/* * 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; } /* ------------------------------------------------------------------------- */ /* ========================================================================= */