comparison src/aci2/mfw/CPHS_mod.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 /*-----------------------Include Files---------------------------------*/
2
3 #define ENTITY_MFW
4
5
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <limits.h>
10
11 #if defined (NEW_FRAME)
12
13 #include "typedefs.h"
14 #include "vsi.h"
15 #include "pei.h"
16 #include "custom.h"
17 #include "gsm.h"
18
19 #else
20
21 #include "STDDEFS.H"
22 #include "custom.h"
23 #include "gsm.h"
24 #include "vsi.h"
25
26 #endif
27
28 #include "prim.h"
29 #ifndef PCM_2_FFS
30 #include "pcm.h"
31 #endif
32
33
34 #ifndef GPRS
35 #include "ffs/ffs.h"
36 #undef GPRS /* ffs.h anyhow defines GPRS: has to be undef ifndef GPRS */
37
38 #else /* GPRS */
39 #include "ffs/ffs.h"
40 #endif /* GPRS */
41
42 #ifndef PCM_2_FFS
43 #include "ffs_coat.h"
44 #endif
45
46 #ifdef SIM_TOOLKIT
47 //#include "mfw_sat.h"
48 #endif
49
50 #include "message.h"
51 #include "prim.h"
52 #include "aci_cmh.h"
53 #if defined (FAX_AND_DATA)
54 #include "aci_fd.h"
55 #endif
56
57 #ifdef GPRS
58 #include "gprs.h"
59 #endif
60 #include "dti_conn_mng.h"
61
62 #include "phb.h"
63 #include "psa.h"
64 #include "cmh.h"
65 #include "cmh_phb.h"
66 #include "psa.h"
67 #include "psa_sim.h"
68 #include "cus_aci.h"
69 #include "cmh_mm.h"
70 #include "cmh_sim.h"
71 #include "CPHS_mod.h"
72
73 /*--------------------- Constant definitions ---------------------------*/
74
75
76 #define MFW_INVALID_SIM_DATA 0xFF
77 #define MAX_CPHS_ENTRY 4
78 #define MAX_PCM_MAILBOX_LEN 10
79
80
81 #define NO_ALLOCATED 0
82 #define FALSE 0
83 #define TRUE 1
84 #define LONG_NAME 26
85 #define SHORT_NAME 10
86 #define SP_NAME 17
87 #define NUMERIC_LENGTH 6
88
89 #ifdef TI_PS_FFS_PHB
90 #define PHB_MAX_LEN MAX_PHB_NUM_LEN /* Phonebook number length + '\0' */
91 #else
92 //GW-SPR#762- 40 digit phonebook size.
93 #ifdef PHONEBOOK_EXTENSION
94 #define PHB_MAX_LEN 41 /* Phonebook number length + '\0' */
95 #else
96 #define PHB_MAX_LEN 21 /* Phonebook number length + '\0' */
97 #endif /* else, #ifdef PHONEBOOK_EXTENSION */
98 #endif /* else, #ifdef TI_PS_FFS_PHB */
99
100 /*--------------------- Types --------------------------------------*/
101 typedef enum /* numbering plan identifier */
102 {
103 CPHS_NPI_UNKNOWN,
104 CPHS_NPI_ISDN = 1,
105 CPHS_NPI_DATA = 3,
106 CPHS_NPI_TELEX = 4,
107 CPHS_NPI_NATIONAL = 8,
108 CPHS_NPI_PRIVATE = 9,
109 CPHS_NPI_M_ERMES = 10,
110 CPHS_NPI_M_CTS = 11
111 } T_PHB_NPI;
112
113 typedef enum /* type of number */
114 {
115 CPHS_TON_UNKNOWN,
116 CPHS_TON_INTERNATIONAL,
117 CPHS_TON_NATIONAL,
118 CPHS_TON_NET_SPECIFIC,
119 CPHS_TON_DED_ACCESS,
120 CPHS_TON_ALPHA_NUMERIC,
121 CPHS_TON_ABBREVIATED,
122 CPHS_TON_EXTENDED
123 } T_CPHS_PHB_TON;
124
125 typedef enum /* CPHS service */
126 {
127 CPHS_CSP = 1, /* customer service profile */
128 CPHS_SST, /* service string table */
129 CPHS_MB_NUMBER, /* mailbox numbers */
130 CHPS_NAME_SHORT, /* operator name shortform */
131 CHPS_INFO_NUMBERS /* information numbers */
132 } T_CPHS_SERVICE;
133
134 #define CPHS_SERVICE_TABLE 2 /* size of CPHS service table */
135 #define CPHS_INFO_SIZE 3 /* size of CPHS information field (6F16) */
136 #define CPHS_ONS_SIZE 20 /* size of operator name string (6F14) - read first 20 bytes only */
137 #define CPHS_ONSF_SIZE 10 /* size of operator name short form (6F18) */
138 #define CPHS_MIN_MBN_SIZE 14
139 #define CPHS_MBS_SIZE 2 /* size of voice message waiting flag (6F11) */
140 #define CPHS_CFF_SIZE 2 /* size of call forwarding flags (6F13) */
141 #define CPHS_ALS_SIZE 1 /* size of alternate line service (6F9F) */
142 #define CPHS_ALSS_SIZE 1 /* size of alternate line service status (6F92) */
143 #define CPHS_CSP_SIZE 20 /* size of customer service profile (6F15) */
144 #define CPHS_MIN_INS_SIZE 5
145
146 typedef struct {
147
148 T_CPHS_OPN opName;
149 T_CPHS_MAILBOX_NUM_LIST mbNum;
150 T_CPHS_LINE_IND mbStatus;
151 T_CPHS_LINE_IND dvStatus;
152 T_CPHS_ALS_INFO alsStatus;
153 T_CPHS_ALS_LINE Line1_desc;
154 T_CPHS_ALS_LINE Line2_desc;
155 T_CPHS_CSP csProfile;
156 T_CPHS_INFO_NUM_LIST* numList;
157 T_CPHS_INFO_NUM_ENTRY* infoEntry;
158 T_CPHS_ROAMING_IND roaming_ind;
159 UBYTE mbnData[40]; // it should be allocated dynamically.
160
161 UBYTE mbsData[CPHS_MBS_SIZE]; // it should be allocated dynamically.
162 UBYTE dvData[CPHS_CFF_SIZE]; // it should be allocated dynamically.
163
164 // T_CPHS_READ_SIM_ENTRY read_sim_entry;//MC
165
166 UBYTE cphsStatus;
167 UBYTE cphsPhase;
168 UBYTE cphsServTab[CPHS_SERVICE_TABLE];
169 UBYTE maxRec;
170
171 T_CPHS_MAILBOX_NUM_ENTRY MbnEntry;
172
173 T_CPHS_MAILBOX_NUM_ENTRY *vcEntry;
174 T_CPHS_SIMOP_STATUS simStatus;
175 UBYTE alsData;
176 UBYTE idxLevel;
177 UBYTE startIdx;
178 UBYTE cphsUpdate ;
179 ULONG cphsPrevRead;
180 T_CPHS_CB_FUNC InfoNumberListCB;
181 T_CPHS_CB_FUNC InfoNumberCB;
182 T_CPHS_CB_FUNC RefreshCB;
183 }T_CPHS_CACHED_DATA;
184
185
186 static T_CPHS_CACHED_DATA* cphs_data = NULL;
187
188 void Cphs_support_check (void);
189 UBYTE Cphs_ssc (UBYTE nr, UBYTE * serv_table);
190 void Cphs_update_info_cnf (SHORT errCode, UBYTE *data, UBYTE dataLen);
191 void Cphs_read_information(SHORT errCode, UBYTE *data, UBYTE dataLen);
192 void Cphs_read_csp(SHORT errCode, UBYTE *data, UBYTE dataLen);
193 void Cphs_read_cff(SHORT errCode, UBYTE *data, UBYTE dataLen);
194 void Cphs_read_mbs(SHORT errCode, UBYTE *data, UBYTE dataLen);
195 void Cphs_read_mbn(SHORT table_id);
196 void Cphs_read_onsf(SHORT errCode, UBYTE *data, UBYTE dataLen);
197 void Cphs_read_ons(SHORT errCode, UBYTE *data, UBYTE dataLen);
198 void Cphs_get_csp ();
199 void Cphs_get_mailbox (void);
200 void Cphs_read_sim_dat_cb(SHORT table_id);
201 BOOL Cphs_read_sim_dat(USHORT data_id, UBYTE len, UBYTE max_length);
202 T_CPHS_RET Cphs_set_divert_status (T_CPHS_FLAG_STATUS line1,
203 T_CPHS_FLAG_STATUS line2,
204 T_CPHS_FLAG_STATUS fax,
205 T_CPHS_FLAG_STATUS data);
206 T_CPHS_RET Cphs_set_mailbox_status (T_CPHS_FLAG_STATUS line1,
207 T_CPHS_FLAG_STATUS line2,
208 T_CPHS_FLAG_STATUS fax,
209 T_CPHS_FLAG_STATUS data);
210 void Cphs_operator_name (void);
211 void Cphs_get_mailbox_status ();
212 void Cphs_get_divert_status () ;
213
214
215 void Cphs_write_eeprom_mailbox(T_CPHS_MAILBOX_NUM_ENTRY *entry);
216 void Cphs_read_eeprom_mailbox(void);
217 void Cphs_build_mbn_data(UBYTE *data, UBYTE len);
218 void Cphs_req_info_num_read(UBYTE rcd_num, UBYTE dataLen);
219 void Cphs_get_info_num (UBYTE level, UBYTE startIndex);
220 void Cphs_read_info_num(SHORT table_id);
221 void Cphs_read_first_info_num(SHORT table_id);
222 void Cphs_read_sim_rcd_cb (SHORT table_id);
223 BOOL Cphs_read_sim_rcd(USHORT data_id, UBYTE rcd_num, UBYTE len);
224 void Cphs_select_info_num (UBYTE index) ;
225 void Cphs_write_sim_dat_cb(SHORT table_id);
226 BOOL Cphs_write_sim_dat(USHORT data_id, UBYTE *data, UBYTE length);
227 void Cphs_write_sim_rcd_cb (SHORT table_id);
228 BOOL Cphs_write_sim_rcd(USHORT data_id, UBYTE rcd_num,
229 UBYTE *data, UBYTE dataLen);
230 void Cphs_read_eeprom_als_desc();
231 void Cphs_write_eeprom_als_desc(T_CPHS_ALS_LINE* line);
232 T_CPHS_RET Cphs_write_eeprom_als(T_CPHS_ALS_INFO* info);
233 T_CPHS_RET Cphs_read_eeprom_als(T_CPHS_ALS_INFO* info);
234 void Cphs_get_als_info ();
235 T_CPHS_PHB_TON cvtTon(T_ACI_TOA_TON ton);
236 /* initializes CPHS module, reads CPHS data fields from SIM and caches */
237 /* the read data. */
238 #ifdef _TESTING__
239 T_CPHS_INFO_NUM_LIST num_list;
240 T_CPHS_INFO_NUM_ENTRY num_entry;
241
242
243 int Info_Numbers_Callback(T_CPHS_INFO_NUM_LIST* list, T_CPHS_INFO_NUM_ENTRY* entry)
244 { char debug[50];
245 TRACE_FUNCTION("Info_Numbers_Callback()");
246
247 if (list != NULL)
248 { sprintf(debug, "INFO_NUMLIST:%s, count:%d",(char*)list->entry[0].alpha.data, list->count);
249 TRACE_EVENT(debug);
250
251 }
252
253 if (entry != NULL)
254 {
255 sprintf(debug, "INFO_NUM:%s",(char*)entry->alpha.data);
256 TRACE_EVENT(debug);
257 }
258 if (list == NULL && entry == NULL)
259 TRACE_EVENT("REFRESH DONE!!!!");
260
261
262 }
263
264 void Cphs_reading_test()
265 { T_CPHS_ALS_INFO als_info;
266 T_CPHS_ALS_LINE als_line;
267 T_CPHS_INFO cphs_info;
268 T_CPHS_CSP cphs_csp;
269 T_CPHS_LINE_IND dv_ind;
270 T_CPHS_MAILBOX_NUM_LIST mb_nums;
271 T_CPHS_OPN op_name;
272 T_CPHS_ROAMING_IND roam_ind;
273
274 char debug[60];
275
276 //cphs_Init(Info_Numbers_Callback);
277 cphs_refresh(Info_Numbers_Callback);
278
279 //cphs_getInfoNumbers(&num_list,1,1, Info_Numbers_Callback);
280 /*cphs_getAlsInfo(&als_info);
281 sprintf(debug,"line:%d, locked:%d", als_info.line, als_info.locked);
282 TRACE_FUNCTION(debug);
283 als_line.line = CPHS_LINE_INDEX_LINE2;
284 cphs_getAlsLineDescr(&als_line);
285 sprintf(debug,"line:%d, desc:%0.22s", als_line.line, als_line.description.data);
286 TRACE_EVENT(debug);
287 cphs_getVoiceMessageInd(&dv_ind);
288 sprintf(debug, "VM result:%d, line1:%d, line2: %d", dv_ind.result, dv_ind.line1, dv_ind.line2);
289 TRACE_EVENT(debug);
290 cphs_getCPHSInfo(&cphs_info);
291 sprintf(debug, "Phase:%d InfoNum:%d, shortname:%d, mb:%d", cphs_info.phase, cphs_info.info_num, cphs_info.opn_short, cphs_info.mailbox_num);
292 TRACE_EVENT(debug);
293
294 cphs_getCSP(&cphs_csp);
295 sprintf(debug, "Result: %d, CSP:%x,%x,%x,%x,%x,%x", cphs_csp.result, cphs_csp.csp[0].services, cphs_csp.csp[1].services,
296 cphs_csp.csp[2].services, cphs_csp.csp[3].services, cphs_csp.csp[4].services, cphs_csp.csp[5].services);
297 TRACE_EVENT(debug);
298 //#ifdef FRED
299 cphs_getDivertCallInd(&dv_ind);
300 sprintf(debug, "Divert result: %d, line1:%d, line2:%d", dv_ind.result, dv_ind.line1, dv_ind.line2);
301 TRACE_EVENT(debug);
302
303 //#endif
304
305 cphs_getOPN(&op_name);
306 sprintf(debug, "res:%d long_name:%s, short_name%0.22s", op_name.result, op_name.long_name, op_name.short_name);
307 TRACE_EVENT(debug);
308
309 cphs_getRoamingInd(&roam_ind);
310 sprintf(debug, "Roaming ind: %d", roam_ind);
311 TRACE_EVENT(debug);
312
313 cphs_getMailboxNumbers(&mb_nums);
314
315 sprintf(debug, "MBN result: %d, count:%d, first:%0.22s",mb_nums.result, mb_nums.count, mb_nums.entries[0].number);
316 TRACE_EVENT(debug);*/
317
318
319 }
320
321
322 void Cphs_writing_test()
323 { T_CPHS_ALS_INFO als_info;
324 T_CPHS_ALS_LINE als_line;
325 T_CPHS_LINE_IND dv_ind;
326 T_CPHS_ROAMING_IND roam_ind;
327 char debug[50];
328
329
330
331 cphs_Init(Info_Numbers_Callback);
332 //cphs_refresh(Info_Numbers_Callback);
333
334 als_line.line = CPHS_LINE_INDEX_LINE2;
335 memcpy(als_line.description.data, (UBYTE*)"Second Line !!", 8);
336 als_line.description.len = 8;
337 cphs_setAlsLineDescr(als_line);
338
339 als_info.line = CPHS_LINE_INDEX_LINE2;
340 als_info.locked= CPHS_LINEFLAG_SET;
341 cphs_setAlsInfo(&als_info);
342 cphs_setDivertCallInd(CPHS_LINE_INDEX_LINE1, CPHS_LINEFLAG_NOT_SET);
343 cphs_setDivertCallInd(CPHS_LINE_INDEX_LINE2, CPHS_LINEFLAG_SET);
344
345 cphs_setVoiceMessageInd(CPHS_LINE_INDEX_LINE1, CPHS_LINEFLAG_NOT_SET);
346 cphs_setVoiceMessageInd(CPHS_LINE_INDEX_LINE2, CPHS_LINEFLAG_SET);
347
348 roam_ind = CPHS_ROAMING_OFF;
349 cphs_setRoamingInd(&roam_ind);
350
351 //cphs_selectInfoNumber(2, &num_entry, Info_Numbers_Callback);
352
353 }
354 #endif
355
356 /*
357 +--------------------------------------------------------------------+
358 | MODULE : CPHS standalone module |
359 | STATE : code ROUTINE : cphs_Init |
360 +--------------------------------------------------------------------+
361
362 */
363 T_CPHS_RET cphs_Init(T_CPHS_CB_FUNC callback)
364 { //check if already initilaised?
365 if (cphs_data)
366 return CPHS_IS_OK;
367 cphs_data = (T_CPHS_CACHED_DATA*)malloc(sizeof(T_CPHS_CACHED_DATA));
368 if (cphs_data)
369 { cphs_data->cphsStatus = CPHS_NOT_PRESENT;
370 cphs_data->simStatus = SIMOP_UNKNOWN;
371 cphs_data->cphsUpdate = FALSE;
372 cphs_data->cphsPrevRead = 0;
373 cphs_data->InfoNumberListCB = NULL;
374 cphs_data->InfoNumberCB = NULL;
375 Cphs_support_check();
376 cphs_refresh(callback);
377 return CPHS_IS_OK;
378 }
379 else
380 return CPHS_FAIL;
381 }
382
383
384
385 /*
386 +--------------------------------------------------------------------+
387 | MODULE : CPHS standalone module |
388 | STATE : code ROUTINE : cphs_refresh() |
389 +--------------------------------------------------------------------+
390
391
392 */
393
394 /* reads CPHS data fields from SIM and updates the cached CPHS data */
395 T_CPHS_RET cphs_refresh(T_CPHS_CB_FUNC callback)
396 { T_CPHS_RET res;
397
398 if (cphs_data EQ NULL)
399 { TRACE_EVENT("CPHS not initialised");
400 return CPHS_NOT_INIT;
401 }
402 //get call divert indicator
403 Cphs_get_divert_status ();
404 cphs_data->RefreshCB = callback; //set call back function
405 //get mailbox numbers
406 /*Cphs_get_mailbox ();
407 Cphs_operator_name ();
408 //get voice message indicator
409 Cphs_read_eeprom_als_desc();
410 //get als line description
411 Cphs_get_mailbox_status ();
412 //get CSP
413 Cphs_get_csp ();*/
414 }
415
416
417 /*
418 +--------------------------------------------------------------------+
419 | MODULE : CPHS standalone module |
420 | STATE : code ROUTINE : cphs_Exit() |
421 +--------------------------------------------------------------------+
422
423
424 */
425 /* de-initializes CPHS module */
426 T_CPHS_RET cphs_Exit()
427 { if (cphs_data EQ NULL)
428 return CPHS_NOT_INIT;
429
430 free(cphs_data);
431
432 return CPHS_IS_OK;
433 }
434
435 /*
436 +--------------------------------------------------------------------+
437 | MODULE : CPHS standalone module |
438 | STATE : code ROUTINE : cphs_getOPN |
439 +--------------------------------------------------------------------+
440
441
442 */
443 /* reads from SIM the operator long name and if available the short */
444 /* name, too */
445 T_CPHS_RET cphs_getOPN ( T_CPHS_OPN *opn )
446 { if (cphs_data EQ NULL)
447 return CPHS_NOT_INIT;
448 if (opn EQ NULL)
449 return CPHS_FAIL;
450 memcpy(opn, &cphs_data->opName, sizeof(T_CPHS_OPN));
451 return CPHS_IS_OK;
452 }
453 /*
454 +--------------------------------------------------------------------+
455 | MODULE : CPHS standalone module |
456 | STATE : code ROUTINE : cphs_getRoamingInd |
457 +--------------------------------------------------------------------+
458
459
460 */
461
462 /* checks if roaming is active */
463 T_CPHS_RET cphs_getRoamingInd ( T_CPHS_ROAMING_IND *indicator )
464 {
465 #ifndef NEPTUNE_BOARD
466 /*
467 T_ACI_COPS_MOD mode;
468 T_ACI_COPS_FRMT format;
469 CHAR oper[30];
470 T_OPER_NTRY* plmn_entry;
471 SHORT mccBuf, mncBuf;
472 char debug[50];
473 UBYTE numeric[8];
474 char ** end;
475 memset(oper, 0, 30);
476 */
477 #else
478 T_ACI_COPS_MOD mode;
479 T_ACI_COPS_FRMT format;
480 CHAR oper[30];
481 T_OPER_NTRY* plmn_entry;
482 SHORT mccBuf, mncBuf;
483 char debug[50];
484 UBYTE numeric[8];
485 char ** end;
486 memset(oper, 0, 30);
487 #endif
488
489 if (cphs_data EQ NULL)
490 return CPHS_NOT_INIT;
491 if (indicator EQ NULL)
492 return CPHS_FAIL;
493 #ifndef NEPTUNE_BOARD
494 *indicator = cphs_data->roaming_ind;
495 #else
496 memcpy(indicator, &cphs_data->roaming_ind, sizeof(T_CPHS_ROAMING_IND));
497 #endif
498 /*
499 qAT_PlusCOPS (CMD_SRC_NONE,&mode,&format,oper );
500 //get current MCC
501 if (format == COPS_FRMT_Long OR format == COPS_FRMT_Short)
502 { sAT_PlusCOPSE(oper, format, NULL, NULL, numeric);
503 // plmn_entry = cmhMM_FindName( oper, format );
504 numeric[3] = 0;//terminate string before MNC
505 plmn_entry->mcc = strtol((char*)numeric,end,16 );
506 }
507
508 if (format == COPS_FRMT_Numeric)
509 { //plmn_entry = cmhMM_FindNumeric( oper );
510 oper[3] = 0;
511 plmn_entry->mcc = strtol((char*)oper, end, 16);
512 }
513 //get "Home MCC"
514 cmhSIM_GetHomePLMN ( &mccBuf, &mncBuf );
515 //currently qAT_PlusCOPS is not returning the correct format
516 //cmhMM_FindName/Numeric rely on PCM which does not work
517 sprintf(debug, "Home MCC %d, current MCC %d COPS fmt:%d", plmn_entry->mcc, mccBuf, format);
518 TRACE_EVENT(debug);
519 if (plmn_entry->mcc == mccBuf)
520 *indicator = CPHS_ROAMING_OFF;
521 else
522 *indicator = CPHS_ROAMING_ON;
523 */
524
525 return CPHS_IS_OK;
526 }
527 /*
528 +--------------------------------------------------------------------+
529 | MODULE : CPHS standalone module |
530 | STATE : code ROUTINE : cphs_getVoiceMessageInd |
531 +--------------------------------------------------------------------+
532
533
534 */
535
536 /* reads from SIM if voice mails are waiting for the available lines */
537 /* (line1, line2, fax, data) */
538 T_CPHS_RET cphs_getVoiceMessageInd( T_CPHS_LINE_IND *indicator )
539 { if (cphs_data EQ NULL)
540 return CPHS_NOT_INIT;
541 if (indicator EQ NULL)
542 return CPHS_FAIL;
543 memcpy(indicator, &cphs_data->mbStatus, sizeof(T_CPHS_LINE_IND));
544 return CPHS_IS_OK;
545 }
546 /*
547 +--------------------------------------------------------------------+
548 | MODULE : CPHS standalone module |
549 | STATE : code ROUTINE : cphs_setVoiceMessageInd |
550 +--------------------------------------------------------------------+
551
552
553 */
554 /* sets on SIM the voice mail waiting flag for the given lines in the */
555 /* parameter line_mask. The bitmask will be created by oring the lines.*/
556 /* The bits for the lines are defined in T_CPHS_LINE_INDEX. */
557 T_CPHS_RET cphs_setVoiceMessageInd( UBYTE line_mask,
558 T_CPHS_FLAG_STATUS flag )
559 {
560 if (cphs_data EQ NULL)
561 return CPHS_NOT_INIT;
562
563 if (CPHS_LINE_INDEX_LINE1 & line_mask)
564 { cphs_data->mbStatus.line1 = flag;
565 TRACE_EVENT("Setting Line 1 VM");
566 Cphs_set_mailbox_status(flag,CPHS_FLAG_NOT_PRESENT ,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
567 }
568
569 if (CPHS_LINE_INDEX_LINE2 & line_mask)
570 { TRACE_EVENT("SEtting line 2 VM");
571 cphs_data->mbStatus.line2 = flag;
572 Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, flag,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
573 }
574 if (CPHS_LINE_INDEX_FAX & line_mask)
575 { cphs_data->mbStatus.fax = flag;
576 Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,flag,CPHS_FLAG_NOT_PRESENT);
577 }
578 if (CPHS_LINE_INDEX_DATA & line_mask)
579 { cphs_data->mbStatus.data = flag;
580 Cphs_set_mailbox_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT,flag);
581 }
582
583
584
585 return CPHS_EXEC;
586 }
587 /*
588 +--------------------------------------------------------------------+
589 | MODULE : CPHS standalone module |
590 | STATE : code ROUTINE : cphs_getDivertCallInd |
591 +--------------------------------------------------------------------+
592 */
593
594
595 /* reads from SIMif calls shall be diverted for the available lines */
596 /* (line1, line2, fax, data) */
597 T_CPHS_RET cphs_getDivertCallInd (T_CPHS_LINE_IND *indicator )
598 {
599 if (cphs_data EQ NULL)
600 return CPHS_NOT_INIT;
601 if (ind EQ NULL)
602 return CPHS_FAIL;
603 memcpy(indicator, &cphs_data->dvStatus, sizeof(T_CPHS_LINE_IND));
604 return CPHS_IS_OK;
605 }
606 /*
607 +--------------------------------------------------------------------+
608 | MODULE : CPHS standalone module |
609 | STATE : code ROUTINE : cphs_setDivertCallInd |
610 +--------------------------------------------------------------------+
611 */
612 /* sets on SIM the divert call flag for the given lines in the */
613 /* parameter line_mask. The bitmask will be created by oring the lines.*/
614 /* The bits for the lines are defined in T_CPHS_LINE_INDEX. */
615 T_CPHS_RET cphs_setDivertCallInd ( UBYTE line_mask,
616 T_CPHS_FLAG_STATUS flag )
617 {
618 if (cphs_data EQ NULL)
619 return CPHS_NOT_INIT;
620
621 if (CPHS_LINE_INDEX_LINE1 & line_mask)
622 { cphs_data->dvStatus.line1 = flag;
623 TRACE_EVENT("Setting line 1 divert");
624 Cphs_set_divert_status(flag,CPHS_FLAG_NOT_PRESENT ,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
625 }
626
627 if (CPHS_LINE_INDEX_LINE2 & line_mask)
628 { cphs_data->dvStatus.line2 = flag;
629 TRACE_EVENT("Setting line 2 divert");
630 Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, flag,CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT);
631 }
632 if (CPHS_LINE_INDEX_FAX & line_mask)
633 { cphs_data->dvStatus.fax = flag;
634 Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,flag,CPHS_FLAG_NOT_PRESENT);
635 }
636 if (CPHS_LINE_INDEX_DATA & line_mask)
637 { cphs_data->dvStatus.data = flag;
638 Cphs_set_divert_status(CPHS_FLAG_NOT_PRESENT, CPHS_FLAG_NOT_PRESENT,CPHS_FLAG_NOT_PRESENT,flag);
639 }
640
641 return CPHS_EXEC;
642
643 }
644
645 /*
646 +--------------------------------------------------------------------+
647 | MODULE : CPHS standalone module |
648 | STATE : code ROUTINE : cphs_getAlsInfo |
649 +--------------------------------------------------------------------+
650 */
651 /* reads from SIM the information of alternate line service */
652 /* ( selected line, alternate line service locked/unlocked) */
653 T_CPHS_RET cphs_getAlsInfo ( T_CPHS_ALS_INFO *info )
654 {
655 if (cphs_data EQ NULL)
656 return CPHS_NOT_INIT;
657 if (info EQ NULL)
658 return CPHS_FAIL;
659
660 //memcpy(info, &cphs_data->alsStatus, sizeof( T_CPHS_ALS_INFO));
661 Cphs_read_eeprom_als(info);
662 return CPHS_IS_OK;
663
664 }
665 /*
666 +--------------------------------------------------------------------+
667 | MODULE : CPHS standalone module |
668 | STATE : code ROUTINE : cphs_setAlsInfo|
669 +--------------------------------------------------------------------+
670 */
671 /* sets on SIM the informtion of alternate line service / selects the */
672 /* active line */
673 T_CPHS_RET cphs_setAlsInfo ( T_CPHS_ALS_INFO *info )
674 { if (cphs_data EQ NULL)
675 return CPHS_NOT_INIT;
676 if (info EQ NULL)
677 return CPHS_FAIL;
678 //memcpy(&cphs_data->alsStatus, info, sizeof(T_CPHS_ALS_INFO));
679 return Cphs_write_eeprom_als(info);
680 //return CPHS_EXEC;
681 }
682 /*
683 +--------------------------------------------------------------------+
684 | MODULE : CPHS standalone module |
685 | STATE : code ROUTINE : cphs_getAlsLineDescr |
686 +--------------------------------------------------------------------+
687 */
688 /* reads the (alpha)numeric description for the given line */
689 T_CPHS_RET cphs_getAlsLineDescr ( T_CPHS_ALS_LINE* line )
690 { if (cphs_data EQ NULL)
691 return CPHS_NOT_INIT;
692 if (line EQ NULL)
693 return CPHS_FAIL;
694 Cphs_read_eeprom_als_desc();
695 if (line->line EQ CPHS_LINE_INDEX_LINE1)
696 { memcpy(line,&cphs_data->Line1_desc, sizeof(T_CPHS_ALS_LINE));
697 return CPHS_IS_OK;
698 }
699
700 if (line->line EQ CPHS_LINE_INDEX_LINE2)
701 { memcpy( line, &cphs_data->Line2_desc,sizeof(T_CPHS_ALS_LINE));
702 return CPHS_IS_OK;
703 }
704
705 return CPHS_FAIL;
706 }
707 /*
708 +--------------------------------------------------------------------+
709 | MODULE : CPHS standalone module |
710 | STATE : code ROUTINE :cphs_setAlsLineDescr |
711 +--------------------------------------------------------------------+
712 */
713 /* sets a (alpha)numeric description for the given line */
714 T_CPHS_RET cphs_setAlsLineDescr ( T_CPHS_ALS_LINE line )
715
716 { if (cphs_data EQ NULL)
717 return CPHS_NOT_INIT;
718
719 if (line.line EQ CPHS_LINE_INDEX_LINE1)
720 { memcpy(&cphs_data->Line1_desc,&line, sizeof(T_CPHS_ALS_LINE));
721 Cphs_write_eeprom_als_desc(&cphs_data->Line1_desc);
722 return CPHS_IS_OK;
723 }
724
725 if (line.line EQ CPHS_LINE_INDEX_LINE2)
726 { memcpy(&cphs_data->Line2_desc, &line, sizeof(T_CPHS_ALS_LINE));
727 Cphs_write_eeprom_als_desc(&cphs_data->Line2_desc);
728 return CPHS_IS_OK;
729 }
730
731 return CPHS_FAIL;
732 }
733 /*
734 +--------------------------------------------------------------------+
735 | MODULE : CPHS standalone module |
736 | STATE : code ROUTINE : cphs_setRoamingInd |
737 +--------------------------------------------------------------------+
738
739 */
740 T_CPHS_RET cphs_setRoamingInd ( T_CPHS_ROAMING_IND* indicator )
741 { if (cphs_data EQ NULL)
742 return CPHS_NOT_INIT;
743
744 if (*indicator EQ CPHS_ROAMING_OFF OR *indicator EQ CPHS_ROAMING_ON)
745 { cphs_data->roaming_ind = *indicator;
746 return CPHS_IS_OK;
747 }
748 else
749 return CPHS_FAIL;
750 }
751 /*
752 +--------------------------------------------------------------------+
753 | MODULE : CPHS standalone module |
754 | STATE : code ROUTINE : cphs_checkEmergencyCall |
755 +--------------------------------------------------------------------+
756 */
757
758 /* check if the current call number(ASCII encoded) is an emergency number supported */
759 /* by CPHS. */
760 T_CPHS_RET cphs_checkEmergencyCall( char* num )
761 { char** end;
762
763
764 if (cphs_data EQ NULL)
765 return CPHS_NOT_INIT;
766
767 if (num EQ NULL)
768 return CPHS_FAIL;
769
770 if (strtol(num, end, 10)EQ CPHS_EMERGENCY_NUM_112 OR
771 strtol(num, end, 10)EQ CPHS_EMERGENCY_NUM_999)
772 return CPHS_IS_OK;
773 else
774 return CPHS_FAIL;
775 }
776
777 /*
778 +--------------------------------------------------------------------+
779 | MODULE : CPHS standalone module |
780 | STATE : code ROUTINE : cphs_getCPHSInfo |
781 +--------------------------------------------------------------------+
782 */
783 /* reads from SIM the phase of the SIM and which optional datafields */
784 /* are present in the SIM */
785 /* (operator name shortform, mailbox numbers, service string table, */
786 /* information numbers) */
787 T_CPHS_RET cphs_getCPHSInfo ( T_CPHS_INFO *info )
788 { if (cphs_data EQ NULL)
789 return CPHS_NOT_INIT;
790
791 if (info !=NULL)
792 {
793 info->phase = cphs_data->cphsPhase;
794 info->csp = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
795 info->mailbox_num = Cphs_ssc(CPHS_MB_NUMBER, cphs_data->cphsServTab);
796
797 if (cphs_data->cphsPhase EQ 1) /* phase 1 only */
798 info->sst = Cphs_ssc(CPHS_SST, cphs_data->cphsServTab);
799 else /* not support */
800 info->sst = NO_ALLOCATED;
801
802 if (cphs_data->cphsPhase EQ 2) /* phase 2 only */
803 {
804 info->opn_short = Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab);
805 info->info_num = Cphs_ssc(CHPS_INFO_NUMBERS, cphs_data->cphsServTab);
806 }
807 else /* not support */
808 {
809 info->opn_short = NO_ALLOCATED;
810 info->info_num = NO_ALLOCATED;
811 }
812 return CPHS_IS_OK;
813 }
814 return CPHS_FAIL;
815
816 }
817
818 /*
819 +--------------------------------------------------------------------+
820 | MODULE : CPHS standalone module |
821 | STATE : code ROUTINE : cphs_getCSP |
822 +--------------------------------------------------------------------+
823
824 */
825 /* reads all entries of the customer service profile and fills */
826 T_CPHS_RET cphs_getCSP ( T_CPHS_CSP *csp )
827 { if (cphs_data EQ NULL)
828 return CPHS_NOT_INIT;
829 if (csp EQ NULL)
830 return CPHS_FAIL;
831
832 memcpy(csp, &cphs_data->csProfile, sizeof(T_CPHS_CSP));
833 return CPHS_IS_OK;
834 }
835
836 /*
837 +--------------------------------------------------------------------+
838 | MODULE : CPHS standalone module |
839 | STATE : code ROUTINE : cphs_getMailboxNumbers |
840 +--------------------------------------------------------------------+
841 */
842 /* reads all mailbox numbers from the SIM fills all mailbox number */
843 /* entries in the mailbox number list */
844 T_CPHS_RET cphs_getMailboxNumbers ( T_CPHS_MAILBOX_NUM_LIST *nums )
845 {if (cphs_data EQ NULL)
846 return CPHS_NOT_INIT;
847 if (nums EQ NULL)
848 return CPHS_FAIL;
849
850 memcpy(nums, &cphs_data->mbNum, sizeof(T_CPHS_CSP));
851 return CPHS_IS_OK;
852 }
853 /*
854 +--------------------------------------------------------------------+
855 | MODULE : CPHS standalone module |
856 | STATE : code ROUTINE : cphs_getInfoNumbers|
857 +--------------------------------------------------------------------+
858
859 */
860
861
862 /* reads all information numbers from the SIM fills all information */
863 /* numbers into the array of pointers to information number lists down to the level specified */
864 //MC-Not sure about the format of this as current mfw_cphs code returns an information number list
865 //with only 4 entries
866 T_CPHS_RET cphs_getInfoNumbers ( T_CPHS_INFO_NUM_LIST *nums, UBYTE level, UBYTE start_index, T_CPHS_CB_FUNC callback)
867 { cphs_data->InfoNumberListCB = callback;
868 cphs_data->numList=nums;
869 Cphs_get_info_num(level, start_index);
870 }
871 /*
872 +--------------------------------------------------------------------+
873 | MODULE : CPHS standalone module |
874 | STATE : code ROUTINE : cphs_selectInfoNumber |
875 +--------------------------------------------------------------------+
876
877 PURPOSE : reads the information number entry given by level and index from
878 the SIM
879
880 */
881 T_CPHS_RET cphs_selectInfoNumber ( USHORT index,
882 T_CPHS_INFO_NUM_ENTRY *num, T_CPHS_CB_FUNC callback)
883 { cphs_data->InfoNumberCB = callback;
884 cphs_data->infoEntry= num;
885 Cphs_select_info_num(index);
886 //num = &cphs_data->infoEntry;
887
888 }
889
890
891
892
893 /*
894 +--------------------------------------------------------------------+
895 | MODULE : CPHS standalone module |
896 | STATE : code ROUTINE : Cphs_support_check |
897 +--------------------------------------------------------------------+
898
899 PURPOSE : Check whether CPHS is supported.
900
901 */
902
903 void Cphs_support_check (void)
904 {
905 TRACE_FUNCTION ("Cphs_support_check()");
906
907 /* Read CPHS information filed (6F16 - 3 bytes) from SIM card */
908 if (!Cphs_read_sim_dat(SIM_CPHS_CINF, NOT_PRESENT_8BIT, CPHS_INFO_SIZE))
909 {
910 /* Read failed */
911 cphs_data->cphsStatus = CPHS_NOT_PRESENT;
912
913 }
914 }
915
916
917
918 /*
919 +--------------------------------------------------------------------+
920 | MODULE : CPHS standalone module |
921 | STATE : code ROUTINE : Cphs_operator_name |
922 +--------------------------------------------------------------------+
923
924 PURPOSE : Request the network operator name
925
926 */
927
928 void Cphs_operator_name (void)
929 {
930 TRACE_FUNCTION ("Cphs_operator_name()");
931
932 /* Check CPHS support status */
933 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
934 return;
935
936 /* Read operator name sring */
937 if (!Cphs_read_sim_dat(SIM_CPHS_ONSTR, NOT_PRESENT_8BIT, CPHS_ONS_SIZE))
938 {
939 /* Read operator name sring failed */
940 cphs_data->opName.long_name.len = 0;
941
942 /* Read operator name shortform */
943 if ((cphs_data->cphsPhase NEQ 2) OR
944 (Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED) OR
945 !Cphs_read_sim_dat(SIM_CPHS_ONSHF, NOT_PRESENT_8BIT, CPHS_ONSF_SIZE) )
946 {
947 /* Read operator name shortform failed.
948 */
949 cphs_data->opName.short_name.len = 0;
950 cphs_data->opName.result = SIMOP_READ_ERR;
951 }
952 }
953
954 }
955
956 /*
957 +-------------------------------------------------------------------------+
958 | MODULE : CPHS standalone module |
959 | STATE : code ROUTINE : Cphs_get_mailbox_status |
960 +-------------------------------------------------------------------------+
961
962 PURPOSE : get the voice message waiting flag
963
964 */
965
966 void Cphs_get_mailbox_status ()
967 {
968 TRACE_FUNCTION ("Cphs_get_mailbox_status()");
969
970 /* Check CPHS support status. */
971 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
972 return ;
973
974 /* Read voice message waiting flag.
975 When this reading failed, send event with "read error" parameter to MMI */
976 if (!Cphs_read_sim_dat(SIM_CPHS_VMW, NOT_PRESENT_8BIT, CPHS_MBS_SIZE))
977 {
978 cphs_data->mbStatus.result = SIMOP_READ_ERR;
979 TRACE_EVENT("Reading mailbox status failed");
980 }
981 }
982
983 /*
984 +------------------------------------------------------------------------+
985 | MODULE : CPHS standalone module |
986 | STATE : code ROUTINE : Cphs_get_divert_status |
987 +------------------------------------------------------------------------+
988
989 PURPOSE : Request the call forwarding flags
990
991 */
992
993 void Cphs_get_divert_status ()
994 {
995 TRACE_FUNCTION ("Cphs_get_divert_status()");
996
997 /* Check CPHS support status. */
998 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
999 return;
1000
1001 /* Read call forwarding flags.
1002 When this reading failed, send event with "read error" parameter to MMI */
1003 if (!Cphs_read_sim_dat(SIM_CPHS_CFF, NOT_PRESENT_8BIT, CPHS_CFF_SIZE))
1004 {
1005 cphs_data->dvStatus.result = SIMOP_READ_ERR;
1006
1007 }
1008
1009 }
1010
1011 /*
1012 +---------------------------------------------------------------------+
1013 | MODULE : CPHS standalone module |
1014 | STATE : code ROUTINE : Cphs_get_als_info |
1015 +---------------------------------------------------------------------+
1016
1017 PURPOSE : Request the Status of Alternate Line Service information
1018 (first read selected ALS line, dann status of this line).
1019 When the field does not exist in SIM, read it from EEPROM.
1020
1021 */
1022 //ATM, cannot get als lock status from SIM
1023 /*void Cphs_get_als_info ()
1024 {
1025 TRACE_EVENT ("Cphs_get_als_info()");
1026
1027 Cphs_read_eeprom_als();
1028
1029 }*/
1030
1031 /*
1032 +---------------------------------------------------------------------+
1033 | MODULE : CPHS standalone module |
1034 | STATE : code ROUTINE : Cphs_get_csp |
1035 +---------------------------------------------------------------------+
1036
1037 PURPOSE : Request the customer service profile
1038
1039 */
1040
1041 void Cphs_get_csp ()
1042 {
1043 UBYTE res;
1044
1045 TRACE_FUNCTION ("Cphs_get_csp()");
1046
1047 /* Check CPHS support status. */
1048 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
1049 return ;
1050
1051 /* check CPHS service table */
1052 res = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
1053 if ( res NEQ ALLOCATED_AND_ACTIVATED)
1054 return;
1055
1056 /* Read customer service profile.
1057 When this reading failed, send event with empty parameter array to MMI */
1058 if (!Cphs_read_sim_dat(SIM_CPHS_CSP, NOT_PRESENT_8BIT, CPHS_CSP_SIZE))
1059 {
1060 cphs_data->csProfile.result = SIMOP_READ_ERR;
1061 memset(cphs_data->csProfile.csp, 0, sizeof(cphs_data->csProfile.csp));
1062 }
1063 }
1064 /*
1065 +---------------------------------------------------------------------+
1066 | MODULE : CPHS standalone module |
1067 | STATE : code ROUTINE : Cphs_get_mailbox |
1068 +---------------------------------------------------------------------+
1069
1070 PURPOSE : Request the customer service profile
1071
1072 */
1073 void Cphs_get_mailbox (void)
1074 {
1075 TRACE_FUNCTION ("Cphs_get_mailbox()");
1076
1077 cphs_data->mbNum.count = 0;
1078
1079 /* Check CPHS support status.
1080 When CPHS is not support, read mailbox numbers from EEPROM */
1081 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
1082 {
1083 Cphs_read_eeprom_mailbox();
1084 return;
1085 }
1086
1087 /* Check CPHS service table.
1088 When CPHS is not support, read mailbox numbers from EEPROM */
1089 if (Cphs_ssc(CPHS_MB_NUMBER, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED)
1090 {
1091 TRACE_EVENT("CPHS doesn't support mailbox");
1092 Cphs_read_eeprom_mailbox();
1093 return;
1094 }
1095
1096 /* Read mailbox numbers from SIM.
1097 When this reading failed, read mailbox numbers from EEPROM */
1098 //cphs_data->simStatus = SIMOP_UNKNOWN;
1099 if (!Cphs_read_sim_rcd(SIM_CPHS_MBXN, 1, 0)) /* read the first record */
1100 { TRACE_EVENT("Mailbox Sim read failed");
1101 Cphs_read_eeprom_mailbox();
1102 }
1103 }
1104
1105 /*
1106 +----------------------------------------------------------------------+
1107 | MODULE: CPHS standalone module |
1108 | STATE : code ROUTINE: Cphs_ssc |
1109 +----------------------------------------------------------------------+
1110
1111
1112 PURPOSE : Check CPHS service status.
1113
1114 */
1115
1116 UBYTE Cphs_ssc (UBYTE nr, UBYTE * serv_table)
1117 {
1118 UBYTE value;
1119
1120 TRACE_FUNCTION ("Cphs_ssc()");
1121
1122 serv_table = serv_table + (nr-1)/4;
1123 value = * serv_table;
1124
1125 value = value >> (((nr-1) & 3) * 2);
1126 value = value & 3;
1127
1128 return value;
1129 }
1130
1131 /*
1132 +------------------------------------------------------------------------+
1133 | MODULE : CPHS standalone module |
1134 | STATE : code ROUTINE : Cphs_set_mailbox_status|
1135 +------------------------------------------------------------------------+
1136
1137 PURPOSE : Set the mailbox status on each line
1138
1139 */
1140
1141 T_CPHS_RET Cphs_set_mailbox_status (T_CPHS_FLAG_STATUS line1,
1142 T_CPHS_FLAG_STATUS line2,
1143 T_CPHS_FLAG_STATUS fax,
1144 T_CPHS_FLAG_STATUS data)
1145 {
1146 UBYTE result;
1147 char debug[50];
1148
1149 TRACE_FUNCTION ("Cphs_set_mailbox_status()");
1150
1151 /* Check CPHS support status. */
1152 // if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
1153 // return CPHS_FAIL;
1154 sprintf(debug, "Original mailbox status: %x%x",cphs_data->mbsData[0],cphs_data->mbsData[1]);
1155 TRACE_EVENT(debug);
1156 /* Write status in buffer */
1157 if (line1 EQ CPHS_LINEFLAG_SET OR
1158 line1 ==CPHS_LINEFLAG_NOT_SET )
1159 { /* low Nibble */
1160 cphs_data->mbsData[0]&=0xF0; //get rid of low nibble
1161 cphs_data->mbsData[0] += (line1&0x0F);
1162 }
1163 /* else
1164 cphs_data->mbsData[0] |= 0x0F;*/
1165
1166 if (line2 EQ CPHS_LINEFLAG_SET OR
1167 line2 EQ CPHS_LINEFLAG_NOT_SET )
1168 { cphs_data->mbsData[0]&=0x0F; //get rid of high nibble
1169 cphs_data->mbsData[0] += (line2 << 4)&0xF0; /* high Nibble */
1170 }
1171 /* else
1172 cphs_data->mbsData[0] = 0xF0 | cphs_data->mbsData[0];*/
1173
1174 if (fax EQ CPHS_LINEFLAG_SET OR
1175 fax EQ CPHS_LINEFLAG_NOT_SET )
1176 {cphs_data->mbsData[1]&=0xF0; //get rid of low nibble
1177 cphs_data->mbsData[1] += fax&0x0F; /* low Nibble */
1178 }
1179 /* else
1180 cphs_data->mbsData[1] |= 0x0F;*/
1181
1182 if (data EQ CPHS_LINEFLAG_SET OR
1183 data EQ CPHS_LINEFLAG_NOT_SET )
1184 { cphs_data->mbsData[1]&=0x0F; //get rid of high nibble
1185 cphs_data->mbsData[1] += (data << 4)&0xF0; /* high Nibble */
1186 }
1187 /* else
1188 cphs_data->mbsData[1] = 0xF0 | cphs_data->mbsData[1];*/
1189
1190 sprintf(debug, "MBS Data:%x%x", cphs_data->mbsData[0], cphs_data->mbsData[1]);
1191 TRACE_EVENT(debug);
1192
1193 /* Read voice message waiting flag to determine the size */
1194 cphs_data->simStatus = SIMOP_WRITE_OK;
1195 if (!Cphs_read_sim_dat(SIM_CPHS_VMW, NOT_PRESENT_8BIT, CPHS_MBS_SIZE))
1196 //if (!Cphs_write_sim_dat(SIM_CPHS_VMW, cphs_data->mbsData, CPHS_MBS_SIZE))
1197 { TRACE_EVENT("Mailbox status SIM write failed");
1198 return CPHS_SIM_WRITE_ERROR;
1199 }
1200 }
1201
1202 /*
1203 +------------------------------------------------------------------------+
1204 | MODULE : CPHS standalone module |
1205 | STATE : code ROUTINE : Cphs_set_divert_status|
1206 +------------------------------------------------------------------------+
1207
1208 PURPOSE : Set the divert status on each line
1209
1210 */
1211
1212 T_CPHS_RET Cphs_set_divert_status (T_CPHS_FLAG_STATUS line1,
1213 T_CPHS_FLAG_STATUS line2,
1214 T_CPHS_FLAG_STATUS fax,
1215 T_CPHS_FLAG_STATUS data)
1216 {
1217 UBYTE result;
1218 char debug[50];
1219
1220 TRACE_FUNCTION ("Cphs_set_divert_status()");
1221
1222 /* Check CPHS support status. */
1223 // if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
1224 // return cphs_data->cphsStatus;
1225 sprintf(debug, "Original divert status: %x%x",cphs_data->dvData[0],cphs_data->dvData[1]);
1226 TRACE_EVENT(debug);
1227 /* Write status in buffer */
1228 if (line1 EQ CPHS_LINEFLAG_SET OR
1229 line1 EQ CPHS_LINEFLAG_NOT_SET )
1230 { cphs_data->dvData[0] &= 0xF0; //zero low nibble
1231 cphs_data->dvData[0] += line1&0x0F; /* low Nibble */
1232 }
1233 /*else
1234 cphs_data->dvData[0] |= 0x0F;*/
1235
1236 if (line2 EQ CPHS_LINEFLAG_SET OR
1237 line2 EQ CPHS_LINEFLAG_NOT_SET )
1238 {cphs_data->dvData[0] &= 0x0F; //zero high nibble
1239 cphs_data->dvData[0] += (line2 << 4)&0xF0; /* high Nibble */
1240 }
1241 /*else
1242 cphs_data->dvData[0] = 0xF0 | cphs_data->dvData[0];*/
1243
1244 if (fax EQ CPHS_LINEFLAG_SET OR
1245 fax EQ CPHS_LINEFLAG_NOT_SET )
1246 { cphs_data->dvData[0] &= 0xF0; //zero low nibble
1247 cphs_data->dvData[1] += fax&0x0F; /* low Nibble */
1248 }
1249 /* else
1250 cphs_data->dvData[1] |= 0x0F;*/
1251
1252 if (data EQ CPHS_LINEFLAG_SET OR
1253 data EQ CPHS_LINEFLAG_NOT_SET )
1254 { cphs_data->dvData[1] &= 0x0F; //zero high nibble
1255 cphs_data->dvData[1] += (data << 4)&0xF0; /* high Nibble */
1256 }
1257 /*else
1258 cphs_data->dvData[1] = 0xF0 | cphs_data->dvData[1];*/
1259 sprintf(debug, "Divert Data:%x%x", cphs_data->dvData[0], cphs_data->dvData[1]);
1260 TRACE_EVENT(debug);
1261 /* Read call forwarding flag to determine the size */
1262 cphs_data->simStatus = SIMOP_WRITE_OK;
1263 if (!Cphs_read_sim_dat(SIM_CPHS_CFF, NOT_PRESENT_8BIT, CPHS_CFF_SIZE))
1264 { TRACE_EVENT("Mailbox SIM write failed");
1265 return SIMOP_WRITE_ERR;
1266 //cphs_sign_exec(E_CPHS_SET_DV_STAT, &result);
1267 }
1268 /* PATCH VO 22.01.01 end */
1269 return cphs_data->cphsStatus;
1270 }
1271
1272 /*CPHS_RET cphs_set_als_status (T_CPHS_ALS_INFO status)
1273 {
1274 UBYTE result;
1275 //T_MFW_SIM_PIN_STATUS pinStatus;
1276
1277 //TRACE_EVENT ("cphs_set_als_status()");
1278
1279 /* check PIN 2 requirement */
1280 /*pinStatus.type = MFW_SIM_PIN2;
1281 sim_pin_status(&pinStatus);
1282 if (pinStatus.set NEQ MFW_SIM_NO_PIN)
1283 return MFW_SIM_PIN2_REQ;
1284
1285 /* check given parameter */
1286 /*if (status NEQ MFW_LINE_LOCKED AND
1287 status NEQ MFW_LINE_UNLOCKED )
1288 {
1289 result = MFW_SIMOP_WRITE_ERR;
1290 //cphs_sign_exec(E_CPHS_SET_ALS_STATUS, &result);
1291 return CPHS_ERR;
1292 }*/
1293
1294 /* cphs_data->alsData = (UBYTE)status.locked;*/
1295
1296 /* write lock status in EEPROM */
1297 //MC cphs_write_eeprom_alss(&result);
1298 //cphs_sign_exec(E_CPHS_SET_LINE, &result);
1299 // }
1300 /* return CPHS_IS_OK;
1301 }*/
1302
1303 /*
1304 +----------------------------------------------------------------------+
1305 | MODULE: CPHS standalone module |
1306 | STATE : code ROUTINE: Cphs_read_sim_dat |
1307 +----------------------------------------------------------------------+
1308
1309
1310 PURPOSE : Request to read SIM card.
1311
1312 */
1313
1314 BOOL Cphs_read_sim_dat(USHORT data_id, UBYTE len, UBYTE max_length)
1315 {
1316 T_ACI_RETURN res;
1317
1318 TRACE_FUNCTION ("Cphs_read_sim_dat()");
1319
1320 res = cmhSIM_ReadTranspEF ( CMD_SRC_NONE,
1321 AT_CMD_NONE,
1322 data_id,
1323 0,
1324 max_length,
1325 NULL,
1326 Cphs_read_sim_dat_cb);
1327 if (res NEQ AT_EXCT)
1328 return FALSE;
1329
1330 return TRUE;
1331 }
1332
1333 /*
1334 +----------------------------------------------------------------------+
1335 | MODULE: CPHS standalone module |
1336 | STATE : code ROUTINE: Cphs_read_sim_dat_cb |
1337 +----------------------------------------------------------------------+
1338
1339
1340 PURPOSE : Call back for SIM read.
1341
1342 */
1343
1344 void Cphs_read_sim_dat_cb(SHORT table_id)
1345 {
1346 UBYTE dataLen;
1347 UBYTE result;
1348
1349
1350 switch (simShrdPrm.atb[table_id].reqDataFld)
1351 {
1352 case SIM_CPHS_CINF: /* CPHS information */
1353 if (!cphs_data->cphsUpdate)
1354 Cphs_read_information(simShrdPrm.atb[table_id].errCode,
1355 simShrdPrm.atb[table_id].exchData,
1356 simShrdPrm.atb[table_id].dataLen);
1357 /*#ifdef SIM_TOOLKIT
1358 else
1359 Cphs_update_info_cnf(simShrdPrm.atb[table_id].errCode,
1360 simShrdPrm.atb[table_id].exchData,
1361 simShrdPrm.atb[table_id].dataLen);
1362 #endif*/
1363 break;
1364
1365 case SIM_CPHS_ONSTR: /* operator name string */
1366
1367 Cphs_read_ons(simShrdPrm.atb[table_id].errCode,
1368 simShrdPrm.atb[table_id].exchData,
1369 simShrdPrm.atb[table_id].dataLen);
1370 break;
1371
1372 case SIM_CPHS_ONSHF: /* operator name short form */
1373
1374 Cphs_read_onsf(simShrdPrm.atb[table_id].errCode,
1375 simShrdPrm.atb[table_id].exchData,
1376 simShrdPrm.atb[table_id].dataLen);
1377 Cphs_get_mailbox_status();//get next item
1378 break;
1379
1380 case SIM_CPHS_VMW: /* voice message waiting flag */
1381
1382 if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
1383 {
1384 /* Determine the size of this field, and write the data.
1385 When the writing is not possible, write this voice
1386 message waiting flag in EEPROM. */
1387 cphs_data->simStatus = SIMOP_UNKNOWN;
1388 #ifdef FF_2TO1_PS
1389 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
1390 #else
1391 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
1392 #endif
1393 {
1394 dataLen = simShrdPrm.atb[table_id].dataLen;
1395 /* Write voice message waiting flag.
1396 When this writing failed, send event with "write error" parameter to MMI */
1397 if (!Cphs_write_sim_dat(SIM_CPHS_VMW, cphs_data->mbsData, dataLen))
1398 {
1399 cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
1400
1401 cphs_data->mbStatus.line1 = CPHS_FLAG_NOT_PRESENT;
1402 cphs_data->mbStatus.line2 = CPHS_FLAG_NOT_PRESENT;
1403 cphs_data->mbStatus.fax = CPHS_FLAG_NOT_PRESENT;
1404 cphs_data->mbStatus.data = CPHS_FLAG_NOT_PRESENT;
1405 }
1406 }
1407 else
1408 {
1409 cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
1410 //cphs_sign_exec(E_CPHS_SET_VC_STAT, &result);
1411 cphs_data->mbStatus.line1 = CPHS_FLAG_NOT_PRESENT;
1412 cphs_data->mbStatus.line2 = CPHS_FLAG_NOT_PRESENT;
1413 cphs_data->mbStatus.fax = CPHS_FLAG_NOT_PRESENT;
1414 cphs_data->mbStatus.data = CPHS_FLAG_NOT_PRESENT;
1415 }
1416 }
1417 else
1418 /* PATCH VO 22.01.01 end */
1419 {
1420 Cphs_read_mbs (simShrdPrm.atb[table_id].errCode,
1421 simShrdPrm.atb[table_id].exchData,
1422 simShrdPrm.atb[table_id].dataLen);
1423 Cphs_get_csp();
1424 }
1425 break;
1426
1427 case SIM_CPHS_CFF: /* call forwarding flag */
1428 /* PATCH VO 22.01.01 */
1429 if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
1430 {
1431 /* Determine the size of this field, and write the data.
1432 When the writing is not possible, write this voice
1433 message waiting flag in EEPROM. */
1434 cphs_data->simStatus = SIMOP_UNKNOWN;
1435 #ifdef FF_2TO1_PS
1436 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
1437 #else
1438 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
1439 #endif
1440 {
1441 dataLen = simShrdPrm.atb[table_id].dataLen;
1442 /* Write call forwarding flag.
1443 When this writing failed, send event with "write error" parameter to MMI */
1444 if (!Cphs_write_sim_dat(SIM_CPHS_CFF, cphs_data->dvData, dataLen))
1445 { TRACE_EVENT("Divert write failed");
1446 cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
1447 cphs_data->dvStatus.line1 = CPHS_FLAG_NOT_PRESENT;
1448 cphs_data->dvStatus.line2 = CPHS_FLAG_NOT_PRESENT;
1449 cphs_data->dvStatus.fax = CPHS_FLAG_NOT_PRESENT;
1450 cphs_data->dvStatus.data = CPHS_FLAG_NOT_PRESENT;
1451 }
1452 }
1453 else
1454 {TRACE_EVENT("Sim error while writing");
1455 cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
1456 cphs_data->dvStatus.line1 = CPHS_FLAG_NOT_PRESENT;
1457 cphs_data->dvStatus.line2 = CPHS_FLAG_NOT_PRESENT;
1458 cphs_data->dvStatus.fax = CPHS_FLAG_NOT_PRESENT;
1459 cphs_data->dvStatus.data = CPHS_FLAG_NOT_PRESENT;
1460 }
1461 }
1462 else
1463 /* PATCH VO 22.01.01 end */
1464 {Cphs_get_mailbox();
1465 Cphs_read_cff (simShrdPrm.atb[table_id].errCode,
1466 simShrdPrm.atb[table_id].exchData,
1467 simShrdPrm.atb[table_id].dataLen);
1468 }
1469 break;
1470
1471
1472
1473 case SIM_CPHS_CSP: /* customer service profile */
1474 Cphs_read_csp (simShrdPrm.atb[table_id].errCode,
1475 simShrdPrm.atb[table_id].exchData,
1476 simShrdPrm.atb[table_id].dataLen);
1477 //All CPHS data fields have now been read
1478 //so call callback function to alert client layer
1479
1480 break;
1481
1482 default:
1483 break;
1484 }
1485 simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
1486 }
1487
1488 /*
1489 +----------------------------------------------------------------------+
1490 | MODULE: CPHS standalone module |
1491 | STATE : code ROUTINE: Cphs_read_sim_rcd |
1492 +----------------------------------------------------------------------+
1493
1494
1495 PURPOSE : Request to read SIM card.
1496
1497 */
1498
1499 BOOL Cphs_read_sim_rcd(USHORT data_id, UBYTE rcd_num, UBYTE len)
1500 {
1501 T_ACI_RETURN res;
1502 UBYTE dataLen;
1503
1504 TRACE_FUNCTION ("Cphs_read_sim_rcd()");
1505
1506 if (rcd_num EQ 1)
1507 dataLen = UCHAR_MAX;
1508 else
1509 dataLen = len;
1510
1511 res = cmhSIM_ReadRecordEF ( CMD_SRC_NONE,
1512 AT_CMD_NONE,
1513 data_id,
1514 rcd_num,
1515 dataLen,
1516 NULL,
1517 Cphs_read_sim_rcd_cb);
1518
1519 if (res NEQ AT_EXCT)
1520 return FALSE;
1521
1522 return TRUE;
1523 }
1524
1525 /*
1526 +----------------------------------------------------------------------+
1527 | MODULE: CPHS standalone module |
1528 | STATE : code ROUTINE: Cphs_read_sim_rcd_cb |
1529 +----------------------------------------------------------------------+
1530
1531
1532 PURPOSE : Request to read SIM card.
1533
1534 */
1535
1536 void Cphs_read_sim_rcd_cb (SHORT table_id)
1537 {
1538 UBYTE dataLen;
1539 char debug[25];
1540 sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
1541
1542 TRACE_FUNCTION ("Cphs_read_sim_rcd_cb()");
1543 TRACE_EVENT(debug);
1544
1545 switch (simShrdPrm.atb[table_id].reqDataFld)
1546 {
1547 case SIM_CPHS_MBXN: /* mailbox numbers */
1548 if (cphs_data->simStatus EQ SIMOP_WRITE_OK)
1549 {
1550 /* Determine the size of record, and write a new record.
1551 When the writing is not possible, write this mailbox
1552 number in EEPROM. */
1553 cphs_data->simStatus = SIMOP_UNKNOWN;
1554 #ifdef FF_2TO1_PS
1555 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
1556 #else
1557 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
1558 #endif
1559 {
1560 dataLen = simShrdPrm.atb[table_id].dataLen;
1561 /* allocate mbnData (sizeof(dataLen)) */
1562 Cphs_build_mbn_data(cphs_data->mbnData, dataLen);
1563 if (!Cphs_write_sim_rcd(SIM_CPHS_MBXN, cphs_data->vcEntry->index,
1564 cphs_data->mbnData, dataLen))
1565 Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
1566 }
1567 else
1568 Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
1569 }
1570 else
1571 Cphs_read_mbn(table_id);
1572
1573 break;
1574
1575 case SIM_CPHS_INFN: /* information numbers */
1576 if (simShrdPrm.atb[table_id].recNr EQ 1)
1577 {
1578
1579 if ((cphs_data->startIdx EQ 1) AND (cphs_data->simStatus EQ SIMOP_READ_OK))
1580 Cphs_read_info_num(table_id);
1581 else
1582
1583 Cphs_read_first_info_num(table_id);
1584 }
1585 else
1586 Cphs_read_info_num(table_id);
1587 break;
1588
1589 case SIM_CPHS_INFN2: /* information numbers 2 - 7F10 'EA01' selected if SIM_CPHS_INFN '6F19' isn't there*/
1590 if (simShrdPrm.atb[table_id].recNr EQ 1)
1591 {
1592
1593 if ((cphs_data->startIdx EQ 1) AND (cphs_data->simStatus EQ SIMOP_READ_OK))
1594 Cphs_read_info_num(table_id);
1595 else
1596 Cphs_read_first_info_num(table_id);
1597 }
1598 else
1599 Cphs_read_info_num(table_id);
1600 break;
1601
1602 default:
1603 break;
1604 }
1605 simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
1606 }
1607
1608 /*
1609 +----------------------------------------------------------------------+
1610 | MODULE: CPHS standalone module |
1611 | STATE : code ROUTINE: Cphs_write_sim_rcd |
1612 +----------------------------------------------------------------------+
1613
1614
1615 PURPOSE : Request to write SIM card.
1616
1617 */
1618
1619 BOOL Cphs_write_sim_rcd(USHORT data_id, UBYTE rcd_num,
1620 UBYTE *data, UBYTE dataLen)
1621 {
1622 T_ACI_RETURN res;
1623
1624 TRACE_FUNCTION ("Cphs_read_sim_rcd()");
1625
1626 res = cmhSIM_WriteRecordEF (CMD_SRC_NONE,
1627 AT_CMD_NONE,
1628 data_id,
1629 rcd_num,
1630 dataLen,
1631 data,
1632 Cphs_write_sim_rcd_cb);
1633
1634 if (res NEQ AT_EXCT)
1635 return FALSE;
1636
1637 return TRUE;
1638 }
1639
1640 /*
1641 +----------------------------------------------------------------------+
1642 | MODULE: CPHS standalone module |
1643 | STATE : code ROUTINE: Cphs_write_sim_rcd_cb |
1644 +----------------------------------------------------------------------+
1645
1646
1647 PURPOSE : callback of SIM card writing.
1648
1649 */
1650
1651 void Cphs_write_sim_rcd_cb (SHORT table_id)
1652 {
1653 UBYTE result;
1654 char debug[30];
1655 TRACE_FUNCTION ("Cphs_write_sim_rcd_cb()");
1656 sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
1657 TRACE_EVENT(debug);
1658 switch (simShrdPrm.atb[table_id].reqDataFld)
1659 {
1660 case SIM_CPHS_MBXN: /* mailbox numbers */
1661 #ifdef FF_2TO1_PS
1662 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
1663 #else
1664 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
1665 #endif
1666 {
1667 cphs_data->mbNum.result = SIMOP_WRITE_OK;
1668 //cphs_sign_exec(E_CPHS_SET_VC_NUM, &result);
1669 }
1670 else
1671 {
1672 Cphs_write_eeprom_mailbox(cphs_data->vcEntry);
1673 }
1674 break;
1675
1676 default:
1677 break;
1678 }
1679 simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
1680 }
1681
1682 /*
1683 +--------------------------------------------------------------------------+
1684 | MODULE : CPHS standalone module |
1685 | STATE : code ROUTINE : Cphs_read_first_info_num |
1686 +--------------------------------------------------------------------------+
1687
1688 PURPOSE : Read first record of information numbers
1689
1690 */
1691
1692 void Cphs_read_first_info_num(SHORT table_id)
1693 {
1694 //UBYTE* pData; /* points to data buffer */
1695 UBYTE dataLen;
1696
1697 TRACE_FUNCTION ("Cphs_read_first_info_num()");
1698
1699 #ifdef FF_2TO1_PS
1700 if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR ) /* VO patch 040501 - remove dataLen and pData check */
1701 #else
1702 if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR ) /* VO patch 040501 - remove dataLen and pData check */
1703 #endif
1704 {
1705 if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
1706 {
1707 cphs_data->simStatus = SIMOP_UNKNOWN;
1708 cphs_data->infoEntry->result = SIMOP_READ_ERR;
1709 if (cphs_data->InfoNumberCB != NULL)
1710 (cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
1711
1712 }
1713 else
1714 {// if we are here then its possible the read of 7F20 6F19 failed.
1715 // so we must try reading 7F10 EA01 instead.
1716
1717 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
1718 {
1719 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
1720 {
1721 cphs_data->infoEntry->result = SIMOP_READ_ERR;
1722 if (cphs_data->InfoNumberCB != NULL)
1723 (cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
1724 }
1725 else
1726 {
1727 cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
1728 }
1729 }
1730 else
1731 { if (cphs_data->InfoNumberListCB != NULL)
1732 (cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
1733 }
1734 }
1735 }
1736 else
1737 {
1738 cphs_data->maxRec = simShrdPrm.atb[table_id].recMax;
1739 dataLen = simShrdPrm.atb[table_id].dataLen;
1740
1741 if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
1742 {
1743 /* VO patch 040501 - add dataLen check: if (patch) else ... */
1744 if (dataLen < CPHS_MIN_INS_SIZE )
1745 {
1746 cphs_data->simStatus = SIMOP_UNKNOWN;
1747 cphs_data->infoEntry->result = SIMOP_READ_ERR;
1748 }
1749 else
1750 Cphs_req_info_num_read(cphs_data->startIdx, dataLen);
1751 }
1752 else /* Read list of information numbers */
1753 {
1754 /* VO patch 040501 - add dataLen check: if (patch) else ... */
1755 if (dataLen >= CPHS_MIN_INS_SIZE )
1756 {
1757 if (cphs_data->idxLevel EQ 1) /* read this entry */
1758 Cphs_read_info_num(table_id);
1759 else /* read the startIndex record */
1760 Cphs_req_info_num_read(cphs_data->startIdx, dataLen);
1761 }
1762 }
1763 }
1764 }
1765 T_PHB_NPI cvtNpi(T_ACI_TOA_NPI npi)
1766 {
1767 switch (npi)
1768 {
1769 case NPI_NotPresent:
1770 case NPI_Unknown: return CPHS_NPI_UNKNOWN;
1771 case NPI_IsdnTelephony: return CPHS_NPI_ISDN;
1772 case NPI_Data: return CPHS_NPI_DATA;
1773 case NPI_Telex: return CPHS_NPI_TELEX;
1774 case NPI_Private: return CPHS_NPI_PRIVATE;
1775 case NPI_National: return CPHS_NPI_NATIONAL;
1776 #ifdef FF_2TO1_PS
1777 case NPI_Ermes: return CPHS_NPI_M_ERMES;
1778 case NPI_Cts: return CPHS_NPI_M_CTS;
1779 #else
1780 case NPI_ERMES: return CPHS_NPI_M_ERMES;
1781 case NPI_CTS: return CPHS_NPI_M_CTS;
1782 #endif
1783 default: return npi;
1784 }
1785 }
1786 /*
1787 +---------------------------------------------------------------------+
1788 | MODULE : CPHS standalone module |
1789 | STATE : code ROUTINE : Cphs_read_info_num |
1790 +---------------------------------------------------------------------+
1791
1792 PURPOSE : Read first record of information numbers
1793
1794 */
1795
1796 void Cphs_read_info_num(SHORT table_id)
1797 {
1798 UBYTE* pData; /* points to data buffer */
1799 UBYTE dataLen;
1800 UBYTE alphaLen;
1801 UBYTE recNr;
1802 T_ACI_TOA type;
1803
1804 TRACE_FUNCTION ("Cphs_read_info_num()");
1805
1806 pData = simShrdPrm.atb[table_id].exchData;
1807 dataLen = simShrdPrm.atb[table_id].dataLen;
1808 recNr = simShrdPrm.atb[table_id].recNr;
1809
1810 #ifdef FF_2TO1_PS
1811 if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR OR
1812 #else
1813 if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR OR
1814 #endif
1815 pData EQ NULL OR
1816 dataLen < CPHS_MIN_INS_SIZE )
1817 {
1818 if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Read entry of information numbers */
1819 {
1820 cphs_data->simStatus = SIMOP_UNKNOWN;
1821 cphs_data->infoEntry->result = SIMOP_READ_ERR;
1822 TRACE_EVENT("Info num read error");
1823 if (cphs_data->InfoNumberCB != NULL)
1824 (cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
1825
1826 }
1827 else
1828 {// if we are here then its possible the read of 7F20 6F19 failed.
1829 // so we must try reading 7F10 EA01 instead.
1830
1831 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
1832 {
1833 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
1834 {
1835 cphs_data->infoEntry->result = SIMOP_READ_ERR;
1836 if (cphs_data->InfoNumberCB != NULL)
1837 (cphs_data->InfoNumberCB)(NULL, cphs_data->infoEntry);
1838 }
1839 else
1840 {
1841 cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
1842 }
1843 }
1844 else
1845 { if (cphs_data->InfoNumberListCB != NULL)
1846 (cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
1847 }
1848 }
1849 (cphs_data->InfoNumberListCB)(cphs_data->numList, NULL);
1850 }
1851 else
1852 {
1853 if (cphs_data->simStatus EQ SIMOP_READ_OK)
1854 {
1855 /* Read entry of information numbers */
1856 alphaLen = *pData;
1857 if (alphaLen)
1858 {
1859 /* copy/encode entry */
1860 cphs_data->infoEntry->index = recNr;
1861 cphs_data->infoEntry->entryStat = *(pData + 1);
1862
1863 cmhPHB_getMfwTagNt(pData + 2, alphaLen,
1864 cphs_data->infoEntry->alpha.data, &cphs_data->infoEntry->alpha.len);
1865
1866 pData += alphaLen + 2;
1867
1868 if (*pData NEQ 0xFF)
1869 {
1870 cmhPHB_getAdrStr ( (CHAR *)cphs_data->infoEntry->number,
1871 3, /* length of number */
1872 pData + 2,
1873 *pData );
1874 cmhPHB_toaDmrg ( *( pData + 1 ), &type );
1875 cphs_data->infoEntry->ton = cvtTon(type.ton);
1876 cphs_data->infoEntry->npi = cvtNpi(type.npi);
1877 cphs_data->infoEntry->entryStat = cphs_data->infoEntry->entryStat | 0x80;
1878 }
1879 else
1880 {
1881 cphs_data->infoEntry->number[0] = '\0';
1882 cphs_data->infoEntry->ton = CPHS_TON_UNKNOWN;
1883 cphs_data->infoEntry->npi = CPHS_NPI_UNKNOWN;
1884 }
1885 }
1886 cphs_data->infoEntry->result = SIMOP_READ_OK;
1887 if (cphs_data->InfoNumberCB != NULL)
1888 (cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*)NULL, cphs_data->infoEntry);
1889 return;
1890 }
1891
1892 else if ((*(pData + 1) & 0x0F) > cphs_data->idxLevel)
1893 {
1894 /* This is not wished index level. Read the next */
1895 recNr++;
1896 Cphs_req_info_num_read(recNr, dataLen);
1897 }
1898 else
1899 {
1900 /* This is the wished index level. Read it. */
1901 alphaLen = *pData;
1902 if (alphaLen) /* check alpha length */
1903 {
1904 /* copy/encode this entry in list */
1905 cphs_data->numList->level = cphs_data->idxLevel;
1906 cphs_data->numList->entry[cphs_data->numList->count].index = recNr;
1907 cphs_data->numList->entry[cphs_data->numList->count].entryStat = *(pData + 1) & 0x7F; /* set bit 8 to 0 */
1908
1909 cmhPHB_getMfwTagNt(pData + 2, alphaLen,
1910 cphs_data->numList->entry[cphs_data->numList->count].alpha.data,
1911 &cphs_data->numList->entry[cphs_data->numList->count].alpha.len);
1912
1913 pData += alphaLen + 2;
1914
1915 if (*pData NEQ 0xFF)
1916 {
1917 cphs_data->numList->entry[cphs_data->numList->count].entryStat = cphs_data->numList->entry[cphs_data->numList->count].entryStat | 0x80;
1918 }
1919 cphs_data->numList->count++;
1920 }
1921 recNr++;
1922 /* Read the next record */
1923 Cphs_req_info_num_read(recNr, dataLen);
1924 }
1925 }
1926 }
1927
1928
1929 /*
1930 +------------------------------------------------------------------------+
1931 | MODULE : CPHS standalone module |
1932 | STATE : code ROUTINE : Cphs_req_info_num_read |
1933 +------------------------------------------------------------------------+
1934
1935 PURPOSE : Read customer service profile
1936
1937 */
1938
1939 void Cphs_req_info_num_read(UBYTE rcd_num, UBYTE dataLen)
1940 {
1941 TRACE_FUNCTION ("Cphs_req_info_num_read()");
1942
1943 if (rcd_num > cphs_data->maxRec)
1944 { if (cphs_data->InfoNumberListCB != NULL)
1945 (cphs_data->InfoNumberListCB)(cphs_data->numList, (T_CPHS_INFO_NUM_ENTRY*) NULL);
1946
1947 return;
1948 }
1949 else
1950 {
1951 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
1952 {
1953 if (Cphs_read_sim_rcd(SIM_CPHS_INFN, rcd_num, dataLen))
1954 {
1955
1956 cphs_data->cphsPrevRead = SIM_CPHS_INFN;
1957 }
1958 }
1959 else
1960 {
1961 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
1962 {
1963 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, rcd_num, dataLen))
1964 if (cphs_data->InfoNumberListCB != NULL)
1965 (cphs_data->InfoNumberListCB)(cphs_data->numList, (T_CPHS_INFO_NUM_ENTRY*) NULL);
1966 else
1967 {
1968 cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
1969 }
1970 }
1971 }
1972 }
1973 }
1974
1975 /*
1976 +----------------------------------------------------------------------+
1977 | MODULE: CPHS standalone module |
1978 | STATE : code ROUTINE: Cphs_build_mbn_data |
1979 +----------------------------------------------------------------------+
1980
1981
1982 PURPOSE : Build mailbox number data in SIM format.
1983
1984 */
1985
1986 void Cphs_build_mbn_data(UBYTE *data, UBYTE len)
1987 {
1988 UBYTE alphaLen;
1989 UBYTE numLen;
1990 UBYTE *pNumber;
1991 UBYTE i, j;
1992
1993 TRACE_FUNCTION ("Cphs_build_mbn_data()");
1994
1995 memset(data, MFW_INVALID_SIM_DATA, len);
1996
1997 /* alpha data */
1998 if (len <= CPHS_MIN_MBN_SIZE)
1999 alphaLen = 0;
2000 else
2001 alphaLen = len - CPHS_MIN_MBN_SIZE;
2002 i = MINIMUM (alphaLen, cphs_data->vcEntry->alpha.len);
2003
2004 for ( j = 0; j < i; j++ )
2005 data[j] = cphs_data->vcEntry->alpha.data[j];
2006
2007 data += alphaLen;
2008
2009 /* number data and TON/NPI data */
2010 if ( cphs_data->vcEntry->number[0] EQ '+' )
2011 {
2012 cphs_data->vcEntry->ton = TON_International;
2013 pNumber = &cphs_data->vcEntry->number[1];
2014 }
2015 else
2016 pNumber = &cphs_data->vcEntry->number[0];
2017
2018 cmhPHB_getAdrBcd ( data + 2, &numLen,
2019 PHB_MAX_LEN, (CHAR *)pNumber );
2020 *data = numLen + 1;
2021 *(data + 1) = ((( cphs_data->vcEntry -> ton << 4 ) & 0xF0 ) + ( cphs_data->vcEntry -> npi & 0x0F )) | 0x80;
2022
2023 data += 12;
2024
2025 /* capability/configuration identifier data and EXT identifier data */
2026 *data = 0xFF;
2027 *(data + 1) = 0xFF;
2028 }
2029
2030 /*
2031 +--------------------------------------------------------------------------+
2032 | MODULE : CPHS standalone module |
2033 | STATE : code ROUTINE : Cphs_read_eeprom_mailbox |
2034 +--------------------------------------------------------------------------+
2035
2036 PURPOSE : Read mailbox number from EEPROM
2037
2038 */
2039
2040 void Cphs_read_eeprom_mailbox(void)
2041 {
2042 U8 version;
2043
2044 #ifdef PCM_2_FFS
2045 EF_MBN mbn;
2046 #else
2047 T_PSPDF_MBN mbn;
2048 #endif
2049
2050 T_ACI_TOA numTp;
2051 int i;
2052 USHORT max_rcd;
2053 TRACE_FUNCTION("Cphs_read_eeprom_mailbox()");
2054 for (i=0; i<MAX_CPHS_ENTRY; i++)
2055 {
2056 //switching from PCM to FFS
2057 #ifdef PCM_2_FFS
2058 if (ffs_fread("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
2059 #else
2060 if (FFS_fread("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
2061 #endif
2062 {
2063 if (mbn.len)
2064 {
2065 cphs_data->mbNum.entries[cphs_data->mbNum.count].index = i+1;
2066 cmhPHB_getAdrStr ( (char *)cphs_data->mbNum.entries[cphs_data->mbNum.count].number,
2067 PHB_MAX_LEN - 1, mbn.mbNum, mbn.len );
2068 cmhPHB_getMfwTagNt ( mbn.alphId, 10,
2069 cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.data,
2070 &cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.len );
2071 cmhPHB_toaDmrg ( mbn.numTp, &numTp );
2072 cphs_data->mbNum.entries[cphs_data->mbNum.count].ton = cvtTon(numTp.ton);
2073 cphs_data->mbNum.entries[cphs_data->mbNum.count].npi = cvtNpi(numTp.npi);
2074 cphs_data->mbNum.entries[cphs_data->mbNum.count].service = i;
2075 cphs_data->mbNum.count++;
2076 }
2077 }
2078 }
2079 }
2080
2081 /*
2082 +---------------------------------------------------------------------------+
2083 | MODULE : CPHS standalone module |
2084 | STATE : code ROUTINE : Cphs_write_eeprom_mailbox |
2085 +---------------------------------------------------------------------------+
2086
2087 PURPOSE : Write mailbox number in EEPROM
2088
2089 */
2090
2091 void Cphs_write_eeprom_mailbox(T_CPHS_MAILBOX_NUM_ENTRY *entry)
2092 {
2093 T_ACI_PB_TEXT text;
2094 UBYTE len;
2095
2096 #ifdef PCM_2_FFS
2097 EF_MBN mbn;
2098 #else
2099 T_PSPDF_MBN mbn;
2100 #endif
2101
2102 T_ACI_TOA type;
2103 UBYTE *pNumber;
2104 UBYTE result;
2105 UBYTE outLen;
2106 TRACE_FUNCTION("Cphs_write_eeprom_mailbox");
2107
2108 len = MINIMUM ( MAX_PCM_MAILBOX_LEN, entry->alpha.len);
2109 text.len = len;
2110 memcpy(text.data, entry->alpha.data, len);
2111 text.cs = CS_Sim;
2112 cmhPHB_getMfwTagSim ( &text, mbn.alphId, &outLen, MAX_PCM_MAILBOX_LEN );
2113
2114 if ( entry->number[0] EQ '+')
2115 {
2116 type.ton = TON_International;
2117 pNumber = &entry->number[1];
2118 }
2119 else
2120 {
2121 type.ton = entry->ton;
2122 pNumber = &entry->number[0];
2123 }
2124 type.npi = entry->npi;
2125 //MC- switching from PCM to FFS
2126 cmhPHB_toaMrg ( &type, &mbn.numTp );
2127
2128 cmhPHB_getAdrBcd ((UBYTE*) mbn.mbNum, &mbn.len,
2129 MAX_PCM_MAILBOX_LEN, (CHAR *)pNumber );
2130 mbn.len++;
2131
2132 //if (pcm_WriteRecord((UBYTE *)EF_MBN_ID, (USHORT)entry->index,
2133 // SIZE_EF_MBN, (UBYTE *)&mbn) EQ PCM_OK)
2134 // if (flash_write() EQ EFFS_OK)
2135 #ifdef PCM_2_FFS
2136 if (ffs_fwrite("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
2137 #else
2138 if (FFS_fwrite("/Mailbox_no", &mbn, sizeof(mbn)) EQ EFFS_OK)
2139 #endif
2140 cphs_data->mbNum.result = SIMOP_WRITE_OK;
2141 else
2142 cphs_data->mbNum.result = SIMOP_WRITE_ERR;
2143
2144 }
2145
2146
2147 /*
2148 +----------------------------------------------------------------------+
2149 | MODULE : CPHS standalone module |
2150 | STATE : code ROUTINE : Cphs_select_info_num |
2151 +----------------------------------------------------------------------+
2152
2153 PURPOSE : read a information number entry
2154
2155 */
2156
2157 void Cphs_select_info_num (UBYTE index)
2158 {
2159 TRACE_FUNCTION ("Cphs_select_info_num()");
2160
2161 /* check CPHS service table */
2162 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
2163 return ;
2164
2165 /* Read a information number entry.
2166 When this reading failed, send event with "read error" parameter to MMI */
2167 cphs_data->simStatus = SIMOP_READ_OK;
2168 cphs_data->startIdx = index;
2169
2170 // By now we know if 6F19 or EA01 are present for reading info. num entries from
2171 // So lets use this knowledge.
2172
2173 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN)
2174 {
2175 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN, 1, 0))
2176 {
2177 cphs_data->infoEntry->result = SIMOP_READ_ERR;
2178 //cphs_sign_exec(E_CPHS_GET_INFO_NUM, &infoEntry);
2179 (cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*) NULL, cphs_data->infoEntry);
2180 }
2181 else
2182 {
2183 cphs_data->cphsPrevRead = SIM_CPHS_INFN;
2184 }
2185 }
2186 else
2187 {
2188 if (cphs_data->cphsPrevRead EQ SIM_CPHS_INFN2)
2189 {
2190 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN2, 1, 0))
2191 {
2192 cphs_data->infoEntry->result = SIMOP_READ_ERR;
2193 //cphs_sign_exec(E_CPHS_GET_INFO_NUM, &infoEntry);
2194 (cphs_data->InfoNumberCB)((T_CPHS_INFO_NUM_LIST*)NULL, cphs_data->infoEntry);
2195 }
2196 else
2197 {
2198 cphs_data->cphsPrevRead = SIM_CPHS_INFN2;
2199 }
2200 }
2201 }
2202 }
2203
2204
2205
2206 /*
2207 +-----------------------------------------------------------------------+
2208 | MODULE : CPHS standalone module |
2209 | STATE : code ROUTINE : Cphs_read_ons |
2210 +-----------------------------------------------------------------------+
2211
2212 PURPOSE : Read operator name short form
2213
2214 */
2215
2216 void Cphs_read_ons(SHORT errCode, UBYTE *data, UBYTE dataLen)
2217 {
2218 UBYTE *ptr;
2219
2220 TRACE_FUNCTION ("Cphs_read_ons()");
2221
2222 ptr = data;
2223 #ifdef FF_2TO1_PS
2224 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2225 #else
2226 if ( errCode NEQ SIM_NO_ERROR OR
2227 #endif
2228 ptr EQ NULL OR
2229 // dataLen < MFW_CPHS_ONS_SIZE )
2230 dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
2231 {
2232 cphs_data->opName.long_name.len = 0;
2233 }
2234 else
2235 {
2236 cmhPHB_getMfwTagNt(ptr, (UBYTE)MINIMUM(LONG_NAME, dataLen),
2237 cphs_data->opName.long_name.data, &cphs_data->opName.long_name.len);
2238 //cphs_data->opName.long_name.dcs = MFW_DCS_SIM;
2239
2240 /* Read operator name shortform */
2241 if ((cphs_data->cphsPhase NEQ 2) OR
2242 (Cphs_ssc(CHPS_NAME_SHORT, cphs_data->cphsServTab) NEQ ALLOCATED_AND_ACTIVATED) OR
2243 !Cphs_read_sim_dat(SIM_CPHS_ONSHF, NOT_PRESENT_8BIT, CPHS_ONSF_SIZE) )
2244 {
2245 cphs_data->opName.short_name.len = 0;
2246 }
2247 }
2248 }
2249
2250 /*
2251 +-----------------------------------------------------------------------+
2252 | MODULE : CPHS standalone module |
2253 | STATE : code ROUTINE : Cphs_read_onsf |
2254 +-----------------------------------------------------------------------+
2255
2256 PURPOSE : Read operator name short form
2257
2258 */
2259
2260 void Cphs_read_onsf(SHORT errCode, UBYTE *data, UBYTE dataLen)
2261 {
2262 UBYTE *ptr;
2263
2264 TRACE_FUNCTION ("Cphs_read_onsf()");
2265
2266 ptr = data;
2267 #ifdef FF_2TO1_PS
2268 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2269 #else
2270 if ( errCode NEQ SIM_NO_ERROR OR
2271 #endif
2272 ptr EQ NULL OR
2273 dataLen < CPHS_ONSF_SIZE )
2274 {
2275 cphs_data->opName.short_name.len = 0;
2276 }
2277 else
2278 {
2279 cmhPHB_getMfwTagNt(ptr, CPHS_ONSF_SIZE,
2280 cphs_data->opName.short_name.data, &cphs_data->opName.short_name.len);
2281 //cphs_data->opName.shortName.dcs = MFW_DCS_SIM;
2282 }
2283
2284 //cphs_sign_exec(E_CPHS_OP_NAME, &opName);
2285 }
2286
2287 /*
2288 +-----------------------------------------------------------------------+
2289 | MODULE : CPHS standalone module |
2290 | STATE : code ROUTINE : cvtTon |
2291 +-----------------------------------------------------------------------+
2292
2293 PURPOSE : Convert Type of Number
2294
2295 */
2296
2297
2298 T_CPHS_PHB_TON cvtTon(T_ACI_TOA_TON ton)
2299 {
2300 switch (ton)
2301 {
2302 case TON_NotPresent:
2303 case TON_Unknown: return CPHS_TON_UNKNOWN;
2304 case TON_International: return CPHS_TON_INTERNATIONAL;
2305 case TON_National: return CPHS_TON_NATIONAL;
2306 case TON_NetSpecific: return CPHS_TON_NET_SPECIFIC;
2307 case TON_DedAccess: return CPHS_TON_DED_ACCESS;
2308 case TON_Alphanumeric: return CPHS_TON_ALPHA_NUMERIC;
2309 case TON_Abbreviated: return CPHS_TON_ABBREVIATED;
2310 case TON_Extended: return CPHS_TON_EXTENDED;
2311 default: return ton;
2312 }
2313 }
2314 /*
2315 +-----------------------------------------------------------------------+
2316 | MODULE : CPHS standalone module |
2317 | STATE : code ROUTINE : cphs_read_mbn |
2318 +-----------------------------------------------------------------------+
2319
2320 PURPOSE : Read mailbox number into runtime variables
2321
2322 */
2323 void Cphs_read_mbn(SHORT table_id)
2324 {
2325 UBYTE* pData; /* points to data buffer */
2326 UBYTE alphaLen;
2327 UBYTE dataLen;
2328 UBYTE recNr;
2329 T_ACI_TOA type;
2330
2331 TRACE_FUNCTION ("Cphs_read_mbn()");
2332
2333 pData = simShrdPrm.atb[table_id].exchData;
2334 dataLen = simShrdPrm.atb[table_id].dataLen;
2335 recNr = simShrdPrm.atb[table_id].recNr;
2336
2337 #ifdef FF_2TO1_PS
2338 if ( simShrdPrm.atb[table_id].errCode NEQ CAUSE_SIM_NO_ERROR OR
2339 #else
2340 if ( simShrdPrm.atb[table_id].errCode NEQ SIM_NO_ERROR OR
2341 #endif
2342 pData EQ NULL OR
2343 dataLen < CPHS_MIN_MBN_SIZE )
2344 {//MC FFS ?
2345 /* if (recNr <= 1)
2346 {
2347 Cphs_read_eeprom_mailbox();
2348 return;
2349 }
2350 else
2351 cphs_sign_exec(E_CPHS_GET_VC_NUM, &mbNum);*/
2352 TRACE_EVENT("MB read error");
2353 return;
2354 }
2355 else /* no read error */
2356 {
2357 if (recNr EQ 1)
2358 {
2359 cphs_data->maxRec = simShrdPrm.atb[table_id].recMax;
2360 }
2361 alphaLen = dataLen - CPHS_MIN_MBN_SIZE;
2362
2363 /* Copy/encode data */
2364 if (*(pData + alphaLen + 2) NEQ 0xFF)
2365 {
2366 cphs_data->mbNum.entries[cphs_data->mbNum.count].index = recNr;
2367 cmhPHB_getMfwTagNt(pData, alphaLen,
2368 cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.data,
2369 &cphs_data->mbNum.entries[cphs_data->mbNum.count].alpha.len);
2370 pData += alphaLen;
2371
2372 cmhPHB_getAdrStr ( (CHAR *)cphs_data->mbNum.entries[cphs_data->mbNum.count].number,
2373 PHB_MAX_LEN - 1,
2374 pData + 2,
2375 *pData );
2376
2377 cmhPHB_toaDmrg ( *( pData + 1 ), &type );
2378 cphs_data->mbNum.entries[cphs_data->mbNum.count].ton = cvtTon(type.ton);
2379 cphs_data->mbNum.entries[cphs_data->mbNum.count].npi = cvtNpi(type.npi);
2380 pData += 12;
2381
2382 if ( *pData NEQ 0xFF )
2383 {
2384 /* read bearer capability EF */
2385 /* return; */
2386 }
2387 cphs_data->mbNum.count++;
2388 cphs_data->mbNum.result = SIMOP_READ_OK;
2389 }
2390 recNr++;
2391 if (recNr > cphs_data->maxRec)
2392 { TRACE_FUNCTION("got CPHS Mailbox nos");
2393 Cphs_operator_name();//get next CPHS item
2394 return;
2395
2396 }
2397 if (recNr <= cphs_data->maxRec)
2398 {
2399 /* Read the next entry */
2400 Cphs_read_sim_rcd(SIM_CPHS_MBXN, recNr, dataLen);
2401 }
2402
2403
2404 }
2405 }
2406
2407 /*
2408 +-----------------------------------------------------------------------+
2409 | MODULE : CPHS standalone module |
2410 | STATE : code ROUTINE : Cphs_read_mbs |
2411 +-----------------------------------------------------------------------+
2412
2413 PURPOSE : Read voice message waiting flag
2414
2415 */
2416
2417 void Cphs_read_mbs(SHORT errCode, UBYTE *data, UBYTE dataLen)
2418 {
2419 UBYTE *ptr;
2420 int i; /* PATCH VO 22.01.01 */
2421 char debug[50];
2422
2423 TRACE_FUNCTION ("Cphs_read_mbs()");
2424
2425 ptr = data;
2426 #ifdef FF_2TO1_PS
2427 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2428 #else
2429 if ( errCode NEQ SIM_NO_ERROR OR
2430 #endif
2431 ptr EQ NULL OR
2432 //dataLen < MFW_CPHS_MBS_SIZE )
2433 dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
2434 {
2435 cphs_data->mbStatus.result = SIMOP_READ_ERR;
2436 }
2437 else
2438 {
2439 sprintf(debug, "Retrieved mailbox status: %x%x",ptr[0],ptr[1]);
2440 TRACE_EVENT(debug);
2441 memset(&cphs_data->mbStatus, CPHS_FLAG_NOT_PRESENT, sizeof(cphs_data->mbStatus));
2442 cphs_data->mbStatus.result = SIMOP_READ_OK;
2443 for (i=0; i<dataLen; i++)
2444 {
2445 switch (i)
2446 {
2447 case 0:
2448 cphs_data->mbStatus.line1 = ptr[i] & 0x0F/*0x01*/;
2449 cphs_data->mbStatus.line2 = ( ptr[i] >> 4 ) & 0x0F/*0x01*/;
2450 break;
2451 case 1:
2452 cphs_data->mbStatus.fax = ptr[i] & 0x0F/*0x01*/;
2453 cphs_data->mbStatus.data = ( ptr[i] >> 4 ) & 0x0F/*0x01*/;
2454 break;
2455 default:
2456 break;
2457 }
2458 }
2459 /* PATCH VO 22.01.01 END */
2460 //Not sure about this
2461 //memcpy(cphs_data->mbsData, ptr, CPHS_MBS_SIZE);
2462 }
2463 }
2464
2465 /*
2466 +-----------------------------------------------------------------------+
2467 | MODULE : CPHS standalone module |
2468 | STATE : code ROUTINE : Cphs_read_cff |
2469 +-----------------------------------------------------------------------+
2470
2471 PURPOSE : Read call forwarding flag
2472
2473 */
2474
2475 void Cphs_read_cff(SHORT errCode, UBYTE *data, UBYTE dataLen)
2476 {
2477 UBYTE *ptr;
2478 int i; /* PATCH VO 22.01.01 */
2479 char debug[50];
2480
2481 TRACE_EVENT ("Cphs_read_cff()");
2482
2483 ptr = data;
2484 #ifdef FF_2TO1_PS
2485 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2486 #else
2487 if ( errCode NEQ SIM_NO_ERROR OR
2488 #endif
2489 ptr EQ NULL OR
2490 //dataLen < MFW_CPHS_CFF_SIZE )
2491 dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
2492 {
2493 cphs_data->dvStatus.result = SIMOP_READ_ERR;
2494 }
2495 else
2496 {
2497 sprintf(debug, "Retrieved divert status: %x%x",ptr[0],ptr[1]);
2498 TRACE_EVENT(debug);
2499 memset(&cphs_data->dvStatus, CPHS_FLAG_NOT_PRESENT, sizeof(cphs_data->dvStatus));
2500 cphs_data->dvStatus.result = SIMOP_READ_OK;
2501 for (i=0; i<dataLen; i++)
2502 {
2503 switch (i)
2504 {
2505 case 0:
2506 cphs_data->dvStatus.line1 = ptr[i] & /*0x0F*/0x01;
2507 cphs_data->dvStatus.line2 = ( ptr[i] >> 4 ) & /*0x0F*/0x01;
2508 break;
2509 case 1:
2510 cphs_data->dvStatus.fax = ptr[i] & /*0x0F*/0x01;
2511 cphs_data->dvStatus.data = ( ptr[i] >> 4 ) & /*0x0F*/0x01;
2512 break;
2513 default:
2514 break;
2515 }
2516 }
2517 /* PATCH VO 22.01.01 END */
2518 //not sure about this bit
2519 //memcpy(cphs_data->dvData, ptr, CPHS_CFF_SIZE);
2520 }
2521 }
2522
2523
2524
2525
2526 /*
2527 +-----------------------------------------------------------------------+
2528 | MODULE : CPHS standalone module |
2529 | STATE : code ROUTINE : Cphs_read_csp |
2530 +-----------------------------------------------------------------------+
2531
2532 PURPOSE : Read customer service profile
2533
2534 */
2535
2536 void Cphs_read_csp(SHORT errCode, UBYTE *data, UBYTE dataLen)
2537 {
2538 UBYTE *ptr;
2539 UBYTE flag;
2540 int i;
2541
2542 TRACE_FUNCTION ("Cphs_read_csp()");
2543
2544 ptr = data;
2545 #ifdef FF_2TO1_PS
2546 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2547 #else
2548 if ( errCode NEQ SIM_NO_ERROR OR
2549 #endif
2550 ptr EQ NULL OR
2551 // dataLen < MFW_CPHS_CSP_SIZE )
2552 dataLen <= 0 ) /* PATCH VO 22.01.01: not check a certain length */
2553 {
2554 if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Used for read information numbers */
2555 {
2556 cphs_data->simStatus = SIMOP_UNKNOWN;
2557 //cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
2558 }
2559 else
2560 {
2561 cphs_data->csProfile.result = SIMOP_READ_ERR;
2562 memset(cphs_data->csProfile.csp, 0, sizeof(cphs_data->csProfile.csp));
2563 //cphs_sign_exec(E_CPHS_GET_CSP, &csProfile);
2564 if (cphs_data->RefreshCB != NULL)
2565 (cphs_data->RefreshCB)(NULL, NULL);
2566 }
2567 }
2568 else
2569 {
2570 if (cphs_data->simStatus EQ SIMOP_READ_OK) /* Used for read information numbers */
2571 {
2572 cphs_data->simStatus = SIMOP_UNKNOWN;
2573
2574 /* check the service group code */
2575 flag = 0;
2576 //for (i = 0; i < MFW_CPHS_CSP_SIZE; i += 2)
2577 for (i = 0; i < dataLen; i += 2) /* PATCH VO 22.01.01: use the actual length in the SIM card */
2578 {
2579 if (ptr[i] EQ 0xD5 AND ptr[i+1] EQ 0xFF)
2580 flag = 1;
2581 }
2582 if (!flag)
2583 {
2584 // cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
2585 return;
2586 }
2587
2588 /* Read the first information numbers record */
2589 if (!Cphs_read_sim_rcd(SIM_CPHS_INFN, 1, 0))
2590 { //cphs_sign_exec(E_CPHS_GET_INFO_LIST, &numList);
2591 TRACE_EVENT("Can't read info num rcd");
2592 return;
2593 }
2594
2595 else
2596 cphs_data->cphsPrevRead = SIM_CPHS_INFN;
2597 }
2598 else
2599 {
2600 cphs_data->csProfile.result = SIMOP_READ_OK;
2601 TRACE_EVENT("CPHS valid CSP");
2602 //memcpy(cphs_data->csProfile.csp, ptr, sizeof(cphs_data->csProfile.csp));
2603 for (i=0; i<(dataLen/2); i++)
2604 {
2605 cphs_data->csProfile.csp[i].group_code = ptr[2*i];
2606 cphs_data->csProfile.csp[i].services =ptr[2*i + 1];
2607 }
2608 if (cphs_data->RefreshCB != NULL)
2609 (cphs_data->RefreshCB)(NULL, NULL);
2610 // cphs_sign_exec(E_CPHS_GET_CSP, &cphs_data->csProfile);
2611 }
2612 }
2613 }
2614
2615 void Cphs_read_information(SHORT errCode, UBYTE *data, UBYTE dataLen)
2616 {
2617 UBYTE *ptr;
2618
2619 UBYTE len;
2620
2621
2622 TRACE_FUNCTION ("Cphs_read_information()");
2623
2624 ptr = data;
2625
2626 len = dataLen;
2627 memset(cphs_data->cphsServTab, 0, sizeof(cphs_data->cphsServTab));
2628 /* PATCH VO 22.01.01 END */
2629 #ifdef FF_2TO1_PS
2630 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2631 #else
2632 if ( errCode NEQ SIM_NO_ERROR OR
2633 #endif
2634 ptr EQ NULL OR
2635 //dataLen < MFW_CPHS_INFO_SIZE)
2636 dataLen <= 0) /* PATCH VO 22.01.01: not check a certain length */
2637 {
2638 cphs_data->cphsStatus = CPHS_NOT_PRESENT;
2639 //cphs_sign_exec(E_CPHS_IND, &cphsStatus);
2640 }
2641 else
2642 {
2643 cphs_data->cphsPhase = *ptr;
2644 len--;
2645 if (len > 0)
2646 {
2647 ptr++;
2648 memcpy (cphs_data->cphsServTab, ptr, MINIMUM(len, CPHS_SERVICE_TABLE));
2649 }
2650 /* PATCH VO 22.01.01 END */
2651 cphs_data->cphsStatus = CPHS_IS_OK;
2652 TRACE_EVENT("CPHS supported");
2653 //cphs_sign_exec(E_CPHS_IND, &cphsStatus);
2654 }
2655 }
2656 #ifdef FRED //commented this func out because of build problems
2657 #ifdef SIM_TOOLKIT
2658 /*
2659 +---------------------------------------------------------------------+
2660 | MODULE : CPHS standalone module |
2661 | STATE : code ROUTINE : Cphs_update_info_cnf |
2662 +---------------------------------------------------------------------+
2663
2664 PURPOSE : call back for SIM file read
2665
2666 */
2667
2668 void Cphs_update_info_cnf (SHORT errCode, UBYTE *data, UBYTE dataLen)
2669 {
2670 UBYTE *ptr;
2671
2672 TRACE_FUNCTION ("Cphs_update_info_cnf()");
2673
2674 cphs_data->cphsUpdate = FALSE; /* reset flag */
2675 ptr = data;
2676 #ifdef FF_2TO1_PS
2677 if ( errCode NEQ CAUSE_SIM_NO_ERROR OR
2678 #else
2679 if ( errCode NEQ SIM_NO_ERROR OR
2680 #endif
2681 ptr EQ NULL OR
2682 dataLen < CPHS_INFO_SIZE)
2683 {
2684 satUpdateFiles(TRUE, SIM_CPHS_CINF);
2685 }
2686 else
2687 {
2688 cphs_data->cphsPhase = *ptr;
2689 ptr++;
2690 memcpy (cphs_data->cphsServTab, ptr, CPHS_SERVICE_TABLE*sizeof(UBYTE));
2691 cphs_data->cphsStatus = CPHS_IS_OK;
2692 satUpdateFiles ( TRUE, SIM_CPHS_CINF );
2693 }
2694 }
2695 #endif
2696 #endif
2697 BOOL Cphs_write_sim_dat(USHORT data_id, UBYTE *data, UBYTE length)
2698 {
2699 T_ACI_RETURN res;
2700
2701 TRACE_FUNCTION ("Cphs_write_sim_dat()");
2702
2703 res = cmhSIM_WriteTranspEF (CMD_SRC_NONE,
2704 AT_CMD_NONE,
2705 data_id,
2706 0,
2707 length,
2708 data,
2709 Cphs_write_sim_dat_cb);
2710
2711 if (res NEQ AT_EXCT)
2712 return FALSE;
2713
2714 return TRUE;
2715 }
2716
2717 /*
2718 +----------------------------------------------------------------------+
2719 | MODULE: CPHS standalone module |
2720 | STATE : code ROUTINE: Cphs_write_sim_dat_cb |
2721 +----------------------------------------------------------------------+
2722
2723
2724 PURPOSE : callback of SIM card writing.
2725
2726 */
2727
2728 void Cphs_write_sim_dat_cb(SHORT table_id)
2729 {
2730 UBYTE result;
2731 char debug[30];
2732 TRACE_FUNCTION ("sim_write_sim_dat_cb()");
2733
2734
2735 sprintf(debug, "SIM Error code!!!%d", simShrdPrm.atb[table_id].errCode);
2736 TRACE_EVENT(debug);
2737 switch (simShrdPrm.atb[table_id].reqDataFld)
2738 {
2739 case SIM_CPHS_VMW: /* voice message waiting flag */
2740 #ifdef FF_2TO1_PS
2741 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
2742 #else
2743 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
2744 #endif
2745 {
2746 cphs_data->mbStatus.result = SIMOP_WRITE_OK;
2747
2748 }
2749 else
2750 {
2751 cphs_data->mbStatus.result = SIMOP_WRITE_ERR;
2752 }
2753 break;
2754
2755 case SIM_CPHS_CFF: /* call forwarding flag */
2756 #ifdef FF_2TO1_PS
2757 if ( simShrdPrm.atb[table_id].errCode EQ CAUSE_SIM_NO_ERROR )
2758 #else
2759 if ( simShrdPrm.atb[table_id].errCode EQ SIM_NO_ERROR )
2760 #endif
2761 {
2762 cphs_data->dvStatus.result = SIMOP_WRITE_OK;
2763 TRACE_EVENT("Divert Write successful");
2764 }
2765 else
2766 {
2767 cphs_data->dvStatus.result = SIMOP_WRITE_ERR;
2768 TRACE_EVENT("Divert Write Failed");
2769 }
2770 break;
2771
2772 default:
2773 break;
2774 }
2775 simShrdPrm.atb[table_id].ntryUsdFlg = FALSE;
2776 }
2777
2778 /*
2779 +-----------------------------------------------------------------------+
2780 | MODULE : CPHS standalone module |
2781 | STATE : code ROUTINE : cphs_read_eeprom_als |
2782 +-----------------------------------------------------------------------+
2783
2784 PURPOSE : Read alternate line service information from EEPROM
2785
2786 */
2787
2788 T_CPHS_RET Cphs_read_eeprom_als(T_CPHS_ALS_INFO* info)
2789 { char read_result;
2790 char debug[50];
2791
2792 #ifdef PCM_2_FFS
2793 read_result =ffs_fread("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
2794 #else
2795 read_result =FFS_fread("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
2796 #endif
2797
2798 if (read_result == EFFS_OK)
2799 { info->result = SIMOP_READ_OK;
2800 return CPHS_IS_OK;
2801 }
2802 else
2803 { info->result = SIMOP_READ_ERR;
2804 sprintf(debug, "ALS info read error:%d", read_result);
2805 TRACE_EVENT(debug);
2806 return CPHS_SIM_READ_ERROR;
2807 }
2808 }
2809
2810 /*
2811 +-----------------------------------------------------------------------+
2812 | MODULE : CPHS standalone module |
2813 | STATE : code ROUTINE : cphs_write_eeprom_als |
2814 +-----------------------------------------------------------------------+
2815
2816 PURPOSE : Write selected alternate line/lock status in EEPROM
2817
2818 */
2819
2820 T_CPHS_RET Cphs_write_eeprom_als(T_CPHS_ALS_INFO* info)
2821 { char write_result;
2822 T_ACI_ALS_MOD alsMode;
2823 T_CPHS_RET return_result;
2824
2825 #ifdef PCM_2_FFS
2826 write_result =ffs_fwrite("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
2827 #else
2828 write_result =FFS_fwrite("/AlsInfo", info, sizeof(T_CPHS_ALS_INFO));
2829 #endif
2830
2831 if (write_result >= EFFS_OK)
2832 { info->result = SIMOP_WRITE_OK;
2833 return_result = CPHS_IS_OK;
2834 TRACE_EVENT("ALS info write OK");
2835 }
2836 else
2837 { info->result = SIMOP_WRITE_ERR;
2838 return_result = CPHS_SIM_WRITE_ERROR;
2839 TRACE_EVENT("ALS info write error");
2840 }
2841
2842 if (cphs_data->alsStatus.line EQ CPHS_LINE_INDEX_LINE1)
2843 alsMode = ALS_MOD_SPEECH;
2844 if (cphs_data->alsStatus.line EQ CPHS_LINE_INDEX_LINE2)
2845 alsMode = ALS_MOD_AUX_SPEECH;
2846 sAT_PercentALS(CMD_SRC_LCL, alsMode);
2847 return return_result;
2848
2849 }
2850 /*
2851 +-----------------------------------------------------------------------+
2852 | MODULE : CPHS standalone module |
2853 | STATE : code ROUTINE : cphs_write_eeprom_als_desc |
2854 +-----------------------------------------------------------------------+
2855
2856 PURPOSE : Write ALS line description in EEPROM
2857
2858 */
2859 void Cphs_write_eeprom_als_desc(T_CPHS_ALS_LINE* line)
2860 { char write_result = -1;
2861 T_CPHS_ALS_LINE* desc;
2862 if (line->line EQ CPHS_LINE_INDEX_LINE1)
2863 { desc = &cphs_data->Line1_desc;
2864
2865 #ifdef PCM_2_FFS
2866 write_result =ffs_fwrite("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
2867 #else
2868 write_result =FFS_fwrite("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
2869 #endif
2870
2871 }
2872 if (line->line EQ CPHS_LINE_INDEX_LINE2)
2873 { desc = &cphs_data->Line2_desc;
2874 #ifdef PCM_2_FFS
2875 write_result =ffs_fwrite("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
2876 #else
2877 write_result =FFS_fwrite("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
2878 #endif
2879 }
2880
2881 if (write_result >= EFFS_OK)
2882 desc->result = SIMOP_WRITE_OK;
2883 else
2884 desc->result = SIMOP_WRITE_ERR;
2885 }
2886 /*
2887 +-----------------------------------------------------------------------+
2888 | MODULE : CPHS standalone module |
2889 | STATE : code ROUTINE : cphs_read_eeprom_als_desc |
2890 +-----------------------------------------------------------------------+
2891
2892 PURPOSE : read ALS line description from EEPROM
2893
2894 */
2895 void Cphs_read_eeprom_als_desc()
2896 { char read_result = -1;
2897 T_CPHS_ALS_LINE* desc;
2898
2899 #ifdef PCM_2_FFS
2900 read_result =ffs_fread("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
2901 #else
2902 read_result =FFS_fread("/AlsDesc1", &cphs_data->Line1_desc, sizeof(cphs_data->Line1_desc));
2903 #endif
2904 if (read_result >= EFFS_OK)
2905 cphs_data->Line1_desc.result = SIMOP_READ_OK;
2906 else
2907 cphs_data->Line1_desc.result = SIMOP_READ_ERR;
2908
2909
2910 #ifdef PCM_2_FFS
2911 read_result =ffs_fread("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
2912 #else
2913 read_result =FFS_fread("/AlsDesc2", &cphs_data->Line2_desc, sizeof(cphs_data->Line1_desc));
2914 #endif
2915 if (read_result EQ EFFS_OK)
2916 cphs_data->Line2_desc.result = SIMOP_READ_OK;
2917 else
2918 cphs_data->Line2_desc.result = SIMOP_READ_ERR;
2919
2920
2921 }
2922
2923 void Cphs_get_info_num (UBYTE level, UBYTE startIndex)
2924 {
2925 UBYTE res;
2926
2927 TRACE_FUNCTION ("cphs_get_info_num()");
2928
2929 /* check CPHS service table */
2930 if (cphs_data->cphsStatus EQ CPHS_NOT_PRESENT)
2931 return;
2932
2933 if (level < 1 OR
2934 startIndex < 1 )
2935 return;
2936
2937 /* check CPHS service table for customer service profile */
2938 /* res = Cphs_ssc(CPHS_CSP, cphs_data->cphsServTab);
2939 if ( res NEQ ALLOCATED_AND_ACTIVATED)
2940 return;*/
2941
2942 /* check CPHS service table for information numbers */
2943 /* res = Cphs_ssc(CHPS_INFO_NUMBERS, cphs_data->cphsServTab);
2944 if ( res NEQ ALLOCATED_AND_ACTIVATED)
2945 return;*/
2946
2947 /* Read customer service profile to check
2948 whether information numbers are supported. */
2949 cphs_data->numList->count = 0;
2950 cphs_data->idxLevel = level;
2951 cphs_data->startIdx = startIndex;
2952 cphs_data->simStatus = SIMOP_READ_OK;
2953 if (!Cphs_read_sim_dat(SIM_CPHS_CSP, NOT_PRESENT_8BIT, CPHS_CSP_SIZE))
2954 {
2955 cphs_data->simStatus = SIMOP_UNKNOWN;
2956 TRACE_EVENT("FAiled in reading CSP for Info nums");
2957 return;
2958 }
2959
2960 return;
2961 }
2962
2963
2964 /* checks the lock status of the given lock type. On successfull check */
2965 /* the status will be returned. If an error occured SIMLOCK_FAIL will */
2966 T_SIMLOCK_RET simlock_checkLock ( T_SIMLOCK_TYPE type )
2967 {
2968
2969 return SIMLOCK_FAIL;
2970 }
2971