FreeCalypso > hg > fc-magnetite
comparison src/aci2/aci/cmh_cphs.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:c41a534f33c6 | 3:93999a60b835 |
---|---|
1 /* | |
2 +--------------------------------------------------------------------+ | |
3 | PROJECT: $Workfile:: cmh_cphs.c $| | |
4 | $Author:: $Revision:: $| | |
5 | CREATED: $Modtime:: $| | |
6 | STATE : code | | |
7 +--------------------------------------------------------------------+ | |
8 | |
9 MODULE : CMH | |
10 | |
11 PURPOSE : CPHS related ACI functions. | |
12 */ | |
13 | |
14 #ifdef FF_CPHS | |
15 | |
16 | |
17 #ifndef CMH_CPHS_C | |
18 #define CMH_CPHS_C | |
19 | |
20 #include "aci_all.h" | |
21 #include "aci_cmh.h" | |
22 #include "psa.h" | |
23 #include "cmh.h" | |
24 | |
25 #include "cphs.h" | |
26 #include "aci_cphs.h" | |
27 | |
28 #include "ksd.h" | |
29 #include "cmh_ss.h" | |
30 | |
31 #include "phb.h" | |
32 #include "cmh_phb.h" | |
33 | |
34 typedef enum | |
35 { | |
36 CMN_FULL_PRSNT, /* all parameter present */ | |
37 CMN_PRTLY_PRSNT, /* only some parameter present */ | |
38 CMN_NOT_PRSNT /* no parameter present */ | |
39 } | |
40 T_CPHS_MB_CMH_CMN_STAT; | |
41 | |
42 typedef enum | |
43 { | |
44 SNGL_VLD_PRSNT, /* parameter is present and in valid range */ | |
45 SNGL_INVLD_PRSNT, /* parameter is present and not in valid range */ | |
46 SNGL_NOT_PRSNT /* parameter is not present */ | |
47 } | |
48 T_CPHS_MB_CMH_SNGL_STAT; | |
49 | |
50 typedef struct CPHSShrdParm | |
51 { | |
52 T_ACI_CMD_SRC srcId; | |
53 | |
54 } T_CPHS_SHRD_PRM; | |
55 | |
56 LOCAL T_CPHS_SHRD_PRM cphsShrdPrm; | |
57 | |
58 /* | |
59 +--------------------------------------------------------------------+ | |
60 | PROJECT : GSM-PS (6147) MODULE : CMH_CPHS | | |
61 | STATE : code ROUTINE : cmhCPHS_user_cb | | |
62 +--------------------------------------------------------------------+ | |
63 | |
64 PURPOSE : This is the callback used by the CPHS module to inform ACI | |
65 of the result of an asynchroneous operation. | |
66 */ | |
67 GLOBAL void cmhCPHS_user_cb( T_CPHS_PARAMS *params ) | |
68 { | |
69 T_ACI_CMD_SRC cphsId = cphsShrdPrm.srcId; | |
70 int i; | |
71 T_ACI_AT_CMD cmd_id; | |
72 BOOL final_result = FALSE; | |
73 | |
74 /* Deal with Final Results */ | |
75 switch(params->cb_type) | |
76 { | |
77 case(CPHS_INIT_RES): | |
78 cmd_id = AT_CMD_CPHS; | |
79 final_result = TRUE; | |
80 break; | |
81 | |
82 case(CPHS_VOICE_MAIL_RES): | |
83 cmd_id = AT_CMD_CPVWI; | |
84 final_result = TRUE; | |
85 break; | |
86 | |
87 case(CPHS_CFU_RES): | |
88 cmd_id = AT_CMD_CPCFU; | |
89 final_result = TRUE; | |
90 break; | |
91 } | |
92 | |
93 if(final_result) | |
94 { | |
95 if(params->operation_result EQ CPHS_OK) | |
96 { | |
97 R_AT( RAT_OK, cphsId ) | |
98 ( AT_CMD_CPHS ); | |
99 } | |
100 else | |
101 { | |
102 R_AT( RAT_CME, cphsId ) | |
103 ( AT_CMD_CPHS, CME_ERR_NotPresent ); | |
104 } | |
105 | |
106 /* reset cphsId */ | |
107 cphsShrdPrm.srcId = CMD_SRC_NONE; | |
108 return; | |
109 } | |
110 | |
111 | |
112 | |
113 /* Deal with Unsolicited Messages */ | |
114 switch(params->cb_type) | |
115 { | |
116 case(CPHS_VOICE_MAIL_IND): | |
117 for (i=0; i < CMD_SRC_MAX; i++) | |
118 { | |
119 R_AT( RAT_CPVWI, i ) (params->set_flag, params->line); | |
120 } | |
121 return; | |
122 | |
123 case(CPHS_ROAM_IND): | |
124 for (i=0; i < CMD_SRC_MAX; i++) | |
125 { | |
126 R_AT( RAT_CPROAM, i ) (params->set_flag); | |
127 } | |
128 return; | |
129 } | |
130 } | |
131 | |
132 /* | |
133 +--------------------------------------------------------------------+ | |
134 | PROJECT : GSM-F&D (8411) MODULE : CMH_CPHS | | |
135 | STATE : code ROUTINE : cmhCPHS_convertSimTag | | |
136 +--------------------------------------------------------------------+ | |
137 | |
138 PURPOSE : This function converts the actual tag string in the | |
139 format used when storing it on the SIM. | |
140 */ | |
141 LOCAL void cmhCPHS_convertSimTag ( T_CPHS_PB_TEXT* inTag, | |
142 UBYTE* outTag, | |
143 UBYTE* outTagLen, | |
144 UBYTE maxOutLen ) | |
145 { | |
146 UBYTE i = MINIMUM ( maxOutLen, inTag->len); | |
147 SHORT restLen = maxOutLen - inTag->len; | |
148 UBYTE j; | |
149 | |
150 /* | |
151 *----------------------------------------------------------------- | |
152 * Convert from internal GSM to default GSM alphabet | |
153 *----------------------------------------------------------------- | |
154 */ | |
155 for ( j = 0; j < i; j++ ) | |
156 outTag[j] = inTag->data[j]; | |
157 | |
158 *outTagLen = i; | |
159 | |
160 if ( restLen > 0 ) | |
161 memset ( &outTag[i], NOT_PRESENT_8BIT, restLen); | |
162 } | |
163 | |
164 /* | |
165 +----------------------------------------------------------------------+ | |
166 | PROJECT : GSM-F&D (8411) MODULE : CMH_CPHS | | |
167 | STATE : code ROUTINE : cmhCPHS_add_mb_record| | |
168 +----------------------------------------------------------------------+ | |
169 | |
170 PURPOSE : %CPMBW: write mailbox numbers to ME cache and SIM | |
171 */ | |
172 | |
173 LOCAL T_ACI_RETURN cmhCPHS_add_mb_record( T_ACI_CMD_SRC srcId, | |
174 T_CPHS_MB_CMH_SNGL_STAT indexStat, | |
175 T_CPHS_PB_TEXT* text, | |
176 CHAR* number, | |
177 T_ACI_TOA* type, | |
178 SHORT index) | |
179 { | |
180 | |
181 T_PHB_RECORD entry; /* reuse of phonebook type */ | |
182 | |
183 | |
184 CHAR *pNumber = NULL; /* pointer to the number that will be saved */ | |
185 T_CPHS_RET cphs_ret; | |
186 | |
187 memset(&entry,0,sizeof(T_PHB_RECORD)); | |
188 | |
189 TRACE_FUNCTION ("cmhCPHS_add_mb_record()"); | |
190 | |
191 switch ( indexStat ) | |
192 { | |
193 case ( SNGL_NOT_PRSNT ): | |
194 case ( SNGL_VLD_PRSNT ): | |
195 { | |
196 /* fill in the structure elements */ | |
197 | |
198 /* process the <index> */ | |
199 #ifdef TI_PS_FFS_PHB | |
200 entry.phy_recno = ( indexStat EQ SNGL_NOT_PRSNT ? | |
201 0 : ( UBYTE ) index ); | |
202 #else | |
203 entry.index = ( indexStat EQ SNGL_NOT_PRSNT ? | |
204 0 : ( UBYTE ) index ); | |
205 #endif | |
206 | |
207 /* process the <tag> */ | |
208 if (text NEQ NULL) | |
209 { | |
210 if (text->len > PHB_MAX_TAG_LEN) | |
211 { | |
212 TRACE_FUNCTION_P2("ERROR: text length (%d) > max tag length (%d)", | |
213 text->len, PHB_MAX_TAG_LEN); | |
214 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_TxtToLong ); | |
215 return (AT_FAIL); | |
216 } | |
217 cmhCPHS_convertSimTag( text, entry.tag, &(entry.tag_len), | |
218 (UBYTE)PHB_MAX_TAG_LEN ); | |
219 } | |
220 | |
221 /* calculate the TON/NPI field */ | |
222 entry.ton_npi = PHB_TONPI_NO_DIAL; | |
223 pNumber = number; | |
224 | |
225 if ( type EQ NULL ) | |
226 { | |
227 cmhPHB_ksdDecodeToa(number, &pNumber, &entry); | |
228 } | |
229 else | |
230 { | |
231 cmhPHB_toaMrg ( type, &entry.ton_npi ); | |
232 } | |
233 | |
234 /* process the <number>, convert to BCD */ | |
235 if ( pNumber NEQ NULL) | |
236 { | |
237 cmhPHB_getAdrBcd ( entry.number, &entry.len, | |
238 PHB_PACKED_NUM_LEN, pNumber ); | |
239 } | |
240 /*********************/ | |
241 /* update the record */ | |
242 /*********************/ | |
243 | |
244 /* in SIM & Cache */ | |
245 cphs_ret = cphs_write_mb_number(srcId, | |
246 #ifdef TI_PS_FFS_PHB | |
247 (UBYTE)entry.phy_recno, | |
248 #else | |
249 entry.index, | |
250 #endif | |
251 entry.tag, | |
252 entry.tag_len, | |
253 entry.len, | |
254 entry.number, | |
255 entry.ton_npi); | |
256 | |
257 /* map return value */ | |
258 switch (cphs_ret) | |
259 { | |
260 case CPHS_EXEC: | |
261 return (AT_EXCT); | |
262 case CPHS_OK: | |
263 return (AT_CMPL); | |
264 case CPHS_NOT_INIT: | |
265 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
266 return (AT_FAIL); | |
267 case CPHS_BUSY: | |
268 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimBusy ); | |
269 return (AT_FAIL); | |
270 case CPHS_FAIL: | |
271 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_TxtToLong ); | |
272 return (AT_FAIL); | |
273 default: | |
274 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown ); | |
275 return (AT_FAIL); | |
276 } | |
277 } | |
278 | |
279 case ( SNGL_INVLD_PRSNT ): | |
280 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
281 return( AT_FAIL ); | |
282 } | |
283 return(AT_FAIL); | |
284 } | |
285 | |
286 | |
287 /* | |
288 +--------------------------------------------------------------------+ | |
289 | PROJECT : GSM-PS (6147) MODULE : CMH_CPHS | | |
290 | STATE : code ROUTINE : sAT_PercentCPHS | | |
291 +--------------------------------------------------------------------+ | |
292 | |
293 PURPOSE : This is the functional counterpart to the %CPHS AT command | |
294 which is responsible for initialise/close/refresh the CPHS module. | |
295 */ | |
296 | |
297 GLOBAL T_ACI_RETURN sAT_PercentCPHS( T_ACI_CMD_SRC srcId, | |
298 T_ACI_CPHS_INIT init_cphs ) | |
299 { | |
300 T_CPHS_RET cphs_ret = CPHS_FAIL; | |
301 | |
302 TRACE_FUNCTION ("sAT_PercentCPHS"); | |
303 | |
304 /* check command source */ | |
305 if(!cmh_IsVldCmdSrc (srcId)) | |
306 { | |
307 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
308 return( AT_FAIL ); | |
309 } | |
310 | |
311 /* check parameter <init_cphs> */ | |
312 switch(init_cphs) | |
313 { | |
314 case(ACI_CPHS_CLOSE): | |
315 cphs_ret = cphs_stop( ); | |
316 break; | |
317 | |
318 case(ACI_CPHS_INIT): | |
319 cphs_ret = cphs_start( cmhCPHS_user_cb ); | |
320 break; | |
321 | |
322 case(ACI_CPHS_REFRESH): | |
323 cphs_ret = cphs_refresh_data( ); | |
324 break; | |
325 | |
326 default: | |
327 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
328 break; | |
329 } | |
330 | |
331 switch(cphs_ret) | |
332 { | |
333 case(CPHS_OK): | |
334 return(AT_CMPL); | |
335 | |
336 case(CPHS_EXEC): | |
337 cphsShrdPrm.srcId = srcId; | |
338 return(AT_EXCT); | |
339 | |
340 case(CPHS_BUSY): | |
341 return(AT_BUSY); | |
342 | |
343 default: | |
344 return(AT_FAIL); | |
345 } | |
346 } | |
347 | |
348 | |
349 GLOBAL T_ACI_RETURN qAT_PercentCPHS( T_ACI_CMD_SRC srcId, | |
350 T_ACI_CPHS_INIT *init_cphs ) | |
351 { | |
352 T_CPHS_RET cphs_ret; | |
353 | |
354 TRACE_FUNCTION ("qAT_PercentCPHS"); | |
355 | |
356 /* check command source */ | |
357 if(!cmh_IsVldCmdSrc (srcId)) | |
358 { | |
359 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
360 return( AT_FAIL ); | |
361 } | |
362 | |
363 cphs_ret = cphs_check_status( ); | |
364 | |
365 switch(cphs_ret) | |
366 { | |
367 case(CPHS_OK): | |
368 *init_cphs = ACI_CPHS_INIT; | |
369 break; | |
370 | |
371 case(CPHS_BUSY): | |
372 *init_cphs = ACI_CPHS_BUSY; | |
373 break; | |
374 | |
375 case(CPHS_NOT_INIT): | |
376 *init_cphs = ACI_CPHS_CLOSE; | |
377 break; | |
378 } | |
379 | |
380 return( AT_CMPL ); | |
381 } | |
382 | |
383 /* | |
384 +--------------------------------------------------------------------+ | |
385 | PROJECT : GSM-PS (6147) MODULE : CMH_CPHS | | |
386 | STATE : code ROUTINE : sAT_PercentCPNUMS | | |
387 +--------------------------------------------------------------------+ | |
388 | |
389 PURPOSE : This is the functional counterpart to the %CPNUMS AT command | |
390 which is responsible for managing the CPHS information numbers feature. | |
391 */ | |
392 | |
393 LOCAL T_ACI_RETURN cmhCPHS_get_info_number_element( T_ACI_CMD_SRC srcId, | |
394 UBYTE element_id ) | |
395 { | |
396 T_CPHS_RET cphs_ret; | |
397 T_CPHS_INF_NUM info_number; /* dynamic ??? */ | |
398 | |
399 TRACE_FUNCTION ("cmhCPHS_get_info_number_element( )"); | |
400 | |
401 cphs_ret = cphs_read_info_nb (element_id, &info_number); | |
402 | |
403 if(cphs_ret NEQ CPHS_OK) | |
404 { | |
405 TRACE_ERROR("cmhCPHS_get_info_number_element: unexpected error"); | |
406 return(AT_FAIL); | |
407 } | |
408 | |
409 R_AT( RAT_CPNUMS, srcId ) | |
410 (element_id, | |
411 info_number.index_level, | |
412 info_number.alpha_tag, | |
413 info_number.number, | |
414 info_number.premium_flag, | |
415 info_number.network_flag, | |
416 info_number.type_of_address); | |
417 | |
418 return(AT_CMPL); | |
419 } | |
420 | |
421 LOCAL T_ACI_RETURN cmhCPHS_get_folder_elements( T_ACI_CMD_SRC srcId, | |
422 UBYTE element_id ) | |
423 { | |
424 T_CPHS_RET cphs_ret; | |
425 UBYTE *info_nums_list; | |
426 UBYTE list_size; | |
427 UBYTE i; | |
428 T_ACI_RETURN ret; | |
429 | |
430 TRACE_FUNCTION ("cmhCPHS_get_folder_elements( )"); | |
431 | |
432 list_size = 10; /* first try with 10 entries */ | |
433 MALLOC(info_nums_list, list_size); | |
434 cphs_ret = cphs_explore_info_nbs(element_id, info_nums_list, &list_size); | |
435 | |
436 TRACE_EVENT_P3("cphs_ret: %d, info_nums_list: %s, list_size: %d", cphs_ret, info_nums_list, list_size); | |
437 | |
438 switch(cphs_ret) | |
439 { | |
440 case(CPHS_OK): | |
441 if((*info_nums_list EQ 0) AND (list_size NEQ 0)) | |
442 { | |
443 TRACE_EVENT_P1("Folder element %d is empty", element_id); | |
444 return(CPHS_FAIL); | |
445 } | |
446 break; | |
447 | |
448 case(CPHS_EXEC): | |
449 /* list was too small: size needed has been written in list_size */ | |
450 TRACE_EVENT_P1("List was too small: needed: %d bytes", list_size); | |
451 MFREE(info_nums_list); | |
452 | |
453 MALLOC(info_nums_list, list_size); | |
454 cphs_ret = cphs_explore_info_nbs(element_id, info_nums_list, &list_size); | |
455 | |
456 if(cphs_ret NEQ CPHS_OK) | |
457 { | |
458 TRACE_ERROR("cmhCPHS_get_folder_elements: unexpected error"); | |
459 MFREE(info_nums_list); | |
460 return(AT_FAIL); | |
461 } | |
462 break; | |
463 | |
464 default: | |
465 MFREE(info_nums_list); | |
466 return(AT_FAIL); | |
467 } | |
468 | |
469 /* Get all elements of folder and send to user */ | |
470 for(i=0;i<list_size;i++) | |
471 { | |
472 ret = cmhCPHS_get_info_number_element(srcId, info_nums_list[i]); | |
473 | |
474 if(ret NEQ AT_CMPL) | |
475 { | |
476 TRACE_EVENT_P1("Wrong Information Number: index ignored: %d...", info_nums_list[i]); | |
477 } | |
478 } | |
479 MFREE(info_nums_list); | |
480 return(AT_CMPL); | |
481 } | |
482 | |
483 GLOBAL T_ACI_RETURN sAT_PercentCPNUMS( T_ACI_CMD_SRC srcId, | |
484 UBYTE element_id, | |
485 UBYTE mode ) | |
486 { | |
487 T_ACI_RETURN ret; | |
488 | |
489 TRACE_FUNCTION ("sAT_PercentCPNUMS"); | |
490 | |
491 TRACE_EVENT_P1("elemt: %d", element_id); | |
492 | |
493 /* check command source */ | |
494 if(!cmh_IsVldCmdSrc (srcId)) | |
495 { | |
496 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
497 return( AT_FAIL ); | |
498 } | |
499 | |
500 /* check parameter <mode> */ | |
501 switch(mode) | |
502 { | |
503 case(CPNUMS_MODE_EXPLORE): | |
504 TRACE_EVENT_P1("CPNUMS mode exploring: folder: %d", element_id); | |
505 return(cmhCPHS_get_folder_elements(srcId, element_id)); | |
506 | |
507 case(CPNUMS_MODE_QUERY): | |
508 TRACE_EVENT_P1("CPNUMS mode querying: element: %d", element_id); | |
509 | |
510 ret = cmhCPHS_get_info_number_element(srcId, element_id); | |
511 | |
512 if(ret NEQ AT_CMPL) | |
513 { | |
514 TRACE_ERROR("sAT_PercentCPNUMS: unexpected error"); | |
515 return(AT_FAIL); | |
516 } | |
517 return(AT_CMPL); | |
518 | |
519 default: | |
520 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
521 return(AT_FAIL); | |
522 } | |
523 } | |
524 | |
525 /* returns whole table */ | |
526 GLOBAL T_ACI_RETURN tAT_PercentCPNUMS( T_ACI_CMD_SRC srcId ) | |
527 { | |
528 T_CPHS_RET cphs_ret; | |
529 T_ACI_RETURN ret; | |
530 UBYTE i; | |
531 UBYTE max_index; | |
532 | |
533 TRACE_FUNCTION ("tAT_PercentCPNUMS"); | |
534 | |
535 /* check command source */ | |
536 if(!cmh_IsVldCmdSrc (srcId)) | |
537 { | |
538 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
539 return( AT_FAIL ); | |
540 } | |
541 | |
542 cphs_ret = cphs_info_num_get_max(&max_index); | |
543 | |
544 if(cphs_ret NEQ CPHS_OK) | |
545 { | |
546 return(AT_FAIL); | |
547 } | |
548 | |
549 for(i=1; i<(max_index+1); i++) | |
550 { | |
551 ret = cmhCPHS_get_info_number_element(srcId, i); | |
552 | |
553 if(ret NEQ AT_CMPL) | |
554 { | |
555 return(AT_FAIL); | |
556 } | |
557 } | |
558 return( AT_CMPL ); | |
559 } | |
560 | |
561 /* | |
562 +--------------------------------------------------------------------+ | |
563 | PROJECT : GSM-PS (6147) MODULE : CMH_CPHS | | |
564 | STATE : code ROUTINE : qAT_PercentCPALS | | |
565 +--------------------------------------------------------------------+ | |
566 | |
567 PURPOSE : This is the functional counterpart to the %CPALS AT command | |
568 which is responsible for managing the CPHS alternate line service feature. | |
569 */ | |
570 | |
571 GLOBAL T_ACI_RETURN qAT_PercentCPALS( T_ACI_CMD_SRC srcId, | |
572 UBYTE call_id, | |
573 T_CPHS_LINES *line, | |
574 CHAR *line_desc, | |
575 UBYTE *max_line_desc) | |
576 { | |
577 TRACE_FUNCTION ("qAT_PercentCPALS"); | |
578 | |
579 /* check command source */ | |
580 if(!cmh_IsVldCmdSrc (srcId)) | |
581 { | |
582 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
583 return( AT_FAIL ); | |
584 } | |
585 | |
586 return(cphs_get_line((UBYTE)srcId, call_id, line, line_desc, max_line_desc)); | |
587 } | |
588 | |
589 /* | |
590 +--------------------------------------------------------------------+ | |
591 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
592 | STATE : code ROUTINE : AT_PercentCPVWI | | |
593 +--------------------------------------------------------------------+ | |
594 | |
595 PURPOSE : %CPVWI: set/clear/query voice message waiting flags | |
596 */ | |
597 | |
598 GLOBAL T_ACI_RETURN sAT_PercentCPVWI( T_ACI_CMD_SRC srcId, | |
599 UBYTE flag_set, | |
600 USHORT lines) | |
601 { | |
602 T_CPHS_RET cphs_ret = AT_CMPL; | |
603 | |
604 TRACE_FUNCTION ("sAT_PercentCPVWI()"); | |
605 | |
606 /* check command source */ | |
607 if(!cmh_IsVldCmdSrc (srcId)) | |
608 { | |
609 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
610 return( AT_FAIL ); | |
611 } | |
612 | |
613 /* check parameter <flag_set> */ | |
614 switch(flag_set) | |
615 { | |
616 case(CPHS_SET_WAITING_FLAG): | |
617 case(CPHS_ERASE_WAITING_FLAG): | |
618 cphs_ret = cphs_set_waiting_flag(flag_set, lines); | |
619 break; | |
620 | |
621 default: | |
622 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
623 return(AT_FAIL); | |
624 } | |
625 | |
626 switch(cphs_ret) | |
627 { | |
628 case(CPHS_EXEC): | |
629 cphsShrdPrm.srcId = srcId; | |
630 return(AT_EXCT); | |
631 | |
632 case(CPHS_BUSY): | |
633 return(AT_BUSY); | |
634 | |
635 default: | |
636 return(AT_FAIL); | |
637 } | |
638 } | |
639 | |
640 | |
641 GLOBAL T_ACI_RETURN qAT_PercentCPVWI( T_ACI_CMD_SRC srcId, | |
642 UBYTE *flag_set, | |
643 USHORT line) | |
644 { | |
645 T_CPHS_RET cphs_ret; | |
646 | |
647 TRACE_FUNCTION ("qAT_PercentCPVWI()"); | |
648 | |
649 /* check command source */ | |
650 if(!cmh_IsVldCmdSrc (srcId)) | |
651 { | |
652 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
653 return( AT_FAIL ); | |
654 } | |
655 | |
656 cphs_ret = cphs_get_waiting_flag(flag_set, line); | |
657 | |
658 switch(cphs_ret) | |
659 { | |
660 case(CPHS_OK): | |
661 return(AT_CMPL); | |
662 | |
663 case(CPHS_BUSY): | |
664 *flag_set = CPHS_FLAG_ERROR; | |
665 return(AT_BUSY); | |
666 | |
667 default: | |
668 *flag_set = CPHS_FLAG_ERROR; | |
669 return(AT_FAIL); | |
670 } | |
671 | |
672 } | |
673 | |
674 | |
675 /* | |
676 +--------------------------------------------------------------------+ | |
677 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
678 | STATE : code ROUTINE : AT_PercentCPOPN | | |
679 +--------------------------------------------------------------------+ | |
680 | |
681 PURPOSE : %CPOPN: query operator name long and short string | |
682 */ | |
683 | |
684 GLOBAL T_ACI_RETURN qAT_PercentCPOPN( T_ACI_CMD_SRC srcId, | |
685 CHAR *longname, | |
686 UBYTE *max_longname, | |
687 CHAR *shortname, | |
688 UBYTE *max_shortname) | |
689 { | |
690 T_CPHS_RET cphs_ret; | |
691 | |
692 TRACE_FUNCTION ("qAT_PercentCPOPN()"); | |
693 | |
694 /* check command source */ | |
695 if(!cmh_IsVldCmdSrc (srcId)) | |
696 { | |
697 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
698 return( AT_FAIL ); | |
699 } | |
700 | |
701 cphs_ret = cphs_get_opn( longname, max_longname, shortname, max_shortname); | |
702 | |
703 switch(cphs_ret) | |
704 { | |
705 case(CPHS_OK): | |
706 return(AT_CMPL); | |
707 | |
708 default: | |
709 return(AT_FAIL); | |
710 } | |
711 } | |
712 | |
713 /* | |
714 +--------------------------------------------------------------------+ | |
715 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
716 | STATE : code ROUTINE : AT_PercentCPINF | | |
717 +--------------------------------------------------------------------+ | |
718 | |
719 PURPOSE : %CPINF: write CSP ( Customer Service Profile ) | |
720 */ | |
721 | |
722 GLOBAL T_ACI_RETURN sAT_PercentCPINF( T_ACI_CMD_SRC srcId, | |
723 UBYTE *csp, | |
724 UBYTE csp_len) | |
725 { | |
726 UBYTE phase; | |
727 USHORT sst; | |
728 T_CPHS_RET cphs_ret; | |
729 | |
730 TRACE_FUNCTION ("sAT_PercentCPINF()"); | |
731 | |
732 /* check command source */ | |
733 if(!cmh_IsVldCmdSrc (srcId)) | |
734 { | |
735 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
736 return( AT_FAIL ); | |
737 } | |
738 | |
739 cphs_ret = cphs_get_cphs_info(&phase, &sst); | |
740 | |
741 if ( cphs_ret EQ CPHS_OK) | |
742 { | |
743 if ( CPHS_CHECK_SST(sst, CPHS_SERVICE_CSP, CPHS_SERVICE_ACTIVATED) ) | |
744 { | |
745 cphs_ret = cphs_set_csp_value(srcId, csp, csp_len); | |
746 } | |
747 else | |
748 { | |
749 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
750 return (AT_FAIL); | |
751 } | |
752 } | |
753 | |
754 switch (cphs_ret) | |
755 { | |
756 case CPHS_EXEC: | |
757 return (AT_EXCT); | |
758 case CPHS_OK: | |
759 return (AT_CMPL); | |
760 case CPHS_BUSY: | |
761 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimBusy ); | |
762 return (AT_FAIL); | |
763 default: | |
764 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
765 return (AT_FAIL); | |
766 } | |
767 } | |
768 | |
769 /* | |
770 +--------------------------------------------------------------------+ | |
771 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
772 | STATE : code ROUTINE : AT_PercentCPINF | | |
773 +--------------------------------------------------------------------+ | |
774 | |
775 PURPOSE : %CPINF: query cphs information and customer service profile | |
776 */ | |
777 | |
778 GLOBAL T_ACI_RETURN qAT_PercentCPINF( T_ACI_CMD_SRC srcId, | |
779 UBYTE *phase, | |
780 USHORT *sst, | |
781 CHAR *csp, | |
782 CHAR *csp2, | |
783 UBYTE *max_csp_size, | |
784 UBYTE *max_csp2_size) | |
785 { | |
786 T_CPHS_RET cphs_ret; | |
787 | |
788 TRACE_FUNCTION ("qAT_PercentCPINF()"); | |
789 | |
790 /* check command source */ | |
791 if(!cmh_IsVldCmdSrc (srcId)) | |
792 { | |
793 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
794 return( AT_FAIL ); | |
795 } | |
796 | |
797 cphs_ret = cphs_get_cphs_info(phase, sst); | |
798 | |
799 if ( cphs_ret EQ CPHS_OK) | |
800 { | |
801 if ( CPHS_CHECK_SST(*sst, CPHS_SERVICE_CSP, CPHS_SERVICE_ACTIVATED) ) | |
802 { | |
803 cphs_ret = cphs_get_csprof( csp, csp2, max_csp_size, max_csp2_size); | |
804 } | |
805 else | |
806 { | |
807 TRACE_EVENT("CSP is not activated in the SST"); | |
808 *max_csp_size = 0; | |
809 *max_csp2_size = 0; | |
810 } | |
811 } | |
812 else | |
813 { | |
814 *max_csp_size = 0; | |
815 *max_csp2_size = 0; | |
816 } | |
817 | |
818 switch(cphs_ret) | |
819 { | |
820 case(CPHS_OK): | |
821 return(AT_CMPL); | |
822 | |
823 default: | |
824 return(AT_FAIL); | |
825 } | |
826 } | |
827 | |
828 /* | |
829 +--------------------------------------------------------------------+ | |
830 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
831 | STATE : code ROUTINE : sAT_PercentCPCFU | | |
832 +--------------------------------------------------------------------+ | |
833 | |
834 PURPOSE : %CPFCU: set call forwarding flags | |
835 */ | |
836 | |
837 GLOBAL T_ACI_RETURN sAT_PercentCPCFU( T_ACI_CMD_SRC srcId, | |
838 UBYTE cfu_set, | |
839 T_CPHS_LINES lines ) | |
840 { | |
841 T_CPHS_RET cphs_ret; | |
842 | |
843 TRACE_FUNCTION ("sAT_PercentCPCFU()"); | |
844 | |
845 /* check command source */ | |
846 if(!cmh_IsVldCmdSrc (srcId)) | |
847 { | |
848 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
849 return( AT_FAIL ); | |
850 } | |
851 | |
852 /* check parameter <cfu_set> */ | |
853 switch(cfu_set) | |
854 { | |
855 case(CPHS_SET_CFU_FLAG): | |
856 case(CPHS_ERASE_CFU_FLAG): | |
857 cphs_ret = cphs_set_cfu_flag(cfu_set, lines); | |
858 break; | |
859 | |
860 default: | |
861 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
862 return(AT_FAIL); | |
863 } | |
864 | |
865 switch(cphs_ret) | |
866 { | |
867 case(CPHS_EXEC): | |
868 cphsShrdPrm.srcId = srcId; | |
869 return(AT_EXCT); | |
870 | |
871 case(CPHS_BUSY): | |
872 return(AT_BUSY); | |
873 | |
874 default: | |
875 return(AT_FAIL); | |
876 } | |
877 } | |
878 | |
879 /* | |
880 +--------------------------------------------------------------------+ | |
881 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
882 | STATE : code ROUTINE : AT_PercentCPCFU | | |
883 +--------------------------------------------------------------------+ | |
884 | |
885 PURPOSE : %CPCFU: query call forwarding flags | |
886 */ | |
887 | |
888 GLOBAL T_ACI_RETURN qAT_PercentCPCFU(T_ACI_CMD_SRC srcId, UBYTE *cfu_set, T_CPHS_LINES line) | |
889 { | |
890 T_CPHS_RET cphs_ret; | |
891 | |
892 TRACE_FUNCTION ("qAT_PercentCPCFU()"); | |
893 | |
894 /* check command source */ | |
895 if(!cmh_IsVldCmdSrc (srcId)) | |
896 { | |
897 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
898 return( AT_FAIL ); | |
899 } | |
900 | |
901 cphs_ret = cphs_get_fwd_flag(cfu_set, line); | |
902 | |
903 switch(cphs_ret) | |
904 { | |
905 case(CPHS_OK): | |
906 return(AT_CMPL); | |
907 | |
908 case(CPHS_BUSY): | |
909 *cfu_set = CPHS_FLAG_ERROR; | |
910 return(AT_BUSY); | |
911 | |
912 case(CPHS_NOT_INIT): | |
913 *cfu_set = CPHS_FLAG_ERROR; | |
914 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
915 return(AT_FAIL); | |
916 default: | |
917 *cfu_set = CPHS_FLAG_ERROR; | |
918 return(AT_FAIL); | |
919 } | |
920 } | |
921 | |
922 /* | |
923 +--------------------------------------------------------------------+ | |
924 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
925 | STATE : code ROUTINE : AT_PercentCPMB | | |
926 +--------------------------------------------------------------------+ | |
927 | |
928 PURPOSE : %CPMB: query mailbox numbers | |
929 | |
930 This function deals with both the set and query aspects of the | |
931 %CPMB command. If 'rec_id' is present, indicating a set operation, | |
932 it will return information about the specified mailbox number | |
933 (parameters 'line', 'number', 'ton', 'npi' and 'alpha_id'). If\ | |
934 'rec_id' is set to ACI_NumParmNotPresent, indicating a query | |
935 operation, it will return the index of the first unused entry in | |
936 the list (parameter 'first'). | |
937 */ | |
938 | |
939 GLOBAL T_ACI_RETURN qAT_PercentCPMB( T_ACI_CMD_SRC srcId, | |
940 UBYTE rec_id, | |
941 T_CPHS_LINES *line, | |
942 CHAR *number, | |
943 T_ACI_TOA_TON *ton, | |
944 T_ACI_TOA_NPI *npi, | |
945 CHAR *alpha_id, | |
946 UBYTE *first) | |
947 { | |
948 T_CPHS_MB mb_number; | |
949 T_CPHS_RET cphs_ret; | |
950 | |
951 TRACE_FUNCTION ("qAT_PercentCPMB()"); | |
952 | |
953 /* check command source */ | |
954 if(!cmh_IsVldCmdSrc (srcId)) | |
955 { | |
956 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
957 return( AT_FAIL ); | |
958 } | |
959 | |
960 /* | |
961 * Determine the first free location, and write it to the | |
962 * memory pointed to by 'first', having first checked that | |
963 * it is not set to NULL. | |
964 */ | |
965 if (first NEQ NULL) | |
966 { | |
967 if (cphs_first_free(first) NEQ CPHS_OK) | |
968 { | |
969 /* | |
970 * It is assumed that cphs_first_free() will have filled in | |
971 * the error number (ACI_ERR_DESC). | |
972 */ | |
973 return(AT_FAIL); | |
974 } | |
975 } | |
976 | |
977 /* | |
978 * No further processing needed for the 'query' command, so | |
979 * unless we are dealing with the 'set' command, get | |
980 * out now. | |
981 */ | |
982 if (rec_id EQ (UBYTE)ACI_NumParmNotPresent) | |
983 return(AT_CMPL); | |
984 | |
985 cphs_ret = cphs_read_mb_number(rec_id, &mb_number); | |
986 | |
987 switch(cphs_ret) | |
988 { | |
989 case(CPHS_OK): | |
990 memcpy(number, mb_number.number, sizeof(mb_number.number)); | |
991 memcpy(alpha_id, mb_number.alpha_id, sizeof(mb_number.alpha_id)); | |
992 *line = mb_number.line; | |
993 if ( mb_number.toa EQ NOT_PRESENT_8BIT) | |
994 { | |
995 *ton = TON_NotPresent; | |
996 *npi = NPI_NotPresent; | |
997 } | |
998 else | |
999 { | |
1000 *ton = ( mb_number.toa & 0x70 ) >> 4; | |
1001 *npi = mb_number.toa & 0x0F; | |
1002 } | |
1003 return(AT_CMPL); | |
1004 | |
1005 default: | |
1006 /* All errors are filled in cphs_read_mb_number(), thus do not fill any CmeError, | |
1007 just returning AT_FAIL */ | |
1008 return(AT_FAIL); | |
1009 } | |
1010 } | |
1011 | |
1012 /* | |
1013 +--------------------------------------------------------------------+ | |
1014 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
1015 | STATE : code ROUTINE : AT_PercentCPMBW | | |
1016 +--------------------------------------------------------------------+ | |
1017 | |
1018 PURPOSE : %CPMBW: write mailbox numbers | |
1019 */ | |
1020 | |
1021 GLOBAL T_ACI_RETURN sAT_PercentCPMBW( T_ACI_CMD_SRC srcId, | |
1022 SHORT index, | |
1023 CHAR* number, | |
1024 T_ACI_TOA* type, | |
1025 T_CPHS_PB_TEXT* text) | |
1026 { | |
1027 | |
1028 T_CPHS_MB_CMH_SNGL_STAT indexStat; /* status of parameter <index> */ | |
1029 T_CPHS_MB_CMH_CMN_STAT entryStat; /* status of parameter <number>, */ | |
1030 /* <type> and <text> */ | |
1031 T_ACI_RETURN aci_result; | |
1032 T_CPHS_RET cphs_result; | |
1033 | |
1034 TRACE_FUNCTION ("sAT_PercentCPMBW()"); | |
1035 | |
1036 #ifndef NO_ASCIIZ | |
1037 /* convert Text */ | |
1038 if ( text NEQ NULL ) | |
1039 { | |
1040 UBYTE tmpBuf[CPHS_MAX_MB_ALPHA_LEN]; | |
1041 USHORT len; | |
1042 text->cs = CS_Sim; | |
1043 cmh_cvtToDefGsm ( (CHAR*)text->data, (CHAR*)tmpBuf, &len ); | |
1044 text->len = (UBYTE)len; | |
1045 memcpy ( text->data, tmpBuf, text->len ); | |
1046 } | |
1047 #endif /* #ifndef NO_ASCIIZ */ | |
1048 | |
1049 /* check command source */ | |
1050 if(!cmh_IsVldCmdSrc (srcId)) | |
1051 { | |
1052 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
1053 return( AT_FAIL ); | |
1054 } | |
1055 | |
1056 /* process the status of parameter <index> */ | |
1057 if ( index EQ ACI_NumParmNotPresent ) | |
1058 { | |
1059 indexStat = SNGL_NOT_PRSNT; /* NOT PRESENT */ | |
1060 } | |
1061 else if( index > CPHS_MAX_MB_ENTRIES OR | |
1062 index < CPHS_MIN_MB_ENTRIES ) | |
1063 { | |
1064 indexStat = SNGL_INVLD_PRSNT; /* INVALID */ | |
1065 } | |
1066 else | |
1067 { | |
1068 indexStat = SNGL_VLD_PRSNT; /* VALID */ | |
1069 } | |
1070 | |
1071 /* process the status of parameter <number>, <type> and <text> */ | |
1072 if ( number EQ NULL AND | |
1073 type EQ NULL AND | |
1074 text EQ NULL ) | |
1075 { | |
1076 entryStat = CMN_NOT_PRSNT; | |
1077 } | |
1078 else if ( number NEQ NULL AND | |
1079 text NEQ NULL ) | |
1080 { | |
1081 entryStat = CMN_FULL_PRSNT; | |
1082 } | |
1083 else | |
1084 { | |
1085 entryStat = CMN_PRTLY_PRSNT; | |
1086 } | |
1087 | |
1088 /* | |
1089 *----------------------------------------------------------------- | |
1090 * process the parameter: | |
1091 * | |
1092 * A -> number, type, text | |
1093 * B -> index | |
1094 * | |
1095 * 0 -> all elements not present | |
1096 * 1 -> all elements present | |
1097 * | |
1098 * A | B | result | |
1099 * --+---+--------------------------- | |
1100 * 0 | 0 | fail | |
1101 * 0 | 1 | delete entry | |
1102 * 1 | 0 | write to first empty entry | |
1103 * 1 | 1 | write to specific entry | |
1104 *----------------------------------------------------------------- | |
1105 */ | |
1106 | |
1107 switch ( entryStat ) | |
1108 { | |
1109 case ( CMN_FULL_PRSNT): | |
1110 case ( CMN_PRTLY_PRSNT ): | |
1111 /* parameters are full or partly present --> add entry to phonebook */ | |
1112 | |
1113 aci_result = cmhCPHS_add_mb_record(srcId, indexStat, text, number, type, index); | |
1114 | |
1115 return(aci_result); | |
1116 | |
1117 /* process variable <entryStat> with value <CMN_NOT_PRSNT> */ | |
1118 case ( CMN_NOT_PRSNT ): | |
1119 | |
1120 if ( indexStat NEQ SNGL_VLD_PRSNT ) | |
1121 { | |
1122 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
1123 return( AT_FAIL ); | |
1124 } | |
1125 | |
1126 if (indexStat EQ SNGL_VLD_PRSNT) | |
1127 { | |
1128 /* delete this very entry */ | |
1129 cphs_result = cphs_write_mb_number(srcId, | |
1130 index, | |
1131 NULL, /* tag */ | |
1132 0, | |
1133 0, | |
1134 NULL, /* number */ | |
1135 0); | |
1136 } | |
1137 else | |
1138 { | |
1139 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx ); | |
1140 return (AT_FAIL); | |
1141 } | |
1142 | |
1143 switch (cphs_result) | |
1144 { | |
1145 case CPHS_EXEC: | |
1146 return (AT_EXCT); | |
1147 case CPHS_OK: | |
1148 return (AT_CMPL); | |
1149 case CPHS_NOT_INIT: | |
1150 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
1151 return (AT_FAIL); | |
1152 case CPHS_FAIL: | |
1153 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx ); | |
1154 return (AT_FAIL); | |
1155 default: | |
1156 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_TxtToLong ); | |
1157 return (AT_FAIL); | |
1158 } | |
1159 } | |
1160 | |
1161 return ( AT_CMPL ); | |
1162 | |
1163 } | |
1164 | |
1165 /* | |
1166 +--------------------------------------------------------------------+ | |
1167 | PROJECT : GSM-F&D (8411) MODULE : ACI_CMD | | |
1168 | STATE : code ROUTINE : AT_PercentCPMBW | | |
1169 +--------------------------------------------------------------------+ | |
1170 | |
1171 PURPOSE : %CPMBW: test command | |
1172 */ | |
1173 | |
1174 GLOBAL T_ACI_RETURN tAT_PercentCPMBW ( T_ACI_CMD_SRC srcId, | |
1175 SHORT* firstIdx, | |
1176 SHORT* lastIdx, | |
1177 UBYTE* nlength, | |
1178 UBYTE* tlength ) | |
1179 { | |
1180 T_CPHS_RET cphs_result; | |
1181 | |
1182 TRACE_FUNCTION("tAT_PercentCPMBW()"); | |
1183 | |
1184 /* check command source */ | |
1185 if(!cmh_IsVldCmdSrc (srcId)) | |
1186 { | |
1187 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); | |
1188 return( AT_FAIL ); | |
1189 } | |
1190 | |
1191 cphs_result = cphs_get_mb_parameter ( firstIdx, lastIdx, nlength, tlength ); | |
1192 switch (cphs_result) | |
1193 { | |
1194 case CPHS_OK: | |
1195 return (AT_CMPL); | |
1196 case CPHS_NOT_INIT: | |
1197 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow ); | |
1198 return (AT_FAIL); | |
1199 default: | |
1200 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown ); | |
1201 return (AT_FAIL); | |
1202 } | |
1203 } | |
1204 #endif /* CPHS_C */ | |
1205 #endif /* FF_CPHS */ | |
1206 | |
1207 |