/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the COPYING file, which can be found at the root of the source code       *
 * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 * Purpose:     The native VOL connector where access is to a single HDF5 file
 *              using HDF5 VFDs.
 */

#include "H5private.h"          /* Generic Functions                        */
#include "H5Eprivate.h"         /* Error handling                           */
#include "H5Iprivate.h"         /* IDs                                      */
#include "H5Pprivate.h"         /* Property lists                           */
#include "H5VLprivate.h"        /* Virtual Object Layer                     */

#include "H5VLnative_private.h" /* Native VOL connector                     */


/* The VOL connector identification number */
static hid_t H5VL_NATIVE_ID_g = H5I_INVALID_HID;

/* Prototypes */
static herr_t H5VL__native_term(void);

/* Native VOL connector class struct */
static H5VL_class_t H5VL_native_cls_g = {
    H5VL_NATIVE_VERSION,                            /* version      */
    H5VL_NATIVE_VALUE,                              /* value        */
    H5VL_NATIVE_NAME,                               /* name         */
    0,                                              /* capability flags */
    NULL,                                           /* initialize   */
    H5VL__native_term,                              /* terminate    */
    {   /* info_cls */
        (size_t)0,                                  /* info size    */
        NULL,                                       /* info copy    */
        NULL,                                       /* info compare */
        NULL,                                       /* info free    */
        NULL,                                       /* info to str  */
        NULL                                        /* str to info  */
    },
    {   /* wrap_cls */
        NULL,                                       /* get_object   */
        NULL,                                       /* get_wrap_ctx */
        NULL,                                       /* wrap_object  */
        NULL,                                       /* unwrap_object */
        NULL                                        /* free_wrap_ctx */
    },
    {   /* attribute_cls */
        H5VL__native_attr_create,                   /* create       */
        H5VL__native_attr_open,                     /* open         */
        H5VL__native_attr_read,                     /* read         */
        H5VL__native_attr_write,                    /* write        */
        H5VL__native_attr_get,                      /* get          */
        H5VL__native_attr_specific,                 /* specific     */
        H5VL__native_attr_optional,                 /* optional     */
        H5VL__native_attr_close                     /* close        */
    },
    {   /* dataset_cls */
        H5VL__native_dataset_create,                /* create       */
        H5VL__native_dataset_open,                  /* open         */
        H5VL__native_dataset_read,                  /* read         */
        H5VL__native_dataset_write,                 /* write        */
        H5VL__native_dataset_get,                   /* get          */
        H5VL__native_dataset_specific,              /* specific     */
        H5VL__native_dataset_optional,              /* optional     */
        H5VL__native_dataset_close                  /* close        */
    },
    {   /* datatype_cls */
        H5VL__native_datatype_commit,               /* commit       */
        H5VL__native_datatype_open,                 /* open         */
        H5VL__native_datatype_get,                  /* get          */
        H5VL__native_datatype_specific,             /* specific     */
        NULL,                                       /* optional     */
        H5VL__native_datatype_close                 /* close        */
    },
    {   /* file_cls */
        H5VL__native_file_create,                   /* create       */
        H5VL__native_file_open,                     /* open         */
        H5VL__native_file_get,                      /* get          */
        H5VL__native_file_specific,                 /* specific     */
        H5VL__native_file_optional,                 /* optional     */
        H5VL__native_file_close                     /* close        */
    },
    {   /* group_cls */
        H5VL__native_group_create,                  /* create       */
        H5VL__native_group_open,                    /* open         */
        H5VL__native_group_get,                     /* get          */
        H5VL__native_group_specific,                /* specific     */
        H5VL__native_group_optional,                /* optional     */
        H5VL__native_group_close                    /* close        */
    },
    {   /* link_cls */
        H5VL__native_link_create,                   /* create       */
        H5VL__native_link_copy,                     /* copy         */
        H5VL__native_link_move,                     /* move         */
        H5VL__native_link_get,                      /* get          */
        H5VL__native_link_specific,                 /* specific     */
        NULL                                        /* optional     */
    },
    {   /* object_cls */
        H5VL__native_object_open,                   /* open         */
        H5VL__native_object_copy,                   /* copy         */
        H5VL__native_object_get,                    /* get          */
        H5VL__native_object_specific,               /* specific     */
        H5VL__native_object_optional                /* optional     */
    },
    {   /* request_cls */
        NULL,                                       /* wait         */
        NULL,                                       /* notify       */
        NULL,                                       /* cancel       */
        NULL,                                       /* specific     */
        NULL,                                       /* optional     */
        NULL                                        /* free         */
    },
    {   /* blob_cls */
        H5VL__native_blob_put,                      /* put */
        H5VL__native_blob_get,                      /* get */
        H5VL__native_blob_specific,                 /* specific */
        NULL                                        /* optional */
    },
    NULL                                            /* optional     */
};


/*-------------------------------------------------------------------------
 * Function:    H5VL_native_register
 *
 * Purpose:     Register the native VOL connector and retrieve an ID for it.
 *
 * Return:      Success:    The ID for the native connector
 *              Failure:    H5I_INVALID_HID
 *
 *-------------------------------------------------------------------------
 */
hid_t
H5VL_native_register(void)
{
    hid_t ret_value = H5I_INVALID_HID;            /* Return value */

    FUNC_ENTER_NOAPI(H5I_INVALID_HID)

    /* Register the native VOL connector, if it isn't already */
    if(NULL == H5I_object_verify(H5VL_NATIVE_ID_g, H5I_VOL))
        if((H5VL_NATIVE_ID_g = H5VL_register_connector((const H5VL_class_t *)&H5VL_native_cls_g, TRUE, H5P_DEFAULT)) < 0)
            HGOTO_ERROR(H5E_VOL, H5E_CANTINSERT, H5I_INVALID_HID, "can't create ID for native VOL connector")

    /* Set return value */
    ret_value = H5VL_NATIVE_ID_g;

done:
    FUNC_LEAVE_NOAPI(ret_value)
} /* end H5VL_native_register() */


/*---------------------------------------------------------------------------
 * Function:    H5VL__native_term
 *
 * Purpose:     Shut down the native VOL
 *
 * Returns:     SUCCEED (Can't fail)
 *
 *---------------------------------------------------------------------------
 */
static herr_t
H5VL__native_term(void)
{
    FUNC_ENTER_STATIC_NOERR

    /* Reset VOL ID */
    H5VL_NATIVE_ID_g = H5I_INVALID_HID;

    FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5VL__native_term() */