Teleca 2b changes.
diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 56a94fb..329767c 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -57,15 +57,13 @@
                                                    call on a Class C GPRS device */
     RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,  /* data ops are not allowed before device
                                                    registers in network */
-    RIL_E_SMS_SEND_FAIL_RETRY = 10,             /* fail to send sms and need retry */    
-    RIL_E_SIM_ABSENT = 11,                      /* fail to set the location where CDMA subscription 
-                                                   shall be retrieved because of SIM or RUIM 
+    RIL_E_SMS_SEND_FAIL_RETRY = 10,             /* fail to send sms and need retry */
+    RIL_E_SIM_ABSENT = 11,                      /* fail to set the location where CDMA subscription
+                                                   shall be retrieved because of SIM or RUIM
                                                    card absent */
-#ifdef FEATURE_MULTIMODE_ANDROID 
-    RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,      /* fail to find CDMA subscription from specified 
+    RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,      /* fail to find CDMA subscription from specified
                                                    location */
     RIL_E_MODE_NOT_SUPPORTED = 13               /* HW does not support preferred network type */
-#endif 
 } RIL_Errno;
 
 typedef enum {
@@ -206,14 +204,14 @@
                                  * 4 = erasure
                                  */
 
-    int             reason;       /* from TS 27.007 7.11 "reason" */
-    int             serviceClass; /* From 27.007 +CCFC/+CLCK "class"
-                                     See table for Android mapping from
-                                     MMI service code
-                                     0 means user doesn't input class */
-    int             toa;          /* "type" from TS 27.007 7.11 */
-    char *          number;       /* "number" from TS 27.007 7.11. May be NULL */
-    int             timeSeconds;  /* for CF no reply only */
+    int             reason;      /* from TS 27.007 7.11 "reason" */
+    int             serviceClass;/* From 27.007 +CCFC/+CLCK "class"
+                                    See table for Android mapping from
+                                    MMI service code
+                                    0 means user doesn't input class */
+    int             toa;         /* "type" from TS 27.007 7.11 */
+    char *          number;      /* "number" from TS 27.007 7.11. May be NULL */
+    int             timeSeconds; /* for CF no reply only */
 }RIL_CallForwardInfo;
 
 typedef struct {
@@ -273,15 +271,15 @@
                                    (MT only, may be NULL). */
 } RIL_SuppSvcNotification;
 
-#define RIL_SIM_ABSENT              0
-#define RIL_SIM_NOT_READY           1
+#define RIL_SIM_ABSENT                  0
+#define RIL_SIM_NOT_READY               1
 /* RIL_SIM_READY means that the radio state is RADIO_STATE_SIM_READY. 
  * This is more
  * than "+CPIN: READY". It also means the radio is ready for SIM I/O
  */
-#define RIL_SIM_READY               2
-#define RIL_SIM_PIN                 3
-#define RIL_SIM_PUK                 4
+#define RIL_SIM_READY                   2
+#define RIL_SIM_PIN                     3
+#define RIL_SIM_PUK                     4
 #define RIL_SIM_NETWORK_PERSONALIZATION 5
 
 /* see RIL_REQUEST_GET_SIM_STATUS */
@@ -389,7 +387,7 @@
     char *          number;             /* Remote party number */
     int             numberPresentation; /* 0=Allowed, 1=Restricted, 2=Not Specified/Unknown */
     char *          name;               /* Remote party name */
-    RIL_CDMA_SignalInfoRecord * signalInfoRecord;
+    RIL_CDMA_SignalInfoRecord signalInfoRecord;
 } RIL_CDMA_CallWaiting;
 
 /* Used by RIL_REQUEST_GET_BROADCAST_CONFIG and RIL_REQUEST_SET_BROADCAST_CONFIG */
@@ -405,7 +403,6 @@
   RIL_BroadcastServiceInfo *entries;
 } RIL_BroadcastSMSConfig;
 
-
 /* No restriction at all including voice/SMS/USSD/SS/AV64 and packet data. */
 #define RIL_RESTRICTED_STATE_NONE           0x00
 /* Block emergency call due to restriction. But allow all normal voice/SMS/USSD/SS/AV64. */
@@ -966,8 +963,8 @@
  *  SUCCESS
  *  RADIO_NOT_AVAILABLE
  */
-
 #define RIL_REQUEST_SIGNAL_STRENGTH 19
