FreeCalypso > hg > fc-magnetite
comparison src/aci2/aci/aci_bat_phb.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Mon, 26 Sep 2016 00:29:36 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 2:c41a534f33c6 | 3:93999a60b835 |
|---|---|
| 1 /* | |
| 2 +----------------------------------------------------------------------------- | |
| 3 | Project : GSM-F&D (8411) | |
| 4 | Modul : ACI_BAT | |
| 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 BAT wrapper modul is ... | |
| 18 | | |
| 19 +----------------------------------------------------------------------------- | |
| 20 */ | |
| 21 | |
| 22 #include "aci_all.h" /* includes prim.h, which includes p_bat.h */ | |
| 23 #include "aci_cmh.h" /* prototypes of sAT_,qAT_,tAT_ */ | |
| 24 #include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ | |
| 25 #include "aci_bat.h" | |
| 26 #include "ati_cmd.h" | |
| 27 #include "aci_cmd.h" | |
| 28 #include "aci_mem.h" /* MAKROS ACI_MALLOC, ACI_MFREE*/ | |
| 29 | |
| 30 | |
| 31 /* | |
| 32 +--------------------------------------------------------------------+ | |
| 33 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 34 | STATE : code ROUTINE : sBAT_PercentPBCF | | |
| 35 +--------------------------------------------------------------------+ | |
| 36 | |
| 37 PURPOSE : Select Phonebook Configuration. | |
| 38 */ | |
| 39 | |
| 40 GLOBAL T_ACI_BAT_RSLT sBAT_PercentPBCF (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 41 T_BAT_cmd_send *cmd) | |
| 42 { | |
| 43 T_ACI_BAT_RSLT ret; | |
| 44 T_ACI_PBCF_LDN ldn = PBCF_LDN_NotPresent; | |
| 45 T_ACI_PBCF_LRN lrn = PBCF_LRN_NotPresent; | |
| 46 T_ACI_PBCF_LMN lmn = PBCF_LMN_NotPresent; | |
| 47 | |
| 48 TRACE_FUNCTION ("sBAT_PercentPBCF()"); | |
| 49 | |
| 50 ldn = (T_ACI_PBCF_LDN)cmd->params.ptr_set_percent_pbcf->ldn; | |
| 51 lrn = (T_ACI_PBCF_LRN)cmd->params.ptr_set_percent_pbcf->lrn; | |
| 52 lmn = (T_ACI_PBCF_LMN)cmd->params.ptr_set_percent_pbcf->lmn; | |
| 53 | |
| 54 /* | |
| 55 * Call the corresponding sAT function. T_ACI_BAT_RSLT is | |
| 56 * assumed to be equivalent to T_ACI_RESULT. | |
| 57 */ | |
| 58 /* for BAT we use the old spec, which means the third param is not supported */ | |
| 59 ret = (T_ACI_BAT_RSLT)sAT_PercentPBCF(src_infos_psi->srcId, ldn, lrn, lmn); | |
| 60 | |
| 61 return(ret); | |
| 62 } | |
| 63 | |
| 64 /* | |
| 65 +--------------------------------------------------------------------+ | |
| 66 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 67 | STATE : code ROUTINE : qBAT_PlusCPBS | | |
| 68 +--------------------------------------------------------------------+ | |
| 69 | |
| 70 PURPOSE : | |
| 71 */ | |
| 72 GLOBAL T_ACI_BAT_RSLT qBAT_PercentPBCF (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 73 T_BAT_cmd_send *cmd) | |
| 74 { | |
| 75 T_ACI_BAT_RSLT ret; | |
| 76 T_ACI_PBCF_LDN ldn = PBCF_LDN_NotPresent; | |
| 77 T_ACI_PBCF_LRN lrn = PBCF_LRN_NotPresent; | |
| 78 T_ACI_PBCF_LMN lmn = PBCF_LMN_NotPresent; | |
| 79 | |
| 80 TRACE_FUNCTION ("qBAT_PercentPBCF()"); | |
| 81 | |
| 82 /* | |
| 83 * Call the corresponding qAT function. T_ACI_BAT_RSLT is | |
| 84 * assumed to be equivalent to T_ACI_RESULT. | |
| 85 */ | |
| 86 ret=(T_ACI_BAT_RSLT)qAT_PercentPBCF(src_infos_psi->srcId, &ldn, &lrn, &lmn); | |
| 87 | |
| 88 /* | |
| 89 * If the query completes, send the response now. | |
| 90 */ | |
| 91 if (ret==ACI_BAT_CMPL) | |
| 92 { | |
| 93 T_BAT_cmd_response resp; | |
| 94 T_BAT_res_que_percent_pbcf pbcf_data; | |
| 95 | |
| 96 resp.ctrl_response=BAT_RES_QUE_PERCENT_PBCF; | |
| 97 resp.response.ptr_que_percent_pbcf = &pbcf_data; | |
| 98 | |
| 99 /* | |
| 100 * This relies on T_BAT_percent_pbcf_ldn being identical to | |
| 101 * T_ACI_PBCF_LDN and so forth for LRN and LMN. | |
| 102 */ | |
| 103 pbcf_data.ldn=(T_BAT_percent_pbcf_ldn)ldn; | |
| 104 pbcf_data.lrn=(T_BAT_percent_pbcf_ldn)lrn; | |
| 105 pbcf_data.lmn=(T_BAT_percent_pbcf_ldn)lmn; | |
| 106 | |
| 107 aci_bat_send(src_infos_psi,&resp); | |
| 108 } | |
| 109 | |
| 110 return(ret); | |
| 111 } | |
| 112 | |
| 113 /* | |
| 114 +--------------------------------------------------------------------+ | |
| 115 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 116 | STATE : code ROUTINE : sBAT_PlusCPBS | | |
| 117 +--------------------------------------------------------------------+ | |
| 118 | |
| 119 PURPOSE : Select phonebook memory storage. | |
| 120 */ | |
| 121 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 122 T_BAT_cmd_send *cmd) | |
| 123 { | |
| 124 T_ACI_BAT_RSLT ret; | |
| 125 T_ACI_PB_STOR stor; | |
| 126 | |
| 127 TRACE_FUNCTION ("sBAT_PlusCPBS()"); | |
| 128 | |
| 129 /* | |
| 130 * This relies on T_BAT_storage being identical to | |
| 131 * T_ACI_PB_STOR. | |
| 132 */ | |
| 133 stor=(T_ACI_PB_STOR)cmd->params.ptr_set_plus_cpbs->storage; | |
| 134 | |
| 135 /* | |
| 136 * Call the corresponding sAT function. T_ACI_BAT_RSLT is | |
| 137 * assumed to be equivalent to T_ACI_RESULT. | |
| 138 */ | |
| 139 /* for BAT we use the old spec, which means the third param is not supported */ | |
| 140 ret=(T_ACI_BAT_RSLT)sAT_PlusCPBS(src_infos_psi->srcId,stor, NULL); | |
| 141 | |
| 142 return(ret); | |
| 143 } | |
| 144 | |
| 145 /* | |
| 146 +--------------------------------------------------------------------+ | |
| 147 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 148 | STATE : code ROUTINE : qBAT_PlusCPBS | | |
| 149 +--------------------------------------------------------------------+ | |
| 150 | |
| 151 PURPOSE : | |
| 152 */ | |
| 153 GLOBAL T_ACI_BAT_RSLT qBAT_PlusCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 154 T_BAT_cmd_send *cmd) | |
| 155 { | |
| 156 T_ACI_BAT_RSLT ret; | |
| 157 T_ACI_PB_STOR stor; | |
| 158 SHORT used; | |
| 159 SHORT total; | |
| 160 | |
| 161 TRACE_FUNCTION ("qBAT_PlusCPBS()"); | |
| 162 | |
| 163 /* | |
| 164 * Call the corresponding qAT function. T_ACI_BAT_RSLT is | |
| 165 * assumed to be equivalent to T_ACI_RESULT. | |
| 166 */ | |
| 167 ret=(T_ACI_BAT_RSLT)qAT_PlusCPBS(src_infos_psi->srcId,&stor,&used,&total); | |
| 168 | |
| 169 /* | |
| 170 * If the query completes, send the response now. | |
| 171 */ | |
| 172 if (ret==ACI_BAT_CMPL) | |
| 173 { | |
| 174 T_BAT_cmd_response resp; | |
| 175 T_BAT_res_que_plus_cpbs cpbs_data; | |
| 176 | |
| 177 resp.ctrl_response=BAT_RES_QUE_PLUS_CPBS; | |
| 178 resp.response.ptr_que_plus_cpbs=&cpbs_data; | |
| 179 | |
| 180 /* | |
| 181 * This relies on T_BAT_storage being identical to | |
| 182 * T_ACI_PB_STOR. | |
| 183 */ | |
| 184 cpbs_data.storage=(T_BAT_storage)stor; | |
| 185 | |
| 186 cpbs_data.total=(S16)total; | |
| 187 cpbs_data.used=(S16)used; | |
| 188 | |
| 189 aci_bat_send(src_infos_psi,&resp); | |
| 190 } | |
| 191 | |
| 192 return(ret); | |
| 193 } | |
| 194 | |
| 195 /* | |
| 196 +--------------------------------------------------------------------+ | |
| 197 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 198 | STATE : code ROUTINE : qBAT_PercentCPBS | | |
| 199 +--------------------------------------------------------------------+ | |
| 200 | |
| 201 PURPOSE : | |
| 202 */ | |
| 203 GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPBS (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 204 T_BAT_cmd_send *cmd) | |
| 205 { | |
| 206 T_ACI_BAT_RSLT ret; | |
| 207 T_ACI_PB_STOR stor; | |
| 208 SHORT used; | |
| 209 SHORT total; | |
| 210 SHORT first; | |
| 211 | |
| 212 TRACE_FUNCTION ("qBAT_PercentCPBS()"); | |
| 213 | |
| 214 /* | |
| 215 * Call the corresponding qAT function. T_ACI_BAT_RSLT is | |
| 216 * assumed to be equivalent to T_ACI_RESULT. | |
| 217 */ | |
| 218 ret=(T_ACI_BAT_RSLT)qAT_PercentCPBS(src_infos_psi->srcId,&stor,&used,&total,&first); | |
| 219 | |
| 220 /* | |
| 221 * If the query completes, send the response now. | |
| 222 */ | |
| 223 if (ret EQ ACI_BAT_CMPL) | |
| 224 { | |
| 225 T_BAT_cmd_response resp; | |
| 226 T_BAT_res_que_percent_cpbs cpbs_data; | |
| 227 | |
| 228 resp.ctrl_response=BAT_RES_QUE_PERCENT_CPBS; | |
| 229 resp.response.ptr_que_percent_cpbs=&cpbs_data; | |
| 230 | |
| 231 /* | |
| 232 * This relies on T_BAT_storage being identical to | |
| 233 * T_ACI_PB_STOR. | |
| 234 */ | |
| 235 cpbs_data.storage=(T_BAT_storage)stor; | |
| 236 | |
| 237 cpbs_data.total=(S16)total; | |
| 238 cpbs_data.used=(S16)used; | |
| 239 cpbs_data.first=(S16)first; | |
| 240 | |
| 241 aci_bat_send(src_infos_psi,&resp); | |
| 242 } | |
| 243 | |
| 244 return(ret); | |
| 245 } | |
| 246 | |
| 247 /* | |
| 248 +--------------------------------------------------------------------+ | |
| 249 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 250 | STATE : code ROUTINE : sBAT_PlusCPBW | | |
| 251 +--------------------------------------------------------------------+ | |
| 252 | |
| 253 PURPOSE : | |
| 254 */ | |
| 255 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBW (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 256 T_BAT_cmd_send *cmd) | |
| 257 { | |
| 258 T_ACI_BAT_RSLT ret; | |
| 259 SHORT index; | |
| 260 CHAR number[BAT_MAX_CPBW_NUMBER_LEN+1]; | |
| 261 CHAR *p_number; | |
| 262 T_ACI_TOA toa; | |
| 263 T_ACI_TOA *p_toa; | |
| 264 T_ACI_PB_TEXT text; | |
| 265 T_ACI_PB_TEXT *p_text; | |
| 266 T_ACI_VP_ABS dmy_date_time; | |
| 267 T_BAT_cmd_set_plus_cpbw *cpbw; | |
| 268 | |
| 269 TRACE_FUNCTION ("sBAT_PlusCPBW()"); | |
| 270 | |
| 271 /* | |
| 272 * Get a pointer to the CPBW structure for convenience. | |
| 273 */ | |
| 274 cpbw=cmd->params.ptr_set_plus_cpbw; | |
| 275 | |
| 276 index=(SHORT)cpbw->index; | |
| 277 | |
| 278 if (cpbw->v_number==TRUE) | |
| 279 { | |
| 280 /* | |
| 281 * The idea here is to get the 'number' parameter into a | |
| 282 * null terminated string, which is what sAT_PlusCPBW() expects, but | |
| 283 * is not guaranteed by BAT. | |
| 284 */ | |
| 285 memset(number,0,sizeof(number)); | |
| 286 memcpy(number,cpbw->number,cpbw->c_number); | |
| 287 p_number=number; | |
| 288 | |
| 289 /* | |
| 290 * BAT stores the type of address in a single value. | |
| 291 */ | |
| 292 if (cpbw->type!=-1) | |
| 293 { | |
| 294 toa=toa_demerge(cpbw->type); | |
| 295 p_toa=&toa; | |
| 296 } | |
| 297 else | |
| 298 { | |
| 299 p_toa=NULL; | |
| 300 } | |
| 301 } | |
| 302 else | |
| 303 { | |
| 304 p_number=NULL; | |
| 305 p_toa=NULL; | |
| 306 } | |
| 307 | |
| 308 /* | |
| 309 * Associated text | |
| 310 */ | |
| 311 if (cpbw->v_text==TRUE) | |
| 312 { | |
| 313 USHORT len; | |
| 314 | |
| 315 /* | |
| 316 * Convert from the currently selected character set into the | |
| 317 * SIM format. | |
| 318 */ | |
| 319 utl_chsetToSim( | |
| 320 (UBYTE *)cpbw->text, | |
| 321 (USHORT)cpbw->c_text, | |
| 322 (UBYTE *)text.data, | |
| 323 &len, | |
| 324 GSM_ALPHA_Def); | |
| 325 | |
| 326 /* | |
| 327 * Set the length. Note that we cannot do this by passing a | |
| 328 * reference to text.len into utl_chsetToSim() because it is | |
| 329 * the wrong type. | |
| 330 */ | |
| 331 text.len=(UBYTE)len; | |
| 332 | |
| 333 text.cs=CS_Sim; | |
| 334 | |
| 335 p_text=&text; | |
| 336 } | |
| 337 else | |
| 338 { | |
| 339 p_text=NULL; | |
| 340 } | |
| 341 | |
| 342 /* | |
| 343 * Call the corresponding sAT function. T_ACI_BAT_RSLT is | |
| 344 * assumed to be equivalent to T_ACI_RESULT. | |
| 345 */ | |
| 346 ret=sAT_PlusCPBW( | |
| 347 src_infos_psi->srcId, | |
| 348 index, | |
| 349 p_number, | |
| 350 p_toa, | |
| 351 p_text, | |
| 352 &dmy_date_time); | |
| 353 | |
| 354 return(ret); | |
| 355 } | |
| 356 | |
| 357 /* | |
| 358 +--------------------------------------------------------------------+ | |
| 359 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 360 | STATE : code ROUTINE : tBAT_PlusCPBW | | |
| 361 +--------------------------------------------------------------------+ | |
| 362 | |
| 363 PURPOSE : | |
| 364 */ | |
| 365 GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBW (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 366 T_BAT_cmd_send *cmd) | |
| 367 { | |
| 368 T_ACI_BAT_RSLT ret; | |
| 369 SHORT first; | |
| 370 SHORT last; | |
| 371 UBYTE nlength; | |
| 372 UBYTE tlength; | |
| 373 | |
| 374 TRACE_FUNCTION ("tBAT_PlusCPBW()"); | |
| 375 | |
| 376 /* | |
| 377 * Call the corresponding tAT function. T_ACI_BAT_RSLT is | |
| 378 * assumed to be equivalent to T_ACI_RESULT. | |
| 379 */ | |
| 380 ret=(T_ACI_BAT_RSLT)tAT_PlusCPBW(src_infos_psi->srcId,&first,&last,&nlength,&tlength); | |
| 381 | |
| 382 /* | |
| 383 * If the command completes, send the response now. | |
| 384 */ | |
| 385 if (ret==ACI_BAT_CMPL) | |
| 386 { | |
| 387 T_BAT_cmd_response resp; | |
| 388 T_BAT_res_tst_plus_cpbw cpbw_data; | |
| 389 | |
| 390 resp.ctrl_response=BAT_RES_TST_PLUS_CPBW; | |
| 391 resp.response.ptr_tst_plus_cpbw=&cpbw_data; | |
| 392 | |
| 393 cpbw_data.index1=(U8)first; | |
| 394 cpbw_data.index2=(U8)last; | |
| 395 cpbw_data.nlength=(S16)nlength; | |
| 396 cpbw_data.tlength=(S16)tlength; | |
| 397 | |
| 398 #pragma message(__TODO__"+CPBW types") | |
| 399 cpbw_data.c_types=0; | |
| 400 cpbw_data.types[0]=0; | |
| 401 | |
| 402 aci_bat_send(src_infos_psi,&resp); | |
| 403 } | |
| 404 | |
| 405 return(ret); | |
| 406 } | |
| 407 | |
| 408 /* | |
| 409 +--------------------------------------------------------------------+ | |
| 410 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 411 | STATE : code ROUTINE : sBAT_PlusCPBR | | |
| 412 +--------------------------------------------------------------------+ | |
| 413 | |
| 414 PURPOSE : Read phonebook entries. If the application wants to read | |
| 415 more than ACI_BAT_MAX_RESPONSES, then the responses are | |
| 416 sent block by block (one block = ACI_BAT_MAX_RESPONSES). | |
| 417 */ | |
| 418 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBR_CB (T_ACI_DTI_PRC_PSI *src_infos_psi) | |
| 419 { | |
| 420 T_BAT_cmd_send cmd; | |
| 421 T_BAT_cmd_set_plus_cpbr cpbr; | |
| 422 | |
| 423 cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBR; | |
| 424 cmd.params.ptr_set_plus_cpbr = &cpbr; | |
| 425 | |
| 426 cpbr.index1 = (U8)src_infos_psi->index1; | |
| 427 cpbr.index2 = (S16)src_infos_psi->index2; | |
| 428 | |
| 429 return (sBAT_PlusCPBR(src_infos_psi, &cmd)); | |
| 430 } | |
| 431 | |
| 432 | |
| 433 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBR (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 434 T_BAT_cmd_send *cmd) | |
| 435 { | |
| 436 T_ACI_BAT_RSLT ret; | |
| 437 SHORT start_idx; | |
| 438 SHORT stop_idx; | |
| 439 SHORT last_idx = ACI_NumParmNotPresent; | |
| 440 T_ACI_PB_ENTR pb_lst[MAX_PB_ENTR]; | |
| 441 | |
| 442 TRACE_FUNCTION ("sBAT_PlusCPBR()"); | |
| 443 | |
| 444 /* define here the variables, which are passed as parameters to sAT_PlusCPBR */ | |
| 445 start_idx = (SHORT)cmd->params.ptr_set_plus_cpbr->index1; | |
| 446 stop_idx = (SHORT)cmd->params.ptr_set_plus_cpbr->index2; | |
| 447 | |
| 448 ret = (T_ACI_BAT_RSLT)sAT_PlusCPBR(src_infos_psi->srcId, start_idx, stop_idx, &last_idx, &pb_lst[0]); | |
| 449 if (ret EQ ACI_BAT_CMPL) | |
| 450 { | |
| 451 SHORT i; | |
| 452 T_BAT_cmd_response resp; | |
| 453 T_BAT_res_set_plus_cpbr cpbr_data; | |
| 454 | |
| 455 resp.ctrl_response = BAT_RES_SET_PLUS_CPBR; | |
| 456 resp.response.ptr_set_plus_cpbr = &cpbr_data; | |
| 457 | |
| 458 /* | |
| 459 * sAT_PlusCPBR() provides in pb_lst[] up to five entries (MAX_PB_ENTR) | |
| 460 */ | |
| 461 for (i = 0; ((i < MAX_PB_ENTR) AND (pb_lst[i].index NEQ ACI_NumParmNotPresent)); i++) | |
| 462 { | |
| 463 USHORT len_cvtd_text=0; | |
| 464 | |
| 465 cpbr_data.index = (U8)pb_lst[i].index; | |
| 466 | |
| 467 cpbr_data.c_number = strlen((CHAR*)pb_lst[i].number); | |
| 468 | |
| 469 cpbr_data.c_number = (cpbr_data.c_number > BAT_MAX_CPBR_NUMBER_LEN) | |
| 470 ? BAT_MAX_CPBR_NUMBER_LEN | |
| 471 : cpbr_data.c_number; | |
| 472 | |
| 473 strncpy((CHAR*)cpbr_data.number, pb_lst[i].number, cpbr_data.c_number+1); /* Include null terminator for Resp_.. () */ | |
| 474 | |
| 475 /* BAT stores the type of address in a single 8-bit value. */ | |
| 476 cpbr_data.type = toa_merge(pb_lst[i].type); | |
| 477 | |
| 478 /* | |
| 479 * Convert the data read from the SIM into the currently | |
| 480 * selected character set. | |
| 481 */ | |
| 482 utl_chsetFromSim( | |
| 483 (UBYTE *)pb_lst[i].text.data, | |
| 484 pb_lst[i].text.len, | |
| 485 (UBYTE *)cpbr_data.text, | |
| 486 BAT_MAX_CPBR_TEXT_LEN, | |
| 487 &len_cvtd_text, | |
| 488 GSM_ALPHA_Def); | |
| 489 | |
| 490 cpbr_data.c_text=(U8)len_cvtd_text; | |
| 491 | |
| 492 TRACE_EVENT_P2("sBAT_PlusCPBR(): index = %i c_text = %d", cpbr_data.index, cpbr_data.c_text); | |
| 493 | |
| 494 /* vsi_t_sleep (aci_handle, 500); */ | |
| 495 aci_bat_send(src_infos_psi,&resp); | |
| 496 } | |
| 497 /* remember updated start index and initial stop index for possible next block of entries to send to APP */ | |
| 498 src_infos_psi->index1 = last_idx + 1; | |
| 499 src_infos_psi->index2 = stop_idx; | |
| 500 } | |
| 501 else | |
| 502 { | |
| 503 ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); | |
| 504 return(ACI_BAT_FAIL); | |
| 505 } | |
| 506 | |
| 507 if (last_idx < stop_idx) | |
| 508 { | |
| 509 src_infos_psi->large_type = TRUE; | |
| 510 return (ACI_BAT_EXCT); | |
| 511 } | |
| 512 | |
| 513 src_infos_psi->large_type = FALSE; | |
| 514 return (ACI_BAT_CMPL); | |
| 515 } | |
| 516 | |
| 517 /* | |
| 518 +--------------------------------------------------------------------+ | |
| 519 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 520 | STATE : code ROUTINE : tBAT_PlusCPBR | | |
| 521 +--------------------------------------------------------------------+ | |
| 522 | |
| 523 PURPOSE : | |
| 524 */ | |
| 525 | |
| 526 GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBR (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 527 T_BAT_cmd_send *cmd) | |
| 528 { | |
| 529 T_ACI_BAT_RSLT ret=ACI_BAT_FAIL; | |
| 530 SHORT first; | |
| 531 SHORT last; | |
| 532 UBYTE nlength; | |
| 533 UBYTE tlength; | |
| 534 | |
| 535 TRACE_FUNCTION ("tBAT_PlusCPBR()"); | |
| 536 | |
| 537 /* | |
| 538 * Call the corresponding tAT function. T_ACI_BAT_RSLT is | |
| 539 * assumed to be equivalent to T_ACI_RESULT. | |
| 540 */ | |
| 541 ret=(T_ACI_BAT_RSLT)tAT_PlusCPBR(src_infos_psi->srcId,&first,&last,&nlength,&tlength); | |
| 542 | |
| 543 /* | |
| 544 * If the command completes, send the response now. | |
| 545 */ | |
| 546 if (ret==ACI_BAT_CMPL) | |
| 547 { | |
| 548 T_BAT_cmd_response resp; | |
| 549 T_BAT_res_tst_plus_cpbr cpbr_data; | |
| 550 | |
| 551 resp.ctrl_response=BAT_RES_TST_PLUS_CPBR; | |
| 552 resp.response.ptr_tst_plus_cpbr=&cpbr_data; | |
| 553 | |
| 554 cpbr_data.index_f=(U8)first; | |
| 555 cpbr_data.index_l=(U8)last; | |
| 556 cpbr_data.nlength=(S16)nlength; | |
| 557 cpbr_data.tlength=(S16)tlength; | |
| 558 | |
| 559 aci_bat_send(src_infos_psi,&resp); | |
| 560 } | |
| 561 | |
| 562 return(ret); | |
| 563 } | |
| 564 | |
| 565 /* | |
| 566 +--------------------------------------------------------------------+ | |
| 567 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 568 | STATE : code ROUTINE : sBAT_PlusCPBF | | |
| 569 +--------------------------------------------------------------------+ | |
| 570 | |
| 571 PURPOSE : | |
| 572 */ | |
| 573 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBF_CB (T_ACI_DTI_PRC_PSI *src_infos_psi) | |
| 574 { | |
| 575 T_BAT_cmd_send cmd; | |
| 576 T_BAT_cmd_set_plus_cpbf cpbf; | |
| 577 | |
| 578 cmd.ctrl_params = BAT_CMD_SET_PLUS_CPBF; | |
| 579 cmd.params.ptr_set_plus_cpbf = &cpbf; | |
| 580 | |
| 581 TRACE_FUNCTION ("sBAT_PlusCPBF_CB()"); | |
| 582 | |
| 583 /* restore search string if ongoing command */ | |
| 584 if ( src_infos_psi->search_str_ptr NEQ NULL ) | |
| 585 { | |
| 586 TRACE_EVENT("Restore search string"); | |
| 587 /* index 1 stores the length of the string in the case of cpbf */ | |
| 588 cpbf.c_findtext = (U8)src_infos_psi->index1; | |
| 589 memcpy(cpbf.findtext, src_infos_psi->search_str_ptr, BAT_MAX_CPBF_FIND_TEXT_LEN); | |
| 590 } | |
| 591 return (sBAT_PlusCPBF(src_infos_psi, &cmd)); | |
| 592 } | |
| 593 | |
| 594 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPBF (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 595 T_BAT_cmd_send *cmd) | |
| 596 { | |
| 597 T_ACI_PB_TEXT pbtext; | |
| 598 USHORT len; | |
| 599 T_ACI_BAT_RSLT ret; | |
| 600 T_BAT_cmd_set_plus_cpbf *cpbf_cmd; | |
| 601 SHORT found = -1; | |
| 602 T_ACI_PB_ENTR pb[MAX_PB_ENTR]; | |
| 603 SHORT i; | |
| 604 T_ACI_CPBF_MOD search_mode; // replaced by global var | |
| 605 T_BAT_cmd_response resp; | |
| 606 T_BAT_res_set_plus_cpbf cpbf_rsp; | |
| 607 | |
| 608 TRACE_FUNCTION ("sBAT_PlusCPBF()"); | |
| 609 | |
| 610 resp.ctrl_response = BAT_RES_SET_PLUS_CPBF; | |
| 611 resp.response.ptr_set_plus_cpbf = &cpbf_rsp; | |
| 612 | |
| 613 /* | |
| 614 * Get a pointer to the CPBF data for convenience. | |
| 615 */ | |
| 616 cpbf_cmd = cmd->params.ptr_set_plus_cpbf; | |
| 617 | |
| 618 /* | |
| 619 * We may have to call sAT_PlusCPBF() more than once, if there are | |
| 620 * more than MAX_PB_ENTR entries found. The search mode is used | |
| 621 * to tell the ACI whether this is a new search or a continuation of | |
| 622 * the old one. | |
| 623 * If there has been a valid string pointer saved to the search_str_ptr | |
| 624 * the seek has to be continued. | |
| 625 */ | |
| 626 | |
| 627 if ((src_infos_psi->search_str_ptr NEQ NULL) | |
| 628 AND (strncmp(src_infos_psi->search_str_ptr, cpbf_cmd->findtext, cpbf_cmd->c_findtext) EQ 0)) | |
| 629 { | |
| 630 found = src_infos_psi->index2; /* recover number found*/ | |
| 631 search_mode = CPBF_MOD_NextSearch; | |
| 632 TRACE_EVENT_P1("Stored Search string: %s", src_infos_psi->search_str_ptr); | |
| 633 TRACE_EVENT_P1("Stored String length: %d", src_infos_psi->index1); | |
| 634 } | |
| 635 else | |
| 636 { | |
| 637 search_mode = CPBF_MOD_NewSearch; | |
| 638 } | |
| 639 | |
| 640 /* | |
| 641 * If the search string has zero length or is larger than the ACI function | |
| 642 * can handle then there's no point continuing. | |
| 643 * In fact there should be a differentiation between UCS2 and 8bit based coding schemes. | |
| 644 * Additionally it has to be considered that the string given within the BAT command is ACSII encoded. | |
| 645 */ | |
| 646 if (((ati_user_output_cfg[src_infos_psi->srcId].cscsChset EQ CSCS_CHSET_Ucs2) | |
| 647 && ((cpbf_cmd->c_findtext>BAT_MAX_CPBF_FIND_TEXT_LEN)||(cpbf_cmd->c_findtext<1)) ) | |
| 648 || | |
| 649 ((ati_user_output_cfg[src_infos_psi->srcId].cscsChset NEQ CSCS_CHSET_Ucs2) | |
| 650 && ((cpbf_cmd->c_findtext>MAX_PHB_NUM_LEN)||(cpbf_cmd->c_findtext<1)) ) ) | |
| 651 { | |
| 652 ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); | |
| 653 return(ACI_BAT_FAIL); | |
| 654 } | |
| 655 | |
| 656 TRACE_EVENT_P1("Search string: %s", cpbf_cmd->findtext); | |
| 657 TRACE_EVENT_P1("String length: %d", cpbf_cmd->c_findtext); | |
| 658 | |
| 659 utl_chsetToSim( | |
| 660 (UBYTE *)cpbf_cmd->findtext, | |
| 661 (USHORT)cpbf_cmd->c_findtext, | |
| 662 (UBYTE *)pbtext.data, | |
| 663 &len, | |
| 664 GSM_ALPHA_Def); | |
| 665 | |
| 666 if (len > MAX_PHB_NUM_LEN) | |
| 667 { | |
| 668 /* | |
| 669 * Shouldn't get here as that would mean that memory has been | |
| 670 * overwritten. Currently utl_chsetToSim() has no specific mechanism | |
| 671 * to prevent this. | |
| 672 */ | |
| 673 ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_TxtToLong); | |
| 674 return(ACI_BAT_FAIL); | |
| 675 } | |
| 676 | |
| 677 pbtext.len = (UBYTE)len; | |
| 678 pbtext.cs = (T_ACI_CS)CS_Sim; | |
| 679 | |
| 680 | |
| 681 /* | |
| 682 * Call the corresponding sAT function. T_ACI_BAT_RSLT is | |
| 683 * assumed to be equivalent to T_ACI_RESULT. | |
| 684 */ | |
| 685 | |
| 686 TRACE_EVENT_P1("search_mode: %d", search_mode); | |
| 687 TRACE_EVENT_P1("pbtext.data: %s", pbtext.data); | |
| 688 TRACE_EVENT_P1("pbtext.len: %d", pbtext.len); | |
| 689 | |
| 690 | |
| 691 /* found is not overwritten in the case of NEXT_SEARCH */ | |
| 692 ret=(T_ACI_BAT_RSLT)sAT_PlusCPBF( | |
| 693 src_infos_psi->srcId, | |
| 694 &pbtext, | |
| 695 search_mode, | |
| 696 &found, | |
| 697 pb); | |
| 698 | |
| 699 TRACE_EVENT_P1("sAT_PlusCPBF returns: %d", ret); | |
| 700 TRACE_EVENT_P1("-- found entries: %d", found); | |
| 701 | |
| 702 /* | |
| 703 * If the command fails, get out now. | |
| 704 */ | |
| 705 if (ret!=ACI_BAT_CMPL) | |
| 706 return(ret); | |
| 707 | |
| 708 /* | |
| 709 * We have received a list, however the BAT response only | |
| 710 * allows for single items. So we must send each one | |
| 711 * individually. | |
| 712 */ | |
| 713 for (i=0;((i<found) && (i<MAX_PB_ENTR));i++) | |
| 714 { | |
| 715 USHORT len_cvtd_text=0; | |
| 716 | |
| 717 cpbf_rsp.index=(U8)pb[i].index; | |
| 718 | |
| 719 TRACE_EVENT("send the found entry"); | |
| 720 strncpy((CHAR*)cpbf_rsp.number,pb[i].number,BAT_MAX_CPBF_NUMBER_LEN); | |
| 721 cpbf_rsp.c_number=strlen((CHAR*)cpbf_rsp.number); | |
| 722 | |
| 723 /* | |
| 724 * BAT stores the type of address in a single 8-bit value. | |
| 725 */ | |
| 726 cpbf_rsp.type=toa_merge(pb[i].type); | |
| 727 | |
| 728 /* | |
| 729 * Convert the data read from the SIM into the currently | |
| 730 * selected character set. | |
| 731 */ | |
| 732 utl_chsetFromSim( | |
| 733 (UBYTE *)pb[i].text.data, | |
| 734 pb[i].text.len, | |
| 735 (UBYTE *)cpbf_rsp.text, | |
| 736 BAT_MAX_CPBF_TEXT_LEN, | |
| 737 &len_cvtd_text, | |
| 738 GSM_ALPHA_Def); | |
| 739 | |
| 740 cpbf_rsp.c_text=(U8)len_cvtd_text; | |
| 741 | |
| 742 /* vsi_t_sleep (aci_handle, 500); */ | |
| 743 | |
| 744 aci_bat_send(src_infos_psi,&resp); | |
| 745 } | |
| 746 | |
| 747 /* | |
| 748 * Set the search mode for the next iteration, should there be | |
| 749 * one. | |
| 750 */ | |
| 751 | |
| 752 if (found>MAX_PB_ENTR) | |
| 753 { | |
| 754 TRACE_EVENT("More entries found"); | |
| 755 /* remember the string to search for (only necessary for first iteration)*/ | |
| 756 if (search_mode EQ CPBF_MOD_NewSearch) | |
| 757 { | |
| 758 TRACE_EVENT("Store string"); | |
| 759 src_infos_psi->index1 = (U16)cpbf_cmd->c_findtext; /* str length */ | |
| 760 ACI_MALLOC(src_infos_psi->search_str_ptr, BAT_MAX_CPBF_FIND_TEXT_LEN); | |
| 761 memcpy(src_infos_psi->search_str_ptr, cpbf_cmd->findtext, BAT_MAX_CPBF_FIND_TEXT_LEN); | |
| 762 } | |
| 763 /* This is a multi-line response */ | |
| 764 src_infos_psi->large_type = TRUE; | |
| 765 /* Save the number of found items - MAX_PB_ENTR send to user */ | |
| 766 src_infos_psi->index2 = found - MAX_PB_ENTR; | |
| 767 /* Still executing */ | |
| 768 ret = ACI_BAT_EXCT; | |
| 769 } | |
| 770 else /* no further entries to find */ | |
| 771 { | |
| 772 TRACE_EVENT("reset search string"); | |
| 773 /* reset search string info for iterations */ | |
| 774 src_infos_psi->index1 = 0; /* str length reset */ | |
| 775 src_infos_psi->index2 = 0; /* number found reset */ | |
| 776 if (src_infos_psi->search_str_ptr NEQ NULL) /* str mem reset, if necessary */ | |
| 777 { | |
| 778 ACI_MFREE(src_infos_psi->search_str_ptr); | |
| 779 src_infos_psi->search_str_ptr = NULL; | |
| 780 } | |
| 781 /* This is NO multiline response */ | |
| 782 src_infos_psi->large_type = FALSE; | |
| 783 /* completed */ | |
| 784 ret = ACI_BAT_CMPL; | |
| 785 } | |
| 786 | |
| 787 return (ret); | |
| 788 | |
| 789 } | |
| 790 | |
| 791 /* | |
| 792 +--------------------------------------------------------------------+ | |
| 793 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 794 | STATE : code ROUTINE : tBAT_PlusCPBF | | |
| 795 +--------------------------------------------------------------------+ | |
| 796 | |
| 797 PURPOSE : | |
| 798 */ | |
| 799 GLOBAL T_ACI_BAT_RSLT tBAT_PlusCPBF (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 800 T_BAT_cmd_send *cmd) | |
| 801 { | |
| 802 T_ACI_BAT_RSLT ret; | |
| 803 UBYTE nlength; | |
| 804 UBYTE tlength; | |
| 805 | |
| 806 TRACE_FUNCTION ("tBAT_PlusCPBF()"); | |
| 807 | |
| 808 /* | |
| 809 * Call the corresponding ACI function. T_ACI_BAT_RSLT is | |
| 810 * assumed to be equivalent to T_ACI_RESULT. | |
| 811 */ | |
| 812 ret=(T_ACI_BAT_RSLT)tAT_PlusCPBF(src_infos_psi->srcId,&nlength,&tlength); | |
| 813 | |
| 814 /* | |
| 815 * If the command completes, send the response now. | |
| 816 */ | |
| 817 if (ret==ACI_BAT_CMPL) | |
| 818 { | |
| 819 T_BAT_cmd_response resp; | |
| 820 T_BAT_res_tst_plus_cpbf cpbf_data; | |
| 821 | |
| 822 resp.ctrl_response=BAT_RES_TST_PLUS_CPBF; | |
| 823 resp.response.ptr_tst_plus_cpbf=&cpbf_data; | |
| 824 | |
| 825 cpbf_data.nlength=(S16)nlength; | |
| 826 cpbf_data.tlength=(S16)tlength; | |
| 827 | |
| 828 aci_bat_send(src_infos_psi,&resp); | |
| 829 } | |
| 830 | |
| 831 return(ret); | |
| 832 } | |
| 833 | |
| 834 /* | |
| 835 +--------------------------------------------------------------------+ | |
| 836 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 837 | STATE : code ROUTINE : sBAT_PlusCSVM | | |
| 838 +--------------------------------------------------------------------+ | |
| 839 | |
| 840 PURPOSE : | |
| 841 */ | |
| 842 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCSVM (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 843 T_BAT_cmd_send *cmd) | |
| 844 { | |
| 845 T_ACI_BAT_RSLT ret; | |
| 846 T_ACI_TOA toa; | |
| 847 CHAR number[BAT_MAX_CSVM_NUMBER_LEN+1]; | |
| 848 CHAR *pnumber; | |
| 849 T_ACI_CSVM_MOD mode; | |
| 850 T_BAT_cmd_set_plus_csvm *csvm; | |
| 851 UBYTE num_len; | |
| 852 | |
| 853 TRACE_FUNCTION ("sBAT_PlusCSVM()"); | |
| 854 | |
| 855 /* | |
| 856 * Get a pointer to the BAT structure for convenience. | |
| 857 */ | |
| 858 csvm=cmd->params.ptr_set_plus_csvm; | |
| 859 | |
| 860 /* | |
| 861 * This assumes that T_ACI_CSVM_MOD and T_BAT_plus_csvm_mode are | |
| 862 * equivalent. They are, except that the ACI version has a | |
| 863 * NotPresent value - this is not a problem here as we are converting | |
| 864 * from BAT format to ACI format. | |
| 865 */ | |
| 866 mode=(T_ACI_CSVM_MOD)csvm->mode; | |
| 867 | |
| 868 if (csvm->v_number==TRUE) | |
| 869 { | |
| 870 /* | |
| 871 * I don't think that CSVM requires a null-terminated string, but | |
| 872 * it's best to err on the side of caution. | |
| 873 */ | |
| 874 pnumber=number; | |
| 875 memset(number,0,sizeof(number)); | |
| 876 memcpy(number,csvm->number,BAT_MAX_CSVM_NUMBER_LEN); | |
| 877 | |
| 878 if (csvm->c_number>BAT_MAX_CSVM_NUMBER_LEN) | |
| 879 num_len=(UBYTE)BAT_MAX_CSVM_NUMBER_LEN; | |
| 880 else | |
| 881 num_len=(UBYTE)csvm->c_number; | |
| 882 } | |
| 883 else | |
| 884 { | |
| 885 pnumber=NULL; | |
| 886 num_len=0; | |
| 887 } | |
| 888 | |
| 889 /* | |
| 890 * BAT stores the type of address in a single 8-bit value. We need to | |
| 891 * convert this to the ACI format. | |
| 892 */ | |
| 893 toa=toa_demerge(csvm->type); | |
| 894 | |
| 895 /* | |
| 896 * Call the corresponding ACI function. T_ACI_BAT_RSLT is | |
| 897 * assumed to be equivalent to T_ACI_RESULT. | |
| 898 */ | |
| 899 ret=(T_ACI_BAT_RSLT)sAT_PlusCSVM(src_infos_psi->srcId,mode,pnumber,num_len,&toa); | |
| 900 | |
| 901 return(ret); | |
| 902 } | |
| 903 | |
| 904 /* | |
| 905 +--------------------------------------------------------------------+ | |
| 906 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 907 | STATE : code ROUTINE : qBAT_PlusCSVM | | |
| 908 +--------------------------------------------------------------------+ | |
| 909 | |
| 910 PURPOSE : | |
| 911 */ | |
| 912 GLOBAL T_ACI_BAT_RSLT qBAT_PlusCSVM (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 913 T_BAT_cmd_send *cmd) | |
| 914 { | |
| 915 T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; | |
| 916 T_ACI_CSVM_MOD mode; | |
| 917 CHAR number[BAT_MAX_CSVM_NUMBER_LEN+1]; | |
| 918 SHORT toa_val; | |
| 919 | |
| 920 TRACE_FUNCTION ("qBAT_PlusCSVM()"); | |
| 921 | |
| 922 /* | |
| 923 * Call the corresponding qAT function. T_ACI_BAT_RSLT is | |
| 924 * assumed to be equivalent to T_ACI_RESULT. | |
| 925 */ | |
| 926 ret=(T_ACI_BAT_RSLT)qAT_PlusCSVM( | |
| 927 src_infos_psi->srcId, | |
| 928 &mode, | |
| 929 number, | |
| 930 BAT_MAX_CSVM_NUMBER_LEN, | |
| 931 &toa_val); | |
| 932 | |
| 933 /* | |
| 934 * If the query completes, send the response now. | |
| 935 */ | |
| 936 if (ret==ACI_BAT_CMPL) | |
| 937 { | |
| 938 T_BAT_cmd_response resp; | |
| 939 T_BAT_res_que_plus_csvm csvm_data; | |
| 940 | |
| 941 resp.ctrl_response=BAT_RES_QUE_PLUS_CSVM; | |
| 942 resp.response.ptr_que_plus_csvm=&csvm_data; | |
| 943 | |
| 944 /* | |
| 945 * We can't just cast the ACI value to the BAT value as it | |
| 946 * might be CSVM_MOD_NotPresent, for which the BAT has no | |
| 947 * equivalent. | |
| 948 */ | |
| 949 csvm_data.mode=(mode==CSVM_MOD_Enable) ? BAT_CSVM_MODE_ENABLE:BAT_CSVM_MODE_DISABLE; | |
| 950 | |
| 951 /* | |
| 952 * We trust the ACI to give us a null-terminated string. | |
| 953 */ | |
| 954 strcpy((CHAR*)csvm_data.number,number); | |
| 955 csvm_data.c_number=strlen((CHAR*)csvm_data.number); | |
| 956 | |
| 957 /* | |
| 958 * Note that in this instance the ACI is giving us the TOA as | |
| 959 * a single number, rather than in its usual T_ACI_TOA format. | |
| 960 */ | |
| 961 csvm_data.type=(U8)toa_val; | |
| 962 | |
| 963 aci_bat_send(src_infos_psi,&resp); | |
| 964 } | |
| 965 | |
| 966 return(ret); | |
| 967 } | |
| 968 | |
| 969 /* | |
| 970 +--------------------------------------------------------------------+ | |
| 971 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 972 | STATE : code ROUTINE : sBAT_PlusCLAN | | |
| 973 +--------------------------------------------------------------------+ | |
| 974 | |
| 975 PURPOSE : | |
| 976 */ | |
| 977 GLOBAL T_ACI_BAT_RSLT sBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 978 T_BAT_cmd_send *cmd) | |
| 979 { | |
| 980 T_ACI_BAT_RSLT ret; | |
| 981 T_ACI_LAN_SUP lng; | |
| 982 CHAR str[BAT_MAX_CLAN_CODE_LEN+1]; | |
| 983 USHORT i; | |
| 984 | |
| 985 TRACE_FUNCTION ("sBAT_PlusCLAN()"); | |
| 986 | |
| 987 /* | |
| 988 * Ensure that we have a null-terminated string. | |
| 989 */ | |
| 990 memset(str,0,sizeof(str)); | |
| 991 memcpy(str,cmd->params.ptr_set_plus_clan->code,BAT_MAX_CLAN_CODE_LEN); | |
| 992 | |
| 993 lng.str=NULL; | |
| 994 | |
| 995 /* | |
| 996 * The BAT provides the language in string form only, we must also | |
| 997 * calculate the corresponding value. To do this we use the lookup | |
| 998 * table "lngs". | |
| 999 * | |
| 1000 * GSM 07.07 says that "AUTO" should be used for automatic mode, but | |
| 1001 * the (ATI) code uses "au". Here we want to accept both. | |
| 1002 */ | |
| 1003 if (!strcmp(str,"AUTO")) | |
| 1004 { | |
| 1005 lng.lng=CLAN_LNG_AUT; | |
| 1006 lng.str="AUTO"; | |
| 1007 } | |
| 1008 else | |
| 1009 { | |
| 1010 for (i=0;lngs[i].str;i++) | |
| 1011 { | |
| 1012 if (!strcmp(lngs[i].str,str)) | |
| 1013 { | |
| 1014 lng.str=lngs[i].str; | |
| 1015 lng.lng=lngs[i].lng; | |
| 1016 break; | |
| 1017 } | |
| 1018 } | |
| 1019 } | |
| 1020 | |
| 1021 if (lng.str==NULL) | |
| 1022 { | |
| 1023 /* | |
| 1024 * Can't work out the language so give up. | |
| 1025 */ | |
| 1026 ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_OpNotSupp); | |
| 1027 return(ACI_BAT_FAIL); | |
| 1028 } | |
| 1029 | |
| 1030 /* | |
| 1031 * Call the corresponding ACI function. T_ACI_BAT_RSLT is | |
| 1032 * assumed to be equivalent to T_ACI_RESULT. | |
| 1033 */ | |
| 1034 ret=(T_ACI_BAT_RSLT)sAT_PlusCLAN(src_infos_psi->srcId,&lng); | |
| 1035 | |
| 1036 return(ret); | |
| 1037 } | |
| 1038 | |
| 1039 /* | |
| 1040 +--------------------------------------------------------------------+ | |
| 1041 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 1042 | STATE : code ROUTINE : qBAT_PlusCLAN | | |
| 1043 +--------------------------------------------------------------------+ | |
| 1044 | |
| 1045 PURPOSE : | |
| 1046 */ | |
| 1047 GLOBAL T_ACI_BAT_RSLT qBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 1048 T_BAT_cmd_send *cmd) | |
| 1049 { | |
| 1050 T_ACI_BAT_RSLT ret; | |
| 1051 T_ACI_LAN_SUP lng; | |
| 1052 T_BAT_cmd_response resp; | |
| 1053 T_BAT_res_que_plus_clan clan_data; | |
| 1054 | |
| 1055 TRACE_FUNCTION ("qBAT_PlusCLAN()"); | |
| 1056 | |
| 1057 resp.ctrl_response=BAT_RES_QUE_PLUS_CLAN; | |
| 1058 resp.response.ptr_que_plus_clan=&clan_data; | |
| 1059 | |
| 1060 memset(&clan_data,0,sizeof(clan_data)); | |
| 1061 lng.str=(CHAR *)clan_data.code; | |
| 1062 | |
| 1063 /* | |
| 1064 * Call the corresponding ACI function. T_ACI_BAT_RSLT is | |
| 1065 * assumed to be equivalent to T_ACI_RESULT. | |
| 1066 * We are trusting this function not to deliver too long | |
| 1067 * a string. At the time of writing, it can only give us two | |
| 1068 * characters, which we easily have room for in the BAT | |
| 1069 * message. | |
| 1070 */ | |
| 1071 ret=(T_ACI_BAT_RSLT)qAT_PlusCLAN(src_infos_psi->srcId,&lng); | |
| 1072 | |
| 1073 /* | |
| 1074 * If the query completes, send the response now. | |
| 1075 */ | |
| 1076 if (ret==ACI_BAT_CMPL) | |
| 1077 { | |
| 1078 clan_data.c_code=strlen(lng.str); | |
| 1079 aci_bat_send(src_infos_psi,&resp); | |
| 1080 } | |
| 1081 | |
| 1082 return(ret); | |
| 1083 } | |
| 1084 | |
| 1085 /* | |
| 1086 +--------------------------------------------------------------------+ | |
| 1087 | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | |
| 1088 | STATE : code ROUTINE : tBAT_PlusCLAN | | |
| 1089 +--------------------------------------------------------------------+ | |
| 1090 | |
| 1091 PURPOSE : | |
| 1092 */ | |
| 1093 GLOBAL T_ACI_BAT_RSLT tBAT_PlusCLAN (T_ACI_DTI_PRC_PSI *src_infos_psi, | |
| 1094 T_BAT_cmd_send *cmd) | |
| 1095 { | |
| 1096 T_ACI_BAT_RSLT ret; | |
| 1097 T_ACI_LAN_SUP lng[MAX_LAN]; | |
| 1098 SHORT last_idx; | |
| 1099 | |
| 1100 TRACE_FUNCTION ("tBAT_PlusCLAN()"); | |
| 1101 | |
| 1102 /* | |
| 1103 * Call the corresponding ACI function. T_ACI_BAT_RSLT is | |
| 1104 * assumed to be equivalent to T_ACI_RESULT. | |
| 1105 */ | |
| 1106 ret=(T_ACI_BAT_RSLT)tAT_PlusCLAN(src_infos_psi->srcId,&last_idx,lng); | |
| 1107 | |
| 1108 /* | |
| 1109 * If the command completes, send the response now. | |
| 1110 */ | |
| 1111 if (ret==ACI_BAT_CMPL) | |
| 1112 { | |
| 1113 USHORT i; | |
| 1114 T_BAT_cmd_response resp; | |
| 1115 T_BAT_res_tst_plus_clan clan_data; | |
| 1116 | |
| 1117 resp.ctrl_response=BAT_RES_TST_PLUS_CLAN; | |
| 1118 resp.response.ptr_tst_plus_clan=&clan_data; | |
| 1119 | |
| 1120 /* | |
| 1121 * We have received a list, however the BAT response only | |
| 1122 * allows for single items. So we must send each one | |
| 1123 * individually. | |
| 1124 */ | |
| 1125 for (i=0;i<last_idx;i++) | |
| 1126 { | |
| 1127 clan_data.c_code=strlen(lng[i].str); | |
| 1128 | |
| 1129 /* | |
| 1130 * Discard any languages for which the string is too long for | |
| 1131 * BAT (this should never happen). | |
| 1132 */ | |
| 1133 if (clan_data.c_code<=BAT_MAX_CLAN_CODE_LEN) | |
| 1134 { | |
| 1135 memcpy(clan_data.code,lng[i].str,BAT_MAX_CLAN_CODE_LEN); | |
| 1136 aci_bat_send(src_infos_psi,&resp); | |
| 1137 } | |
| 1138 } | |
| 1139 } | |
| 1140 | |
| 1141 return(ret); | |
| 1142 } | |
| 1143 |
