diff src/g23m-aci/aci/aci_bat_cphs.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-aci/aci/aci_bat_cphs.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,803 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-F&D (8411)
+|  Modul   :  ACI_BAT
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved. 
+|
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  This BAT wrapper modul is ...
+| 
++----------------------------------------------------------------------------- 
+*/ 
+
+#include "aci_all.h"     /* includes prim.h, which includes p_bat.h */ 
+#include "aci_cmh.h"     /* prototypes of sAT_,qAT_,tAT_    */ 
+#include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ 
+#include "aci_bat.h"
+#include "cphs.h"
+#include "aci_cphs.h"
+#include "aci_cmd.h"
+
+/*
+ * commonly used query for %CPCFU and %CPVWI
+ * %CPCFU: <status>[,<line>]
+ * %CPVWI: <status>[,<line>]
+ *
+ * status acts as a global status information for all lines.
+ * if any line is set then status is set/activated
+ * and in the line bit field you can check which one.
+ * the strange thing is that the numerical value for status
+ * is exactly complementary between %CPCFU and %CPVWI
+ * see also 8415_052.doc
+ */
+LOCAL T_ACI_BAT_RSLT query_cphs_lines (T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                       T_BAT_cmd_send    *cmd,
+                                       T_CPHS_LINES       lines)
+{
+  T_ACI_BAT_RSLT ret;
+  T_ACI_RETURN (*fptr)(T_ACI_CMD_SRC srcId, U8 *cfu_set, T_CPHS_LINES line);
+  T_CPHS_LINES line         = CPHS_LINE_NULL;
+  T_CPHS_LINES line_bitmask = CPHS_LINE_NULL;
+  U16          i, end;
+  U8           flag_set;
+
+  T_BAT_res_set_percent_cpvwi cpvwi;
+  T_BAT_res_set_percent_cpcfu cpcfu;
+  T_BAT_cmd_response          resp; 
+ 
+  switch (cmd->ctrl_params)
+  {
+    case (BAT_CMD_SET_PERCENT_CPCFU):
+    {
+      fptr = qAT_PercentCPCFU;
+      break;
+    }
+    case (BAT_CMD_SET_PERCENT_CPVWI):
+    {
+      fptr = qAT_PercentCPVWI;
+      break;
+    }
+    default:
+    {
+      return (ACI_BAT_FAIL);
+    }
+  }
+
+  end = 8 * sizeof(T_CPHS_LINES);
+  /* rotate over all bits */
+  for (i=0; i<end; i++)
+  {
+    line = 1 << i;
+    if (lines & line)
+    {
+      ret = (T_ACI_BAT_RSLT)fptr((T_ACI_CMD_SRC)src_infos_psi->srcId, &flag_set, line);
+
+      if(ret NEQ (T_ACI_BAT_RSLT)AT_CMPL)
+      {
+        return(ACI_BAT_FAIL);
+      }
+
+      if(flag_set EQ CPHS_FLAG_ACTIVATED)
+      {
+        line_bitmask |= line;
+      }
+    }
+    else
+    {
+      continue; /* bit not set --> do not check this line */
+    } 
+  }
+
+  switch (cmd->ctrl_params)
+  {
+    case (BAT_CMD_SET_PERCENT_CPCFU):
+    {
+      cpcfu.line = (T_BAT_percent_cpcfu_line)line_bitmask;
+      cpcfu.status = (line_bitmask EQ CPHS_LINE_NULL) 
+                     ? BAT_P_CPCFU_STATUS_DEACTIVATE
+                     : BAT_P_CPCFU_STATUS_ACTIVATED;    
+      resp.ctrl_response = BAT_RES_SET_PERCENT_CPCFU;
+      resp.response.ptr_set_percent_cpcfu = &cpcfu;
+      /* 
+       * according to 8415_052.doc CPCFU status: 0 Activated, 1 Deactivated,
+       * which must be an error, because on ATI the status is given as 1, when any line has been set.
+       * But the nice thing with BAT is the using of symbolic constants, where the actual numeric
+       * value for BAT_P_CPCFU_STATUS_ACTIVATED is unimportant as long as the client code uses it.
+       * If they use numerical value instead of symbolic constant, then ... we cannot help ...
+       */
+      TRACE_EVENT_P2("query_cphs_lines(): status = %i, line = 0x%02X",cpcfu.status, cpcfu.line);
+      break;
+    }
+    case (BAT_CMD_SET_PERCENT_CPVWI):
+    {
+      cpvwi.line = (T_BAT_percent_cpvwi_lines)line_bitmask;
+      cpvwi.status = (line_bitmask EQ CPHS_LINE_NULL) 
+                     ? BAT_P_CPVWI_FLAG_DEACTIVATED
+                     : BAT_P_CPVWI_FLAG_ACTIVATED;
+      resp.ctrl_response = BAT_RES_SET_PERCENT_CPVWI;
+      resp.response.ptr_set_percent_cpvwi = &cpvwi;
+      TRACE_EVENT_P2("query_cphs_lines(): status = %i, line = 0x%02X",cpvwi.status, cpvwi.line);
+      break;
+    }
+    default:
+    {
+      return (ACI_BAT_FAIL);
+    }
+  }
+
+  aci_bat_send(src_infos_psi, &resp);
+  return (ACI_BAT_CMPL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPHS     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPHS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                       T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+
+  TRACE_FUNCTION ("sBAT_PercentCPHS()");
+  ret = (T_ACI_BAT_RSLT)sAT_PercentCPHS((T_ACI_CMD_SRC)src_infos_psi->srcId, 
+                        (T_ACI_CPHS_INIT)cmd->params.ptr_set_percent_cphs->init_mode); 
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentCPHS     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPHS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                       T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  T_BAT_cmd_response resp;
+  T_BAT_res_que_percent_cphs cphs;
+
+  TRACE_FUNCTION ("qBAT_PercentCPHS()");
+
+  resp.ctrl_response = BAT_RES_QUE_PERCENT_CPHS; 
+  resp.response.ptr_que_percent_cphs = &cphs;
+
+  ret = (T_ACI_BAT_RSLT)qAT_PercentCPHS((T_ACI_CMD_SRC)src_infos_psi->srcId,(T_ACI_CPHS_INIT*)&cphs.init_mode); 
+
+  aci_bat_send(src_infos_psi, &resp);
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPNUMS   |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPNUMS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                         T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+
+  TRACE_FUNCTION ("sBAT_PercentCPNUMS()");
+
+  ret = (T_ACI_BAT_RSLT)sAT_PercentCPNUMS((T_ACI_CMD_SRC)src_infos_psi->srcId, 
+                          cmd->params.ptr_set_percent_cpnums->element_id, 
+                          (U8)cmd->params.ptr_set_percent_cpnums->mode);
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : tBAT_PercentCPNUMS   |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT tBAT_PercentCPNUMS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                         T_BAT_cmd_send    *cmd)
+{
+  return(ACI_BAT_FAIL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPALS    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPALS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+
+  TRACE_FUNCTION ("sBAT_PercentCPALS()");
+  /* adjust the left hand side
+    xxx = cmd->params.ptr_set_percent_cpals->call_id;
+  */
+  /* hmm, do not know which ACI function to call ! */ 
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentCPALS    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPALS(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  T_BAT_cmd_response resp;
+  T_BAT_res_que_percent_cpals cpals;
+
+  T_CPHS_LINES  active_line; 
+  CHAR          *line_desc; 
+  U8            max_line_desc = 30; /* should be enough ! */ 
+
+  TRACE_FUNCTION ("qBAT_PercentCPALS()");
+
+  MALLOC(line_desc, max_line_desc);
+
+  resp.ctrl_response = BAT_RES_QUE_PERCENT_CPALS; 
+  resp.response.ptr_que_percent_cpals = &cpals;
+
+  ret = (T_ACI_BAT_RSLT)qAT_PercentCPALS((T_ACI_CMD_SRC)src_infos_psi->srcId, 
+                          (U8)cpals.lines,
+                          &active_line,
+                          line_desc, 
+                          &max_line_desc);
+  MFREE(line_desc);
+
+  aci_bat_send(src_infos_psi, &resp);
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPVWI    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPVWI(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  T_CPHS_LINES lines = CPHS_LINE_NULL;
+
+  TRACE_FUNCTION ("sBAT_PercentCPVWI()");
+
+  /* According to 8415_52.doc the parameter line is mandatory,
+   * but implementation in ATI/ACI allows this one to be omittable.
+   * So, BAT goes with them. In case of line is omitted, 
+   * set it to all possible. Else leave the bitfield as is (BAT == ACI).
+   */
+  if (cmd->params.ptr_set_percent_cpvwi->lines EQ BAT_P_CPVWI_LINES_NOT_PRESENT)
+  {
+    lines = CPHS_LINE1 + CPHS_LINE_DATA + CPHS_LINE_FAX + CPHS_LINE2;   
+  }
+  else
+  {
+    lines = cmd->params.ptr_set_percent_cpvwi->lines;
+  }
+
+  if (cmd->params.ptr_set_percent_cpvwi->mode EQ BAT_P_CPVWI_MODE_QUERY)
+  {
+    ret = query_cphs_lines(src_infos_psi, cmd, lines);
+  }
+  else
+  {  
+    ret = (T_ACI_BAT_RSLT)sAT_PercentCPVWI((T_ACI_CMD_SRC)src_infos_psi->srcId, 
+                           (U8)cmd->params.ptr_set_percent_cpvwi->mode,
+                           lines);
+  }
+
+  return(ret);
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentCPOPN    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPOPN(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  T_BAT_cmd_response resp;
+  T_BAT_res_que_percent_cpopn cpopn;
+
+  TRACE_FUNCTION ("qBAT_PercentCPOPN()");
+
+  resp.ctrl_response = BAT_RES_QUE_PERCENT_CPOPN; 
+  resp.response.ptr_que_percent_cpopn = &cpopn;
+
+  ret = (T_ACI_BAT_RSLT)qAT_PercentCPOPN((T_ACI_CMD_SRC)src_infos_psi->srcId,
+                          (CHAR*)cpopn.long_name, 
+                          &cpopn.c_long_name,
+                          (CHAR*)cpopn.short_name, 
+                          &cpopn.c_short_name);
+
+  aci_bat_send(src_infos_psi, &resp);
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPINF    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPINF(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  T_BAT_cmd_set_percent_cpinf *cpinf = cmd->params.ptr_set_percent_cpinf;
+  UBYTE  serv_group[CPHS_MAX_CSP];
+  UBYTE  serv_len = 0;
+
+  TRACE_FUNCTION ("sBAT_PercentCPINF()");
+
+  memset(serv_group,0,sizeof(serv_group));
+
+  /* CSP exceeding maximum value display text too long */
+  if ( cpinf->c_csp > BAT_MAX_CPINF_CSP_LEN )
+  {
+    ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_TxtToLong);
+    return(ACI_BAT_FAIL);
+  }
+
+  serv_len = utl_HexStrToBin((UBYTE*)cpinf->csp, cpinf->c_csp, serv_group, CPHS_MAX_CSP);
+  
+  /* Odd length CSP or empty CSP display operation not allowed */
+  if(((serv_len % 2) NEQ 0) OR (serv_len EQ 0))
+  {
+    ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_OpNotAllow);
+    return(ACI_BAT_FAIL);
+  }
+
+  ret = (T_ACI_BAT_RSLT)sAT_PercentCPINF( (T_ACI_CMD_SRC)src_infos_psi->srcId,
+                          serv_group,
+                          serv_len);
+
+  return(ret);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentCPINF    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPINF(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_RETURN ret = AT_FAIL;
+  T_BAT_cmd_response resp;
+  T_BAT_res_que_percent_cpinf cpinf;
+
+  TRACE_FUNCTION ("qBAT_PercentCPINF()");
+
+  resp.ctrl_response = BAT_RES_QUE_PERCENT_CPINF; 
+  resp.response.ptr_que_percent_cpinf = &cpinf;
+
+  cpinf.phase = BAT_P_CPINF_PHASE_1;
+  cpinf.sst   = 0;
+  cpinf.c_csp = BAT_MAX_CPINF_CSP_LEN;/* Since the BAT_MAX_CPINF_CSP_LEN length has been updated to 22,then there is no need of BAT_MAX_CPINF_CSP2_LEN */  
+  cpinf.c_csp2 = BAT_MAX_CPINF_CSP_LEN;
+  memset(cpinf.csp, 0x00, BAT_MAX_CPINF_CSP_LEN);
+  memset(cpinf.csp2, 0x00, BAT_MAX_CPINF_CSP_LEN);
+
+  ret = (T_ACI_RETURN)qAT_PercentCPINF((T_ACI_CMD_SRC)src_infos_psi->srcId,
+                          (U8*)&cpinf.phase,
+                          &cpinf.sst, 
+                          (CHAR*)cpinf.csp,
+                          (CHAR*)cpinf.csp2,
+                          &cpinf.c_csp,
+                          &cpinf.c_csp2);
+
+  if (ret EQ AT_CMPL)
+  {
+    aci_bat_send(src_infos_psi, &resp);
+    return (ACI_BAT_CMPL);
+  }
+
+  return (ACI_BAT_FAIL);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPMB     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPMB(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                       T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  T_CPHS_LINES line;
+  CHAR number[CPHS_MAX_MB_NUMBER_LEN];
+  CHAR alpha_id[CPHS_MAX_MB_ALPHA_LEN];
+  T_ACI_TOA_TON ton;
+  T_ACI_TOA_NPI npi;
+
+  TRACE_FUNCTION ("sBAT_PercentCPMB()");
+
+  /*
+  *   Call the corresponding ACI function. T_ACI_BAT_RSLT is
+  *   assumed to be equivalent to T_ACI_RESULT.
+  */
+  ret=(T_ACI_BAT_RSLT)qAT_PercentCPMB(
+    (T_ACI_CMD_SRC)src_infos_psi->srcId,
+    (UBYTE)cmd->params.ptr_set_percent_cpmb->record_id,
+    &line,number,&ton,&npi,alpha_id,NULL);
+
+  /*
+  *   If the query completes, send the response now.
+  */
+  if (ret EQ ACI_BAT_CMPL)
+  {
+    T_BAT_cmd_response resp;
+    T_BAT_res_set_percent_cpmb cpmb_data;
+    UBYTE len;
+    T_ACI_TOA toa;
+ 
+    resp.ctrl_response=BAT_RES_SET_PERCENT_CPMB;
+    resp.response.ptr_set_percent_cpmb=&cpmb_data;
+
+    cpmb_data.record_id=(T_BAT_record_id)cmd->params.ptr_set_percent_cpmb->record_id;
+    cpmb_data.line=(T_BAT_percent_cpmb_line)line;
+
+    len=strlen(number);
+
+    /*
+    *   This is in line with the existing ATI implementation (see
+    *   setatPercentCPMB()) and is necessary to pass tests such as
+    *   ACI583.
+    */ 
+    if (len EQ 0)
+    {
+      ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_NotFound);
+      return(ACI_BAT_FAIL);
+    }
+
+    /*
+    *   Check that the number isn't too long for the BAT message, 
+    *   if it is it will effectively be truncated.
+    */
+    if (len>BAT_MAX_CPMB_NUMBER_LEN)
+      len=BAT_MAX_CPMB_NUMBER_LEN;
+
+    if (len)
+    {
+      memcpy(cpmb_data.number,number,len);
+      cpmb_data.v_number=TRUE;
+      cpmb_data.c_number=(U8)len;
+    }
+    else
+    {
+      cpmb_data.v_number=FALSE;
+    }
+
+    len=strlen(alpha_id);
+
+    if (len)
+    {
+      USHORT len_cvtd_text=0;
+
+      /*
+      *   Convert the data read from the SIM into the currently 
+      *   selected character set.
+      */
+      utl_chsetFromSim(
+        (UBYTE *)alpha_id,
+        (USHORT)len,
+        (UBYTE *)cpmb_data.alpha_id,
+        BAT_MAX_CPMB_ALPHA_ID_LEN,
+        &len_cvtd_text,
+        GSM_ALPHA_Def);
+
+      cpmb_data.v_alpha_id=TRUE;
+      cpmb_data.c_alpha_id=(U8)len_cvtd_text;
+    }
+    else
+    {
+      cpmb_data.v_alpha_id=FALSE;
+    }
+
+    /*
+    *   Get the type of number and numbering plan into a T_ACI_TOA structure
+    *   so that we can use toa_merge().
+    */
+    toa.ton=ton;
+    toa.npi=npi;
+
+    /*
+    *   BAT stores the type of address in a single 8-bit value (it is S16 in
+    *   the message only to allow for a 'not present' value of -1).
+    */
+    cpmb_data.type=(S16)toa_merge(toa);
+
+    aci_bat_send(src_infos_psi,&resp);
+  }
+
+  return(ret);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : qBAT_PercentCPMB     |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT qBAT_PercentCPMB(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                       T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  UBYTE first;
+
+  TRACE_FUNCTION ("qBAT_PercentCPMB()");
+
+  /*
+  *   Call the corresponding qAT function. T_ACI_BAT_RSLT is
+  *   assumed to be equivalent to T_ACI_RESULT.
+  */
+  ret=(T_ACI_BAT_RSLT)qAT_PercentCPMB(
+         (T_ACI_CMD_SRC)src_infos_psi->srcId,
+    (UBYTE)ACI_NumParmNotPresent,NULL,NULL,NULL,NULL,NULL,&first);
+
+  /*
+  *   If the query completes, send the response now.
+  */
+  if (ret EQ ACI_BAT_CMPL)
+  {
+    T_BAT_cmd_response resp;
+    T_BAT_res_que_percent_cpmb cpmb_data;
+ 
+    resp.ctrl_response=BAT_RES_QUE_PERCENT_CPMB;
+    resp.response.ptr_que_percent_cpmb=&cpmb_data;
+
+    cpmb_data.first=(U8)first;
+
+    aci_bat_send(src_infos_psi,&resp);
+  }
+
+  return(ret);
+}
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPMBW    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPMBW(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret;
+  T_BAT_cmd_set_percent_cpmbw *cpmbw = cmd->params.ptr_set_percent_cpmbw;
+  T_ACI_TOA type;
+  T_ACI_TOA *p_type;
+  CHAR number[BAT_MAX_CPMBW_NUMBER_LEN+1];
+  CHAR *p_number;
+  T_CPHS_PB_TEXT text;
+  T_CPHS_PB_TEXT *p_text;
+
+  TRACE_FUNCTION ("sBAT_PercentCPMBW()");
+
+  if (cpmbw->type EQ -1)
+  {
+    p_type=NULL;
+  }
+  else
+  {
+    p_type=&type;
+    type=toa_demerge(cpmbw->type);
+  }
+
+  if (cpmbw->v_number EQ FALSE)
+  {
+    p_number=NULL;
+  }
+  else
+  {
+    /*
+    *   Mailbox number is present, so make a zero-terminated version
+    *   and set a pointer to it.
+    */
+    p_number=number;
+    memset(number,0,sizeof(number));
+    memcpy(number,cpmbw->number,cpmbw->c_number);
+  }
+
+  if (cpmbw->v_text EQ FALSE)
+  {
+    p_text=NULL;
+  }
+  else
+  {
+    USHORT len;
+
+    p_text=&text;
+
+    /*
+    *   Convert from the currently selected character set into the
+    *   SIM format.
+    */
+    utl_chsetToSim(
+      (UBYTE *)cpmbw->text,
+      (USHORT)cpmbw->c_text,
+      (UBYTE *)text.data,
+      &len,
+      GSM_ALPHA_Def);
+
+    if (len>CPHS_MAX_MB_ALPHA_LEN)
+    {
+      /*
+      *   Shouldn't get here as that would mean that memory has been
+      *   overwritten. Currently utl_chsetToSim() has no specific mechanism
+      *   to prevent this.
+      */
+      ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_TxtToLong);
+      return(ACI_BAT_FAIL);
+    }
+          
+    /*
+    *   Set the length. Note that we cannot do this by passing a
+    *   reference to text.len into utl_chsetToSim() because it is
+    *   the wrong type.
+    */
+    text.len=(UBYTE)len;
+    
+    p_text=&text;
+  }
+
+  /*
+  *   Call the corresponding sAT function. T_ACI_BAT_RSLT is
+  *   assumed to be equivalent to T_ACI_RESULT.
+  */
+  ret=(T_ACI_BAT_RSLT)sAT_PercentCPMBW(
+    (T_ACI_CMD_SRC)src_infos_psi->srcId, 
+    (SHORT)cpmbw->record_id,
+    p_number,
+    p_type,
+    p_text);
+
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : tBAT_PercentCPMBW    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT tBAT_PercentCPMBW(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  SHORT          first_idx = 0;
+  SHORT          last_idx  = 0;
+  UBYTE          tlength   = 0;
+  UBYTE          nlength   = 0;
+
+  TRACE_FUNCTION ("tBAT_PercentCPMBW()");
+
+  ret=(T_ACI_BAT_RSLT)tAT_PercentCPMBW((T_ACI_CMD_SRC)src_infos_psi->srcId,
+                                       &first_idx,
+                                       &last_idx,
+                                       &nlength,
+                                       &tlength);
+
+  if (ret EQ ACI_BAT_CMPL)
+  {
+    T_BAT_cmd_response resp;
+    T_BAT_res_tst_percent_cpmbw cpmbw_data;
+ 
+    resp.ctrl_response = BAT_RES_TST_PERCENT_CPMBW;
+    resp.response.ptr_tst_percent_cpmbw = &cpmbw_data;
+
+    cpmbw_data.min_rec_id = (U8)first_idx;
+    cpmbw_data.max_rec_id = (U8)last_idx;
+    cpmbw_data.nlength    = nlength;
+    cpmbw_data.tlength    = tlength;
+
+    /* 
+     * currently c_type_range and type_range are initialized to zero
+     * TODO : %CPMBW types
+     */
+    cpmbw_data.c_type_range = 0;
+    cpmbw_data.type_range[0] = 0;
+
+    aci_bat_send(src_infos_psi,&resp);
+  }
+
+  return(ret);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)            MODULE  : ACI_BAT              |
+| STATE   : code                      ROUTINE : sBAT_PercentCPCFU    |
++--------------------------------------------------------------------+
+
+  PURPOSE : 
+*/
+GLOBAL T_ACI_BAT_RSLT sBAT_PercentCPCFU(T_ACI_DTI_PRC_PSI *src_infos_psi,
+                                        T_BAT_cmd_send    *cmd)
+{
+  T_ACI_BAT_RSLT ret = ACI_BAT_FAIL;
+  T_CPHS_LINES lines = CPHS_LINE_NULL;
+
+  TRACE_FUNCTION ("sBAT_PercentCPCFU()");
+
+  /* According to 8415_52.doc the parameter line is mandatory,
+   * but implementation in ATI/ACI allows this one to be omittable.
+   * So, BAT goes with them. In case of line is omitted, 
+   * set it to all possible. Else leave the bitfield as is (BAT == ACI).
+   */
+  if (cmd->params.ptr_set_percent_cpcfu->line EQ BAT_P_CPCFU_LINE_NOT_PRESENT)
+  {
+    lines = CPHS_LINE1 + CPHS_LINE_DATA + CPHS_LINE_FAX + CPHS_LINE2;   
+  }
+  else
+  {
+    lines = cmd->params.ptr_set_percent_cpcfu->line;
+  }
+
+  if (cmd->params.ptr_set_percent_cpcfu->mode EQ BAT_P_CPCFU_MODE_QUERY)
+  {
+    ret = query_cphs_lines(src_infos_psi, cmd, lines);
+  }
+  else
+  {  
+    ret = (T_ACI_BAT_RSLT)sAT_PercentCPCFU((T_ACI_CMD_SRC)src_infos_psi->srcId,
+                           (U8)cmd->params.ptr_set_percent_cpcfu->mode,
+                            lines);
+  }
+  return(ret);
+}
+
+