Example #1
0
BioAPI_RETURN BioAPI
BioAPI_EnumModules(BioAPI_BSP_SCHEMA * BspSchemaArray,
									uint32 ArraySize,
									uint32 * ElementsNeeded,
									uint32 * NumElementsReturned)

{
	BioAPI_RETURN err;
	MDSU_CONTEXT MdsuContext;
	BioAPI_BSP_SCHEMA BioAPICapTemplate;
	BioAPI_BSP_SCHEMA BioAPICapData;
	BioAPI_BSP_SCHEMA * CurrentSchemaPtr;
	uint32 Count;

	/* Initialize in case of early return (usually caused by no installed modules) */
	*NumElementsReturned = 0;
	*ElementsNeeded = 0;

	if((err = MDSU_Init(&MdsuContext,
					&BioAPIMemoryFuncs,
					&bioapi_UUID,
					MDS_CDSA_DIRECTORY,
					(CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE),
					BIOAPI_MDS_COMMIT_SIZE)) != BioAPI_OK)
		return err;

	/* Handle the simple case first...NULL passed for BspSchemaArray */
	if(BspSchemaArray == NULL)
	{
		Count = 0;
		BioAPICapTemplate.SpecVersion.Major = BioAPI_MAJOR;
		BioAPICapTemplate.SpecVersion.Minor = BioAPI_MINOR;
		err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspCapabilitySchema,
								 &BioAPICapTemplate,
								 MDSU_BIOAPI_BSP_CAP_SPECVERSION,
								 &BioAPICapData,
								 NULL);
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			if (CSSMERR_DL_ENDOFDATA == err)
				return BioAPIERR_H_FRAMEWORK_FUNCTION_FAILED;
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			err = MDSU_FindNext(&MdsuContext,
								&BioAPICapData,
								NULL);
		}
		*ElementsNeeded = Count;
	}
	else
	{
		if(ArraySize == 0)
			return BioAPI_ERRCODE_INVALID_DATA;
		Count = 0;
		CurrentSchemaPtr = BspSchemaArray;
		BioAPICapTemplate.SpecVersion.Major = BioAPI_MAJOR;
		BioAPICapTemplate.SpecVersion.Minor = BioAPI_MINOR;
		err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspCapabilitySchema,
								 &BioAPICapTemplate,
								 MDSU_BIOAPI_BSP_CAP_SPECVERSION,
								 &BioAPICapData,
								 NULL);
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			if(Count <= ArraySize)
			{
				memcpy(CurrentSchemaPtr, &BioAPICapData, sizeof(BioAPI_BSP_SCHEMA));
				CurrentSchemaPtr++;
			}
			err = MDSU_FindNext(&MdsuContext,
								&BioAPICapData,
								NULL);
		}
		if(Count > ArraySize)
		{
			*NumElementsReturned = ArraySize;
		}
		else
		{
			*NumElementsReturned = Count;
		}
		*ElementsNeeded = Count;
	}
	MDSU_Term( &MdsuContext );
	return (BioAPI_OK);

}
Example #2
0
BioAPI_RETURN BioAPI
BioAPI_EnumDevices(const BioAPI_UUID *uuid,
									BioAPI_DEVICE_SCHEMA * DeviceSchemaArray,
									uint32 ArraySize,
									uint32 * ElementsNeeded,
									uint32 * NumElementsReturned)

