OSDN Git Service

DO NOT MERGE Fix security vulnerability in pre-O rild code. am: c4c7c551b1 -s ours...
[android-x86/hardware-ril.git] / libril / RilSapSocket.h
1 /*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef RIL_UIM_SOCKET_H_INCLUDED
18 #define RIL_UIM_SOCKET_H_INCLUDED
19 #define RIL_SHLIB
20 #include "telephony/ril.h"
21 #include "RilSocket.h"
22 #include <hardware/ril/librilutils/proto/sap-api.pb.h>
23
24 /**
25  * RilSapSocket is a derived class, derived from the RilSocket abstract
26  * class, representing sockets for communication between bluetooth SAP module and
27  * the ril daemon.
28  * <p>
29  * This class performs the following functions :
30  * <ul>
31  *     <li>Initialize the socket.
32  *     <li>Process the requests coming on the socket.
33  *     <li>Provide handlers for Unsolicited and request responses.
34  *     <li>Request and pending response queue handling.
35  * </ul>
36  */
37 class RilSapSocket : public RilSocket {
38     /**
39      * Function pointer to the ril initialization funtion.
40      *
41      * @param Ril environment variable with place request and
42      *        response handlers and timeout handler.
43      *
44      * @param Number of arguements for the initialization function.
45      *
46      * @param Arguements to the initialization function used to
47      *        generate instance id of the ril daemon.
48      *
49      * @return Radio functions with handlers for onRequest, onStateRequest,
50      *         supports, onCancel and getVersion.
51      */
52     RIL_RadioFunctions *(*UimInit)(const struct RIL_Env *, int argc, char **argv);
53
54     /**
55      * Place holder for the radio functions returned by the initialization
56      * function. Currenty only onRequest handler is being used.
57      */
58     RIL_RadioFunctions* uimFuncs;
59
60     /**
61      * Wrapper struct for handling the requests in the queue.
62      */
63     typedef struct SapSocketRequest {
64         int token;
65         MsgHeader* curr;
66         struct SapSocketRequest* p_next;
67         RIL_SOCKET_ID socketId;
68     } SapSocketRequest;
69
70     /**
71      * Queue for requests that are pending dispatch.
72      */
73     Ril_queue<SapSocketRequest> dispatchQueue;
74
75     /**
76      * Queue for requests that are dispatched but are pending response
77      */
78     Ril_queue<SapSocketRequest> pendingResponseQueue;
79
80     public:
81         /**
82          * Initialize the socket and add the socket to the list.
83          *
84          * @param Name of the socket.
85          * @param Radio functions to be used by the socket.
86          */
87         static void initSapSocket(const char *socketName,
88         RIL_RadioFunctions *uimFuncs);
89
90         /**
91          * Process requests from the dispatch request queue.
92          * @param Request to be dispatched.
93          */
94         int processRequest(MsgHeader *request);
95
96         /**
97          * Ril envoronment variable that holds the request and
98          * unsol response handlers.
99          */
100         static struct RIL_Env uimRilEnv;
101
102         /**
103          * Function to print the socket list.
104          */
105         static void printList();
106
107         /**
108          * Clean up method to be called on command close.
109          */
110         void onCommandsSocketClosed(void);
111
112         /**
113          * Datatype to handle the socket list.
114          */
115         typedef struct RilSapSocketList {
116             RilSapSocket* socket;
117             RilSapSocketList *next;
118         } RilSapSocketList;
119
120     protected:
121         /**
122          * Process each record read from the socket and
123          * push a new request created from that record to
124          * the dispatch request queue.
125          *
126          * @param The record data.
127          * @param The record length.
128          */
129         void pushRecord(void *record, size_t recordlen);
130
131         /**
132          * Socket handler to be called when a request has
133          * been completed.
134          *
135          * @param Token associated with the request.
136          * @param Error, if any, while processing the request.
137          * @param The response payload.
138          * @param Response payload length.
139          */
140         void onRequestComplete(RIL_Token t,RIL_Errno e,
141         void *response, size_t response_len);
142
143         /**
144          * Socket handler to be called when there is an
145          * unsolicited response.
146          *
147          * @param Message id.
148          * @param Response data.
149          * @param Response data length.
150          */
151         void onUnsolicitedResponse(int unsolResponse,
152         void *data, size_t datalen);
153
154         /**
155          * Class method to get the socket from the socket list.
156          *
157          * @param Socket id.
158          * @return the sap socket.
159          */
160         static RilSapSocket* getSocketById(RIL_SOCKET_ID socketId);
161
162         /**
163          * Method to send response to SAP. It does an atomic write operation on the
164          * socket.
165          *
166          * @param the response header with the payload.
167          */
168         void sendResponse(MsgHeader *hdr);
169
170         /**
171          * A loop for processing the requests in the request dispatch queue.
172          */
173         void *processRequestsLoop(void);
174
175         /**
176          * Class method to add the sap socket to the list of sockets.
177          * Does nothing if the socket is already present in the list.
178          * Otherwise, calls the constructor of the parent class(To startlistening)
179          * and add socket to the socket list.
180          */
181         static void addSocketToList(const char *socketName, RIL_SOCKET_ID socketid,
182         RIL_RadioFunctions *uimFuncs);
183
184         /**
185          * Check if a socket of the given name exists in the socket list.
186          *
187          * @param Socket name.
188          * @return true if exists, false otherwise.
189          */
190         static bool SocketExists(const char *socketName);
191
192         /**
193          * Send a clean up SAP DISCONNECT if the socket disconnects before doing a SAP
194          * disconnect.
195          */
196         void sendDisconnect(void);
197
198         /**
199          * Dispatch the clean up disconnect request.
200          */
201         void dispatchDisconnect(MsgHeader *req);
202
203
204     private:
205         /**
206          * Constructor.
207          *
208          * @param Socket name.
209          * @param Socket id.
210          * @param Radio functions.
211          */
212         RilSapSocket(const char *socketName,
213         RIL_SOCKET_ID socketId,
214         RIL_RadioFunctions *inputUimFuncs);
215
216         /**
217          * Called by the processRequest method to dispatch the request to
218          * the lower layers. It calls the on request function.
219          *
220          * @param The request message.
221          */
222         void dispatchRequest(MsgHeader *request);
223
224         /**
225          * Class method that selects the socket on which the onRequestComplete
226          * is called.
227          *
228          * @param Token associated with the request.
229          * @param Error, if any, while processing the request.
230          * @param The response payload.
231          * @param Response payload length.
232          */
233         static void sOnRequestComplete(RIL_Token t,
234         RIL_Errno e, void *response, size_t responselen);
235
236 #if defined(ANDROID_MULTI_SIM)
237         /**
238          * Class method that selects the socket on which the onUnsolicitedResponse
239          * is called.
240          *
241          * @param Message id.
242          * @param Response data.
243          * @param Response data length.
244          * @param Socket id.
245          */
246         static void sOnUnsolicitedResponse(int unsolResponse, const void *data,
247         size_t datalen, RIL_SOCKET_ID socket_id);
248 #else
249         /**
250          * Class method that selects the socket on which the onUnsolicitedResponse
251          * is called.
252          *
253          * @param Message id.
254          * @param Response data.
255          * @param Response data length.
256          */
257         static void sOnUnsolicitedResponse(int unsolResponse, const void *data,
258         size_t datalen);
259 #endif
260 };
261
262 #endif /*RIL_UIM_SOCKET_H_INCLUDED*/