/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* ---- includes ----------------------------------------------------------- */
#include "SDK_Internal.h"
#include "b_BasicEm/Functions.h"
/* ------------------------------------------------------------------------- */
/* ========================================================================= */
/* */
/* ---- functions ---------------------------------------------------------- */
/* */
/* ========================================================================= */
/* ------------------------------------------------------------------------- */
void btk_SDK_init( struct btk_SDK* ptrA )
{
bbs_Context_init( &ptrA->contextE );
ptrA->hidE = btk_HID_SDK;
ptrA->refCtrE = 0;
ptrA->mallocFPtrE = NULL;
ptrA->freeFPtrE = NULL;
ptrA->errorFPtrE = NULL;
ptrA->maxImageWidthE = 0;
ptrA->maxImageHeightE = 0;
}
/* ------------------------------------------------------------------------- */
void btk_SDK_exit( struct btk_SDK* ptrA )
{
bbs_Context_exit( &ptrA->contextE );
ptrA->hidE = btk_HID_SDK;
ptrA->refCtrE = 0;
ptrA->mallocFPtrE = NULL;
ptrA->freeFPtrE = NULL;
ptrA->errorFPtrE = NULL;
ptrA->maxImageWidthE = 0;
ptrA->maxImageHeightE = 0;
}
/* ------------------------------------------------------------------------- */
/* malloc wrapper */
void* btk_malloc( struct bbs_Context* cpA,
const struct bbs_MemSeg* memSegPtrA,
uint32 sizeA )
{
btk_HSDK hsdkL = ( btk_HSDK )cpA;
if( hsdkL->mallocFPtrE != NULL )
{
return hsdkL->mallocFPtrE( sizeA );
}
else
{
return NULL;
}
}
/* ------------------------------------------------------------------------- */
/** error handler wrapper */
void btk_error( struct bbs_Context* cpA )
{
btk_HSDK hsdkL = ( btk_HSDK )cpA;
if( hsdkL->errorFPtrE != NULL )
{
hsdkL->errorFPtrE( hsdkL );
}
}
/* ------------------------------------------------------------------------- */
btk_SDKCreateParam btk_SDK_defaultParam()
{
btk_SDKCreateParam paramL;
paramL.fpError = NULL;
paramL.fpMalloc = NULL;
paramL.fpFree = NULL;
paramL.pExMem = NULL;
paramL.sizeExMem = 0;
paramL.pShMem = NULL;
paramL.sizeShMem = 0;
paramL.licenseKey = NULL;
paramL.maxImageWidth = 0;
paramL.maxImageHeight = 0;
return paramL;
}
/* ------------------------------------------------------------------------- */
btk_Status btk_SDK_create( const btk_SDKCreateParam* pCreateParamA,
btk_HSDK* hpsdkA )
{
btk_HSDK hsdkL = NULL;
if( hpsdkA == NULL ) return btk_STATUS_INVALID_HANDLE;
if( *hpsdkA != NULL ) return btk_STATUS_INVALID_HANDLE;
if( pCreateParamA->fpMalloc != NULL )
{
if( pCreateParamA->fpFree == NULL ) return btk_STATUS_INVALID_HANDLE;
/* allocate context */
hsdkL = ( btk_HSDK )pCreateParamA->fpMalloc( bbs_SIZEOF8( struct btk_SDK ) );
if( hsdkL == NULL ) return btk_STATUS_INVALID_HANDLE;
btk_SDK_init( hsdkL );
/* initialize SDK context */
hsdkL->mallocFPtrE = pCreateParamA->fpMalloc;
hsdkL->freeFPtrE = pCreateParamA->fpFree;
hsdkL->errorFPtrE = pCreateParamA->fpError;
/* initialize core context */
bbs_Context_quickInit( &hsdkL->contextE, btk_malloc, pCreateParamA->fpFree, btk_error );
if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
}
else
{
uint16* exMemPtrL = ( uint16* )pCreateParamA->pExMem;
uint32 exMemSizeL = pCreateParamA->sizeExMem >> 1;
if( pCreateParamA->pExMem == NULL ) return btk_STATUS_INVALID_HANDLE;
if( pCreateParamA->pShMem == NULL ) return btk_STATUS_INVALID_HANDLE;
if( pCreateParamA->pExMem == pCreateParamA->pShMem ) return btk_STATUS_INVALID_HANDLE;
if( pCreateParamA->sizeExMem < bbs_SIZEOF16( struct btk_SDK ) ) return btk_STATUS_INVALID_HANDLE;
/* allocate context */
hsdkL = ( btk_HSDK )exMemPtrL;
exMemPtrL += bbs_SIZEOF16( struct btk_SDK );
exMemSizeL -= bbs_SIZEOF16( struct btk_SDK );
btk_SDK_init( hsdkL );
hsdkL->errorFPtrE = pCreateParamA->fpError;
hsdkL->contextE.errorHandlerE = btk_error;
/* initialize core context */
bbs_Context_addStaticSeg( &hsdkL->contextE, exMemPtrL, exMemSizeL, FALSE, 0 );
bbs_Context_addStaticSeg( &hsdkL->contextE, pCreateParamA->pShMem, pCreateParamA->sizeShMem >> 1, TRUE, 0 );
}
hsdkL->maxImageWidthE = pCreateParamA->maxImageWidth;
hsdkL->maxImageHeightE = pCreateParamA->maxImageHeight;
*hpsdkA = hsdkL;
return btk_STATUS_OK;
}
/* ------------------------------------------------------------------------- */
btk_Status btk_SDK_close( btk_HSDK hsdkA )
{
const char* fNameL = "btk_SDK_close";
if( hsdkA == NULL ) return btk_STATUS_INVALID_HANDLE;
if( hsdkA->hidE != btk_HID_SDK ) return btk_STATUS_INVALID_HANDLE;
if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
if( hsdkA->refCtrE > 0 )
{
bbs_Context_pushError( &hsdkA->contextE,
bbs_Error_create( bbs_ERR_ERROR, 0, NULL, "%s:\nThis SDK context is still in use by %i objects!\n"
"Close all instances of the context scope first.\n",
fNameL,
hsdkA->refCtrE ) );
return btk_STATUS_ERROR;
}
if( hsdkA->freeFPtrE )
{
btk_fpFree freeFPtrL = hsdkA->freeFPtrE;
btk_SDK_exit( hsdkA );
freeFPtrL( hsdkA );
}
else
{
btk_SDK_exit( hsdkA );
}
/* btk_SDK_exit clears error stack and does not produce an error condition */
return btk_STATUS_OK;
}
/* ------------------------------------------------------------------------- */
btk_Error btk_SDK_getError( btk_HSDK hsdkA, char* msgBufA, u32 msgBufSizeA )
{
if( hsdkA == NULL ) return btk_ERR_CORRUPT_DATA;
if( hsdkA->hidE != btk_HID_SDK ) return btk_STATUS_INVALID_HANDLE;
if( bbs_Context_error( &hsdkA->contextE ) )
{
struct bbs_Error errL = bbs_Context_popError( &hsdkA->contextE );
if( msgBufA != NULL ) bbs_strncpy( msgBufA, errL.textE, msgBufSizeA );
switch( errL.errorE )
{
case bbs_ERR_OUT_OF_MEMORY: return btk_ERR_MEMORY;
case bbs_ERR_MEMORY_OVERFLOW: return btk_ERR_MEMORY;
case bbs_ERR_WRONG_VERSION: return btk_ERR_VERSION;
case bbs_ERR_CORRUPT_DATA: return btk_ERR_CORRUPT_DATA;
default: return btk_ERR_INTERNAL;
}
}
return btk_ERR_NO_ERROR;
}
/* ------------------------------------------------------------------------- */
u32 btk_SDK_exAllocSize( btk_HSDK hsdkA )
{
if( hsdkA == NULL ) return 0;
if( hsdkA->hidE != btk_HID_SDK ) return 0;
return ( bbs_Context_exclAllocSize( &hsdkA->contextE, 0 ) * 2 ) + bbs_SIZEOF8( struct btk_SDK );
}
/* ------------------------------------------------------------------------- */
u32 btk_SDK_shAllocSize( btk_HSDK hsdkA )
{
if( hsdkA == NULL ) return 0;
if( hsdkA->hidE != btk_HID_SDK ) return 0;
return bbs_Context_shrdAllocSize( &hsdkA->contextE, 0 ) * 2;
}
/* ------------------------------------------------------------------------- */
u32 btk_SDK_allocSize( btk_HSDK hsdkA )
{
return btk_SDK_exAllocSize( hsdkA ) + btk_SDK_shAllocSize( hsdkA );
}
/* ------------------------------------------------------------------------- */
btk_Status btk_SDK_paramConsistencyTest( struct btk_SDK* hsdkA,
const void* memPtrA,
u32 memSizeA,
const char* fNameA )
{
const uint16* memPtrL = ( uint16* )memPtrA;
uint32 memSizeL;
uint32 iL;
uint16 sumL = 0;
if( memSizeA < sizeof( memSizeL ) )
{
bbs_Context_pushError( &hsdkA->contextE,
bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
"%s:\nCorrupt parameter data.", fNameA ) );
return btk_STATUS_ERROR;
}
memPtrL += bbs_memRead32( &memSizeL, memPtrL );
if( memSizeA < ( memSizeL << 1 ) )
{
bbs_Context_pushError( &hsdkA->contextE,
bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
"%s:\nCorrupt parameter data.", fNameA ) );
return btk_STATUS_ERROR;
}
memPtrL = ( uint16* )memPtrA;
for( iL = 0; iL < memSizeL; iL++ )
{
uint16 valL = 0;
memPtrL += bbs_memRead16( &valL, memPtrL );
sumL += valL;
}
if( sumL != 0xFFFF )
{
bbs_Context_pushError( &hsdkA->contextE,
bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
"%s:\nChecksum error; corrupt parameter data.", fNameA ) );
return btk_STATUS_ERROR;
}
return btk_STATUS_OK;
}
/* ------------------------------------------------------------------------- */
/* ========================================================================= */