# This file is part of h5py, a Python interface to the HDF5 library.
#
# http://www.h5py.org
#
# Copyright 2008-2013 Andrew Collette and contributors
#
# License:  Standard 3-clause BSD; see "license.txt" for full license terms
#           and contributor agreement.

from api_types_hdf5 cimport *

# Auto-set exception.  Returns 1 if exception set, 0 if no HDF5 error found.
cdef int set_exception() except -1

cdef extern from "hdf5.h":                          

  ctypedef enum H5E_major_t:
    H5E_NONE_MAJOR       = 0,   # special zero, no error                     
    H5E_ARGS,                   # invalid arguments to routine               
    H5E_RESOURCE,               # resource unavailable                       
    H5E_INTERNAL,               # Internal error (too specific to document)
    H5E_FILE,                   # file Accessability                         
    H5E_IO,                     # Low-level I/O                              
    H5E_FUNC,                   # function Entry/Exit                        
    H5E_ATOM,                   # object Atom                                
    H5E_CACHE,                  # object Cache                               
    H5E_BTREE,                  # B-Tree Node                                
    H5E_SYM,                    # symbol Table                               
    H5E_HEAP,                   # Heap                                       
    H5E_OHDR,                   # object Header                              
    H5E_DATATYPE,               # Datatype                                   
    H5E_DATASPACE,              # Dataspace                                  
    H5E_DATASET,                # Dataset                                    
    H5E_STORAGE,                # data storage                               
    H5E_PLIST,                  # Property lists                             
    H5E_ATTR,                   # Attribute                                  
    H5E_PLINE,                  # Data filters                               
    H5E_EFL,                    # External file list                         
    H5E_REFERENCE,              # References                                 
    H5E_VFL,                    # Virtual File Layer                 
