blob: 619401af2800566c884691fe3894d2a6842e6c5a [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_SOCKET_H_INCLUDED
18#define RIL_SOCKET_H_INCLUDED
Colin Crossb9e88c82015-12-16 14:15:42 -080019#include <libril/ril_ex.h>
Dheeraj Shettycc231012014-07-02 21:27:57 +020020#include "rilSocketQueue.h"
21#include <ril_event.h>
22
23using namespace std;
24
Chih-Hung Hsiehe7ed8c82015-05-06 15:12:30 -070025extern "C" void *ril_socket_process_requests_loop(void *arg);
26
Dheeraj Shettycc231012014-07-02 21:27:57 +020027/**
28 * Abstract socket class representing sockets in rild.
29 * <p>
30 * This class performs the following functions :
31 * <ul>
32 * <li> Start socket listen.
33 * <li> Handle socket listen and command callbacks.
34 * </ul>
35 */
36class RilSocket {
37 protected:
38
39 /**
40 * Socket name.
41 */
42 const char* name;
43
44 /**
45 * Socket id.
46 */
47 RIL_SOCKET_ID id;
48
49 /**
50 * Listen socket file descriptor.
51 */
52 int listenFd = -1;
53
54 /**
55 * Commands socket file descriptor.
56 */
57 int commandFd = -1;
58
59 /**
60 * Socket request loop thread id.
61 */
62 pthread_t socketThreadId;
63
64 /**
65 * Listen event callack. Callback called when the other ends does accept.
66 */
67 ril_event_cb listenCb;
68
69 /**
70 * Commands event callack.Callback called when there are requests from the other side.
71 */
72 ril_event_cb commandCb;
73
74 /**
75 * Listen event to be added to eventloop after socket listen.
76 */
77 struct ril_event listenEvent;
78
79 /**
80 * Commands event to be added to eventloop after accept.
81 */
82 struct ril_event callbackEvent;
83
84 /**
85 * Static socket listen handler. Chooses the socket to call the listen callback
86 * from ril.cpp.
87 *
88 * @param Listen fd.
89 * @param flags.
90 * @param Parameter for the listen handler.
91 */
92 static void sSocketListener(int fd, short flags, void *param);
93
94 /**
95 * Static socket request handler. Chooses the socket to call the request handler on.
96 *
97 * @param Commands fd.
98 * @param flags.
99 * @param Parameter for the request handler.
100 */
101 static void sSocketRequestsHandler(int fd, short flags, void *param);
102
103 /**
104 * Process record from the record stream and push the requests onto the queue.
105 *
106 * @param record data.
107 * @param record length.
108 */
109 virtual void pushRecord(void *record, size_t recordlen) = 0;
110
111 /**
112 * Socket lock for writing data on the socket.
113 */
114 pthread_mutex_t write_lock = PTHREAD_MUTEX_INITIALIZER;
115
116 /**
117 * The loop to process the incoming requests.
118 */
119 virtual void *processRequestsLoop(void) = 0;
120
121 private:
122 friend void *::ril_socket_process_requests_loop(void *arg);
123
124 public:
125
126 /**
127 * Constructor.
128 *
129 * @param Socket name.
130 * @param Socket id.
131 */
132 RilSocket(const char* socketName, RIL_SOCKET_ID socketId) {
133 name = socketName;
134 id = socketId;
135 }
136
137 /**
138 * Clean up function on commands socket close.
139 */
140 virtual void onCommandsSocketClosed(void) = 0;
141
142 /**
143 * Function called on new commands socket connect. Request loop thread is started here.
144 */
145 void onNewCommandConnect(void);
146
147 /**
148 * Set listen socket fd.
149 *
150 * @param Input fd.
151 */
152 void setListenFd(int listenFd);
153
154 /**
155 * Set commands socket fd.
156 *
157 * @param Input fd.
158 */
159 void setCommandFd(int commandFd);
160
161 /**
162 * Get listen socket fd.
163 *
164 * @return Listen fd.
165 */
166 int getListenFd(void);
167
168 /**
169 * Get commands socket fd.
170 *
171 * @return Commands fd.
172 */
173 int getCommandFd(void);
174
175 /**
176 * Set listen event callback.
177 *
178 * @param Input event callback.
179 */
180 void setListenCb(ril_event_cb listenCb);
181
182 /**
183 * Set command event callback.
184 *
185 * @param Input event callback.
186 */
187 void setCommandCb(ril_event_cb commandCb);
188
189 /**
190 * Get listen event callback.
191 *
192 * @return Listen event callback.
193 */
194 ril_event_cb getListenCb(void);
195
196 /**
197 * Gey command event callback.
198 *
199 * @return Command event callback.
200 */
201 ril_event_cb getCommandCb(void);
202
203 /**
204 * Set listen event.
205 *
206 * @param Input event.
207 */
208 void setListenEvent(ril_event listenEvent);
209
210 /**
211 * Set command callback event.
212 *
213 * @param Input event.
214 */
215 void setCallbackEvent(ril_event commandEvent);
216
217 /**
218 * Get listen event.
219 *
220 * @return Listen event.
221 */
222 ril_event* getListenEvent(void);
223
224 /**
225 * Get commands callback event.
226 *
227 * @return Commands callback event.
228 */
229 ril_event* getCallbackEvent(void);
230
231 virtual ~RilSocket(){}
232
233 protected:
234
235 /**
236 * Start listening on the socket and add the socket listen callback event.
237 *
238 * @return Result of the socket listen.
239 */
240 int socketInit(void);
241
242 /**
243 * Socket request handler
244 *
245 * @param Commands fd.
246 * @param flags.
247 * @param Record stream.
248 */
249 void socketRequestsHandler(int fd, short flags, RecordStream *rs);
250};
251
252class socketClient {
253 public:
254 RilSocket *socketPtr;
255 RecordStream *rs;
256
257 socketClient(RilSocket *socketPtr, RecordStream *rs) {
258 this->socketPtr = socketPtr;
259 this->rs = rs;
260 }
261};
262
263typedef struct MySocketListenParam {
264 SocketListenParam sListenParam;
265 RilSocket *socket;
266} MySocketListenParam;
267
268typedef void* (RilSocket::*RilSocketFuncPtr)(void);
269typedef void (RilSocket::*RilSocketEventPtr)(int fd,short flags, void *param);
270typedef void* (*PthreadPtr)(void*);
271
272#endif