+
 /**
  * RIL_REQUEST_REGISTRATION_STATE
  *
@@ -1225,7 +1222,7 @@
  *                          and NULL for CDMA
  *
  * FIXME may need way to configure QoS settings
- * 
+ *
  * replaces  RIL_REQUEST_SETUP_DEFAULT_PDP
  *
  * Valid errors:
@@ -2293,7 +2290,7 @@
 
 /**
  * RIL_REQUEST_SET_LOCATION_UPDATES
- * 
+ *
  * Enables/disables network state change notifications due to changes in
  * LAC and/or CID (basically, +CREG=2 vs. +CREG=1).  
  *
@@ -2305,7 +2302,7 @@
  * ((int *)data)[0] is == 0 for updates disabled (+CREG=1)
  *
  * "response" is NULL
- * 
+ *
  * Valid errors:
  *  SUCCESS
  *  RADIO_NOT_AVAILABLE
@@ -3062,7 +3059,8 @@
  *
  * Ring indication for an incoming call (eg, RING or CRING event).
  *
- * "data" is const RIL_CDMA_SignalInfoRecord *
+ * "data" is null for GSM
+ * "data" is const RIL_CDMA_SignalInfoRecord * if CDMA
  */
 #define RIL_UNSOL_CALL_RING 1018
 
@@ -3070,7 +3068,7 @@
  * RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED
  *
  * Indicates that SIM state changes.
- * 
+ *
  * Callee will invoke RIL_REQUEST_GET_SIM_STATUS on main thread
 
  * "data" is null
@@ -3081,15 +3079,15 @@
  * RIL_UNSOL_RESPONSE_CDMA_NEW_SMS
  *
  * Called when new CDMA SMS is received
- * 
+ *
  * "data" is const RIL_CDMA_SMS_Message *
- * 
+ *
  * Callee will subsequently confirm the receipt of the SMS with
  * a RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE
- * 
+ *
  * No new RIL_UNSOL_RESPONSE_CDMA_NEW_SMS should be sent until
  * RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE has been received
- * 
+ *
  */
 #define RIL_UNSOL_RESPONSE_CDMA_NEW_SMS 1020
 
@@ -3315,7 +3313,7 @@
  * RIL_onRequestComplete will return as soon as possible
  *
  * @param t is parameter passed in on previous call to RIL_Notification
- * routine.
+ *          routine.
  * @param e error code
  *          if "e" != SUCCESS, then response can be null/is ignored
  * @param response is owned by caller, and should not be modified or
diff --git a/libril/ril.cpp b/libril/ril.cpp
index fd1d508..d06f0f3 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -135,7 +135,7 @@
     char local;         // responses to local commands do not go back to command process
 } RequestInfo;
 
-typedef struct UserCallbackInfo{
+typedef struct UserCallbackInfo {
     RIL_TimedCallback p_callback;
     void *userParam;
     struct ril_event event;
@@ -223,6 +223,11 @@
 static int responseCdmaBrCnf(Parcel &p, void *response, size_t responselen);
 static int responseCdmaSms(Parcel &p, void *response, size_t responselen);
 static int responseCellList(Parcel &p, void *response, size_t responselen);
+static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen);
+static int responseRilSignalStrength(Parcel &p,void *response, size_t responselen);
+static int responseCallRing(Parcel &p, void *response, size_t responselen);
+static int responseCdmaSignalInfoRecord(Parcel &p,void *response, size_t responselen);
+static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen);
 
 extern "C" const char * requestToString(int request);
 extern "C" const char * failCauseToString(RIL_Errno);
@@ -973,8 +978,6 @@
     status = p.readInt32(&t);
     rcbsc.size = (int) t;
 
