summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/telephony/ril.h19
-rw-r--r--libril/ril.cpp29
-rw-r--r--libril/ril_event.cpp12
-rw-r--r--libril/ril_event.h3
-rw-r--r--libril/ril_unsol_commands.h2
-rw-r--r--rild/rild.c8
6 files changed, 58 insertions, 15 deletions
diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 4bd9442..82d2ca3 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -3481,8 +3481,14 @@ struct RIL_Env {
* soon as possible
*/
- void (*RequestTimedCallback) (RIL_TimedCallback callback,
+ void* (*RequestTimedCallback) (RIL_TimedCallback callback,
void *param, const struct timeval *relativeTime);
+
+
+ /**
+ * Remove user-specified callback function
+ */
+ void (*RemoveTimedCallback) (void *callbackInfo);
};
@@ -3546,8 +3552,15 @@ void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
* @param relativeTime a relative time value at which the callback is invoked
*/
-void RIL_requestTimedCallback (RIL_TimedCallback callback,
- void *param, const struct timeval *relativeTime);
+void* RIL_requestTimedCallback (RIL_TimedCallback callback,
+ void *param, const struct timeval *relativeTime);
+
+/**
+ * Remove user-specified callback function
+ * @param callbackInfo Pointer returned to the caller when timer was scheduled
+ */
+
+void RIL_removeTimedCallback(void *callbackInfo);
#endif /* RIL_SHLIB */
diff --git a/libril/ril.cpp b/libril/ril.cpp
index f31c516..b5c0e9f 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -142,7 +142,6 @@ typedef struct UserCallbackInfo {
struct UserCallbackInfo *p_next;
} UserCallbackInfo;
-
/*******************************************************************/
RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
@@ -240,8 +239,9 @@ extern "C" void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
#endif
static UserCallbackInfo * internalRequestTimedCallback
- (RIL_TimedCallback callback, void *param,
- const struct timeval *relativeTime);
+ (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime);
+
+static void internalRemoveTimedCallback(void *callbackInfo);
/** Index == requestNumber */
static CommandInfo s_commands[] = {
@@ -2862,7 +2862,7 @@ error_exit:
*/
static UserCallbackInfo *
internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
- const struct timeval *relativeTime)
+ const struct timeval *relativeTime)
{
struct timeval myRelativeTime;
UserCallbackInfo *p_info;
@@ -2871,7 +2871,6 @@ internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
p_info->p_callback = callback;
p_info->userParam = param;
-
if (relativeTime == NULL) {
/* treat null parameter as a 0 relative time */
memset (&myRelativeTime, 0, sizeof(myRelativeTime));
@@ -2888,11 +2887,27 @@ internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
return p_info;
}
+static void
+internalRemoveTimedCallback(void *callbackInfo)
+{
+ UserCallbackInfo *p_info;
+ p_info = (UserCallbackInfo *)callbackInfo;
+ LOGI("remove timer callback event");
+ if(p_info) {
+ ril_timer_delete(&(p_info->event));
+ free(p_info);
+ }
+}
-extern "C" void
+extern "C" void *
RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
const struct timeval *relativeTime) {
- internalRequestTimedCallback (callback, param, relativeTime);
+ return internalRequestTimedCallback (callback, param, relativeTime);
+}
+
+extern "C" void
+RIL_removeTimedCallback (void *callbackInfo) {
+ internalRemoveTimedCallback(callbackInfo);
}
const char *
diff --git a/libril/ril_event.cpp b/libril/ril_event.cpp
index e40e72b..c24c655 100644
--- a/libril/ril_event.cpp
+++ b/libril/ril_event.cpp
@@ -312,13 +312,23 @@ void ril_timer_add(struct ril_event * ev, struct timeval * tv)
dlog("~~~~ -ril_timer_add ~~~~");
}
+// Remove event from timer list
+void ril_timer_delete(struct ril_event *tev)
+{
+ dlog("~~~~timer event delete=%x",(unsigned int)tev);
+ MUTEX_ACQUIRE();
+ removeFromList(tev);
+ MUTEX_RELEASE();
+}
+
// Remove event from watch or timer list
void ril_event_del(struct ril_event * ev)
{
- dlog("~~~~ +ril_event_del ~~~~");
+ dlog("~~~~ +ril_event_del event= %x ~~~~", (unsigned int)ev);
MUTEX_ACQUIRE();
if (ev->index < 0 || ev->index >= MAX_FD_EVENTS) {
+ MUTEX_RELEASE();
return;
}
diff --git a/libril/ril_event.h b/libril/ril_event.h
index 7ba231b..2b9980a 100644
--- a/libril/ril_event.h
+++ b/libril/ril_event.h
@@ -47,6 +47,9 @@ void ril_timer_add(struct ril_event * ev, struct timeval * tv);
// Remove event from watch list
void ril_event_del(struct ril_event * ev);
+// Remove event from timer list
+void ril_timer_delete(struct ril_event * ev);
+
// Event loop
void ril_event_loop();
diff --git a/libril/ril_unsol_commands.h b/libril/ril_unsol_commands.h
index 3660702..6eddd0f 100644
--- a/libril/ril_unsol_commands.h
+++ b/libril/ril_unsol_commands.h
@@ -35,7 +35,7 @@
{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_RESPONSE_NEW_BROADCAST_SMS, responseRaw, WAKE_PARTIAL},
{RIL_UNSOL_CDMA_RUIM_SMS_STORAGE_FULL, responseVoid, WAKE_PARTIAL},
{RIL_UNSOL_RESTRICTED_STATE_CHANGED, responseInts, WAKE_PARTIAL},
{RIL_UNSOL_ENTER_EMERGENCY_CALLBACK_MODE, responseVoid, WAKE_PARTIAL},
diff --git a/rild/rild.c b/rild/rild.c
index 14a6ea9..4dc46fe 100644
--- a/rild/rild.c
+++ b/rild/rild.c
@@ -52,14 +52,16 @@ extern void RIL_onRequestComplete(RIL_Token t, RIL_Errno e,
extern void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
size_t datalen);
-extern void RIL_requestTimedCallback (RIL_TimedCallback callback,
+extern void* RIL_requestTimedCallback (RIL_TimedCallback callback,
void *param, const struct timeval *relativeTime);
+extern void RIL_removeTimedCallback(void *callbackInfo);
static struct RIL_Env s_rilEnv = {
RIL_onRequestComplete,
RIL_onUnsolicitedResponse,
- RIL_requestTimedCallback
+ RIL_requestTimedCallback,
+ RIL_removeTimedCallback
};
extern void RIL_startEventLoop();
@@ -91,7 +93,7 @@ void switchUser() {
struct __user_cap_data_struct cap;
header.version = _LINUX_CAPABILITY_VERSION;
header.pid = 0;
- cap.effective = cap.permitted = 1 << CAP_NET_ADMIN;
+ cap.effective = cap.permitted = (1 << CAP_NET_ADMIN) | (1 << CAP_NET_RAW);
cap.inheritable = 0;
capset(&header, &cap);
}