static int responseHardwareConfig(Parcel &p, void *response, size_t responselen);
static int responseDcRtInfo(Parcel &p, void *response, size_t responselen);
static int responseRadioCapability(Parcel &p, void *response, size_t responselen);
+static int responseSSData(Parcel &p, void *response, size_t responselen);
+
static int decodeVoiceRadioTechnology (RIL_RadioState radioState);
static int decodeCdmaSubscriptionSource (RIL_RadioState radioState);
static RIL_RadioState processRadioState(RIL_RadioState newRadioState);
+static bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType);
+
#ifdef RIL_SHLIB
#if defined(ANDROID_MULTI_SIM)
extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
status = p.readInt32(&request);
status = p.readInt32 (&token);
- RLOGD("SOCKET %s REQUEST: %s length:%d", rilSocketIdToString(socket_id), requestToString(request), buflen);
-
#if (SIM_COUNT >= 2)
if (socket_id == RIL_SOCKET_2) {
pendingRequestsMutexHook = &s_pendingRequestsMutex_socket2;
return 0;
}
+static int responseSSData(Parcel &p, void *response, size_t responselen) {
+ RLOGD("In responseSSData");
+ int num;
+
+ if (response == NULL && responselen != 0) {
+ RLOGE("invalid response length was %d expected %d",
+ (int)responselen, (int)sizeof (RIL_SIM_IO_Response));
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ if (responselen != sizeof(RIL_StkCcUnsolSsResponse)) {
+ RLOGE("invalid response length %d, expected %d",
+ (int)responselen, (int)sizeof(RIL_StkCcUnsolSsResponse));
+ return RIL_ERRNO_INVALID_RESPONSE;
+ }
+
+ startResponse;
+ RIL_StkCcUnsolSsResponse *p_cur = (RIL_StkCcUnsolSsResponse *) response;
+ p.writeInt32(p_cur->serviceType);
+ p.writeInt32(p_cur->requestType);
+ p.writeInt32(p_cur->teleserviceType);
+ p.writeInt32(p_cur->serviceClass);
+ p.writeInt32(p_cur->result);
+
+ if (isServiceTypeCfQuery(p_cur->serviceType, p_cur->requestType)) {
+ RLOGD("responseSSData CF type, num of Cf elements %d", p_cur->cfData.numValidIndexes);
+ if (p_cur->cfData.numValidIndexes > NUM_SERVICE_CLASSES) {
+ RLOGE("numValidIndexes is greater than max value %d, "
+ "truncating it to max value", NUM_SERVICE_CLASSES);
+ p_cur->cfData.numValidIndexes = NUM_SERVICE_CLASSES;
+ }
+ /* number of call info's */
+ p.writeInt32(p_cur->cfData.numValidIndexes);
+
+ for (int i = 0; i < p_cur->cfData.numValidIndexes; i++) {
+ RIL_CallForwardInfo cf = p_cur->cfData.cfInfo[i];
+
+ p.writeInt32(cf.status);
+ p.writeInt32(cf.reason);
+ p.writeInt32(cf.serviceClass);
+ p.writeInt32(cf.toa);
+ writeStringToParcel(p, cf.number);
+ p.writeInt32(cf.timeSeconds);
+ appendPrintBuf("%s[%s,reason=%d,cls=%d,toa=%d,%s,tout=%d],", printBuf,
+ (cf.status==1)?"enable":"disable", cf.reason, cf.serviceClass, cf.toa,
+ (char*)cf.number, cf.timeSeconds);
+ RLOGD("Data: %d,reason=%d,cls=%d,toa=%d,num=%s,tout=%d],", cf.status,
+ cf.reason, cf.serviceClass, cf.toa, (char*)cf.number, cf.timeSeconds);
+ }
+ } else {
+ p.writeInt32 (SS_INFO_MAX);
+
+ /* each int*/
+ for (int i = 0; i < SS_INFO_MAX; i++) {
+ appendPrintBuf("%s%d,", printBuf, p_cur->ssInfo[i]);
+ RLOGD("Data: %d",p_cur->ssInfo[i]);
+ p.writeInt32(p_cur->ssInfo[i]);
+ }
+ }
+ removeLastChar;
+ closeResponse;
+
+ return 0;
+}
+
+static bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType) {
+ if ((reqType == SS_INTERROGATION) &&
+ (serType == SS_CFU ||
+ serType == SS_CF_BUSY ||
+ serType == SS_CF_NO_REPLY ||
+ serType == SS_CF_NOT_REACHABLE ||
+ serType == SS_CF_ALL ||
+ serType == SS_CF_ALL_CONDITIONAL)) {
+ return true;
+ }
+ return false;
+}
+
static void triggerEvLoop() {
int ret;
if (!pthread_equal(pthread_self(), s_tid_dispatch)) {