blob: 31a3b46c7ba7cf494fd7b31498a6050437b2ae6c [file] [log] [blame]
b.liud440f9f2025-04-18 10:44:31 +08001#include "lynq_qser_sim.h"
2#include "mbtk_type.h"
3#include "mbtk_ril_api.h"
4
5/****************************DEFINE***************************************/
6#define QSER_RESULT_SUCCESS 0
7#define QSER_RESULT_FAIL -1
8
9#define QSER_IMEI_SV_VERSION "01"
10
11/****************************DEFINE***************************************/
12
13/****************************VARIABLE***************************************/
14static mbtk_ril_handle* qser_info_handle;
15static const uint qser_h_sim = 0x5F6F7F8F;
16static QSER_SIM_RxMsgHandlerFunc_t qser_sim_state_cb = NULL;
17static bool qser_sim_cb_state = false;
18/****************************VARIABLE***************************************/
19
20/******************************FUNC*****************************************/
21void qser_sim_state_change_cb(const void* data, int data_len)
22{
23 //uint8 *ptr = (uint8*)data;
24 mbtk_ril_sim_state_info_t* ptr_state = (mbtk_ril_sim_state_info_t*)data;
25 LOGE("[qser_sim] SIM state : %d\n", ptr_state->sim_state);
26 QSER_SIM_CARD_STATUS_INFO_T qser_sim_statue = {0};
27 if(ptr_state->sim_state == 0)
28 {
29 qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
30 }
31 else if(ptr_state->sim_state == 1)
32 {
33 qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_PRESENT;
34 }
35 else if(ptr_state->sim_state == 18)
36 {
37 qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
38 }
39 else
40 {
41 qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
42 }
43 if(qser_sim_state_cb != NULL)
44 {
45 qser_sim_state_cb(&qser_sim_statue);
46 }
47}
48
49/******************************FUNC*****************************************/
50
51/****************************API***************************************/
52int qser_sim_client_init(sim_client_handle_type *ph_sim)
53{
54 //UNUSED(ph_voice);
55 if(ph_sim == NULL)
56 {
57 LOGE("[qser_sim] ph_sim is NULL.");
58 return QSER_RESULT_FAIL;
59 }
60
61 if(NULL == qser_info_handle)
62 {
63 qser_info_handle = mbtk_ril_open(MBTK_AT_PORT_DEF);
64 if(NULL == qser_info_handle)
65 {
66 LOGE("[qser_sim] qser_info_handle get fail.");
67 return QSER_RESULT_FAIL;
68 }
69 }
70 else
71 {
72 LOGE("[qser_sim] qser_info_handle has init.");
73 *ph_sim = qser_h_sim;
74 return QSER_RESULT_FAIL;
75 }
76 *ph_sim = qser_h_sim;
77
78 LOGE("[qser_sim] qser_info_handle get success.");
79
80
81 return QSER_RESULT_SUCCESS;
82
83}
84
85
86
87int qser_sim_getimsi(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info,char *imsi,size_t imsiLen)
88{
89 //UNUSED(h_sim);
90 UNUSED(pt_info);
91 //UNUSED(imsi);
92 //UNUSED(imsiLen);
93
94 if(h_sim != qser_h_sim)
95 {
96 LOGE("[qser_sim] h_sim is error.");
97 return QSER_RESULT_FAIL;
98 }
99
100 if(qser_info_handle == NULL)
101 {
102 LOGE("[qser_sim] handle is NULL.");
103 return QSER_RESULT_FAIL;
104 }
105
106 if(imsi == NULL || imsiLen < 15)
107 {
108 LOGE("[qser_sim] imsi is NULL.");
109 return QSER_RESULT_FAIL;
110 }
111
112 memset(imsi,0,imsiLen);
113 int err = mbtk_imsi_get(qser_info_handle, imsi);
114 if(err)
115 {
116 LOGE("[qser_sim] mbtk_imsi_get is fail.");
117 return QSER_RESULT_FAIL;
118 }
119
120 if(strlen(imsi) > imsiLen)
121 {
122 LOGE("[qser_sim] get datalength out of range.");
123 return QSER_RESULT_FAIL;
124 }
125
126 return QSER_RESULT_SUCCESS;
127}
128
129int qser_sim_geticcid(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,char *iccid, size_t iccidLen)
130{
131 //UNUSED(h_sim);
132 UNUSED(simId);
133 //UNUSED(iccid);
134 //UNUSED(iccidLen);
135
136 if(h_sim != qser_h_sim)
137 {
138 LOGE("[qser_sim] h_sim is error.");
139 return QSER_RESULT_FAIL;
140 }
141
142 if(qser_info_handle == NULL)
143 {
144 LOGE("[qser_sim] handle is NULL.");
145 return QSER_RESULT_FAIL;
146 }
147
148 if(iccid == NULL || iccidLen < QSER_SIM_ICCID_LEN_MAX)
149 {
150 LOGE("[qser_sim] iccid is NULL.");
151 return QSER_RESULT_FAIL;
152 }
153
154 memset(iccid, 0, iccidLen);
155 int err = mbtk_iccid_get(qser_info_handle, iccid);
156 if(err)
157 {
158 LOGE("[qser_sim] mbtk_iccid_get is fail.");
159 return QSER_RESULT_FAIL;
160 }
161
162 if(strlen(iccid) > iccidLen)
163 {
164 LOGE("[qser_sim] get datalength out of range.");
165 return QSER_RESULT_FAIL;
166 }
167
168 return QSER_RESULT_SUCCESS;
169}
170
171int qser_sim_getphonenumber(sim_client_handle_type h_sim,QSER_SIM_APP_ID_INFO_T *pt_info, char*phone_num, size_t phoneLen)
172{
173 //UNUSED(h_sim);
174 UNUSED(pt_info);
175 //UNUSED(phone_num);
176 //UNUSED(phoneLen);
177
178 if(h_sim != qser_h_sim)
179 {
180 LOGE("[qser_sim] h_sim is error.");
181 return QSER_RESULT_FAIL;
182 }
183
184 if(qser_info_handle == NULL)
185 {
186 LOGE("[qser_sim] handle is NULL.");
187 return QSER_RESULT_FAIL;
188 }
189
190 if(phone_num == NULL || phoneLen < 11)
191 {
192 LOGE("[qser_sim] phone_num is NULL.");
193 return QSER_RESULT_FAIL;
194 }
195
196 memset(phone_num, 0, phoneLen);
197 int err = mbtk_phone_number_get(qser_info_handle, phone_num);
198 if(err)
199 {
200 LOGE("[qser_sim] mbtk_phone_number_get is fail.");
201 return QSER_RESULT_FAIL;
202 }
203
204 if(strlen(phone_num) > phoneLen)
205 {
206 LOGE("[qser_sim] get datalength out of range.");
207 return QSER_RESULT_FAIL;
208 }
209
210 return QSER_RESULT_SUCCESS;
211}
212
213int qser_sim_verifypin(sim_client_handle_type h_sim,QSER_SIM_VERIFY_PIN_INFO_T *pt_info)
214{
215 //UNUSED(h_sim);
216 //UNUSED(pt_info);
217 mbtk_sim_lock_info_t info = {0};
218
219 if(h_sim != qser_h_sim)
220 {
221 LOGE("[qser_sim] h_sim is error.");
222 return QSER_RESULT_FAIL;
223 }
224
225 if(qser_info_handle == NULL)
226 {
227 LOGE("[qser_sim] handle is NULL.");
228 return QSER_RESULT_FAIL;
229 }
230
231 if(pt_info == NULL)
232 {
233 LOGE("[qser_sim] pt_info is NULL.");
234 return QSER_RESULT_FAIL;
235 }
236
237 info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PIN;
238 memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
239
240 int err = mbtk_sim_lock_set(qser_info_handle, &info);
241 if(err)
242 {
243 LOGE("[qser_sim] mbtk_verify_pin is fail.");
244 return QSER_RESULT_FAIL;
245 }
246
247 return QSER_RESULT_SUCCESS;
248}
249
250int qser_sim_changepin(sim_client_handle_type h_sim,QSER_SIM_CHANGE_PIN_INFO_T *pt_info)
251{
252 //UNUSED(h_sim);
253 //UNUSED(pt_info);
254 mbtk_sim_lock_info_t info = {0};
255
256 if(h_sim != qser_h_sim)
257 {
258 LOGE("[qser_sim] h_sim is error.");
259 return QSER_RESULT_FAIL;
260 }
261
262 if(qser_info_handle == NULL)
263 {
264 LOGE("[qser_sim] handle is NULL.");
265 return QSER_RESULT_FAIL;
266 }
267
268 if(pt_info == NULL)
269 {
270 LOGE("[qser_sim] pt_info is NULL.");
271 return QSER_RESULT_FAIL;
272 }
273
274 info.type = MBTK_SIM_LOCK_TYPE_CHANGE;
275 memcpy(info.pin1, pt_info->old_pin_value, strlen(pt_info->old_pin_value));
276 memcpy(info.pin2, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
277
278 int err = mbtk_sim_lock_set(qser_info_handle, &info);
279 if(err)
280 {
281 LOGE("[qser_sim] mbtk_change_pin is fail.");
282 return QSER_RESULT_FAIL;
283 }
284
285 return QSER_RESULT_SUCCESS;
286}
287
288int qser_sim_unblockpin(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info)
289{
290 //UNUSED(h_sim);
291 //UNUSED(pt_info);
292 mbtk_sim_lock_info_t info = {0};
293
294 if(h_sim != qser_h_sim)
295 {
296 LOGE("[qser_sim] h_sim is error.");
297 return QSER_RESULT_FAIL;
298 }
299
300 if(qser_info_handle == NULL)
301 {
302 LOGE("[qser_sim] handle is NULL.");
303 return QSER_RESULT_FAIL;
304 }
305
306 if(pt_info == NULL)
307 {
308 LOGE("[qser_sim] pt_info is NULL.");
309 return QSER_RESULT_FAIL;
310 }
311
312 info.type = MBTK_SIM_LOCK_TYPE_VERIFY_PUK;
313 memcpy(info.pin1, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
314 memcpy(info.puk, pt_info->puk_value, strlen(pt_info->puk_value));
315
316 int err = mbtk_sim_lock_set(qser_info_handle, &info);
317 if(err)
318 {
319 LOGE("[qser_sim] mbtk_unlock_pin is fail.");
320 return QSER_RESULT_FAIL;
321 }
322
323 return QSER_RESULT_SUCCESS;
324}
325
326int qser_sim_enablepin(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info)
327{
328 //UNUSED(h_sim);
329 //UNUSED(pt_info);
330 mbtk_sim_lock_info_t info = {0};
331
332 if(h_sim != qser_h_sim)
333 {
334 LOGE("[qser_sim] h_sim is error.");
335 return QSER_RESULT_FAIL;
336 }
337
338 if(qser_info_handle == NULL)
339 {
340 LOGE("[qser_sim] handle is NULL.");
341 return QSER_RESULT_FAIL;
342 }
343
344 if(pt_info == NULL)
345 {
346 LOGE("[qser_sim] pt_info is NULL.");
347 return QSER_RESULT_FAIL;
348 }
349
350 info.type = MBTK_SIM_LOCK_TYPE_ENABLE;
351 memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
352
353 int err = mbtk_sim_lock_set(qser_info_handle, &info);
354 if(err)
355 {
356 LOGE("[qser_sim] mbtk_enable_pin is fail.");
357 return QSER_RESULT_FAIL;
358 }
359
360 return QSER_RESULT_SUCCESS;
361}
362
363int qser_sim_disablepin(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info)
364{
365 //UNUSED(h_sim);
366 //UNUSED(pt_info);
367 mbtk_sim_lock_info_t info = {0};
368
369 if(h_sim != qser_h_sim)
370 {
371 LOGE("[qser_sim] h_sim is error.");
372 return QSER_RESULT_FAIL;
373 }
374
375 if(qser_info_handle == NULL)
376 {
377 LOGE("[qser_sim] handle is NULL.");
378 return QSER_RESULT_FAIL;
379 }
380
381 if(pt_info == NULL)
382 {
383 LOGE("[qser_sim] pt_info is NULL.");
384 return QSER_RESULT_FAIL;
385 }
386
387 info.type = MBTK_SIM_LOCK_TYPE_DISABLE;
388 memcpy(info.pin1, pt_info->pin_value, strlen(pt_info->pin_value));
389
390 int err = mbtk_sim_lock_set(qser_info_handle, &info);
391 if(err)
392 {
393 LOGE("[qser_sim] mbtk_enable_pin is fail.");
394 return QSER_RESULT_FAIL;
395 }
396
397 return QSER_RESULT_SUCCESS;
398}
399
400int qser_sim_getcardstatus(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,QSER_SIM_CARD_STATUS_INFO_T *pt_info)
401{
402 //UNUSED(h_sim);
403 //UNUSED(simId);
404 //UNUSED(pt_info);
405
406 if(h_sim != qser_h_sim)
407 {
408 LOGE("[qser_sim] h_sim is error.");
409 return QSER_RESULT_FAIL;
410 }
411
412 if(qser_info_handle == NULL)
413 {
414 LOGE("[qser_sim] handle is NULL.");
415 return QSER_RESULT_FAIL;
416 }
417
418 if(pt_info == NULL)
419 {
420 LOGE("[qser_sim] pt_info is NULL.");
421 return QSER_RESULT_FAIL;
422 }
423
424 mbtk_sim_state_enum sim;
425 mbtk_sim_card_type_enum sim_card_type;
426 mbtk_pin_puk_last_times_t qser_last_times = {0};
427 int err = mbtk_sim_state_get(qser_info_handle, &sim);
428 if(err)
429 {
430 LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
431 return QSER_RESULT_FAIL;
432 }
433 else
434 {
435 LOGE("[qser_sim] sim = %d.", sim);
436 memset(pt_info, 0x0, sizeof(QSER_SIM_CARD_STATUS_INFO_T));
437 switch (sim)
438 {
439 case 0: //ABSENT
440 pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
441 break;
442 case 1: //NOT READY
443 pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
444 break;
445 case 2: //READY
446 pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
447 break;
448 case 3: //SIM PIN
449 pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
450 break;
451 case 4: //SIM PUK
452 pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
453 break;
454 case 5: //NETWORK
455 pt_info->e_card_state = QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS;
456 break;
457 default:
458 pt_info->e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
459 break;
460 }
461 }
462
463 err = mbtk_sim_type_get(qser_info_handle, &sim_card_type);
464 if(err)
465 {
466 LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
467 return QSER_RESULT_FAIL;
468 }
469 else
470 {
471 if(sim_card_type == 0 || sim_card_type == 2)
472 pt_info->e_card_type = QSER_SIM_CARD_TYPE_ICC;
473 else if(sim_card_type == 1 || sim_card_type == 3)
474 pt_info->e_card_type = QSER_SIM_CARD_TYPE_UICC;
475 else
476 pt_info->e_card_type = QSER_SIM_CARD_TYPE_UNKNOWN;
477 }
478
479 err = mbtk_sim_lock_retry_times_get(qser_info_handle, &qser_last_times);
480 if(err)
481 {
482 LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
483 return QSER_RESULT_FAIL;
484 }
485 else
486 {
487 pt_info->card_app_info.app_3gpp.pin1_num_retries = qser_last_times.p1_retry;
488 pt_info->card_app_info.app_3gpp.pin2_num_retries = qser_last_times.p2_retry;
489 pt_info->card_app_info.app_3gpp.puk1_num_retries = qser_last_times.puk1_retry;
490 pt_info->card_app_info.app_3gpp.puk2_num_retries = qser_last_times.puk2_retry;
491 }
492
493 return QSER_RESULT_SUCCESS;
494}
495
496int qser_sim_getimei(sim_client_handle_type h_sim, char *imei)
497{
498 //UNUSED(h_sim);
499 //UNUSED(imei);
500
501 if(h_sim != qser_h_sim)
502 {
503 LOGE("[qser_sim] h_sim is error.");
504 return QSER_RESULT_FAIL;
505 }
506
507 if(qser_info_handle == NULL)
508 {
509 LOGE("[qser_sim] handle is NULL.");
510 return QSER_RESULT_FAIL;
511 }
512
513 if(imei == NULL)
514 {
515 LOGE("[qser_sim] imei is NULL.");
516 return QSER_RESULT_FAIL;
517 }
518
519 int err = mbtk_imei_get(qser_info_handle, imei);
520 if(err)
521 {
522 LOGE("[qser_sim] mbtk_imei_get Error : %d\n", err);
523 return QSER_RESULT_FAIL;
524 }
525 return QSER_RESULT_SUCCESS;
526}
527
528int qser_get_imei_and_sv(sim_client_handle_type h_sim,char *imei, char*sv)
529{
530 //UNUSED(h_sim);
531 //UNUSED(imei);
532 //UNUSED(sv);
533 if(h_sim != qser_h_sim)
534 {
535 LOGE("[qser_sim] h_sim is error.");
536 return QSER_RESULT_FAIL;
537 }
538
539 if(qser_info_handle == NULL)
540 {
541 LOGE("[qser_sim] handle is NULL.");
542 return QSER_RESULT_FAIL;
543 }
544
545 if(imei == NULL || sv == NULL)
546 {
547 LOGE("[qser_sim] param is NULL.");
548 return QSER_RESULT_FAIL;
549 }
550
551 int err = mbtk_imei_get(qser_info_handle, imei);
552 if(err)
553 {
554 LOGE("[qser_sim] mbtk_imei_get Error: %d\n", err);
555 return QSER_RESULT_FAIL;
556 }
557
558 memcpy(sv, QSER_IMEI_SV_VERSION, strlen(QSER_IMEI_SV_VERSION));
559
560 return QSER_RESULT_SUCCESS;
561}
562
563int qser_reset_modem(sim_client_handle_type h_sim)
564{
565 //UNUSED(h_sim);
566
567 if(h_sim != qser_h_sim)
568 {
569 LOGE("[qser_sim] h_sim is error.");
570 return QSER_RESULT_FAIL;
571 }
572
573 if(qser_info_handle == NULL)
574 {
575 LOGE("[qser_sim] handle is NULL.");
576 return QSER_RESULT_FAIL;
577 }
578
579 for(int cid =0; cid < MBTK_APN_CID_MAX; cid++)
580 {
581 mbtk_data_call_stop(qser_info_handle, cid, 1);
582 }
583
584 mbtk_radio_state_enum radio = MBTK_RADIO_STATE_MINI_FUNC;
585 int reset = 0;
586 int err = mbtk_radio_state_set(qser_info_handle, radio, reset);
587
588 if(err)
589 {
590 LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
591 return QSER_RESULT_FAIL;
592 }
593
594 radio = MBTK_RADIO_STATE_FULL_FUNC;
595 err = mbtk_radio_state_set(qser_info_handle, radio, reset);
596 if(err)
597 {
598 LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
599 return QSER_RESULT_FAIL;
600 }
601 return QSER_RESULT_SUCCESS;
602}
603
604int qser_get_version(sim_client_handle_type h_sim, char *buf)
605{
606 //UNUSED(h_sim);
607 //UNUSED(buf);
608
609 if(h_sim != qser_h_sim)
610 {
611 LOGE("[qser_sim] h_sim is error.");
612 return QSER_RESULT_FAIL;
613 }
614
615 if(qser_info_handle == NULL)
616 {
617 LOGE("[qser_sim] handle is NULL.");
618 return QSER_RESULT_FAIL;
619 }
620
621 if(buf == NULL)
622 {
623 LOGE("[qser_sim] buf is NULL.");
624 return QSER_RESULT_FAIL;
625 }
626
627 int err = mbtk_version_get(qser_info_handle, buf);
628 if(err)
629 {
630 LOGE("[qser_sim] mbtk_version_get Error : %d\n", err);
631 return QSER_RESULT_FAIL;
632 }
633 return QSER_RESULT_SUCCESS;
634}
635
636int qser_reset_sim(sim_client_handle_type h_sim)
637{
638 //UNUSED(h_sim);
639
640 if(h_sim != qser_h_sim)
641 {
642 LOGE("[qser_sim] h_sim is error.");
643 return QSER_RESULT_FAIL;
644 }
645
646 if(qser_info_handle == NULL)
647 {
648 LOGE("[qser_sim] handle is NULL.");
649 return QSER_RESULT_FAIL;
650 }
651
652 mbtk_radio_state_enum radio = MBTK_RADIO_STATE_DIS_SIM;
653 int reset = 0;
654 int err = mbtk_radio_state_set(qser_info_handle, radio, reset);
655 if(err)
656 {
657 LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
658 return QSER_RESULT_FAIL;
659 }
660
661 radio = MBTK_RADIO_STATE_FULL_FUNC;
662 err = mbtk_radio_state_set(qser_info_handle, radio, reset);
663 if(err)
664 {
665 LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
666 return QSER_RESULT_FAIL;
667 }
668 return QSER_RESULT_SUCCESS;
669}
670
671int qser_sim_addrxmsghandler(QSER_SIM_RxMsgHandlerFunc_t handlerPtr)
672{
673 if(qser_info_handle == NULL)
674 {
675 LOGE("[qser_sim] handle is NULL.");
676 return QSER_RESULT_FAIL;
677 }
678
679 if(handlerPtr == NULL)
680 {
681 LOGE("[qser_sim] param is NULL.");
682 qser_sim_state_cb = NULL;
683 return QSER_RESULT_SUCCESS;
684 }
685
686 qser_sim_state_cb = handlerPtr;
687 if(!qser_sim_cb_state)
688 {
689 int ret = mbtk_sim_state_change_cb_reg(qser_sim_state_change_cb);
690 if(ret != 0)
691 {
692 LOGE("[qser_sim] set cb fail.");
693 qser_sim_state_cb = NULL;
694 return QSER_RESULT_FAIL;
695 }
696 }
697
698 return QSER_RESULT_SUCCESS;
699}
700
701
702int qser_sim_client_deinit(sim_client_handle_type h_sim)
703{
704 if(h_sim != qser_h_sim)
705 {
706 LOGE("[qser_sim] h_sim is error.");
707 return QSER_RESULT_FAIL;
708 }
709
710 if(qser_info_handle)
711 {
712 int ret = mbtk_ril_close(MBTK_AT_PORT_DEF);;
713 if(ret)
714 {
715 LOGE("[qser_sim] mbtk_info_handle_free() fail.");
716 return QSER_RESULT_FAIL;
717 }
718 else
719 {
720 qser_info_handle = NULL;
721 qser_sim_state_cb = NULL;
722 }
723 }
724 else
725 {
726 LOGE("[qser_sim] handle not inited.");
727 return QSER_RESULT_FAIL;
728 }
729
730 return QSER_RESULT_SUCCESS;
731}
732
733
734/****************************API***************************************/
735