/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "ckdbm.h"

static CK_RV
nss_dbm_mdInstance_Initialize(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    NSSUTF8 *configurationData)
{
    CK_RV rv = CKR_OK;
    NSSArena *arena;
    nss_dbm_instance_t *instance;

    arena = NSSCKFWInstance_GetArena(fwInstance, &rv);
    if (((NSSArena *)NULL == arena) && (CKR_OK != rv)) {
        return rv;
    }

    instance = nss_ZNEW(arena, nss_dbm_instance_t);
    if ((nss_dbm_instance_t *)NULL == instance) {
        return CKR_HOST_MEMORY;
    }

    instance->arena = arena;

    /*
     * This should parse the configuration data for information on
     * number and locations of databases, modes (e.g. readonly), etc.
     * But for now, we'll have one slot with a creatable read-write
     * database called "cert8.db."
     */

    instance->nSlots = 1;
    instance->filenames = nss_ZNEWARRAY(arena, char *, instance->nSlots);
    if ((char **)NULL == instance->filenames) {
        return CKR_HOST_MEMORY;
    }

    instance->flags = nss_ZNEWARRAY(arena, int, instance->nSlots);
    if ((int *)NULL == instance->flags) {
        return CKR_HOST_MEMORY;
    }

    instance->filenames[0] = "cert8.db";
    instance->flags[0] = O_RDWR | O_CREAT;

    mdInstance->etc = (void *)instance;
    return CKR_OK;
}

/* nss_dbm_mdInstance_Finalize is not required */

static CK_ULONG
nss_dbm_mdInstance_GetNSlots(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    CK_RV *pError)
{
    nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc;
    return instance->nSlots;
}

static CK_VERSION
nss_dbm_mdInstance_GetCryptokiVersion(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance)
{
    static CK_VERSION rv = { 2, 1 };
    return rv;
}

static NSSUTF8 *
nss_dbm_mdInstance_GetManufacturerID(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    CK_RV *pError)
{
    return "Mozilla Foundation";
}

static NSSUTF8 *
nss_dbm_mdInstance_GetLibraryDescription(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    CK_RV *pError)
{
    return "Berkeley Database Module";
}

static CK_VERSION
nss_dbm_mdInstance_GetLibraryVersion(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance)
{
    static CK_VERSION rv = { 1, 0 }; /* My own version number */
    return rv;
}

static CK_BBOOL
nss_dbm_mdInstance_ModuleHandlesSessionObjects(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance)
{
    return CK_TRUE;
}

static CK_RV
nss_dbm_mdInstance_GetSlots(
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    NSSCKMDSlot *slots[])
{
    nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc;
    CK_ULONG i;
    CK_RV rv = CKR_OK;

    for (i = 0; i < instance->nSlots; i++) {
        slots[i] = nss_dbm_mdSlot_factory(instance, instance->filenames[i],
                                          instance->flags[i], &rv);
        if ((NSSCKMDSlot *)NULL == slots[i]) {
            return rv;
        }
    }

    return rv;
}

/* nss_dbm_mdInstance_WaitForSlotEvent is not relevant */

NSS_IMPLEMENT_DATA NSSCKMDInstance
    nss_dbm_mdInstance = {
        NULL, /* etc; filled in later */
        nss_dbm_mdInstance_Initialize,
        NULL, /* nss_dbm_mdInstance_Finalize */
        nss_dbm_mdInstance_GetNSlots,
        nss_dbm_mdInstance_GetCryptokiVersion,
        nss_dbm_mdInstance_GetManufacturerID,
        nss_dbm_mdInstance_GetLibraryDescription,
        nss_dbm_mdInstance_GetLibraryVersion,
        nss_dbm_mdInstance_ModuleHandlesSessionObjects,
        nss_dbm_mdInstance_GetSlots,
        NULL, /* nss_dbm_mdInstance_WaitForSlotEvent */
        NULL  /* terminator */
    };