#   H5E_TBBT,                   # Threaded, Balanced, Binary Trees (not in 1.8)
    H5E_TST,                    # Ternary Search Trees                       
    H5E_RS,                     # Reference Counted Strings                  
    H5E_ERROR,                  # Error API                                  
    H5E_SLIST                   # Skip Lists     

  ctypedef enum H5E_minor_t:

    # Generic low-level file I/O errors 
    H5E_SEEKERROR      # Seek failed 
    H5E_READERROR      # Read failed  
    H5E_WRITEERROR     # Write failed  
    H5E_CLOSEERROR     # Close failed 
    H5E_OVERFLOW       # Address overflowed 
    H5E_FCNTL          # File control (fcntl) failed

    # Resource errors 
    H5E_NOSPACE        # No space available for allocation 
    H5E_CANTALLOC      # Can't allocate space 
    H5E_CANTCOPY       # Unable to copy object 
    H5E_CANTFREE       # Unable to free object 
    H5E_ALREADYEXISTS  # Object already exists 
    H5E_CANTLOCK       # Unable to lock object 
    H5E_CANTUNLOCK     # Unable to unlock object 
    H5E_CANTGC         # Unable to garbage collect 
    H5E_CANTGETSIZE    # Unable to compute size 
    H5E_OBJOPEN        # Object is already open 
                       
    # Heap errors      
    H5E_CANTRESTORE    # Can't restore condition 
    H5E_CANTCOMPUTE    # Can't compute value 
    H5E_CANTEXTEND     # Can't extend heap's space 
    H5E_CANTATTACH     # Can't attach object 
    H5E_CANTUPDATE     # Can't update object 
    H5E_CANTOPERATE    # Can't operate on object 

    # Function entry/exit interface errors 
    H5E_CANTINIT       # Unable to initialize object 
    H5E_ALREADYINIT    # Object already initialized 
    H5E_CANTRELEASE    # Unable to release object 
                       
    # Property list errors 
    H5E_CANTGET        # Can't get value 
    H5E_CANTSET        # Can't set value 
    H5E_DUPCLASS       # Duplicate class name in parent class 

    # Free space errors 
    H5E_CANTMERGE      # Can't merge objects 
    H5E_CANTREVIVE     # Can't revive object 
    H5E_CANTSHRINK     # Can't shrink container 

    # Object header related errors 
    H5E_LINKCOUNT      # Bad object header link 
    H5E_VERSION        # Wrong version number 
    H5E_ALIGNMENT      # Alignment error 
    H5E_BADMESG        # Unrecognized message 
    H5E_CANTDELETE     # Can't delete message 
    H5E_BADITER        # Iteration failed 
    H5E_CANTPACK       # Can't pack messages 
    H5E_CANTRESET      # Can't reset object count 
                        
    # System level errors 
    H5E_SYSERRSTR      # System error message 

    # I/O pipeline errors 
    H5E_NOFILTER       # Requested filter is not available 
    H5E_CALLBACK       # Callback failed 
    H5E_CANAPPLY       # Error from filter 'can apply' callback 
    H5E_SETLOCAL       # Error from filter 'set local' callback 
    H5E_NOENCODER      # Filter present but encoding disabled 
    H5E_CANTFILTER     # Filter operation failed 

    # Group related errors 
    H5E_CANTOPENOBJ    # Can't open object 
    H5E_CANTCLOSEOBJ   # Can't close object 
    H5E_COMPLEN        # Name component is too long 
    H5E_PATH           # Problem with path to object 

    # No error 
    H5E_NONE_MINOR     # No error 

    # File accessability errors 
    H5E_FILEEXISTS     # File already exists 
    H5E_FILEOPEN       # File already open 
    H5E_CANTCREATE     # Unable to create file
    H5E_CANTOPENFILE   # Unable to open file 
    H5E_CANTCLOSEFILE  # Unable to close file 
    H5E_NOTHDF5        # Not an HDF5 file 
    H5E_BADFILE        # Bad file ID accessed 
    H5E_TRUNCATED      # File has been truncated
    H5E_MOUNT          # File mount error 

    # Object atom related errors 
    H5E_BADATOM        # Unable to find atom information (already closed?) 
    H5E_BADGROUP       # Unable to find ID group information 
    H5E_CANTREGISTER   # Unable to register new atom 
    H5E_CANTINC        # Unable to increment reference count 
    H5E_CANTDEC        # Unable to decrement reference count 
    H5E_NOIDS          # Out of IDs for group 

    # Cache related errors 
    H5E_CANTFLUSH      # Unable to flush data from cache 
    H5E_CANTSERIALIZE  # Unable to serialize data from cache 
    H5E_CANTLOAD       # Unable to load metadata into cache 
    H5E_PROTECT        # Protected metadata error 
    H5E_NOTCACHED      # Metadata not currently cached 
    H5E_SYSTEM         # Internal error detected 
    H5E_CANTINS        # Unable to insert metadata into cache 
    H5E_CANTRENAME     # Unable to rename metadata 
    H5E_CANTPROTECT    # Unable to protect metadata 
    H5E_CANTUNPROTECT  # Unable to unprotect metadata 
    H5E_CANTPIN        # Unable to pin cache entry 
    H5E_CANTUNPIN      # Unable to un-pin cache entry 
    H5E_CANTMARKDIRTY  # Unable to mark a pinned entry as dirty 
    H5E_CANTDIRTY      # Unable to mark metadata as dirty 
    H5E_CANTEXPUNGE    # Unable to expunge a metadata cache entry 
    H5E_CANTRESIZE     # Unable to resize a metadata cache entry 

    # Link related errors 
    H5E_TRAVERSE       # Link traversal failure 
    H5E_NLINKS         # Too many soft links in path
    H5E_NOTREGISTERED  # Link class not registered 
    H5E_CANTMOVE       # Move callback returned error
    H5E_CANTSORT       # Can't sort objects 

    # Parallel MPI errors 
    H5E_MPI           # Some MPI function failed
    H5E_MPIERRSTR     # MPI Error String 
    H5E_CANTRECV      # Can't receive data 

    # Dataspace errors 
    H5E_CANTCLIP      # Can't clip hyperslab region 
    H5E_CANTCOUNT     # Can't count elements 
    H5E_CANTSELECT    # Can't select hyperslab 
    H5E_CANTNEXT      # Can't move to next iterator location 
    H5E_BADSELECT     # Invalid selection 
    H5E_CANTCOMPARE   # Can't compare objects 

    # Argument errors 
    H5E_UNINITIALIZED  # Information is uinitialized 
    H5E_UNSUPPORTED    # Feature is unsupported 
    H5E_BADTYPE        # Inappropriate type 
    H5E_BADRANGE       # Out of range 
    H5E_BADVALUE       # Bad value 

    # B-tree related errors 
    H5E_NOTFOUND            # Object not found 
    H5E_EXISTS              # Object already exists 
    H5E_CANTENCODE          # Unable to encode value 
    H5E_CANTDECODE          # Unable to decode value 
    H5E_CANTSPLIT           # Unable to split node 
    H5E_CANTREDISTRIBUTE    # Unable to redistribute records 
    H5E_CANTSWAP            # Unable to swap records 
    H5E_CANTINSERT          # Unable to insert object 
    H5E_CANTLIST            # Unable to list node 
    H5E_CANTMODIFY          # Unable to modify record 
    H5E_CANTREMOVE          # Unable to remove object 

    # Datatype conversion errors 
    H5E_CANTCONVERT         # Can't convert datatypes 
    H5E_BADSIZE             # Bad size for object 
                        
  cdef enum H5E_direction_t:
    H5E_WALK_UPWARD    = 0      # begin deep, end at API function    
    H5E_WALK_DOWNWARD = 1       # begin at API function, end deep    

  ctypedef struct H5E_error_t:
    H5E_major_t     maj_num     #  major error number             
    H5E_minor_t     min_num     #  minor error number             
    char    *func_name          #  function in which error occurred   
    char    *file_name          #  file in which error occurred       
    unsigned    line            #  line in file where error occurs    
    char    *desc               #  optional supplied description      

  char      *H5Eget_major(H5E_major_t n)
  char      *H5Eget_minor(H5E_minor_t n)
  herr_t    H5Eclear() except *

  ctypedef herr_t (*H5E_auto_t)(void *client_data)
  herr_t    H5Eset_auto(H5E_auto_t func, void *client_data)
  herr_t    H5Eget_auto(H5E_auto_t *func, void** client_data)

  herr_t    H5Eprint(void *stream)

  ctypedef herr_t (*H5E_walk_t)(int n, H5E_error_t *err_desc, void* client_data)  
  herr_t    H5Ewalk(H5E_direction_t direction, H5E_walk_t func, void* client_data)

# --- Functions for managing the HDF5 error callback mechanism ---

ctypedef struct err_cookie:
    # Defines the error handler state (callback and callback data)
    H5E_auto_t func
    void *data

# Set (via H5Eset_auto) the HDF5 error handler for this thread.  Returns
# the old (presently installed) handler.
cdef err_cookie set_error_handler(err_cookie handler)
    