-    LOGE("RIL_CPP: dispatchCdmaBrSmsCnf(), isize=%d", rcbsc.size);
-
     if (rcbsc.size != 0) {
         RIL_CDMA_BroadcastServiceInfo cdmaBsi[rcbsc.size];
         for (int i = 0 ; i < rcbsc.size ; i++ ) {
@@ -1287,7 +1290,7 @@
     }
 
     if (responselen % sizeof (RIL_Call *) != 0) {
-        LOGE("invalid response length %d expected multiple of %d\n", 
+        LOGE("invalid response length %d expected multiple of %d\n",
             (int)responselen, (int)sizeof (RIL_Call *));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1315,16 +1318,20 @@
         p.writeInt32(p_cur->numberPresentation);
         writeStringToParcel(p, p_cur->name);
         p.writeInt32(p_cur->namePresentation);
-        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
+        appendPrintBuf("%s[id=%d,%s,toa=%d,",
             printBuf,
             p_cur->index,
             callStateToString(p_cur->state),
-            p_cur->toa,
+            p_cur->toa);
+        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
+            printBuf,
             (p_cur->isMpty)?"conf":"norm",
             (p_cur->isMT)?"mt":"mo",
             p_cur->als,
             (p_cur->isVoice)?"voc":"nonvoc",
-            (p_cur->isVoicePrivacy)?"evp":"noevp",
+            (p_cur->isVoicePrivacy)?"evp":"noevp");
+        appendPrintBuf("%s%s,cli=%d,name='%s',%d]",
+            printBuf,
             p_cur->number,
             p_cur->numberPresentation,
             p_cur->name,
@@ -1345,20 +1352,21 @@
         p.writeInt32(p_cur->numberPresentation);
         writeStringToParcel (p, "a-person");
         p.writeInt32(2); // p_cur->namePresentation);
-        appendPrintBuf("%s[id=%d,%s,toa=%d,%s,%s,als=%d,%s,%s,%s,cli=%d,name='%s',%d],",
+        appendPrintBuf("%s[id=%d,%s,toa=%d,",
             printBuf,
             p_cur->index,
             callStateToString(p_cur->state),
-            p_cur->toa,
+            p_cur->toa);
+        appendPrintBuf("%s%s,%s,als=%d,%s,%s,",
+            printBuf,
             (p_cur->isMpty)?"conf":"norm",
             (p_cur->isMT)?"mt":"mo",
             p_cur->als,
-            (p_cur->isVoice)?"voc":"nonvoc",
-            (p_cur->isVoicePrivacy)?"evp":"noevp",
+            (p_cur->isVoice)?"voc":"nonvoc");
+        appendPrintBuf("%s%s,cli=%d]",
+            printBuf,
             p_cur->number,
-            p_cur->numberPresentation,
-            p_cur->name,
-            p_cur->namePresentation);
+            p_cur->numberPresentation);
 #endif
     }
     removeLastChar;
@@ -1543,8 +1551,7 @@
     return 0;
 }
 
-static int responseCellList(Parcel &p, void *response, size_t responselen)
-{
+static int responseCellList(Parcel &p, void *response, size_t responselen) {
     int num;
 
     if (response == NULL && responselen != 0) {
@@ -1559,14 +1566,13 @@
     }
 
     startResponse;
-    /* number of cell info's */
+    /* number of records */
     num = responselen / sizeof(RIL_NeighboringCell *);
     p.writeInt32(num);
 
     for (int i = 0 ; i < num ; i++) {
         RIL_NeighboringCell *p_cur = ((RIL_NeighboringCell **) response)[i];
 
-        /* each cell info */
         p.writeInt32(p_cur->rssi);
         writeStringToParcel (p, p_cur->cid);
 
@@ -1579,8 +1585,317 @@
     return 0;
 }
 
-static void triggerEvLoop()
-{
+/**
+ * Marshall the signalInfoRecord into the parcel if it exists.
+ */
+static void marshallSignalInfoRecord(Parcel &p, RIL_CDMA_SignalInfoRecord &p_signalInfoRecord) {
+    p.writeInt32(p_signalInfoRecord.isPresent);
+    p.writeInt32(p_signalInfoRecord.signalType);
+    p.writeInt32(p_signalInfoRecord.alertPitch);
+    p.writeInt32(p_signalInfoRecord.signal);
+}
+
+static int responseCdmaInformationRecords(Parcel &p,void *response, size_t responselen) {
+    int num;
+    int digitCount;
+    int digitLimit;
+
+    if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof(RIL_CDMA_InformationRecords)) {
+        LOGE("invalid response length %d expected %d\n",
+            (int)responselen, (int)sizeof (RIL_CDMA_InformationRecords));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+
+    /* TODO(Teleca): Wink believes this should be deleted? */
+//    num = responselen / sizeof(RIL_CDMA_InformationRecords *);
+//    p.writeInt32(num);
+
+    RIL_CDMA_InformationRecords *p_cur = ((RIL_CDMA_InformationRecords *) response);
+
+    /* Number of records */
+    p.writeInt32(p_cur->numberOfInfoRecs);
+
+    startResponse;
+
+    digitLimit = MIN((p_cur->numberOfInfoRecs),RIL_CDMA_MAX_NUMBER_OF_INFO_RECS);
+    for (digitCount = 0 ; digitCount < digitLimit; digitCount ++) {
+        switch(p_cur->infoRec[digitCount].name){
+            case RIL_CDMA_DISPLAY_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.display.alpha_len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.display.alpha_len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.display.alpha_buf[i]);
+                }
+                appendPrintBuf("%s[rec.display.alpha_len%c, rec.display.alpha_buf%s],",
+                        printBuf,
+                    p_cur->infoRec[digitCount].rec.display.alpha_len,
+                    p_cur->infoRec[digitCount].rec.display.alpha_buf);
+                break;
+            case RIL_CDMA_CALLED_PARTY_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_CALLING_PARTY_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for (int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++) {
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_CONNECTED_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.len);
+                for(int i =0;i<(int)(p_cur->infoRec[digitCount].rec.number.len);i++){
+                    p.writeInt32(p_cur->infoRec[digitCount].rec.number.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.number.si);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_SIGNAL_INFO_REC:
+                marshallSignalInfoRecord(p, p_cur->infoRec[digitCount].rec.signal);
+                appendPrintBuf("%s[isPresent=%c,signalType=%c,alertPitch=%c,signal=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.signal.isPresent,
+                        p_cur->infoRec[digitCount].rec.signal.signalType,
+                        p_cur->infoRec[digitCount].rec.signal.alertPitch,
+                        p_cur->infoRec[digitCount].rec.signal.signal);
+                break;
+            case RIL_CDMA_REDIRECTING_NUMBER_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.len);
+                for (int i =0;\
+                        i<(int)(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.len);i++){
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.buf[i]);
+                }
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.number_type);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.number_plan);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.pi);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingNumber.si);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.redir.redirectingReason);
+                appendPrintBuf("%s[len=%c,buf=%s,number_type=%c,number_plan=%c,",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.len,
+                        p_cur->infoRec[digitCount].rec.number.buf,
+                        p_cur->infoRec[digitCount].rec.number.number_type,
+                        p_cur->infoRec[digitCount].rec.number.number_plan);
+                appendPrintBuf("%spi=%c,si=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.number.pi,
+                        p_cur->infoRec[digitCount].rec.number.si);
+                break;
+            case RIL_CDMA_LINE_CONTROL_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPolarityIncluded);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlToggle);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlReverse);
+                p.writeInt32( p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPowerDenial);
+                appendPrintBuf("%s[PolarityIncluded=%c,CtrlToggle=%c,CtrlReverse=%c,\
+                        CtrlPowerDenial=%c]",
+                        printBuf,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPolarityIncluded,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlToggle,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlReverse,
+                        p_cur->infoRec[digitCount].rec.lineCtrl.lineCtrlPowerDenial);
+                break;
+            case RIL_CDMA_EXTENDED_DISPLAY_INFO_REC:
+                break;
+            case RIL_CDMA_T53_CLIR_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.clir.cause);
+                appendPrintBuf("%s[cause=%c]",printBuf,p_cur->infoRec[digitCount].rec.clir.cause);
+                break;
+
+            case RIL_CDMA_T53_RELEASE_INFO_REC:
+                break;
+            case RIL_CDMA_T53_AUDIO_CONTROL_INFO_REC:
+                p.writeInt32(p_cur->infoRec[digitCount].rec.audioCtrl.upLink);
+                p.writeInt32(p_cur->infoRec[digitCount].rec.audioCtrl.downLink);
+                appendPrintBuf("%s[uplink=%c,downlink=%c]",
+                        printBuf,p_cur->infoRec[digitCount].rec.audioCtrl.upLink,
+                        p_cur->infoRec[digitCount].rec.audioCtrl.downLink);
+                 break;
+            default:
+                LOGE ("Invalid request");
+                break;
+        }
+    }
+
+
+   closeResponse;
+
+  return 0;
+}
+
+static int responseRilSignalStrength(Parcel &p, void *response, size_t responselen) {
+     if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if ((responselen != sizeof (RIL_SignalStrength))
+         && (responselen % sizeof (void *) == 0)) {
+        // Old RIL deprecated
+        RIL_GW_SignalStrength *p_cur = ((RIL_GW_SignalStrength *) response);
+
+        p.writeInt32(7);
+        p.writeInt32(p_cur->signalStrength);
+        p.writeInt32(p_cur->bitErrorRate);
+        for (int i = 0; i < 5; i++) {
+            p.writeInt32(0);
+        }
+    } else if (responselen == sizeof (RIL_SignalStrength)) {
+        // New RIL
+        RIL_SignalStrength *p_cur = ((RIL_SignalStrength *) response);
+
+        p.writeInt32(7);
+        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);
+        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);
+        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);
+        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);
+        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);
+        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);
+        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);
+    } else {
+        LOGE("invalid response length");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+    appendPrintBuf("%s[signalStrength=%d,bitErrorRate=%d,\
+            CDMA_SignalStrength.dbm=%d,CDMA_SignalStrength.ecio=%d,\
+            EVDO_SignalStrength.dbm =%d,EVDO_SignalStrength.ecio=%d,\
+            EVDO_SignalStrength.signalNoiseRatio=%d]",
+            printBuf,
+            p_cur->GW_SignalStrength.signalStrength,
+            p_cur->GW_SignalStrength.bitErrorRate,
+            p_cur->CDMA_SignalStrength.dbm,
+            p_cur->CDMA_SignalStrength.ecio,
+            p_cur->EVDO_SignalStrength.dbm,
+            p_cur->EVDO_SignalStrength.ecio,
+            p_cur->EVDO_SignalStrength.signalNoiseRatio);
+
+    closeResponse;
+
+    return 0;
+}
+
+static int responseCallRing(Parcel &p, void *response, size_t responselen) {
+    if ((response == NULL) || (responselen == 0)) {
+        return responseVoid(p, response, responselen);
+    } else {
+        return responseCdmaSignalInfoRecord(p, response, responselen);
+    }
+}
+
+static int responseCdmaSignalInfoRecord(Parcel &p, void *response, size_t responselen) {
+    if (response == NULL || responselen == 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof (RIL_CDMA_SignalInfoRecord)) {
+        LOGE("invalid response length %d expected sizeof (RIL_CDMA_SignalInfoRecord) of %d\n",
+            (int)responselen, (int)sizeof (RIL_CDMA_SignalInfoRecord));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+
+    RIL_CDMA_SignalInfoRecord *p_cur = ((RIL_CDMA_SignalInfoRecord *) response);
+    marshallSignalInfoRecord(p, *p_cur);
+
+    appendPrintBuf("%s[isPresent=%d,signalType=%d,alertPitch=%d\
+              signal=%d]",
+              printBuf,
+              p_cur->isPresent,
+              p_cur->signalType,
+              p_cur->alertPitch,
+              p_cur->signal);
+
+    closeResponse;
+    return 0;
+}
+
+static int responseCdmaCallWaiting(Parcel &p,void *response, size_t responselen) {
+    if (response == NULL && responselen != 0) {
+        LOGE("invalid response: NULL");
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    if (responselen != sizeof(RIL_CDMA_CallWaiting)) {
+        LOGE("invalid response length %d expected %d\n",
+            (int)responselen, (int)sizeof(RIL_CDMA_CallWaiting));
+        return RIL_ERRNO_INVALID_RESPONSE;
+    }
+
+    startResponse;
+    RIL_CDMA_CallWaiting *p_cur = ((RIL_CDMA_CallWaiting *) response);
+
+    writeStringToParcel (p, p_cur->number);
+    p.writeInt32(p_cur->numberPresentation);
+    writeStringToParcel (p, p_cur->name);
+    marshallSignalInfoRecord(p, p_cur->signalInfoRecord);
+
+    appendPrintBuf("%snumber=%s,numberPresentation=%d, name=%s,\
+            signalInfoRecord[isPresent=%d,signalType=%d,alertPitch=%d\
+            signal=%d]",
+            printBuf,
+            p_cur->number,
+            p_cur->numberPresentation,
+            p_cur->name,
+            p_cur->signalInfoRecord.isPresent,
+            p_cur->signalInfoRecord.signalType,
+            p_cur->signalInfoRecord.alertPitch,
+            p_cur->signalInfoRecord.signal);
+
+    closeResponse;
+
+    return 0;
+}
+
+static void triggerEvLoop() {
     int ret;
     if (!pthread_equal(pthread_self(), s_tid_dispatch)) {
         /* trigger event loop to wakeup. No reason to do this,
@@ -1591,8 +1906,7 @@
     }
 }
 
-static void rilEventAddWakeup(struct ril_event *ev)
-{
+static void rilEventAddWakeup(struct ril_event *ev) {
     ril_event_add(ev);
     triggerEvLoop();
 }
@@ -1606,7 +1920,7 @@
     }
 
     if (responselen % sizeof (RIL_CardStatus *) != 0) {
-        LOGE("invalid response length %d expected multiple of %d\n", 
+        LOGE("invalid response length %d expected multiple of %d\n",
             (int)responselen, (int)sizeof (RIL_CardStatus *));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1644,7 +1958,7 @@
     closeResponse;
 
     return 0;
-} 
+}
 
 static int responseBrSmsCnf(Parcel &p, void *response, size_t responselen) {
     int num;
@@ -1655,7 +1969,7 @@
     }
 
     if (responselen % sizeof(RIL_BroadcastSMSConfig) != 0) {
-        LOGE("invalid response length %d expected multiple of %d", 
+        LOGE("invalid response length %d expected multiple of %d",
                 (int)responselen, (int)sizeof(RIL_BroadcastSMSConfig));
         return RIL_ERRNO_INVALID_RESPONSE;
     }
@@ -1669,7 +1983,7 @@
     p.writeInt32(p_cur->entries->uFromServiceID);
     p.writeInt32(p_cur->entries->uToserviceID);
     p.write(&(p_cur->entries->bSelected),sizeof(p_cur->entries->bSelected));
-    
+
     startResponse;
     appendPrintBuf("%s size=%d, entries.uFromServiceID=%d, \
             entries.uToserviceID=%d, entries.bSelected =%d, ",
@@ -2529,7 +2843,6 @@
     return;
 
 error_exit:
-    // There was an error and we've got the wake lock so release it.
     if (shouldScheduleTimeout) {
         releaseWakeLock();
     }
@@ -2755,11 +3068,15 @@
         case RIL_UNSOL_SIM_REFRESH: return "UNSOL_SIM_REFRESH";
         case RIL_UNSOL_DATA_CALL_LIST_CHANGED: return "UNSOL_DATA_CALL_LIST_CHANGED";
         case RIL_UNSOL_CALL_RING: return "UNSOL_CALL_RING";
-        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
         case RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED: return "UNSOL_RESPONSE_SIM_STATUS_CHANGED";
         case RIL_UNSOL_RESPONSE_CDMA_NEW_SMS: return "UNSOL_NEW_CDMA_SMS";
         case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: return "UNSOL_NEW_BROADCAST_SMS";
         case RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL: return "UNSOL_CDMA_RUIM_SMS_STORAGE_FULL";
+        case RIL_UNSOL_RESTRICTED_STATE_CHANGED: return "UNSOL_RESTRICTED_STATE_CHANGED";
+        case RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE: return "UNSOL_ENTER_EMERGENCY_CALLBACK_MODE";
+        case RIL_UNSOL_CDMA_CALL_WAITING: return "UNSOL_CDMA_CALL_WAITING";
+        case RIL_UNSOL_CDMA_OTA_PROVISION_STATUS: return "UNSOL_CDMA_OTA_PROVISION_STATUS";
+        case RIL_UNSOL_CDMA_INFO_REC: return "UNSOL_CDMA_INFO_REC";
         case RIL_UNSOL_OEM_HOOK_RAW: return "UNSOL_OEM_HOOK_RAW";
         default: return "<unknown request>";
     }
diff --git a/libril/ril_unsol_commands.h b/libril/ril_unsol_commands.h
index 4cfa3aa..7eff708 100644
--- a/libril/ril_unsol_commands.h
+++ b/libril/ril_unsol_commands.h
@@ -23,7 +23,7 @@
     {RIL_UNSOL_ON_USSD, responseStrings, WAKE_PARTIAL},
     {RIL_UNSOL_ON_USSD_REQUEST, responseVoid, DONT_WAKE},
     {RIL_UNSOL_NITZ_TIME_RECEIVED, responseString, WAKE_PARTIAL},
-    {RIL_UNSOL_SIGNAL_STRENGTH, responseInts, DONT_WAKE},
+    {RIL_UNSOL_SIGNAL_STRENGTH, responseRilSignalStrength, DONT_WAKE},
     {RIL_UNSOL_DATA_CALL_LIST_CHANGED, responseDataCallList, WAKE_PARTIAL},
     {RIL_UNSOL_SUPP_SVC_NOTIFICATION, responseSsn, WAKE_PARTIAL},
     {RIL_UNSOL_STK_SESSION_END, responseVoid, WAKE_PARTIAL},
@@ -32,16 +32,14 @@
     {RIL_UNSOL_STK_CALL_SETUP, responseInts, WAKE_PARTIAL},
     {RIL_UNSOL_SIM_SMS_STORAGE_FULL, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_SIM_REFRESH, responseInts, WAKE_PARTIAL},
-    {RIL_UNSOL_CALL_RING, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CALL_RING, responseCallRing, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_CDMA_NEW_SMS, responseCdmaSms, WAKE_PARTIAL},
     {RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, responseString, WAKE_PARTIAL},
     {RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL, responseVoid, WAKE_PARTIAL},
     {RIL_UNSOL_RESTRICTED_STATE_CHANGED, responseInts, WAKE_PARTIAL},
-    // TODO(): Need to update the response func for the following 4 commands,
-    // once they've been implemented.
     {RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE, responseVoid, WAKE_PARTIAL},
-    {RIL_UNSOL_CDMA_CALL_WAITING, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CDMA_CALL_WAITING, responseCdmaCallWaiting, WAKE_PARTIAL},
     {RIL_UNSOL_CDMA_OTA_PROVISION_STATUS, responseInts, WAKE_PARTIAL},
-    {RIL_UNSOL_CDMA_INFO_REC, responseVoid, WAKE_PARTIAL},
+    {RIL_UNSOL_CDMA_INFO_REC, responseCdmaInformationRecords, WAKE_PARTIAL},
     {RIL_UNSOL_OEM_HOOK_RAW, responseRaw, WAKE_PARTIAL}
diff --git a/reference-ril/reference-ril.c b/reference-ril/reference-ril.c
index bf3889c..348234d 100644
--- a/reference-ril/reference-ril.c
+++ b/reference-ril/reference-ril.c
@@ -141,7 +141,11 @@
  * Note: directly modified line and has *p_call point directly into
  * modified line
  */
+#if NEWRIL
+static int callFromCLCCLine(char *line, RIL_Call *p_call)
+#else
 static int callFromCLCCLine(char *line, RIL_CallOld *p_call)
+#endif
 {
         //+CLCC: 1,0,2,0,0,\"+18005551212\",145
         //     index,isMT,state,mode,isMpty(,number,TOA)?
@@ -470,8 +474,13 @@
     ATLine *p_cur;
     int countCalls;
     int countValidCalls;
+#if NEWRIL
+    RIL_Call *p_calls;
+    RIL_Call **pp_calls;
+#else
     RIL_CallOld *p_calls;
     RIL_CallOld **pp_calls;
+#endif
     int i;
     int needRepoll = 0;
 
@@ -499,9 +508,15 @@
 
     /* yes, there's an array of pointers and then an array of structures */
 
+#if NEWRIL
+    pp_calls = (RIL_Call **)alloca(countCalls * sizeof(RIL_Call *));
+    p_calls = (RIL_Call *)alloca(countCalls * sizeof(RIL_Call));
+    memset (p_calls, 0, countCalls * sizeof(RIL_Call));
+#else
     pp_calls = (RIL_CallOld **)alloca(countCalls * sizeof(RIL_CallOld *));
     p_calls = (RIL_CallOld *)alloca(countCalls * sizeof(RIL_CallOld));
     memset (p_calls, 0, countCalls * sizeof(RIL_CallOld));
+#endif
 
     /* init the pointer array */
     for(i = 0; i < countCalls ; i++) {
@@ -566,8 +581,13 @@
     s_repollCallsCount = 0;
 #endif /*WORKAROUND_ERRONEOUS_ANSWER*/
 
+#if NEWRIL
+    RIL_onRequestComplete(t, RIL_E_SUCCESS, pp_calls,
+            countValidCalls * sizeof (RIL_Call *));
+#else
     RIL_onRequestComplete(t, RIL_E_SUCCESS, pp_calls,
             countValidCalls * sizeof (RIL_CallOld *));
+#endif
 
     at_response_free(p_response);