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 * 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 /** 102 * Clean up method to be called on command close. 103 */ 104 void onCommandsSocketClosed(void); 105 106 /** 107 * Datatype to handle the socket list. 108 */ 109 typedef struct RilSapSocketList { 110 RilSapSocket* socket; 111 RilSapSocketList *next; 112 } RilSapSocketList; 113 114 protected: 115 /** 116 * Process each record read from the socket and 117 * push a new request created from that record to 118 * the dispatch request queue. 119 * 120 * @param The record data. 121 * @param The record length. 122 */ 123 void pushRecord(void *record, size_t recordlen); 124 125 /** 126 * Socket handler to be called when a request has 127 * been completed. 128 * 129 * @param Token associated with the request. 130 * @param Error, if any, while processing the request. 131 * @param The response payload. 132 * @param Response payload length. 133 */ 134 void onRequestComplete(RIL_Token t,RIL_Errno e, 135 void *response, size_t response_len); 136 137 /** 138 * Socket handler to be called when there is an 139 * unsolicited response. 140 * 141 * @param Message id. 142 * @param Response data. 143 * @param Response data length. 144 */ 145 void onUnsolicitedResponse(int unsolResponse, 146 void *data, size_t datalen); 147 148 /** 149 * Class method to get the socket from the socket list. 150 * 151 * @param Socket id. 152 * @return the sap socket. 153 */ 154 static RilSapSocket* getSocketById(RIL_SOCKET_ID socketId); 155 156 /** 157 * Method to send response to SAP. It does an atomic write operation on the 158 * socket. 159 * 160 * @param the response header with the payload. 161 */ 162 void sendResponse(MsgHeader *hdr); 163 164 /** 165 * A loop for processing the requests in the request dispatch queue. 166 */ 167 void *processRequestsLoop(void); 168 169 /** 170 * Class method to add the sap socket to the list of sockets. 171 * Does nothing if the socket is already present in the list. 172 * Otherwise, calls the constructor of the parent class(To startlistening) 173 * and add socket to the socket list. 174 */ 175 static void addSocketToList(const char *socketName, RIL_SOCKET_ID socketid, 176 RIL_RadioFunctions *uimFuncs); 177 178 /** 179 * Check if a socket of the given name exists in the socket list. 180 * 181 * @param Socket name. 182 * @return true if exists, false otherwise. 183 */ 184 static bool SocketExists(const char *socketName); 185 186 /** 187 * Send a clean up SAP DISCONNECT if the socket disconnects before doing a SAP 188 * disconnect. 189 */ 190 void sendDisconnect(void); 191 192 /** 193 * Dispatch the clean up disconnect request. 194 */ 195 void dispatchDisconnect(MsgHeader *req); 196 197 198 private: 199 /** 200 * Constructor. 201 * 202 * @param Socket name. 203 * @param Socket id. 204 * @param Radio functions. 205 */ 206 RilSapSocket(const char *socketName, 207 RIL_SOCKET_ID socketId, 208 RIL_RadioFunctions *inputUimFuncs); 209 210 /** 211 * Dispatches the request to the lower layers. 212 * It calls the on request function. 213 * 214 * @param The request message. 215 */ 216 void dispatchRequest(MsgHeader *request); 217 218 /** 219 * Class method that selects the socket on which the onRequestComplete 220 * is called. 221 * 222 * @param Token associated with the request. 223 * @param Error, if any, while processing the request. 224 * @param The response payload. 225 * @param Response payload length. 226 */ 227 static void sOnRequestComplete(RIL_Token t, 228 RIL_Errno e, void *response, size_t responselen); 229 230 #if defined(ANDROID_MULTI_SIM) 231 /** 232 * Class method that selects the socket on which the onUnsolicitedResponse 233 * is called. 234 * 235 * @param Message id. 236 * @param Response data. 237 * @param Response data length. 238 * @param Socket id. 239 */ 240 static void sOnUnsolicitedResponse(int unsolResponse, const void *data, 241 size_t datalen, RIL_SOCKET_ID socket_id); 242 #else 243 /** 244 * Class method that selects the socket on which the onUnsolicitedResponse 245 * is called. 246 * 247 * @param Message id. 248 * @param Response data. 249 * @param Response data length. 250 */ 251 static void sOnUnsolicitedResponse(int unsolResponse, const void *data, 252 size_t datalen); 253 #endif 254 }; 255 256 #endif /*RIL_UIM_SOCKET_H_INCLUDED*/ 257