OSDN Git Service

Convert ril cpp to HIDL service.
authorSanket Padawe <sanketpadawe@google.com>
Tue, 3 Jan 2017 07:46:00 +0000 (23:46 -0800)
committerAmit Mahajan <amitmahajan@google.com>
Thu, 12 Jan 2017 17:42:23 +0000 (09:42 -0800)
Bug: 32020264

Test: Basic telephony sanity tests (voice calls, data, sms, APM).
Change-Id: I1327e7b07ed001e7fbb8d69a2c871bdc500f1a9f

include/telephony/ril.h
libril/ril.cpp
libril/ril_commands.h
libril/ril_internal.h
libril/ril_service.cpp
libril/ril_service.h

index fe55c0a..342377d 100644 (file)
@@ -172,6 +172,7 @@ typedef enum {
     RIL_E_DEVICE_IN_USE = 64,                   /* Operation cannot be performed because the device
                                                    is currently in use */
     RIL_E_ABORTED = 65,                         /* Operation aborted */
+    RIL_E_INVALID_RESPONSE = 66,                /* Invalid response sent by vendor code */
     // OEM specific error codes. To be used by OEM when they don't want to reveal
     // specific error codes which would be replaced by Generic failure.
     RIL_E_OEM_ERROR_1 = 501,
index 6a7e694..121353e 100644 (file)
@@ -320,7 +320,7 @@ static int responsePcoData(Parcel &p, int slotId, int requestNumber, int respons
         RIL_Errno e, void *response, size_t responselen);
 
 static void grabPartialWakeLock();
-static void releaseWakeLock();
+void releaseWakeLock();
 static void wakeTimeoutCallback(void *);
 
 static bool isServiceTypeCfQuery(RIL_SsServiceType serType, RIL_SsRequestType reqType);
@@ -557,10 +557,11 @@ processCommandBuffer(void *buffer, size_t buflen, RIL_SOCKET_ID socket_id) {
     return 0;
 }
 
-int
-addRequestToList(RequestInfo *pRI, int request, int token, RIL_SOCKET_ID socket_id) {
-    status_t status;
+RequestInfo *
+addRequestToList(int serial, int slotId, int request) {
+    RequestInfo *pRI;
     int ret;
+    RIL_SOCKET_ID socket_id = (RIL_SOCKET_ID) slotId;
     /* Hook for current context */
     /* pendingRequestsMutextHook refer to &s_pendingRequestsMutex */
     pthread_mutex_t* pendingRequestsMutexHook = &s_pendingRequestsMutex;
@@ -586,13 +587,16 @@ addRequestToList(RequestInfo *pRI, int request, int token, RIL_SOCKET_ID socket_
 #endif
 #endif
 
-    // Received an Ack for the previous result sent to RIL.java,
-    // so release wakelock and exit
-    if (request == RIL_RESPONSE_ACKNOWLEDGEMENT) {
-        releaseWakeLock();
-        return 0;
+    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
+    if (pRI == NULL) {
+        RLOGE("Memory allocation failed for request %s", requestToString(request));
+        return NULL;
     }
 
+    pRI->token = serial;
+    pRI->pCI = &(s_commands[request]);
+    pRI->socket_id = socket_id;
+
     ret = pthread_mutex_lock(pendingRequestsMutexHook);
     assert (ret == 0);
 
@@ -602,7 +606,7 @@ addRequestToList(RequestInfo *pRI, int request, int token, RIL_SOCKET_ID socket_
     ret = pthread_mutex_unlock(pendingRequestsMutexHook);
     assert (ret == 0);
 
-    return 0;
+    return pRI;
 }
 
 static void
@@ -4807,7 +4811,6 @@ RIL_register (const RIL_RadioFunctions *callbacks) {
     startListen(RIL_SOCKET_4, &s_ril_param_socket4);
 #endif /* (SIM_COUNT == 4) */
 
-    RLOGI("RILHIDL calling registerService");
     radio::registerService(&s_callbacks, s_commands);
     RLOGI("RILHIDL called registerService");
 
@@ -4984,8 +4987,23 @@ RIL_onRequestAck(RIL_Token t) {
         p.writeInt32 (RESPONSE_SOLICITED_ACK);
         p.writeInt32 (pRI->token);
 
+        switch(pRI->pCI->requestNumber) {
+            case RIL_REQUEST_GET_SIM_STATUS:
+            case RIL_REQUEST_ENTER_SIM_PIN:
+            case RIL_REQUEST_ENTER_SIM_PUK:
+            case RIL_REQUEST_ENTER_SIM_PIN2:
+            case RIL_REQUEST_ENTER_SIM_PUK2:
+            case RIL_REQUEST_CHANGE_SIM_PIN:
+            case RIL_REQUEST_CHANGE_SIM_PIN2:
+            case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION:
+            case RIL_REQUEST_GET_CURRENT_CALLS:
+            case RIL_REQUEST_DIAL:
+                radio::acknowledgeRequest((int) socket_id, pRI->token);
+                return;
+        }
+
         if (fd < 0) {
-            RLOGD ("RIL onRequestComplete: Command channel closed");
+            RLOGD ("RIL onRequestAck: Command channel closed");
         }
 
         sendResponse(p, socket_id);
@@ -5042,13 +5060,30 @@ RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responsel
 
         p.writeInt32 (e);
 
-        if (response != NULL) {
+        bool hidlized = false;
+        switch(pRI->pCI->requestNumber) {
+            case RIL_REQUEST_GET_SIM_STATUS:
+            case RIL_REQUEST_ENTER_SIM_PIN:
+            case RIL_REQUEST_ENTER_SIM_PUK:
+            case RIL_REQUEST_ENTER_SIM_PIN2:
+            case RIL_REQUEST_ENTER_SIM_PUK2:
+            case RIL_REQUEST_CHANGE_SIM_PIN:
+            case RIL_REQUEST_CHANGE_SIM_PIN2:
+            case RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION:
+            case RIL_REQUEST_GET_CURRENT_CALLS:
+            case RIL_REQUEST_DIAL:
+                hidlized = true;
+                break;
+        }
+
+        if (response != NULL || hidlized) {
             // there is a response payload, no matter success or not.
             RLOGE ("Calling responseFunction() for token %d", pRI->token);
             ret = pRI->pCI->responseFunction(p, (int) socket_id, pRI->pCI->requestNumber,
                     responseType, pRI->token, e, response, responselen);
 
-            if (pRI->pCI->requestNumber == RIL_REQUEST_GET_SIM_STATUS) {
+            if (hidlized)  {
+                free(pRI);
                 return;
             }
 
@@ -5065,7 +5100,7 @@ RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responsel
         }
 
         if (fd < 0) {
-            RLOGD ("RIL onRequestComplete: Command channel closed");
+            RLOGD ("RIL_onRequestComplete: Command channel closed");
         }
         sendResponse(p, socket_id);
     }
@@ -5100,7 +5135,7 @@ grabPartialWakeLock() {
     }
 }
 
-static void
+void
 releaseWakeLock() {
     if (s_callbacks.version >= 13) {
         int ret;
@@ -5414,6 +5449,7 @@ failCauseToString(RIL_Errno e) {
         case RIL_E_NO_NETWORK_FOUND: return "E_NO_NETWORK_FOUND";
         case RIL_E_DEVICE_IN_USE: return "E_DEVICE_IN_USE";
         case RIL_E_ABORTED: return "E_ABORTED";
+        case RIL_E_INVALID_RESPONSE: return "INVALID_RESPONSE";
         case RIL_E_OEM_ERROR_1: return "E_OEM_ERROR_1";
         case RIL_E_OEM_ERROR_2: return "E_OEM_ERROR_2";
         case RIL_E_OEM_ERROR_3: return "E_OEM_ERROR_3";
index 0f70c3d..1097759 100644 (file)
 ** limitations under the License.
 */
     {0, NULL, NULL},                   //none
-    {RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, radio::iccCardStatusResponse},
-    {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, responseInts},
-    {RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, responseInts},
-    {RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, responseInts},
-    {RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, responseInts},
-    {RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, responseInts},
-    {RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, responseInts},
-    {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, responseInts},
-    {RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, responseCallList},
-    {RIL_REQUEST_DIAL, dispatchDial, responseVoid},
+    {RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, radio::getIccCardStatusResponse},
+    {RIL_REQUEST_ENTER_SIM_PIN, dispatchStrings, radio::supplyIccPinForAppResponse},
+    {RIL_REQUEST_ENTER_SIM_PUK, dispatchStrings, radio::supplyIccPukForAppResponse},
+    {RIL_REQUEST_ENTER_SIM_PIN2, dispatchStrings, radio::supplyIccPin2ForAppResponse},
+    {RIL_REQUEST_ENTER_SIM_PUK2, dispatchStrings, radio::supplyIccPuk2ForAppResponse},
+    {RIL_REQUEST_CHANGE_SIM_PIN, dispatchStrings, radio::changeIccPinForAppResponse},
+    {RIL_REQUEST_CHANGE_SIM_PIN2, dispatchStrings, radio::changeIccPin2ForAppResponse},
+    {RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION, dispatchStrings, radio::supplyNetworkDepersonalizationResponse},
+    {RIL_REQUEST_GET_CURRENT_CALLS, dispatchVoid, radio::getCurrentCallsResponse},
+    {RIL_REQUEST_DIAL, dispatchDial, radio::dialResponse},
     {RIL_REQUEST_GET_IMSI, dispatchStrings, responseString},
     {RIL_REQUEST_HANGUP, dispatchInts, responseVoid},
     {RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND, dispatchVoid, responseVoid},
index 0d77eb0..de7158c 100644 (file)
@@ -56,10 +56,11 @@ typedef struct CommandInfo {
             RIL_Errno e, void *response, size_t responselen);
 } CommandInfo;
 
-int addRequestToList(RequestInfo *pRI, int request, int token, RIL_SOCKET_ID socket_id);
+RequestInfo * addRequestToList(int serial, int slotId, int request);
 
 char * RIL_getRilSocketName();
 
+void releaseWakeLock();
 }   // namespace android
 
 #endif //ANDROID_RIL_INTERNAL_H
index 3d61f5e..1f47cbf 100644 (file)
@@ -47,9 +47,9 @@ sp<RadioImpl> radioService[1];
 #endif
 
 struct RadioImpl : public IRadio {
-    int32_t slotId;
-    sp<IRadioResponse> radioResponse;
-    sp<IRadioIndication> radioIndication;
+    int32_t mSlotId;
+    sp<IRadioResponse> mRadioResponse;
+    sp<IRadioIndication> mRadioIndication;
 
     Return<void> setResponseFunctions(
             const ::android::sp<IRadioResponse>& radioResponse,
@@ -57,41 +57,30 @@ struct RadioImpl : public IRadio {
 
     Return<void> getIccCardStatus(int32_t serial);
 
-    Return<void> supplyIccPinForApp(int32_t serial,
-            const ::android::hardware::hidl_string& pin,
-            const ::android::hardware::hidl_string& aid);
+    Return<void> supplyIccPinForApp(int32_t serial, const hidl_string& pin,
+            const hidl_string& aid);
 
-    Return<void> supplyIccPukForApp(int32_t serial,
-            const ::android::hardware::hidl_string& puk,
-            const ::android::hardware::hidl_string& pin,
-            const ::android::hardware::hidl_string& aid);
+    Return<void> supplyIccPukForApp(int32_t serial, const hidl_string& puk,
+            const hidl_string& pin, const hidl_string& aid);
 
     Return<void> supplyIccPin2ForApp(int32_t serial,
-            const ::android::hardware::hidl_string& pin2,
-            const ::android::hardware::hidl_string& aid);
+            const hidl_string& pin2,
+            const hidl_string& aid);
 
-    Return<void> supplyIccPuk2ForApp(int32_t serial,
-            const ::android::hardware::hidl_string& puk2,
-            const ::android::hardware::hidl_string& pin2,
-            const ::android::hardware::hidl_string& aid);
+    Return<void> supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
+            const hidl_string& pin2, const hidl_string& aid);
 
-    Return<void> changeIccPinForApp(int32_t serial,
-            const ::android::hardware::hidl_string& oldPin,
-            const ::android::hardware::hidl_string& newPin,
-            const ::android::hardware::hidl_string& aid);
+    Return<void> changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
+            const hidl_string& newPin, const hidl_string& aid);
 
-    Return<void> changeIccPin2ForApp(int32_t serial,
-            const ::android::hardware::hidl_string& oldPin2,
-            const ::android::hardware::hidl_string& newPin2,
-            const ::android::hardware::hidl_string& aid);
+    Return<void> changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
+            const hidl_string& newPin2, const hidl_string& aid);
 
-    Return<void> supplyNetworkDepersonalization(int32_t serial,
-            const ::android::hardware::hidl_string& netPin);
+    Return<void> supplyNetworkDepersonalization(int32_t serial, const hidl_string& netPin);
 
     Return<void> getCurrentCalls(int32_t serial);
 
-    Return<void> dial(int32_t serial,
-            const Dial& dialInfo);
+    Return<void> dial(int32_t serial, const Dial& dialInfo);
 
     Return<void> getImsiForApp(int32_t serial,
             const ::android::hardware::hidl_string& aid);
@@ -392,73 +381,249 @@ struct RadioImpl : public IRadio {
     Return<void> responseAcknowledgement();
 };
 
+void dispatchStrings(RequestInfo *pRI, int countStrings, ...) {
+    char **pStrings;
+    android::Parcel p;   // TODO: should delete this after translation of all commands is complete
+    pStrings = (char **)calloc(countStrings, sizeof(char *));
+    if (pStrings == NULL) {
+        RLOGE("Memory allocation failed for request %s",
+            requestToString(pRI->pCI->requestNumber));
+        pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
+                (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
+        return;
+    }
+    va_list ap;
+    va_start(ap, countStrings);
+    for (int i = 0; i < countStrings; i++) {
+        const char* str = va_arg(ap, const char *);
+        int len = strlen(str);
+        pStrings[i] = (char *) calloc(len + 1, sizeof(char));
+        if (pStrings[i] == NULL) {
+            RLOGE("Memory allocation failed for request %s",
+                    requestToString(pRI->pCI->requestNumber));
+            va_end(ap);
+            pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
+                    (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
+            for (int j = 0; j < i; j++) {
+#ifdef MEMSET_FREED
+                memsetString (pStrings[j]);
+#endif
+                free(pStrings[j]);
+            }
+            free(pStrings);
+            return;
+        }
+        strncpy(pStrings[i], str, len + 1);
+    }
+    va_end(ap);
+
+    s_callbacks->onRequest(pRI->pCI->requestNumber, pStrings, countStrings * sizeof(char *), pRI);
+
+    if (pStrings != NULL) {
+        for (int i = 0 ; i < countStrings ; i++) {
+#ifdef MEMSET_FREED
+            memsetString (pStrings[i]);
+#endif
+            free(pStrings[i]);
+        }
+
+#ifdef MEMSET_FREED
+        memset(pStrings, 0, countStrings * sizeof(char *));
+#endif
+        free(pStrings);
+    }
+}
+
 Return<void> RadioImpl::setResponseFunctions(
         const ::android::sp<IRadioResponse>& radioResponseParam,
         const ::android::sp<IRadioIndication>& radioIndicationParam) {
     RLOGD("RadioImpl::setResponseFunctions");
-    radioResponse = radioResponseParam;
-    radioIndication = radioIndicationParam;
+    mRadioResponse = radioResponseParam;
+    mRadioIndication = radioIndicationParam;
     return Status::ok();
 }
 
 Return<void> RadioImpl::getIccCardStatus(int32_t serial) {
     RLOGD("RadioImpl::getIccCardStatus: serial %d", serial);
-    RequestInfo *pRI;
-    pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_SIM_STATUS);
     if (pRI == NULL) {
-        RLOGE("RadioImpl::getIccCardStatus: Memory allocation failed for request %s",
-                requestToString(RIL_REQUEST_GET_SIM_STATUS));
         return Void();
     }
+    s_callbacks->onRequest(RIL_REQUEST_GET_SIM_STATUS, NULL, 0, pRI);
 
-    pRI->token = serial;
-    pRI->pCI = &(s_commands[RIL_REQUEST_GET_SIM_STATUS]);
-    pRI->socket_id = (RIL_SOCKET_ID) slotId;
-    android::addRequestToList(pRI, RIL_REQUEST_GET_SIM_STATUS, serial, pRI->socket_id);
+    return Status::ok();
+}
 
-    s_callbacks->onRequest(RIL_REQUEST_GET_SIM_STATUS, NULL, 0, pRI);
+Return<void> RadioImpl::supplyIccPinForApp(int32_t serial, const hidl_string& pin,
+        const hidl_string& aid) {
+    RLOGD("RadioImpl::supplyIccPinForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN);
+    if (pRI == NULL) {
+        return Void();
+    }
 
+    dispatchStrings(pRI, 2, (const char *)pin, (const char *)aid);
     return Status::ok();
 }
 
-Return<void> RadioImpl::supplyIccPinForApp(int32_t serial,
-        const ::android::hardware::hidl_string& pin,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+Return<void> RadioImpl::supplyIccPukForApp(int32_t serial, const hidl_string& puk,
+        const hidl_string& pin, const hidl_string& aid) {
+    RLOGD("RadioImpl::supplyIccPukForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK);
+    if (pRI == NULL) {
+        return Void();
+    }
 
-Return<void> RadioImpl::supplyIccPukForApp(int32_t serial,
-        const ::android::hardware::hidl_string& puk,
-        const ::android::hardware::hidl_string& pin,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+    dispatchStrings(pRI, 3, (const char *)puk, (const char *)pin, (const char *)aid);
+    return Status::ok();
+}
 
-Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial,
-        const ::android::hardware::hidl_string& pin2,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+Return<void> RadioImpl::supplyIccPin2ForApp(int32_t serial, const hidl_string& pin2,
+        const hidl_string& aid) {
+    RLOGD("RadioImpl::supplyIccPin2ForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PIN2);
+    if (pRI == NULL) {
+        return Void();
+    }
 
-Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial,
-        const ::android::hardware::hidl_string& puk2,
-        const ::android::hardware::hidl_string& pin2,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+    dispatchStrings(pRI, 2, (const char *)pin2, (const char *)aid);
+    return Status::ok();
+}
 
-Return<void> RadioImpl::changeIccPinForApp(int32_t serial,
-        const ::android::hardware::hidl_string& oldPin,
-        const ::android::hardware::hidl_string& newPin,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+Return<void> RadioImpl::supplyIccPuk2ForApp(int32_t serial, const hidl_string& puk2,
+        const hidl_string& pin2, const hidl_string& aid) {
+    RLOGD("RadioImpl::supplyIccPuk2ForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_ENTER_SIM_PUK2);
+    if (pRI == NULL) {
+        return Void();
+    }
 
-Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial,
-        const ::android::hardware::hidl_string& oldPin2,
-        const ::android::hardware::hidl_string& newPin2,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+    dispatchStrings(pRI, 3, (const char *)puk2, (const char *)pin2, (const char *)aid);
+    return Status::ok();
+}
+
+Return<void> RadioImpl::changeIccPinForApp(int32_t serial, const hidl_string& oldPin,
+        const hidl_string& newPin, const hidl_string& aid) {
+    RLOGD("RadioImpl::changeIccPinForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN);
+    if (pRI == NULL) {
+        return Void();
+    }
+
+    dispatchStrings(pRI, 3, (const char *)oldPin, (const char *)newPin,
+            (const char *)aid);
+    return Status::ok();
+}
+
+Return<void> RadioImpl::changeIccPin2ForApp(int32_t serial, const hidl_string& oldPin2,
+        const hidl_string& newPin2, const hidl_string& aid) {
+    RLOGD("RadioImpl::changeIccPin2ForApp: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_CHANGE_SIM_PIN2);
+    if (pRI == NULL) {
+        return Void();
+    }
+
+    dispatchStrings(pRI, 3, (const char *)oldPin2, (const char *)newPin2,
+            (const char *)aid);
+    return Status::ok();
+}
 
 Return<void> RadioImpl::supplyNetworkDepersonalization(int32_t serial,
-        const ::android::hardware::hidl_string& netPin) {return Status::ok();}
+        const hidl_string& netPin) {
+    RLOGD("RadioImpl::supplyNetworkDepersonalization: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId,
+            RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION);
+    if (pRI == NULL) {
+        return Void();
+    }
+
+    dispatchStrings(pRI, 1, (const char *)netPin);
+    return Status::ok();
+}
+
+Return<void> RadioImpl::getCurrentCalls(int32_t serial) {
+    RLOGD("RadioImpl::getCurrentCalls: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_GET_CURRENT_CALLS);
+    if (pRI == NULL) {
+        return Void();
+    }
 
-Return<void> RadioImpl::getCurrentCalls(int32_t serial) {return Status::ok();}
+    s_callbacks->onRequest(RIL_REQUEST_GET_CURRENT_CALLS, NULL, 0, pRI);
+    return Status::ok();
+}
+
+Return<void> RadioImpl::dial(int32_t serial, const Dial& dialInfo) {
+    RLOGD("RadioImpl::dial: serial %d", serial);
+    RequestInfo *pRI = android::addRequestToList(serial, mSlotId, RIL_REQUEST_DIAL);
+    if (pRI == NULL) {
+        return Void();
+    }
+    RIL_Dial dial;
+    RIL_UUS_Info uusInfo;
+    int32_t sizeOfDial = sizeof(dial);
+
+    memset (&dial, 0, sizeOfDial);
+
+    dial.address = (char *) calloc(dialInfo.address.size() + 1, sizeof(char));
+    if (dial.address == NULL) {
+        android::Parcel p;
+        RLOGE("Memory allocation failed for request %s", requestToString(pRI->pCI->requestNumber));
+        pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
+                (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
+        return Void();
+    }
+    strcpy(dial.address, dialInfo.address.c_str());
+    dial.clir = (int)dialInfo.clir;
+
+    memset(&uusInfo, 0, sizeof(RIL_UUS_Info));
+    if (dialInfo.uusInfo.size() != 0) {
+        int32_t len;
+
+        uusInfo.uusType = (RIL_UUS_Type) dialInfo.uusInfo[0].uusType;
+        uusInfo.uusDcs = (RIL_UUS_DCS) dialInfo.uusInfo[0].uusDcs;
+
+        if (dialInfo.uusInfo[0].uusData.size() == 0) {
+            uusInfo.uusData = NULL;
+            len = 0;
+        } else {
+            len = dialInfo.uusInfo[0].uusData.size();
+            uusInfo.uusData = (char*) calloc(len + 1, sizeof(char));
+            // check if the length is invalid
+            if (uusInfo.uusData == NULL) {
+                RLOGE("Memory allocation failed for request %s",
+                        requestToString(pRI->pCI->requestNumber));
+                android::Parcel p;
+                pRI->pCI->responseFunction(p, (int) pRI->socket_id, pRI->pCI->requestNumber,
+                        (int) RadioResponseType::SOLICITED, pRI->token, RIL_E_NO_MEMORY, NULL, 0);
+                free(dial.address);
+                return Void();
+            }
+            strcpy(uusInfo.uusData, dialInfo.uusInfo[0].uusData.c_str());
+        }
+
+        uusInfo.uusLength = len;
+        dial.uusInfo = &uusInfo;
+    }
+
+    s_callbacks->onRequest(RIL_REQUEST_DIAL, &dial, sizeOfDial, pRI);
+
+#ifdef MEMSET_FREED
+    memsetString (dial.address);
+#endif
+    free (dial.address);
+
+#ifdef MEMSET_FREED
+    memsetString (uusInfo.uusData);
+#endif
+    if (uusInfo.uusData != NULL) {
+        free(uusInfo.uusData);
+    }
 
-Return<void> RadioImpl::dial(int32_t serial,
-        const Dial& dialInfo) {return Status::ok();}
+    return Status::ok();
+}
 
 Return<void> RadioImpl::getImsiForApp(int32_t serial,
-        const ::android::hardware::hidl_string& aid) {return Status::ok();}
+        const hidl_string& aid) {return Status::ok();}
 
 Return<void> RadioImpl::hangup(int32_t serial, int32_t gsmIndex) {return Status::ok();}
 
@@ -751,7 +916,10 @@ Return<void> RadioImpl::setAllowedCarriers(int32_t serial,
 
 Return<void> RadioImpl::getAllowedCarriers(int32_t serial) {return Status::ok();}
 
-Return<void> RadioImpl::responseAcknowledgement() {return Status::ok();}
+Return<void> RadioImpl::responseAcknowledgement() {
+    android::releaseWakeLock();
+    return Status::ok();
+}
 
 hidl_string convertCharPtrToHidlString(char *ptr) {
     hidl_string ret;
@@ -761,39 +929,56 @@ hidl_string convertCharPtrToHidlString(char *ptr) {
     return ret;
 }
 
-int radio::iccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber,
-        int responseType, int serial, RIL_Errno e, void *response, size_t responselen) {
-    RLOGD("iccCardStatusResponse: serial %d", serial);
+void radio::acknowledgeRequest(int slotId, int serial) {
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        radioService[slotId]->mRadioResponse->acknowledgeRequest(serial);
+    } else {
+        RLOGE("acknowledgeRequest: radioService[%d]->mRadioResponse == NULL", slotId);
+    }
+}
+
+void populateResponseInfo(RadioResponseInfo& responseInfo, int serial, int responseType,
+        RIL_Errno e) {
+    responseInfo.serial = serial;
+    switch (responseType) {
+        case RESPONSE_SOLICITED:
+            responseInfo.type = RadioResponseType::SOLICITED;
+            break;
+        case RESPONSE_SOLICITED_ACK_EXP:
+            responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
+            break;
+    }
+    responseInfo.error = (RadioError) e;
+}
+
+int responseInt(RadioResponseInfo& responseInfo, int serial, int responseType, RIL_Errno e,
+        void *response, size_t responseLen) {
+    populateResponseInfo(responseInfo, serial, responseType, e);
+    int ret = -1;
+
+    if (response == NULL || responseLen != sizeof(int)) {
+        RLOGE("responseInt: Invalid response");
+        if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+    } else {
+        int *p_int = (int *) response;
+        ret = p_int[0];
+    }
+    return ret;
+}
+
+int radio::getIccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::getIccCardStatusResponse: serial %d", serial);
 
-    if (radioService[slotId]->radioResponse != NULL) {
+    if (radioService[slotId]->mRadioResponse != NULL) {
         RadioResponseInfo responseInfo;
+        populateResponseInfo(responseInfo, serial, responseType, e);
         CardStatus cardStatus;
-        responseInfo.serial = serial;
-
-        switch (responseType) {
-            case RESPONSE_SOLICITED:
-                responseInfo.type = RadioResponseType::SOLICITED;
-                break;
-            case RESPONSE_SOLICITED_ACK:
-                responseInfo.type = RadioResponseType::SOLICITED_ACK;
-                break;
-            case RESPONSE_SOLICITED_ACK_EXP:
-                responseInfo.type = RadioResponseType::SOLICITED_ACK_EXP;
-                break;
-        }
-
-        if (response == NULL && responselen != 0) {
-            RLOGE("iccCardStatusResponse: invalid response: NULL");
-            //todo: it used to be -1 (RIL_ERRNO_INVALID_RESPONSE) but adding that to interface
-            // doesn't make sense since this will eventually be part of vendor ril. Options to
-            // handle this:
-            // 1. Add -1 to interface and use that, and update interface to say it's a valid error
-            // 2. Add GENERIC_FAILURE as valid error to interface
-            // 3. Assume this will never happen and not handle it
-            responseInfo.error = RadioError::GENERIC_FAILURE;
+        if (response == NULL || responseLen != sizeof(RIL_CardStatus_v6)) {
+            RLOGE("radio::getIccCardStatusResponse: Invalid response");
+            if (e == RIL_E_SUCCESS) responseInfo.error = RadioError::INVALID_RESPONSE;
+            memset(&cardStatus, 0, sizeof(cardStatus));
         } else {
-            responseInfo.error = (RadioError) e;
-
             RIL_CardStatus_v6 *p_cur = ((RIL_CardStatus_v6 *) response);
             cardStatus.cardState = (CardState) p_cur->card_state;
             cardStatus.universalPinState = (PinState) p_cur->universal_pin_state;
@@ -804,7 +989,7 @@ int radio::iccCardStatusResponse(android::Parcel &p, int slotId, int requestNumb
             RIL_AppStatus *rilAppStatus = p_cur->applications;
             cardStatus.applications.resize(p_cur->num_applications);
             AppStatus *appStatus = cardStatus.applications.data();
-            RLOGD("iccCardStatusResponse: num_applications %d", p_cur->num_applications);
+            RLOGD("radio::getIccCardStatusResponse: num_applications %d", p_cur->num_applications);
             for (int i = 0; i < p_cur->num_applications; i++) {
                 appStatus[i].appType = (AppType) rilAppStatus[i].app_type;
                 appStatus[i].appState = (AppState) rilAppStatus[i].app_state;
@@ -818,23 +1003,207 @@ int radio::iccCardStatusResponse(android::Parcel &p, int slotId, int requestNumb
             }
         }
 
-        radioService[slotId]->radioResponse->getIccCardStatusResponse(responseInfo, cardStatus);
+        radioService[slotId]->mRadioResponse->getIccCardStatusResponse(responseInfo, cardStatus);
+    } else {
+        RLOGE("radio::getIccCardStatusResponse: radioService[%d]->mRadioResponse == NULL", slotId);
+    }
+
+    return 0;
+}
+
+int radio::supplyIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::supplyIccPinForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->supplyIccPinForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::supplyIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::supplyIccPukForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::supplyIccPukForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->supplyIccPukForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::supplyIccPukForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::supplyIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::supplyIccPin2ForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->supplyIccPin2ForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::supplyIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::supplyIccPuk2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::supplyIccPuk2ForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->supplyIccPuk2ForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::supplyIccPuk2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::changeIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::changeIccPinForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->changeIccPinForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::changeIccPinForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::changeIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::changeIccPin2ForAppResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->changeIccPin2ForAppResponse(responseInfo, ret);
+    } else {
+        RLOGE("radio::changeIccPin2ForAppResponse: radioService[%d]->mRadioResponse == NULL",
+                slotId);
+    }
+
+    return 0;
+}
+
+int radio::supplyNetworkDepersonalizationResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::supplyNetworkDepersonalizationResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        int ret = responseInt(responseInfo, serial, responseType, e, response, responseLen);
+        radioService[slotId]->mRadioResponse->supplyNetworkDepersonalizationResponse(responseInfo,
+                ret);
+    } else {
+        RLOGE("radio::supplyNetworkDepersonalizationResponse: radioService[%d]->mRadioResponse == \
+                NULL", slotId);
+    }
+
+    return 0;
+}
+
+int radio::getCurrentCallsResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::getCurrentCallsResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        populateResponseInfo(responseInfo, serial, responseType, e);
+
+        hidl_vec<Call> calls;
+        if (response == NULL || (responseLen % sizeof(RIL_Call *)) != 0) {
+            RLOGE("radio::getCurrentCallsResponse: Invalid response");
+            responseInfo.error = RadioError::INVALID_RESPONSE;
+        } else {
+            int num = responseLen / sizeof(RIL_Call *);
+            calls.resize(num);
+
+            for (int i = 0 ; i < num ; i++) {
+                RIL_Call *p_cur = ((RIL_Call **) response)[i];
+                /* each call info */
+                calls[i].state = (CallState) p_cur->state;
+                calls[i].index = p_cur->index;
+                calls[i].toa = p_cur->toa;
+                calls[i].isMpty = p_cur->isMpty;
+                calls[i].isMT = p_cur->isMT;
+                calls[i].als = p_cur->als;
+                calls[i].isVoice = p_cur->isVoice;
+                calls[i].isVoicePrivacy = p_cur->isVoicePrivacy;
+                calls[i].number = convertCharPtrToHidlString(p_cur->number);
+                calls[i].numberPresentation = (CallPresentation) p_cur->numberPresentation;
+                calls[i].name = convertCharPtrToHidlString(p_cur->name);
+                calls[i].namePresentation = (CallPresentation) p_cur->namePresentation;
+                if (!(p_cur->uusInfo == NULL || p_cur->uusInfo->uusData == NULL)) {
+                    RIL_UUS_Info *uusInfo = p_cur->uusInfo;
+                    calls[i].uusInfo[0].uusType = (UusType) uusInfo->uusType;
+                    calls[i].uusInfo[0].uusDcs = (UusDcs) uusInfo->uusDcs;
+                    // convert uusInfo->uusData to a null-terminated string
+                    if (uusInfo->uusData != NULL) {
+                        char *nullTermStr = strndup(uusInfo->uusData, uusInfo->uusLength);
+                        calls[i].uusInfo[0].uusData = nullTermStr;
+                        free(nullTermStr);
+                    } else {
+                        hidl_string emptyString;
+                        calls[i].uusInfo[0].uusData = emptyString;
+                    }
+                }
+            }
+        }
+
+        radioService[slotId]->mRadioResponse->getCurrentCallsResponse(responseInfo, calls);
+    } else {
+        RLOGE("getCurrentCallsResponse: radioService[%d]->mRadioResponse == NULL", slotId);
+    }
+
+    return 0;
+}
+
+int radio::dialResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responseLen) {
+    RLOGD("radio::dialResponse: serial %d", serial);
+
+    if (radioService[slotId]->mRadioResponse != NULL) {
+        RadioResponseInfo responseInfo;
+        populateResponseInfo(responseInfo, serial, responseType, e);
+        radioService[slotId]->mRadioResponse->dialResponse(responseInfo);
     } else {
-        RLOGE("iccCardStatusResponse: radioService[%d]->radioResponse == NULL", slotId);
+        RLOGE("radio::dialResponse: radioService[%d]->mRadioResponse == NULL", slotId);
     }
 
     return 0;
 }
 
 void radio::radioStateChanged(int slotId, int indicationType, RIL_RadioState radioState) {
-    RLOGD("radioStateChanged: radioState %d", radioState);
-    if (radioService[slotId]->radioIndication != NULL) {
+    RLOGD("radio::radioStateChanged: radioState %d", radioState);
+    if (radioService[slotId]->mRadioIndication != NULL) {
         RadioIndicationType type = indicationType == RESPONSE_UNSOLICITED ?
                 (RadioIndicationType::UNSOLICITED) :
                 (RadioIndicationType::UNSOLICITED_ACK_EXP);
-        radioService[slotId]->radioIndication->radioStateChanged(type, (RadioState) radioState);
+        radioService[slotId]->mRadioIndication->radioStateChanged(type, (RadioState) radioState);
     } else {
-        RLOGE("radioStateChanged: radioService[%d]->radioIndication == NULL", slotId);
+        RLOGE("radio::radioStateChanged: radioService[%d]->mRadioIndication == NULL", slotId);
     }
 }
 
@@ -861,7 +1230,7 @@ void radio::registerService(RIL_RadioFunctions *callbacks, CommandInfo *commands
     configureRpcThreadpool(1, true /* callerWillJoin */);
     for (int i = 0; i < simCount; i++) {
         radioService[i] = new RadioImpl;
-        radioService[i]->slotId = i;
+        radioService[i]->mSlotId = i;
         RLOGD("registerService: starting IRadio %s", serviceNames[i]);
         android::status_t status = radioService[i]->registerAsService(serviceNames[i]);
     }
index ef8e9e8..39bd5c5 100644 (file)
 namespace radio {
 
 void registerService(RIL_RadioFunctions *callbacks, android::CommandInfo *commands);
-int iccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber, int responseType,
+int getIccCardStatusResponse(android::Parcel &p, int slotId, int requestNumber, int responseType,
         int token, RIL_Errno e, void *response, size_t responselen);
+int supplyIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int supplyIccPukForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int supplyIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int supplyIccPuk2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int changeIccPinForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int changeIccPin2ForAppResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int supplyNetworkDepersonalizationResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int getCurrentCallsResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+int dialResponse(android::Parcel &p, int slotId, int requestNumber,
+        int responseType, int serial, RIL_Errno e, void *response, size_t responselen);
+void acknowledgeRequest(int slotId, int serial);
 void radioStateChanged(int slotId, int indicationType, RIL_RadioState radioState);
-
-}   // namespace android
+}   // namespace radio
 
 #endif  // RIL_SERVICE_H
\ No newline at end of file