blob: 1f6163e727afa1e9e81d63e1c1be193f0a991b40 [file] [log] [blame]
Dheeraj Shettycc231012014-07-02 21:27:57 +02001/*
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 */
37class 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 /**
Dheeraj Shettycc231012014-07-02 21:27:57 +020091 * Ril envoronment variable that holds the request and
92 * unsol response handlers.
93 */
94 static struct RIL_Env uimRilEnv;
95
96 /**
97 * Function to print the socket list.
98 */
99 static void printList();
100
101 /**
Martin Bouchet0d4bbaf2017-09-23 04:54:37 -0300102 * Dispatches the request to the lower layers.
103 * It calls the on request function.
104 *
105 * @param request The request message.
Dheeraj Shettycc231012014-07-02 21:27:57 +0200106 */
Martin Bouchet0d4bbaf2017-09-23 04:54:37 -0300107 void dispatchRequest(MsgHeader *request);
108
109 /**
110 * Class method to get the socket from the socket list.
111 *
112 * @param socketId Socket id.
113 * @return the sap socket.
114 */
115 static RilSapSocket* getSocketById(RIL_SOCKET_ID socketId);
Dheeraj Shettycc231012014-07-02 21:27:57 +0200116
117 /**
118 * Datatype to handle the socket list.
119 */
120 typedef struct RilSapSocketList {
121 RilSapSocket* socket;
122 RilSapSocketList *next;
123 } RilSapSocketList;
124
125 protected:
126 /**
Dheeraj Shettycc231012014-07-02 21:27:57 +0200127 * Socket handler to be called when a request has
128 * been completed.
129 *
130 * @param Token associated with the request.
131 * @param Error, if any, while processing the request.
132 * @param The response payload.
133 * @param Response payload length.
134 */
135 void onRequestComplete(RIL_Token t,RIL_Errno e,
136 void *response, size_t response_len);
137
138 /**
139 * Socket handler to be called when there is an
140 * unsolicited response.
141 *
142 * @param Message id.
143 * @param Response data.
144 * @param Response data length.
145 */
146 void onUnsolicitedResponse(int unsolResponse,
147 void *data, size_t datalen);
148
149 /**
Dheeraj Shettycc231012014-07-02 21:27:57 +0200150 * Class method to add the sap socket to the list of sockets.
151 * Does nothing if the socket is already present in the list.
152 * Otherwise, calls the constructor of the parent class(To startlistening)
153 * and add socket to the socket list.
154 */
155 static void addSocketToList(const char *socketName, RIL_SOCKET_ID socketid,
156 RIL_RadioFunctions *uimFuncs);
157
158 /**
159 * Check if a socket of the given name exists in the socket list.
160 *
161 * @param Socket name.
162 * @return true if exists, false otherwise.
163 */
164 static bool SocketExists(const char *socketName);
165
Dheeraj Shettycc231012014-07-02 21:27:57 +0200166 private:
167 /**
168 * Constructor.
169 *
170 * @param Socket name.
171 * @param Socket id.
172 * @param Radio functions.
173 */
174 RilSapSocket(const char *socketName,
175 RIL_SOCKET_ID socketId,
176 RIL_RadioFunctions *inputUimFuncs);
177
178 /**
Dheeraj Shettycc231012014-07-02 21:27:57 +0200179 * Class method that selects the socket on which the onRequestComplete
180 * is called.
181 *
182 * @param Token associated with the request.
183 * @param Error, if any, while processing the request.
184 * @param The response payload.
185 * @param Response payload length.
186 */
187 static void sOnRequestComplete(RIL_Token t,
188 RIL_Errno e, void *response, size_t responselen);
189
190#if defined(ANDROID_MULTI_SIM)
191 /**
192 * Class method that selects the socket on which the onUnsolicitedResponse
193 * is called.
194 *
195 * @param Message id.
196 * @param Response data.
197 * @param Response data length.
198 * @param Socket id.
199 */
200 static void sOnUnsolicitedResponse(int unsolResponse, const void *data,
201 size_t datalen, RIL_SOCKET_ID socket_id);
202#else
203 /**
204 * Class method that selects the socket on which the onUnsolicitedResponse
205 * is called.
206 *
207 * @param Message id.
208 * @param Response data.
209 * @param Response data length.
210 */
211 static void sOnUnsolicitedResponse(int unsolResponse, const void *data,
212 size_t datalen);
213#endif
214};
215
216#endif /*RIL_UIM_SOCKET_H_INCLUDED*/