一、RIL_commands.h中定义了许多命令ID,处理函数和响应函数的三列表项异步
{RIL_REQUEST_GET_SIM_STATUS, dispatchVoid, responseSimStatus},socket
首先RIL_commands.h被用来初始化RIL.cpp中的一个全局变量s_commands,其类型以下函数
typedef struct {
int requestNumber;
void (*dispatchFunction) (Parcel &p, struct RequestInfo *pRI);
int(*responseFunction) (Parcel &p, void *response, size_t responselen);
} CommandInfo;oop
那么从监视到socket文件发生变化开始spa
ril_event_loop()->firePending()->遍历一个叫pendingList的链表,执行其中的ev的callback函数,对于指针
s_listen_event的回调函数为listenCallback(这个回调函数指向的赋值再startListen函数中)接口
listenCallback ->ci
processCommandsCallback->get
processCommandBuffer->根据requestNumber匹配对应的处理函数回调函数
dispatchVoid ->CALL_ONREQUEST
看宏定义#define CALL_ONREQUEST(a, b, c, d, e) s_callbacks.onRequest((a), (b), (c), (d), (e))
而s_callbacks 再rild初始化中调用RIL_register时被赋值为reference-ril库中传递过来的用来回调结构指针func,因此至此一条消息从接到RILJ的请求到调用第三方库提供的发送接口完成。
咱们知道libRIL与厂商第三方库reference-ril的数据交互是经过动态引入库实现的,二者间是基于函数调用进行通讯的,那么基于异步消息的方式且出于维护第三方的权益的方式考虑,二者之间的必然会有许多的函数回调方式。其中二者的回调接口分别为funcs和static struct RIL_Env s_rilEnv = { RIL_onRequestComplete, RIL_onUnsolicitedResponse, RIL_requestTimedCallback };,二者的类型依次为typedef struct { int version; /* set to RIL_VERSION */ RIL_RequestFunc onRequest; RIL_RadioStateRequest onStateRequest; RIL_Supports supports; RIL_Cancel onCancel; RIL_GetVersion getVersion; } RIL_RadioFunctions; 和RIL_ENV