comparison g23m/condat/ms/src/aci/cmh_phbs.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : CMH_PHBS
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module provides the set functions related to the
18 | protocol stack adapter for the phonebook management.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef CMH_PHBS_C
23 #define CMH_PHBS_C
24 #endif
25
26 #include "aci_all.h"
27 /*==== INCLUDES ===================================================*/
28 #include "aci_cmh.h"
29 #include "ksd.h"
30
31 #ifdef FAX_AND_DATA
32 #include "aci_fd.h"
33 #endif /* of #ifdef FAX_AND_DATA */
34
35 #include "psa.h"
36 #include "psa_sim.h"
37 #include "psa_sms.h"
38 #include "ati_cmd.h"
39 #include "aci_cmd.h"
40 #include "phb.h"
41 #include "cmh.h"
42 #include "cmh_phb.h"
43 #include "cmh_sms.h"
44 #include "pcm.h"
45
46 /*--------------------------------------------------------------------*
47 * The Below include files are included for the SIM functions called *
48 * in CPBS command handler *
49 *--------------------------------------------------------------------*/
50
51 #include "dti_conn_mng.h"
52 #include "cmh_sim.h"
53
54
55 /*==== CONSTANTS ==================================================*/
56
57 #define PHB_CMH_CC_ID_NOT_USED 0xFF
58 #define PHB_CMH_EXT_NOT_USED 0xFF
59
60 /*==== TYPES ======================================================*/
61
62 typedef enum
63 {
64 CMN_FULL_PRSNT, /* all parameter present */
65 CMN_PRTLY_PRSNT, /* only some parameter present */
66 CMN_NOT_PRSNT /* no parameter present */
67 }
68 T_PHB_CMH_CMN_STAT;
69
70 typedef enum
71 {
72 SNGL_VLD_PRSNT, /* parameter is present and in valid range */
73 SNGL_INVLD_PRSNT, /* parameter is present and not in valid range */
74 SNGL_NOT_PRSNT /* parameter is not present */
75 }
76 T_PHB_CMH_SNGL_STAT;
77
78 #ifdef TI_PS_FFS_PHB
79 typedef T_PHB_RETURN T_FCT_READ ( T_PHB_TYPE type,
80 SHORT index,
81 T_PHB_RECORD* entry );
82 #else
83 typedef T_PHB_RETURN T_FCT_READ ( UBYTE type,
84 SHORT index,
85 T_PHB_RECORD* entry );
86 #endif
87
88 /*==== EXPORT =====================================================*/
89
90 /*==== VARIABLES ==================================================*/
91
92 /*==== FUNCTIONS ==================================================*/
93 /*
94 +-------------------------------------------------------------------+
95 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
96 | STATE : code ROUTINE : sAT_PlusCPBS |
97 +-------------------------------------------------------------------+
98
99 PURPOSE : This is the functional counterpart of the +CPBS
100 AT command which is responsible for setting the
101 phonebook memory storage.
102
103 <mem>: phonebook memory storage
104 */
105 GLOBAL T_ACI_RETURN sAT_PlusCPBS ( T_ACI_CMD_SRC srcId,
106 T_ACI_PB_STOR mem,
107 char* pin2)
108 {
109 T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameters */
110 T_SIM_SET_PRM * pSIMSetPrm; /* To hold the SIM related values for CPBW
111 command */
112 T_PHB_TYPE chkMem; /* checked and converted parameter <mem> */
113
114 TRACE_FUNCTION ("sAT_PlusCPBS ()");
115
116 /*
117 *-----------------------------------------------------------------
118 * check command source
119 *-----------------------------------------------------------------
120 */
121 if(!cmh_IsVldCmdSrc (srcId))
122 {
123 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
124 return( AT_FAIL );
125 }
126
127 pPHBCmdPrm = &cmhPrm[srcId].phbCmdPrm;
128
129 /*
130 *-----------------------------------------------------------------
131 * process the <mem> parameter
132 *-----------------------------------------------------------------
133 */
134 if ( mem NEQ PB_STOR_NotPresent )
135 {
136 if ( cmhPHB_cvtPhbType ( mem, &chkMem ) EQ TRUE )
137 {
138 if (pin2 EQ NULL OR
139 (strlen ( pin2 ) EQ 0) )
140 {
141 pPHBCmdPrm -> cmhStor = mem;
142 pPHBCmdPrm -> phbStor = chkMem;
143 }
144 else
145 {
146 if ( simShrdPrm.PINStat EQ PS_PUK2 )
147 {
148 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimPuk2Req );
149 return( AT_FAIL );
150 }
151 /* check preselected phonebook storage for FDN or BDN */
152 if ( ( mem EQ PB_STOR_Fd OR mem EQ PB_STOR_Bd )
153 AND
154 ( simShrdPrm.pn2Stat EQ PS_PIN2 OR
155 simShrdPrm.pn2Stat EQ NO_VLD_PS ) )
156 {
157 if ( simShrdPrm.PINStat EQ PS_RDY OR
158 simShrdPrm.PINStat EQ PS_PIN2 )
159 {
160 simShrdPrm.PINStat = PS_PIN2;
161 }
162 else
163 {
164 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimFail );
165 return( AT_FAIL );
166 }
167
168 /*-------------------------------------------------------------------------*
169 * The below code is added on 12/08/2003 as in R99 one more new paramter *
170 * is added in CPBS command <password>, this password is used to *
171 * verification of SIM PIN-2 before selecting any SIM related storages, *
172 * if it is already not done. *
173 * But now as password is provided by CPBS command. It is used for the *
174 * verification if it not done. *
175 *-------------------------------------------------------------------------*/
176
177
178 pSIMSetPrm = &simShrdPrm.setPrm[srcId];
179
180 cmhSIM_FillInPIN ( (char *)pin2, pSIMSetPrm -> curPIN,
181 PIN_LEN);
182 pSIMSetPrm -> PINType = PHASE_2_PIN_2;
183 simEntStat.curCmd = AT_CMD_CPBS;
184 simEntStat.entOwn = simShrdPrm.owner = srcId;
185
186 /*---------------------------------------------------------------------*
187 * During verification is the Owner ID is worng, then return the *
188 * AT_FAIL response. *
189 *---------------------------------------------------------------------*/
190 if ( psaSIM_VerifyPIN() < 0 )
191 {
192 TRACE_EVENT( "FATAL RETURN psaSIM in +CPBS: Not a valid owner ID" );
193 return AT_FAIL;
194 }
195
196 /*----------------------------------------------------------------*
197 * Hold the storage types in the temprory fields unless SIM PIN-2 *
198 * confirmation comes. *
199 *----------------------------------------------------------------*/
200
201 pPHBCmdPrm ->temp_cmhStor = mem;
202 pPHBCmdPrm ->temp_phbStor = chkMem;
203
204 return ( AT_EXCT );
205 }
206 else
207 {
208 pPHBCmdPrm -> cmhStor = mem;
209 pPHBCmdPrm -> phbStor = chkMem;
210 }
211 }
212 }
213 else
214 {
215 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
216 return( AT_FAIL );
217 }
218 }
219
220 return ( AT_CMPL );
221 }
222
223 /*
224 +-------------------------------------------------------------------+
225 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
226 | STATE : code ROUTINE : sAT_PlusCPBW |
227 +-------------------------------------------------------------------+
228
229 PURPOSE : This is the functional counterpart of the +CPBW
230 AT command which is responsible for writing a phonebook
231 entry to memory.
232
233 <index>: location number of phonebook memory
234 <number>: phone number
235 <type>: type of phone number
236 <text>: text associated with phone number
237 */
238 GLOBAL void cmhPHB_ksdDecodeToa(CHAR *number, CHAR **pNumber, T_PHB_RECORD *entry)
239 {
240 T_KSD_SEQGRP seqGrp = SEQGRP_UNKNOWN;
241 T_KSD_SEQPARAM seqPrm;
242 CHAR* restSeq;
243 T_ACI_TOA stdToa;
244 CHAR numBuf[MAX_PHB_NUM_LEN]; /* Phonebook number ASCII + '\0' */
245
246 TRACE_FUNCTION ("cmhksd_decode_toa()");
247
248 if ( strlen (number) EQ 0 )
249 {
250 TRACE_EVENT("number has length 0");
251 return;
252 }
253
254 stdToa.ton = TON_Unknown;
255 stdToa.npi = NPI_IsdnTelephony;
256
257 strncpy ( numBuf, number, MAX_PHB_NUM_LEN - 1 );
258 numBuf[MAX_PHB_NUM_LEN - 1] = '\0';
259
260
261 if ( ksd_decode ( numBuf,
262 TRUE,
263 &seqGrp,
264 &restSeq,
265 &seqPrm ) EQ FALSE )
266 {
267 TRACE_EVENT("ksd_decode returned FALSE");
268 return;
269 }
270
271 switch (seqGrp)
272 {
273 case (SEQGRP_USSD):
274 if ( cmhPHB_rplcIntnl ( number,
275 numBuf,
276 0xFF ) EQ TRUE )
277 {
278 stdToa.ton = TON_International;
279 }
280
281 *pNumber = numBuf;
282 cmhPHB_toaMrg ( &stdToa, &entry->ton_npi );
283 break;
284
285 case (SEQGRP_DIAL):
286 if ( number[0] EQ '+' )
287 {
288 *pNumber = &number[1];
289 stdToa.ton = TON_International;
290 }
291 /* 00 is not an indication for an international number */
292 cmhPHB_toaMrg ( &stdToa, &entry->ton_npi );
293 break;
294
295 case (SEQGRP_CF):
296 {
297 UBYTE cnt;
298
299 if ( seqPrm.cf.num EQ NULL )
300 {
301 break;
302 }
303
304 if ( number [0] EQ '*' AND
305 number [1] EQ '*' )
306 {
307 cnt = 3;
308 }
309 else if ( number[0] EQ '*' )
310 {
311 cnt = 2;
312 }
313 else
314 {
315 cnt = 1;
316 }
317
318 if ( cmhPHB_rplcIntnl ( number,
319 numBuf,
320 cnt ) EQ TRUE )
321 {
322 stdToa.ton = TON_International;
323 }
324
325 *pNumber = numBuf;
326 cmhPHB_toaMrg ( &stdToa, &entry->ton_npi );
327 }
328 break;
329
330 case (SEQGRP_SUP_CLIR):
331 case (SEQGRP_INV_CLIR):
332 if (strlen (restSeq) NEQ 0)
333 {
334 if ( restSeq[0] EQ '+' )
335 {
336 strcpy ( &numBuf[4], &restSeq[1] );
337 stdToa.ton = TON_International;
338 }
339 /* 00 is not an international number */
340 else
341 {
342 strcpy ( &numBuf[4], &restSeq[0] );
343 }
344
345 *pNumber = numBuf;
346 cmhPHB_toaMrg ( &stdToa, &entry->ton_npi );
347 }
348 break;
349
350 default:
351 break;
352 }
353 }
354
355 LOCAL T_ACI_RETURN cmhPHB_add_record(T_ACI_CMD_SRC srcId,
356 T_PHB_CMH_SNGL_STAT indexStat,
357 T_ACI_PB_TEXT *text,
358 CHAR *number,
359 T_ACI_TOA *type,
360 SHORT index,
361 T_ACI_VP_ABS *dateTime,
362 UBYTE phonebook_storage)
363 {
364 T_PHB_RECORD entry;
365 CHAR *pNumber = NULL; /* pointer to the number that will be saved */
366 T_PHB_RETURN result;
367
368 TRACE_FUNCTION ("cmhPHB_add_record()");
369
370 switch ( indexStat )
371 {
372 case ( SNGL_NOT_PRSNT ):
373 case ( SNGL_VLD_PRSNT ):
374 {
375 /* fill in the structure elements */
376
377 /* process the <index> */
378 #ifdef TI_PS_FFS_PHB
379 entry.phy_recno = ( indexStat EQ SNGL_NOT_PRSNT ?
380 0 : ( UBYTE ) index );
381 #else
382 entry.index = ( indexStat EQ SNGL_NOT_PRSNT ?
383 0 : ( UBYTE ) index );
384 #endif
385
386 /* process the <tag> */
387 if (text->len > PHB_MAX_TAG_LEN)
388 {
389 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_TxtToLong );
390 return (AT_FAIL);
391 }
392
393 cmhPHB_getMfwTagSim ( text, entry.tag, &entry.tag_len,
394 PHB_MAX_TAG_LEN );
395
396 /* calculate the TON/NPI field */
397 entry.ton_npi = PHB_TONPI_NO_DIAL;
398 pNumber = number;
399
400 if ( type EQ NULL )
401 {
402 cmhPHB_ksdDecodeToa(number, &pNumber, &entry);
403 }
404 else
405 {
406 cmhPHB_toaMrg ( type, &entry.ton_npi );
407 }
408
409 /* process the <number> */
410 cmhPHB_getAdrBcd ( entry.number, &entry.len,
411 PHB_PACKED_NUM_LEN, pNumber );
412
413 #if defined(TI_PS_FFS_PHB) OR defined(PHONEBOOK_EXTENSION)
414 /* Clear the subaddress (until fully supported here) */
415 memset (entry.subaddr, 0xFF, sizeof (entry.subaddr));
416 #endif
417
418 /* process the <cc_id> */
419 entry.cc_id = PHB_CMH_CC_ID_NOT_USED;
420
421 /* process the <extension> */
422 /* extension Mechansim not yet supported
423 entry.extension = PHB_CMH_EXT_NOT_USED; */
424
425 /* process the <date and time> */
426 if ( dateTime EQ NULL OR
427 !cmhSMS_isVpabsVld ( dateTime ) )
428 {
429 cmhPHB_invldPhbDateTime ( &entry );
430 }
431 else
432 {
433 cmhPHB_cpyCmhDateTime ( dateTime, &entry );
434 }
435
436 /* add the record */
437 result = pb_add_record (phonebook_storage,
438 #ifdef TI_PS_FFS_PHB
439
440 entry.phy_recno,
441 #else
442 entry.index,
443 #endif
444 &entry);
445 switch (result)
446 {
447 case PHB_EXCT:
448 if (srcId EQ CMD_SRC_LCL)
449 {
450 TRACE_EVENT("Special handling with LCL source: return AT_CMPL");
451 return (AT_CMPL);
452 }
453 return (AT_EXCT);
454
455 case PHB_OK:
456 return (AT_CMPL);
457
458 case PHB_FULL:
459 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_MemFull );
460 return (AT_FAIL);
461
462 case PHB_TAG_EXCEEDED:
463 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_TxtToLong );
464 return (AT_FAIL);
465
466 #ifdef TI_PS_FFS_PHB
467 case PHB_LOCKED:
468 return (AT_BUSY);
469 #endif
470
471 case PHB_FAIL:
472 default:
473 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
474 return (AT_FAIL);
475 }
476 }
477
478 case ( SNGL_INVLD_PRSNT ):
479 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
480 return( AT_FAIL );
481 }
482 return(AT_FAIL);
483 }
484
485
486 GLOBAL T_ACI_RETURN sAT_PlusCPBW ( T_ACI_CMD_SRC srcId,
487 SHORT index,
488 CHAR* number,
489 T_ACI_TOA* type,
490 T_ACI_PB_TEXT* text,
491 T_ACI_VP_ABS* dateTime )
492 {
493 T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameters */
494
495 T_PHB_CMH_SNGL_STAT indexStat; /* status of parameter <index> */
496 T_PHB_CMH_CMN_STAT entryStat; /* status of parameter <number>, */
497 /* <type> and <text> */
498 T_PHB_RETURN result;
499 T_ACI_RETURN aci_return;
500 #ifndef TI_PS_FFS_PHB
501 UBYTE pb_status;
502 UBYTE ext_rcd_num = 0xFF;
503 #endif
504
505 TRACE_FUNCTION ("sAT_PlusCPBW ()");
506
507 #ifndef NO_ASCIIZ
508 if ( text NEQ NULL )
509 {
510 UBYTE tmpBuf[MAX_ALPHA_LEN];
511 USHORT len;
512
513 if (text->data[0] NEQ 0x80 AND text->data[0] NEQ 0x81
514 AND text->data[0] NEQ 0x82)
515 {
516 text->cs = CS_Sim;
517 cmh_cvtToDefGsm ( (CHAR*)text->data, (CHAR*)tmpBuf, &len );
518 text->len = (UBYTE)len;
519 memcpy ( text->data, tmpBuf, text->len );
520 }
521 }
522 #endif /* #ifndef NO_ASCIIZ */
523
524 /* check command source */
525 if(!cmh_IsVldCmdSrc (srcId))
526 {
527 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
528 return( AT_FAIL );
529 }
530
531 #ifndef TI_PS_FFS_PHB
532 /* If the phonebook status is not PHB_READY then SIM BUSY error is indicated to the user.*/
533 pb_status_req(&pb_status); /* get phone book status */
534
535 TRACE_EVENT_P1("Current phonebook status: %d", pb_status);
536
537 if(pb_status EQ PHB_BUSY)
538 {
539 return AT_BUSY;
540 }
541 else if(pb_status EQ PHB_UNKNOWN)
542 {
543 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
544 return AT_FAIL;
545 }
546 #endif
547
548 pPHBCmdPrm = &cmhPrm[srcId].phbCmdPrm;
549
550 /* check preselected phonebook storage */
551 if ( pPHBCmdPrm -> cmhStor EQ PB_STOR_NotPresent )
552 {
553 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
554 return( AT_FAIL );
555 }
556
557 /* check preselected phonebook storage for FDN or BDN */
558 if ( ( simShrdPrm.pn2Stat EQ PS_PIN2 OR
559 simShrdPrm.pn2Stat EQ NO_VLD_PS )
560 AND
561 ( pPHBCmdPrm -> cmhStor EQ PB_STOR_Fd OR
562 pPHBCmdPrm -> cmhStor EQ PB_STOR_Bd ) )
563 {
564 if ( simShrdPrm.PINStat EQ PS_RDY )
565 {
566 simShrdPrm.PINStat = PS_PIN2;
567 }
568 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimPin2Req );
569 return( AT_FAIL );
570 }
571
572 /* process the status of parameter <index> */
573 if ( index EQ ACI_NumParmNotPresent )
574 {
575 indexStat = SNGL_NOT_PRSNT;
576 }
577 else if( index > PHB_CMH_IDX_MAX OR
578 index < PHB_CMH_IDX_MIN )
579 {
580 indexStat = SNGL_INVLD_PRSNT;
581 }
582 else
583 {
584 indexStat = SNGL_VLD_PRSNT;
585 }
586
587 /* process the status of parameter <number>, <type> and <text> */
588 if ( number EQ NULL AND
589 type EQ NULL AND
590 text EQ NULL )
591 {
592 entryStat = CMN_NOT_PRSNT;
593 }
594 else if ( number NEQ NULL AND
595 text NEQ NULL )
596 {
597 entryStat = CMN_FULL_PRSNT;
598 }
599 else
600 {
601 entryStat = CMN_PRTLY_PRSNT;
602 }
603
604 /*
605 *-----------------------------------------------------------------
606 * process the parameter:
607 *
608 * A -> number, type, text
609 * B -> index
610 *
611 * 0 -> all elements not present
612 * 1 -> all elements present
613 *
614 * A | B | result
615 * --+---+---------------------------
616 * 0 | 0 | fail
617 * 0 | 1 | delete entry
618 * 1 | 0 | write to first empty entry
619 * 1 | 1 | write to specific entry
620 *-----------------------------------------------------------------
621 */
622 switch ( entryStat )
623 {
624 /* process variable <entryStat> with value <CMN_FULL_PRSNT> */
625 case ( CMN_FULL_PRSNT):
626 case ( CMN_PRTLY_PRSNT ):
627 aci_return = cmhPHB_add_record(srcId, indexStat, text, number, type, index, dateTime, pPHBCmdPrm->phbStor);
628 if(aci_return EQ AT_EXCT)
629 {
630 pPHBCmdPrm->curCmd = AT_CMD_CPBW;
631 }
632 return(aci_return);
633
634 /* process variable <entryStat> with value <CMN_NOT_PRSNT> */
635 case ( CMN_NOT_PRSNT ):
636
637 if ( indexStat NEQ SNGL_VLD_PRSNT )
638 {
639 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
640 return( AT_FAIL );
641 }
642
643 #ifdef TI_PS_FFS_PHB
644 result = pb_del_record (pPHBCmdPrm->phbStor, index);
645 #else
646 result = pb_delete_record (pPHBCmdPrm->phbStor,
647 (UBYTE) index,
648 &ext_rcd_num,
649 TRUE);
650 #endif
651
652 switch (result)
653 {
654 case PHB_EXCT:
655 if (srcId EQ CMD_SRC_LCL)
656 {
657 TRACE_EVENT("Special handling with LCL source: return AT_CMPL");
658 return (AT_CMPL);
659 }
660 pPHBCmdPrm->curCmd = AT_CMD_CPBW;
661 return (AT_EXCT);
662
663 case PHB_OK:
664 return (AT_CMPL);
665
666 #ifdef TI_PS_FFS_PHB
667 case PHB_LOCKED:
668 return (AT_BUSY);
669 #endif
670
671 case PHB_FAIL:
672 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
673 return (AT_FAIL);
674
675 default:
676 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
677 return (AT_FAIL);
678 }
679 }
680
681 return ( AT_CMPL );
682 }
683
684 /*
685 +-------------------------------------------------------------------+
686 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
687 | STATE : code ROUTINE : sAT_PlusCPBR |
688 +-------------------------------------------------------------------+
689
690 PURPOSE : This is the functional counterpart of the +CPBR
691 AT command which is responsible for reading phonebook
692 entries from memory.
693
694 <startIdx>: index of first location to be read
695 <stopIdx>: index of last location to be read
696 <lastIdx>: index of last location already read
697 <pbLst>: list of phonebook entries
698 */
699 GLOBAL T_ACI_RETURN sAT_PlusCPBR ( T_ACI_CMD_SRC srcId,
700 SHORT startIdx,
701 SHORT stopIdx,
702 SHORT* lastIdx,
703 T_ACI_PB_ENTR* pbLst)
704 {
705 TRACE_FUNCTION ("sAT_PlusCPBR ()");
706
707 return cmhPHB_PlusCPBR ( srcId,
708 SR_TYP_Physical,
709 startIdx,
710 stopIdx,
711 lastIdx,
712 pbLst );
713 }
714
715
716
717 /*
718 PURPOSE : This is the functional counterpart of the %CPBR
719 AT command which is responsible for reading phonebook
720 entries from memory.
721
722 **************************************************
723 Added by Shen,Chao March.18th.2003
724 **************************************************
725 */
726 GLOBAL T_ACI_RETURN sAT_PercentCPBR ( T_ACI_CMD_SRC srcId,
727 SHORT startIdx,
728 SHORT stopIdx,
729 T_ACI_SR_TYP searchMode,
730 SHORT* lastIdx,
731 T_ACI_PB_ENTR* pbLst )
732 {
733 TRACE_FUNCTION ("sAT_PercentCPBR ()");
734
735 return cmhPHB_PlusCPBR ( srcId,
736 searchMode,
737 startIdx,
738 stopIdx,
739 lastIdx,
740 pbLst );
741 }
742
743 #ifdef TI_PS_FFS_PHB
744 /*
745 +-------------------------------------------------------------------+
746 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
747 | STATE : code ROUTINE : cmhPHB_read_index_record |
748 +-------------------------------------------------------------------+
749
750 PURPOSE : This function reads the nth non-free record determined
751 by index.
752 This function could be implemented more efficiently
753 within the phonebook itself, on the other hand,
754 it is not used in the code for the big phonebooks like ADN,
755 so we should be able to live with this at least for a while.
756
757 */
758 LOCAL T_PHB_RETURN cmhPHB_read_index_record (T_PHB_TYPE type,
759 SHORT index,
760 T_PHB_RECORD *entry)
761 {
762 T_PHB_RETURN phb_result;
763 USHORT phy_recno;
764
765 TRACE_FUNCTION ("cmhPHB_read_index_record()");
766
767 if (index < PHB_CMH_IDX_MIN)
768 return PHB_INVALID_IDX;
769
770 phy_recno = PHB_CMH_IDX_MIN;
771
772 do
773 {
774 do
775 {
776 phb_result = pb_read_record (type, phy_recno, entry);
777 phy_recno++;
778 }
779 while (phb_result EQ PHB_EMPTY_RECORD);
780 index--;
781 }
782 while (index NEQ 0);
783 return phb_result;
784 }
785 #endif
786
787 /*
788 +-------------------------------------------------------------------+
789 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
790 | STATE : code ROUTINE : cmhPHB_PlusCPBR |
791 +-------------------------------------------------------------------+
792
793 PURPOSE : This is the functional counterpart of the +CPBR
794 AT command which is responsible for reading phonebook
795 entries from memory.
796
797 <type>: search type
798 <startIdx>: index of first location to be read
799 <stopIdx>: index of last location to be read
800 <lastIdx>: index of last location already read
801 <pbLst>: list of phonebook entries
802 */
803 GLOBAL T_ACI_RETURN cmhPHB_PlusCPBR ( T_ACI_CMD_SRC srcId,
804 T_ACI_SR_TYP type,
805 SHORT startIdx,
806 SHORT stopIdx,
807 SHORT* lastIdx,
808 T_ACI_PB_ENTR* pbLst)
809 {
810 T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameters */
811 SHORT toIdx; /* last used index */
812 SHORT maxIdx; /* holds upper index bound */
813 SHORT i; /* used for counting */
814 SHORT readRec = 0; /* records already read */
815 T_PHB_RECORD rec; /* read record */
816 T_FCT_READ* readFct; /* selected read function */
817 T_PHB_RETURN result;
818 #ifdef TI_PS_FFS_PHB
819 T_PHB_TYPE book; /* Phonebook */
820 SHORT dummy_used_rcd;
821 UBYTE dummy_num_len;
822 UBYTE dummy_tag_len;
823 #endif
824
825 /*
826 *-----------------------------------------------------------------
827 * check command source
828 *-----------------------------------------------------------------
829 */
830 if(!cmh_IsVldCmdSrc (srcId))
831 {
832 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
833 return( AT_FAIL );
834 }
835
836 pPHBCmdPrm = &cmhPrm[srcId].phbCmdPrm;
837
838 /*
839 *-----------------------------------------------------------------
840 * check preselected phonebook storage
841 *-----------------------------------------------------------------
842 */
843 #ifdef TI_PS_FFS_PHB
844 if (!cmhPHB_cvtPhbType (pPHBCmdPrm->cmhStor, &book))
845 #else
846 if ( pPHBCmdPrm -> cmhStor EQ PB_STOR_NotPresent )
847 #endif
848 {
849 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
850 return( AT_FAIL );
851 }
852
853 /*
854 *-----------------------------------------------------------------
855 * check input parameter <startIdx>
856 *-----------------------------------------------------------------
857 */
858 #ifdef TI_PS_FFS_PHB
859 (void)pb_read_sizes (book, &maxIdx,
860 &dummy_used_rcd, &dummy_num_len, &dummy_tag_len);
861 #else
862 if( pPHBCmdPrm->cmhStor EQ PB_STOR_Af ) /* ADN-FDN phb */
863 maxIdx = MAX_AFB_RECORDS;
864 else
865 maxIdx = PHB_CMH_IDX_MAX;
866 #endif
867
868 if( startIdx > maxIdx OR startIdx < PHB_CMH_IDX_MIN )
869 {
870 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
871 return( AT_FAIL );
872 }
873
874 /*
875 *-----------------------------------------------------------------
876 * check input parameter <stopIdx>
877 *-----------------------------------------------------------------
878 */
879 if ( stopIdx EQ ACI_NumParmNotPresent )
880
881 toIdx = startIdx;
882
883 else
884 {
885 if( stopIdx > maxIdx OR stopIdx < PHB_CMH_IDX_MIN OR
886 stopIdx < startIdx )
887 {
888 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
889 return( AT_FAIL );
890 }
891
892 else
893
894 toIdx = stopIdx;
895 }
896
897 /*
898 *-----------------------------------------------------------------
899 * calculating the read function
900 *-----------------------------------------------------------------
901 */
902 switch ( type )
903 {
904 case ( SR_TYP_Name ): readFct = pb_read_alpha_record; break;
905 case ( SR_TYP_Number ): readFct = pb_read_number_record; break;
906 #ifdef TI_PS_FFS_PHB
907 /*case ( SR_TYP_Index ): readFct = pb_read_index_record; break;*/
908 case ( SR_TYP_Index ): readFct = cmhPHB_read_index_record; break;
909 case ( SR_TYP_Physical ): readFct = pb_read_record; break;
910 #else
911 case ( SR_TYP_Index ): readFct = pb_read_index_record; break;
912 case ( SR_TYP_Physical ): readFct = pb_read_phys_record; break;
913 #endif
914
915 default:
916 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
917 return( AT_FAIL );
918 }
919
920 /*
921 *-----------------------------------------------------------------
922 * reading of records
923 *-----------------------------------------------------------------
924 */
925 i = startIdx;
926
927 while ( i <= toIdx AND readRec < MAX_PB_ENTR )
928 {
929 result = readFct (pPHBCmdPrm->phbStor, i, &rec);
930 /* check for invalid index */
931 if ((result EQ PHB_INVALID_IDX) AND (i EQ startIdx))
932 {
933 ACI_ERR_DESC (ACI_ERR_CLASS_Cme, CME_ERR_InvIdx);
934 return( AT_FAIL );
935 }
936 if (result EQ PHB_OK)
937 {
938 cmhPHB_cpyRecEntr (&pbLst[readRec],
939 #ifdef TI_PS_FFS_PHB
940 pPHBCmdPrm->phbStor,
941 #endif
942 &rec);
943
944 readRec++;
945 }
946 if ( i EQ toIdx) /* this check is used in order to prevent the index = 0xFF */
947 {
948 i++;
949 break;
950 }
951 else
952 i++;
953 }
954
955 /*
956 *-----------------------------------------------------------------
957 * mark the first invalid entry
958 *-----------------------------------------------------------------
959 */
960 if ( readRec < MAX_PB_ENTR )
961
962 cmhPHB_invldEntr ( &pbLst[readRec] );
963
964 /*
965 *-----------------------------------------------------------------
966 * process the parameter <lastIdx>
967 *-----------------------------------------------------------------
968 */
969 /* *lastIdx = i - 1; */
970 *lastIdx =(SHORT)(i - 1); /* set -1 to 255 */
971
972 return ( AT_CMPL );
973 }
974
975 /*
976 +-------------------------------------------------------------------+
977 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
978 | STATE : code ROUTINE : sAT_PlusCPBF |
979 +-------------------------------------------------------------------+
980
981 PURPOSE : This is the functional counterpart of the +CPBF
982 AT command which is responsible for finding phonebook
983 entries in memory.
984
985 <findText>: search string
986 <mode>: search mode
987 <found>: number of entries found
988 <pbLst>: list of found phonebook entries
989 */
990 #ifdef NO_ASCIIZ
991 GLOBAL T_ACI_RETURN sAT_PlusCPBF ( T_ACI_CMD_SRC srcId,
992 T_ACI_PB_TEXT *findtext,
993 T_ACI_CPBF_MOD mode,
994 SHORT *found,
995 T_ACI_PB_ENTR *pbLst )
996 #else /* ifdef NO_ASCIIZ */
997 GLOBAL T_ACI_RETURN sAT_PlusCPBF ( T_ACI_CMD_SRC srcId,
998 CHAR *findtext_str,
999 T_ACI_CPBF_MOD mode,
1000 SHORT *found,
1001 T_ACI_PB_ENTR *pbLst )
1002 #endif /* ifdef NO_ASCIIZ */
1003 {
1004 SHORT firstIdx; /* dummy variable, not used */
1005 T_ACI_PB_TEXT *find_text;
1006 #ifndef NO_ASCIIZ
1007 T_ACI_PB_TEXT findtext;
1008 #endif /* #ifndef NO_ASCIIZ */
1009
1010 TRACE_FUNCTION ("sAT_PlusCPBF ()");
1011
1012 #ifdef NO_ASCIIZ
1013 find_text = findtext;
1014 #else /* ifdef NO_ASCIIZ */
1015 find_text = &findtext;
1016
1017 if ( findtext_str NEQ NULL )
1018 {
1019 USHORT len = (USHORT)strlen( findtext_str );
1020
1021 cmh_cvtToDefGsm ( findtext_str, (CHAR*)find_text->data, &len );
1022 find_text->cs = CS_Sim;
1023 find_text->len = (UBYTE)len;
1024 }
1025 else
1026 {
1027 find_text->cs = CS_NotPresent;
1028 find_text->len = 0;
1029 }
1030 #endif /* ifdef NO_ASCIIZ */
1031
1032 return (cmhPHB_PlusCPBF ( srcId,
1033 find_text,
1034 SR_TYP_Name,
1035 mode,
1036 &firstIdx,
1037 found,
1038 pbLst ));
1039 }
1040
1041
1042
1043 #ifdef NO_ASCIIZ
1044 GLOBAL T_ACI_RETURN sAT_PercentCPBF ( T_ACI_CMD_SRC srcId,
1045 T_ACI_PB_TEXT* findtext,
1046 T_ACI_CPBF_MOD mode,
1047 T_ACI_SR_TYP searchMode,
1048 U8 direction,
1049 SHORT* found,
1050 T_ACI_PB_ENTR* pbLst )
1051
1052 #else /* ifdef NO_ASCIIZ */
1053
1054 GLOBAL T_ACI_RETURN sAT_PercentCPBF ( T_ACI_CMD_SRC srcId,
1055 T_ACI_PB_TEXT* findtext,
1056 T_ACI_CPBF_MOD mode,
1057 T_ACI_SR_TYP searchMode,
1058 U8 direction,
1059 SHORT* found,
1060 T_ACI_PB_ENTR* pbLst )
1061 #endif /* ifdef NO_ASCIIZ */
1062 {
1063 SHORT firstIdx; /* dummy variable, not used */
1064 T_ACI_PB_TEXT *find_text;
1065 #ifndef NO_ASCIIZ
1066 T_ACI_PB_TEXT findtext;
1067 #endif /* #ifndef NO_ASCIIZ */
1068
1069 TRACE_FUNCTION ("sAT_PercentCPBF ()");
1070
1071 #ifdef NO_ASCIIZ
1072 find_text = findtext;
1073 #else /* ifdef NO_ASCIIZ */
1074 find_text = &findtext;
1075
1076 if ( findtext_str NEQ NULL )
1077 {
1078 USHORT len = (USHORT)strlen( findtext_str );
1079
1080 cmh_cvtToDefGsm ( findtext_str, (CHAR*)find_text->data, &len );
1081 find_text->cs = CS_Sim;
1082 find_text->len = (UBYTE)len;
1083 }
1084 else
1085 {
1086 find_text->cs = CS_NotPresent;
1087 find_text->len = 0;
1088 }
1089 #endif /* ifdef NO_ASCIIZ */
1090
1091 return (cmhPHB_PlusCPBF ( srcId,
1092 find_text,
1093 searchMode,
1094 mode,
1095 &firstIdx,
1096 found,
1097 pbLst ));
1098 }
1099
1100
1101 /*
1102 +-------------------------------------------------------------------+
1103 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
1104 | STATE : code ROUTINE : cmhPHB_PlusCPBF |
1105 +-------------------------------------------------------------------+
1106
1107 PURPOSE : This is the functional counterpart of the +CPBF
1108 AT command which is responsible for finding phonebook
1109 entries in memory.
1110
1111 <findText>: search string
1112 <type>: search type
1113 <mode>: search mode
1114 <firstIdx>: first found index
1115 <found>: number of entries found
1116 <pbLst>: list of found phonebook entries
1117
1118 HM 7-Sep-2005: Warning, MFW is using this function directly!
1119
1120 */
1121 GLOBAL T_ACI_RETURN cmhPHB_PlusCPBF ( T_ACI_CMD_SRC srcId,
1122 T_ACI_PB_TEXT *findtext,
1123 T_ACI_SR_TYP type,
1124 T_ACI_CPBF_MOD mode,
1125 SHORT* firstIdx,
1126 SHORT* found,
1127 T_ACI_PB_ENTR* pbLst )
1128 {
1129 T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameters */
1130 #ifdef TI_PS_FFS_PHB
1131 T_PHB_MATCH match_criteria;
1132 #else
1133 UBYTE cvtMode; /* converted parameter <mode> */
1134 #endif
1135 USHORT i; /* used for counting */
1136 T_PHB_RECORD fndRec; /* found records */
1137 T_PHB_RETURN res;
1138
1139 /*
1140 *-----------------------------------------------------------------
1141 * check command source
1142 *-----------------------------------------------------------------
1143 */
1144 if(!cmh_IsVldCmdSrc (srcId))
1145 {
1146 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1147 return( AT_FAIL );
1148 }
1149
1150 pPHBCmdPrm = &cmhPrm[srcId].phbCmdPrm;
1151
1152 /*
1153 *-----------------------------------------------------------------
1154 * check preselected phonebook storage
1155 *-----------------------------------------------------------------
1156 */
1157 if ( pPHBCmdPrm -> cmhStor EQ PB_STOR_NotPresent )
1158 {
1159 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1160 return( AT_FAIL );
1161 }
1162
1163 /*
1164 *-----------------------------------------------------------------
1165 * check input parameter <findtext>
1166 *-----------------------------------------------------------------
1167 */
1168 if ( ( findtext EQ NULL ) OR ( findtext->len EQ 0 ) )
1169 {
1170 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1171 return( AT_FAIL );
1172 }
1173
1174 /*
1175 *-----------------------------------------------------------------
1176 * check input parameter <mode>
1177 *-----------------------------------------------------------------
1178 */
1179 switch ( mode )
1180 {
1181 #ifdef TI_PS_FFS_PHB
1182 case CPBF_MOD_NewSearch:
1183 case CPBF_MOD_NextSearch:
1184 break;
1185 #else
1186 case ( CPBF_MOD_NewSearch ): cvtMode = PHB_NEW_SEARCH; break;
1187 case ( CPBF_MOD_NextSearch ): cvtMode = PHB_NEXT_SEARCH; break;
1188 #endif
1189
1190 default:
1191 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1192 return( AT_FAIL );
1193 }
1194
1195 /*
1196 *-----------------------------------------------------------------
1197 * searching for first records and reset information about found
1198 * and written records
1199 *-----------------------------------------------------------------
1200 */
1201 #ifdef TI_PS_FFS_PHB
1202 if ( mode EQ CPBF_MOD_NewSearch )
1203 {
1204 pPHBCmdPrm->order_num = 0;
1205 *firstIdx = 0;
1206 *found = 0;
1207 switch ( type )
1208 {
1209 case ( SR_TYP_Name ):
1210 if (srcId EQ CMD_SRC_LCL)
1211 match_criteria = PHB_MATCH_GE;
1212 else
1213 match_criteria = PHB_MATCH_PARTIAL;
1214
1215 res = pb_search_name_ex (pPHBCmdPrm -> phbStor,
1216 match_criteria,
1217 findtext,
1218 firstIdx,
1219 found,
1220 &fndRec);
1221 break;
1222
1223 case ( SR_TYP_Number ):
1224 res = pb_search_number_ex (pPHBCmdPrm -> phbStor,
1225 findtext->data,
1226 firstIdx,
1227 found,
1228 &fndRec);
1229 break;
1230
1231 default:
1232 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1233 return( AT_FAIL );
1234 }
1235
1236 switch (res)
1237 {
1238 case PHB_OK:
1239 break;
1240
1241 case PHB_LOCKED:
1242 return AT_BUSY;
1243
1244 default:
1245 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_NotFound );
1246 return( AT_FAIL );
1247 }
1248
1249 pPHBCmdPrm -> fndRec = *found;
1250 pPHBCmdPrm -> wrtRec = 0;
1251 i = 0;
1252
1253 if ( pPHBCmdPrm -> fndRec > 0 )
1254 {
1255 cmhPHB_cpyRecEntr (&pbLst[i],
1256 pPHBCmdPrm->phbStor,
1257 &fndRec);
1258
1259 pPHBCmdPrm -> wrtRec++;
1260
1261 i++;
1262 }
1263 pPHBCmdPrm->order_num = *firstIdx + pPHBCmdPrm->wrtRec;
1264 }
1265 else
1266 {
1267 /* CPBF_MOD_NextSearch */
1268 i = 0;
1269 }
1270 #else
1271 if ( mode EQ CPBF_MOD_NewSearch )
1272 {
1273 *firstIdx = 0;
1274 *found = 0;
1275 switch ( type )
1276 {
1277 case ( SR_TYP_Name ):
1278 res = pb_search_name ( srcId,
1279 pPHBCmdPrm -> phbStor,
1280 findtext,
1281 cvtMode,
1282 firstIdx,
1283 found,
1284 &fndRec );
1285 break;
1286 case ( SR_TYP_Number ):
1287 res = pb_search_number ( pPHBCmdPrm -> phbStor,
1288 findtext->data,
1289 cvtMode,
1290 firstIdx,
1291 found,
1292 &fndRec );
1293 break;
1294 default:
1295 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1296 return( AT_FAIL );
1297 }
1298
1299 if ( res EQ PHB_FAIL )
1300 {
1301 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_NotFound );
1302 return( AT_FAIL );
1303 }
1304
1305 pPHBCmdPrm -> fndRec = *found;
1306 pPHBCmdPrm -> wrtRec = 0;
1307 i = 0;
1308
1309 if ( pPHBCmdPrm -> fndRec > 0 )
1310 {
1311 cmhPHB_cpyRecEntr ( &pbLst[i], &fndRec );
1312
1313 pPHBCmdPrm -> wrtRec++;
1314
1315 i++;
1316 }
1317 }
1318 else
1319
1320 i = 0;
1321 #endif
1322
1323 /*
1324 *-----------------------------------------------------------------
1325 * copying and searching of records
1326 *-----------------------------------------------------------------
1327 */
1328 while ( i < MAX_PB_ENTR AND
1329 pPHBCmdPrm -> wrtRec < pPHBCmdPrm -> fndRec)
1330 {
1331 switch ( type )
1332 {
1333 #ifdef TI_PS_FFS_PHB
1334 case ( SR_TYP_Name ):
1335 res = pb_read_alpha_record (pPHBCmdPrm->phbStor,
1336 pPHBCmdPrm->order_num,
1337 &fndRec);
1338 break;
1339
1340 case ( SR_TYP_Number ):
1341 res = pb_read_number_record (pPHBCmdPrm->phbStor,
1342 pPHBCmdPrm->order_num,
1343 &fndRec);
1344 break;
1345 #else
1346 case ( SR_TYP_Name ):
1347 res = pb_search_name ( srcId,
1348 pPHBCmdPrm -> phbStor,
1349 findtext,
1350 CPBF_MOD_NextSearch,
1351 firstIdx,
1352 found,
1353 &fndRec );
1354 break;
1355 case ( SR_TYP_Number ):
1356 res = pb_search_number ( pPHBCmdPrm -> phbStor,
1357 findtext->data,
1358 CPBF_MOD_NextSearch,
1359 firstIdx,
1360 found,
1361 &fndRec );
1362 break;
1363 #endif
1364
1365 default:
1366 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1367 return( AT_FAIL );
1368 }
1369 if (res NEQ PHB_OK)
1370 {
1371 pPHBCmdPrm->order_num = 0;
1372 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_NotFound );
1373 return( AT_FAIL );
1374 }
1375
1376 cmhPHB_cpyRecEntr (&pbLst[i],
1377 #ifdef TI_PS_FFS_PHB
1378 pPHBCmdPrm->phbStor,
1379 #endif
1380 &fndRec);
1381
1382 pPHBCmdPrm -> wrtRec++;
1383 pPHBCmdPrm -> order_num++;
1384
1385 i++;
1386 }
1387
1388 if (pPHBCmdPrm->wrtRec >= pPHBCmdPrm->fndRec) // #HM#
1389 pPHBCmdPrm->order_num = 0; // #HM#
1390
1391 /*
1392 *-----------------------------------------------------------------
1393 * mark the first invalid entry
1394 *-----------------------------------------------------------------
1395 */
1396 if ( i < MAX_PB_ENTR )
1397
1398 cmhPHB_invldEntr ( &pbLst[i] );
1399
1400 return ( AT_CMPL );
1401 }
1402
1403 /*
1404 +-------------------------------------------------------------------+
1405 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
1406 | STATE : code ROUTINE : sAT_PercentPBCF |
1407 +-------------------------------------------------------------------+
1408
1409 PURPOSE : This is the functional counterpart of the %PBCF
1410 AT command which is responsible for phone configuration.
1411
1412 <ldn>: last dialed number configuration.
1413 <lrn>: last received number configuration.
1414 */
1415 GLOBAL T_ACI_RETURN sAT_PercentPBCF( T_ACI_CMD_SRC srcId,
1416 T_ACI_PBCF_LDN ldn,
1417 T_ACI_PBCF_LRN lrn,
1418 T_ACI_PBCF_LMN lmn )
1419 {
1420
1421 TRACE_FUNCTION ("sAT_PercentPBCF ()");
1422
1423 /*
1424 *-----------------------------------------------------------------
1425 * process the <ldn> parameter
1426 *-----------------------------------------------------------------
1427 */
1428 switch( ldn )
1429 {
1430 case( PBCF_LDN_NotPresent ):
1431
1432 ldn = PBCFldn;
1433 break;
1434
1435 case( PBCF_LDN_Enable ):
1436 case( PBCF_LDN_Disable ):
1437
1438 break;
1439
1440 default:
1441 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1442 return( AT_FAIL );
1443 }
1444
1445 /*
1446 *-----------------------------------------------------------------
1447 * process the <lrn> parameter
1448 *-----------------------------------------------------------------
1449 */
1450 switch( lrn )
1451 {
1452 case( PBCF_LRN_NotPresent ):
1453
1454 ldn = PBCFlrn;
1455 break;
1456
1457 case( PBCF_LRN_Enable ):
1458 case( PBCF_LRN_Disable ):
1459
1460 break;
1461
1462 default:
1463 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1464 return( AT_FAIL );
1465 }
1466
1467 /*
1468 *-----------------------------------------------------------------
1469 * process the <lmn> parameter
1470 *-----------------------------------------------------------------
1471 */
1472 switch( lmn )
1473 {
1474 case( PBCF_LMN_NotPresent ):
1475
1476 lmn = PBCFlmn;
1477 break;
1478
1479 case( PBCF_LMN_Enable ):
1480 case( PBCF_LMN_Disable ):
1481
1482 break;
1483
1484 default:
1485 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1486 return( AT_FAIL );
1487 }
1488
1489 /*
1490 *--------------------------------------------------------------------
1491 * assign the parameters
1492 *--------------------------------------------------------------------
1493 */
1494 PBCFldn = ldn;
1495 PBCFlrn = lrn;
1496 PBCFlmn = lmn;
1497
1498 return ( AT_CMPL );
1499 }
1500
1501 /*
1502 +---------------------------------------------------------------------+
1503 | PROJECT : GSM-PS (6147) MODULE : CMH_CCS |
1504 | STATE : code ROUTINE : sAT_PlusCSVM |
1505 +---------------------------------------------------------------------+
1506
1507 PURPOSE : This is the functional counterpart of the +CSVM AT command
1508 which is responsible for Setting a Voice Mail Number.
1509
1510 <mode>: Enable or Disable the voice mail number
1511 <pnumber>: Number of the voice mail server
1512 <num_len>: Number length
1513 <type>: type of number
1514 */
1515
1516 GLOBAL T_ACI_RETURN sAT_PlusCSVM ( T_ACI_CMD_SRC srcId,
1517 T_ACI_CSVM_MOD mode,
1518 CHAR *pnumber,
1519 UBYTE num_len,
1520 T_ACI_TOA* toa)
1521 {
1522 CHAR* ef = EF_VMN_ID;
1523 UBYTE toa_val= 0;
1524
1525 T_PHB_CMD_PRM * pPHBCmdPrm; /* points to PHB command parameter */
1526 EF_VMN vmn;
1527
1528 TRACE_FUNCTION ("sAT_PlusCSVM ()");
1529 /*
1530 *-----------------------------------------------------------------
1531 * check command source
1532 *-----------------------------------------------------------------
1533 */
1534 if(!cmh_IsVldCmdSrc (srcId))
1535 {
1536 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1537 return( AT_FAIL );
1538 }
1539
1540 pPHBCmdPrm = &cmhPrm[srcId].phbCmdPrm;
1541 /*
1542 *-------------------------------------------------------------------
1543 * process the mode parameter
1544 *-------------------------------------------------------------------
1545 */
1546 switch( mode )
1547 {
1548 case( CSVM_MOD_NotPresent ):
1549 break;
1550
1551 case( CSVM_MOD_Disable ):
1552 case( CSVM_MOD_Enable ):
1553
1554 pPHBCmdPrm -> CSVMmode = mode;
1555 break;
1556
1557 default:
1558 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
1559 return( AT_FAIL );
1560 }
1561
1562 /*
1563 *-------------------------------------------------------------------
1564 * process the toa parameter
1565 *-------------------------------------------------------------------
1566 */
1567 if( ! toa )
1568 return( AT_CMPL );
1569
1570 switch( toa -> ton )
1571 {
1572 case( TON_Unknown ):
1573 case( TON_International ):
1574 case( TON_National ):
1575 case( TON_NetSpecific ):
1576 case( TON_DedAccess ):
1577
1578 break;
1579
1580 default:
1581 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
1582 return( AT_FAIL );
1583 }
1584
1585 switch( toa -> npi )
1586 {
1587 case( NPI_Unknown ):
1588 case( NPI_IsdnTelephony ):
1589 case( NPI_Data ):
1590 case( NPI_Telex ):
1591 case( NPI_National ):
1592 case( NPI_Private ):
1593
1594 break;
1595
1596 default:
1597 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown );
1598 return( AT_FAIL );
1599 }
1600
1601 /*
1602 *-------------------------------------------------------------------
1603 * process the phone number
1604 *-------------------------------------------------------------------
1605 */
1606 /*init*/
1607 memset( vmn.vmNum, 0xFF, sizeof(vmn.vmNum) );
1608
1609 memcpy ( vmn.vmNum, pnumber, num_len );
1610 toa_val = toa_merge (*toa);
1611
1612 vmn.numTp = toa_val;
1613
1614 if (pcm_WriteFile((UBYTE*)ef, SIZE_EF_VMN, (UBYTE*)&vmn) EQ PCM_OK)
1615 {
1616 return( AT_CMPL );
1617 }
1618 else
1619 {
1620 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_MemFail );
1621 return( AT_FAIL );
1622 }
1623
1624 }
1625 /*==== EOF ========================================================*/