diff options
-rw-r--r-- | include/telephony/ril.h | 19 | ||||
-rw-r--r-- | libril/ril.cpp | 29 | ||||
-rw-r--r-- | libril/ril_event.cpp | 12 | ||||
-rw-r--r-- | libril/ril_event.h | 3 | ||||
-rw-r--r-- | libril/ril_unsol_commands.h | 2 | ||||
-rw-r--r-- | rild/rild.c | 8 |
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); } |