1 /*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /* ---- includes ----------------------------------------------------------- */
18
19 #include "SDK_Internal.h"
20 #include "b_BasicEm/Functions.h"
21
22 /* ------------------------------------------------------------------------- */
23
24 /* ========================================================================= */
25 /* */
26 /* ---- functions ---------------------------------------------------------- */
27 /* */
28 /* ========================================================================= */
29
30 /* ------------------------------------------------------------------------- */
31
btk_SDK_init(struct btk_SDK * ptrA)32 void btk_SDK_init( struct btk_SDK* ptrA )
33 {
34 bbs_Context_init( &ptrA->contextE );
35 ptrA->hidE = btk_HID_SDK;
36 ptrA->refCtrE = 0;
37 ptrA->mallocFPtrE = NULL;
38 ptrA->freeFPtrE = NULL;
39 ptrA->errorFPtrE = NULL;
40 ptrA->maxImageWidthE = 0;
41 ptrA->maxImageHeightE = 0;
42 }
43
44 /* ------------------------------------------------------------------------- */
45
btk_SDK_exit(struct btk_SDK * ptrA)46 void btk_SDK_exit( struct btk_SDK* ptrA )
47 {
48 bbs_Context_exit( &ptrA->contextE );
49 ptrA->hidE = btk_HID_SDK;
50 ptrA->refCtrE = 0;
51 ptrA->mallocFPtrE = NULL;
52 ptrA->freeFPtrE = NULL;
53 ptrA->errorFPtrE = NULL;
54 ptrA->maxImageWidthE = 0;
55 ptrA->maxImageHeightE = 0;
56 }
57
58 /* ------------------------------------------------------------------------- */
59
60 /* malloc wrapper */
btk_malloc(struct bbs_Context * cpA,const struct bbs_MemSeg * memSegPtrA,uint32 sizeA)61 void* btk_malloc( struct bbs_Context* cpA,
62 const struct bbs_MemSeg* memSegPtrA,
63 uint32 sizeA )
64 {
65 btk_HSDK hsdkL = ( btk_HSDK )cpA;
66 if( hsdkL->mallocFPtrE != NULL )
67 {
68 return hsdkL->mallocFPtrE( sizeA );
69 }
70 else
71 {
72 return NULL;
73 }
74 }
75
76 /* ------------------------------------------------------------------------- */
77
78 /** error handler wrapper */
btk_error(struct bbs_Context * cpA)79 void btk_error( struct bbs_Context* cpA )
80 {
81 btk_HSDK hsdkL = ( btk_HSDK )cpA;
82 if( hsdkL->errorFPtrE != NULL )
83 {
84 hsdkL->errorFPtrE( hsdkL );
85 }
86 }
87
88 /* ------------------------------------------------------------------------- */
89
btk_SDK_defaultParam()90 btk_SDKCreateParam btk_SDK_defaultParam()
91 {
92 btk_SDKCreateParam paramL;
93 paramL.fpError = NULL;
94 paramL.fpMalloc = NULL;
95 paramL.fpFree = NULL;
96 paramL.pExMem = NULL;
97 paramL.sizeExMem = 0;
98 paramL.pShMem = NULL;
99 paramL.sizeShMem = 0;
100 paramL.licenseKey = NULL;
101 paramL.maxImageWidth = 0;
102 paramL.maxImageHeight = 0;
103 return paramL;
104 }
105
106 /* ------------------------------------------------------------------------- */
107
btk_SDK_create(const btk_SDKCreateParam * pCreateParamA,btk_HSDK * hpsdkA)108 btk_Status btk_SDK_create( const btk_SDKCreateParam* pCreateParamA,
109 btk_HSDK* hpsdkA )
110 {
111 btk_HSDK hsdkL = NULL;
112 if( hpsdkA == NULL ) return btk_STATUS_INVALID_HANDLE;
113 if( *hpsdkA != NULL ) return btk_STATUS_INVALID_HANDLE;
114
115 if( pCreateParamA->fpMalloc != NULL )
116 {
117 if( pCreateParamA->fpFree == NULL ) return btk_STATUS_INVALID_HANDLE;
118
119 /* allocate context */
120 hsdkL = ( btk_HSDK )pCreateParamA->fpMalloc( bbs_SIZEOF8( struct btk_SDK ) );
121 if( hsdkL == NULL ) return btk_STATUS_INVALID_HANDLE;
122
123 btk_SDK_init( hsdkL );
124
125 /* initialize SDK context */
126 hsdkL->mallocFPtrE = pCreateParamA->fpMalloc;
127 hsdkL->freeFPtrE = pCreateParamA->fpFree;
128 hsdkL->errorFPtrE = pCreateParamA->fpError;
129
130 /* initialize core context */
131 bbs_Context_quickInit( &hsdkL->contextE, btk_malloc, pCreateParamA->fpFree, btk_error );
132 if( bbs_Context_error( &hsdkL->contextE ) ) return btk_STATUS_ERROR;
133 }
134 else
135 {
136 uint16* exMemPtrL = ( uint16* )pCreateParamA->pExMem;
137 uint32 exMemSizeL = pCreateParamA->sizeExMem >> 1;
138
139 if( pCreateParamA->pExMem == NULL ) return btk_STATUS_INVALID_HANDLE;
140 if( pCreateParamA->pShMem == NULL ) return btk_STATUS_INVALID_HANDLE;
141 if( pCreateParamA->pExMem == pCreateParamA->pShMem ) return btk_STATUS_INVALID_HANDLE;
142
143 if( pCreateParamA->sizeExMem < bbs_SIZEOF16( struct btk_SDK ) ) return btk_STATUS_INVALID_HANDLE;
144
145 /* allocate context */
146 hsdkL = ( btk_HSDK )exMemPtrL;
147 exMemPtrL += bbs_SIZEOF16( struct btk_SDK );
148 exMemSizeL -= bbs_SIZEOF16( struct btk_SDK );
149
150 btk_SDK_init( hsdkL );
151
152 hsdkL->errorFPtrE = pCreateParamA->fpError;
153 hsdkL->contextE.errorHandlerE = btk_error;
154
155 /* initialize core context */
156 bbs_Context_addStaticSeg( &hsdkL->contextE, exMemPtrL, exMemSizeL, FALSE, 0 );
157 bbs_Context_addStaticSeg( &hsdkL->contextE, pCreateParamA->pShMem, pCreateParamA->sizeShMem >> 1, TRUE, 0 );
158 }
159
160 hsdkL->maxImageWidthE = pCreateParamA->maxImageWidth;
161 hsdkL->maxImageHeightE = pCreateParamA->maxImageHeight;
162
163 *hpsdkA = hsdkL;
164 return btk_STATUS_OK;
165 }
166
167 /* ------------------------------------------------------------------------- */
168
btk_SDK_close(btk_HSDK hsdkA)169 btk_Status btk_SDK_close( btk_HSDK hsdkA )
170 {
171 const char* fNameL = "btk_SDK_close";
172
173 if( hsdkA == NULL ) return btk_STATUS_INVALID_HANDLE;
174 if( hsdkA->hidE != btk_HID_SDK ) return btk_STATUS_INVALID_HANDLE;
175 if( bbs_Context_error( &hsdkA->contextE ) ) return btk_STATUS_PREEXISTING_ERROR;
176
177 if( hsdkA->refCtrE > 0 )
178 {
179 bbs_Context_pushError( &hsdkA->contextE,
180 bbs_Error_create( bbs_ERR_ERROR, 0, NULL, "%s:\nThis SDK context is still in use by %i objects!\n"
181 "Close all instances of the context scope first.\n",
182 fNameL,
183 hsdkA->refCtrE ) );
184
185 return btk_STATUS_ERROR;
186 }
187
188 if( hsdkA->freeFPtrE )
189 {
190 btk_fpFree freeFPtrL = hsdkA->freeFPtrE;
191 btk_SDK_exit( hsdkA );
192 freeFPtrL( hsdkA );
193 }
194 else
195 {
196 btk_SDK_exit( hsdkA );
197 }
198
199 /* btk_SDK_exit clears error stack and does not produce an error condition */
200
201 return btk_STATUS_OK;
202 }
203
204 /* ------------------------------------------------------------------------- */
205
btk_SDK_getError(btk_HSDK hsdkA,char * msgBufA,u32 msgBufSizeA)206 btk_Error btk_SDK_getError( btk_HSDK hsdkA, char* msgBufA, u32 msgBufSizeA )
207 {
208 if( hsdkA == NULL ) return btk_ERR_CORRUPT_DATA;
209 if( hsdkA->hidE != btk_HID_SDK ) return btk_STATUS_INVALID_HANDLE;
210
211 if( bbs_Context_error( &hsdkA->contextE ) )
212 {
213 struct bbs_Error errL = bbs_Context_popError( &hsdkA->contextE );
214 if( msgBufA != NULL ) bbs_strncpy( msgBufA, errL.textE, msgBufSizeA );
215 switch( errL.errorE )
216 {
217 case bbs_ERR_OUT_OF_MEMORY: return btk_ERR_MEMORY;
218 case bbs_ERR_MEMORY_OVERFLOW: return btk_ERR_MEMORY;
219 case bbs_ERR_WRONG_VERSION: return btk_ERR_VERSION;
220 case bbs_ERR_CORRUPT_DATA: return btk_ERR_CORRUPT_DATA;
221 default: return btk_ERR_INTERNAL;
222 }
223 }
224
225 return btk_ERR_NO_ERROR;
226 }
227
228 /* ------------------------------------------------------------------------- */
229
btk_SDK_exAllocSize(btk_HSDK hsdkA)230 u32 btk_SDK_exAllocSize( btk_HSDK hsdkA )
231 {
232 if( hsdkA == NULL ) return 0;
233 if( hsdkA->hidE != btk_HID_SDK ) return 0;
234 return ( bbs_Context_exclAllocSize( &hsdkA->contextE, 0 ) * 2 ) + bbs_SIZEOF8( struct btk_SDK );
235 }
236
237 /* ------------------------------------------------------------------------- */
238
btk_SDK_shAllocSize(btk_HSDK hsdkA)239 u32 btk_SDK_shAllocSize( btk_HSDK hsdkA )
240 {
241 if( hsdkA == NULL ) return 0;
242 if( hsdkA->hidE != btk_HID_SDK ) return 0;
243 return bbs_Context_shrdAllocSize( &hsdkA->contextE, 0 ) * 2;
244 }
245
246 /* ------------------------------------------------------------------------- */
247
btk_SDK_allocSize(btk_HSDK hsdkA)248 u32 btk_SDK_allocSize( btk_HSDK hsdkA )
249 {
250 return btk_SDK_exAllocSize( hsdkA ) + btk_SDK_shAllocSize( hsdkA );
251 }
252
253 /* ------------------------------------------------------------------------- */
254
btk_SDK_paramConsistencyTest(struct btk_SDK * hsdkA,const void * memPtrA,u32 memSizeA,const char * fNameA)255 btk_Status btk_SDK_paramConsistencyTest( struct btk_SDK* hsdkA,
256 const void* memPtrA,
257 u32 memSizeA,
258 const char* fNameA )
259 {
260 const uint16* memPtrL = ( uint16* )memPtrA;
261 uint32 memSizeL;
262 uint32 iL;
263 uint16 sumL = 0;
264
265 if( memSizeA < sizeof( memSizeL ) )
266 {
267 bbs_Context_pushError( &hsdkA->contextE,
268 bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
269 "%s:\nCorrupt parameter data.", fNameA ) );
270 return btk_STATUS_ERROR;
271 }
272
273 memPtrL += bbs_memRead32( &memSizeL, memPtrL );
274
275 if( memSizeA < ( memSizeL << 1 ) )
276 {
277 bbs_Context_pushError( &hsdkA->contextE,
278 bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
279 "%s:\nCorrupt parameter data.", fNameA ) );
280 return btk_STATUS_ERROR;
281 }
282
283 memPtrL = ( uint16* )memPtrA;
284
285 for( iL = 0; iL < memSizeL; iL++ )
286 {
287 uint16 valL = 0;
288 memPtrL += bbs_memRead16( &valL, memPtrL );
289 sumL += valL;
290 }
291
292 if( sumL != 0xFFFF )
293 {
294 bbs_Context_pushError( &hsdkA->contextE,
295 bbs_Error_create( bbs_ERR_ERROR, 0, NULL,
296 "%s:\nChecksum error; corrupt parameter data.", fNameA ) );
297 return btk_STATUS_ERROR;
298 }
299
300 return btk_STATUS_OK;
301 }
302
303 /* ------------------------------------------------------------------------- */
304
305 /* ========================================================================= */
306