{
	BioAPI_RETURN err;
	MDSU_CONTEXT MdsuContext;
	BioAPI_DEVICE_SCHEMA DeviceTemplate;
	BioAPI_DEVICE_SCHEMA DeviceData;
	BioAPI_DEVICE_SCHEMA * CurrentSchemaPtr;
	uint32 Count;

	/* Initialize in case of early return (usually caused by no installed devices) */
	*NumElementsReturned = 0;
	*ElementsNeeded = 0;

	if((err = MDSU_Init(&MdsuContext,
					&BioAPIMemoryFuncs,
					uuid,
					MDS_CDSA_DIRECTORY,
					(CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE),
					BIOAPI_MDS_COMMIT_SIZE)) != BioAPI_OK)
		return err;

	/* Handle the simple case first...NULL passed for DeviceSchemaArray */
	if(DeviceSchemaArray == NULL)
	{
		Count = 0;
		BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid);
		ERR(err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspDeviceSchema,
								 &DeviceTemplate,
								 MDSU_BIOAPI_DEV_MODULEID,
								 &DeviceData,
								 NULL));
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			err = MDSU_FindNext(&MdsuContext,
								&DeviceData,
								NULL);
		}
		*ElementsNeeded = Count;
	}
	else
	{
		if(ArraySize == 0)
			return BioAPI_ERRCODE_INVALID_DATA;
		Count = 0;
		CurrentSchemaPtr = DeviceSchemaArray;
		BioAPI_CopyUuid (DeviceTemplate.ModuleId, uuid);
		err = MDSU_FindFirst(&MdsuContext,
								 &IfiMdsuBioAPIBspCapabilitySchema,
								 &DeviceTemplate,
								 MDSU_BIOAPI_DEV_MODULEID,
								 &DeviceData,
								 NULL);
		if (CSSM_OK != err)
		{
			MDSU_Term( &MdsuContext );
			return err;
		}
		while(CSSM_OK == err)
		{
			Count ++;
			if(Count <= ArraySize)
			{
				memcpy(CurrentSchemaPtr, &DeviceData, sizeof(BioAPI_DEVICE_SCHEMA));
				CurrentSchemaPtr++;
			}
			err = MDSU_FindNext(&MdsuContext,
								&DeviceData,
								NULL);
		}
		if(Count > ArraySize)
		{
			*NumElementsReturned = ArraySize;
		}
		else
		{
			*NumElementsReturned = Count;
		}
		*ElementsNeeded = Count;
	}
	MDSU_Term( &MdsuContext );
	return (BioAPI_OK);

}
Example #3
0
static CSSM_RETURN __CleanMDS( MDSU_CONTEXT *pContext )
{
	CSSM_RETURN rv = CSSM_OK;
	MDSU_CDSA_COMMON_SCHEMA CommonTemplate;
	MDSU_CDSA_COMMON_SCHEMA CommonData;
	MDSU_CDSA_DL_PRIMARY_SCHEMA DLPrimaryTemplate;
	MDSU_CDSA_DL_PRIMARY_SCHEMA DLPrimaryData;
	MDSU_CDSA_DL_ENC_PRODUCT_SCHEMA DLEncProdTemplate;
	MDSU_CDSA_DL_ENC_PRODUCT_SCHEMA DLEncProdData;

	/* Execute a search on every DL record type to get a handle of all
	 * records and then delete them.
	 */
	/* Common Schema */
	CommonTemplate.ModuleID = MODULE_GUID;
	rv = MDSU_FindFirst( pContext,
						 &IfiMdsuCdsadirCommonSchema,
						 &CommonTemplate,
						 MDSU_COM_MODULE_ID,
						 &CommonData,
						 NULL );
	while ( rv == CSSM_OK )
	{
		if ( CommonData.Manifest.Data )
		{
			MDSU_free( pContext, CommonData.Manifest.Data );
		}

		rv = MDSU_FindNext( pContext,
							&CommonData,
							NULL );
	}
	if ( rv == CSSMERR_DL_ENDOFDATA )
	{
		/* DL Primary Schema */
		DLPrimaryTemplate.ModuleID = MODULE_GUID;
		rv = MDSU_FindFirst( pContext,
							 &IfiMdsuCdsadirDLPrimarySchema,
							 &DLPrimaryTemplate,
							 MDSU_DLP_MODULE_ID,
							 &DLPrimaryData,
							 NULL );
		while ( rv == CSSM_OK )
		{
			if ( DLPrimaryData.Manifest.Data )
			{
				MDSU_free( pContext, DLPrimaryData.Manifest.Data );
			}

			rv = MDSU_FindNext( pContext,
								&DLPrimaryData,
								NULL );
		}
		if ( rv == CSSMERR_DL_ENDOFDATA )
		{
			/* DL Encapsulated Product Schema */
			DLEncProdTemplate.ModuleID = MODULE_GUID;
			rv = MDSU_FindFirst( pContext,
								 &IfiMdsuCdsadirDLEncProductSchema,
								 &DLEncProdTemplate,
								 MDSU_DLEP_MODULE_ID,
								 &DLEncProdData,
								 NULL );
			while ( rv == CSSM_OK )
			{
				rv = MDSU_FindNext( pContext,
									&DLEncProdData,
									NULL );
			}
			if ( rv == CSSMERR_DL_ENDOFDATA )
			{
				/* Flush everything from the MDS */
				rv = MDSU_Revert( pContext );
			} /* CSP Encapsulated Product removed */
		} /* CSP Primary removed */
	} /* Common removed */

	/* Make sure nothing gets removed if there is an error */
	if ( ( rv != CSSMERR_DL_ENDOFDATA ) &&
		 ( rv != CSSM_OK ) )
	{
		MDSU_Commit( pContext );
	}

	return rv;
}