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 <device/generic/goldfish/radio/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 * Place holder for the radio functions returned by the initialization 40 * function. Currenty only onRequest handler is being used. 41 */ 42 const RIL_RadioFunctions* uimFuncs; 43 44 /** 45 * Wrapper struct for handling the requests in the queue. 46 */ 47 typedef struct SapSocketRequest { 48 int token; 49 MsgHeader* curr; 50 struct SapSocketRequest* p_next; 51 RIL_SOCKET_ID socketId; 52 } SapSocketRequest; 53 54 /** 55 * Queue for requests that are pending dispatch. 56 */ 57 Ril_queue<SapSocketRequest> dispatchQueue; 58 59 /** 60 * Queue for requests that are dispatched but are pending response 61 */ 62 Ril_queue<SapSocketRequest> pendingResponseQueue; 63 64 public: 65 /** 66 * Initialize the socket and add the socket to the list. 67 * 68 * @param Name of the socket. 69 * @param Radio functions to be used by the socket. 70 */ 71 static void initSapSocket(const char *socketName, 72 const RIL_RadioFunctions *uimFuncs); 73 74 /** 75 * Ril envoronment variable that holds the request and 76 * unsol response handlers. 77 */ 78 static struct RIL_Env uimRilEnv; 79 80 /** 81 * Function to print the socket list. 82 */ 83 static void printList(); 84 85 /** 86 * Dispatches the request to the lower layers. 87 * It calls the on request function. 88 * 89 * @param request The request message. 90 */ 91 void dispatchRequest(MsgHeader *request); 92 93 /** 94 * Class method to get the socket from the socket list. 95 * 96 * @param socketId Socket id. 97 * @return the sap socket. 98 */ 99 static RilSapSocket* getSocketById(RIL_SOCKET_ID socketId); 100 101 /** 102 * Datatype to handle the socket list. 103 */ 104 typedef struct RilSapSocketList { 105 RilSapSocket* socket; 106 RilSapSocketList *next; 107 } RilSapSocketList; 108 109 protected: 110 /** 111 * Socket handler to be called when a request has 112 * been completed. 113 * 114 * @param Token associated with the request. 115 * @param Error, if any, while processing the request. 116 * @param The response payload. 117 * @param Response payload length. 118 */ 119 void onRequestComplete(RIL_Token t,RIL_Errno e, 120 void *response, size_t response_len); 121 122 /** 123 * Socket handler to be called when there is an 124 * unsolicited response. 125 * 126 * @param Message id. 127 * @param Response data. 128 * @param Response data length. 129 */ 130 void onUnsolicitedResponse(int unsolResponse, 131 void *data, size_t datalen); 132 133 /** 134 * Class method to add the sap socket to the list of sockets. 135 * Does nothing if the socket is already present in the list. 136 * Otherwise, calls the constructor of the parent class(To startlistening) 137 * and add socket to the socket list. 138 */ 139 static void addSocketToList(const char *socketName, RIL_SOCKET_ID socketid, 140 const RIL_RadioFunctions *uimFuncs); 141 142 /** 143 * Check if a socket of the given name exists in the socket list. 144 * 145 * @param Socket name. 146 * @return true if exists, false otherwise. 147 */ 148 static bool SocketExists(const char *socketName); 149 150 private: 151 /** 152 * Constructor. 153 * 154 * @param Socket name. 155 * @param Socket id. 156 * @param Radio functions. 157 */ 158 RilSapSocket(const char *socketName, 159 RIL_SOCKET_ID socketId, 160 const RIL_RadioFunctions *inputUimFuncs); 161 162 /** 163 * Class method that selects the socket on which the onRequestComplete 164 * is called. 165 * 166 * @param Token associated with the request. 167 * @param Error, if any, while processing the request. 168 * @param The response payload. 169 * @param Response payload length. 170 */ 171 static void sOnRequestComplete(RIL_Token t, 172 RIL_Errno e, void *response, size_t responselen); 173 174 #if defined(ANDROID_MULTI_SIM) 175 /** 176 * Class method that selects the socket on which the onUnsolicitedResponse 177 * is called. 178 * 179 * @param Message id. 180 * @param Response data. 181 * @param Response data length. 182 * @param Socket id. 183 */ 184 static void sOnUnsolicitedResponse(int unsolResponse, const void *data, 185 size_t datalen, RIL_SOCKET_ID socket_id); 186 #else 187 /** 188 * Class method that selects the socket on which the onUnsolicitedResponse 189 * is called. 190 * 191 * @param Message id. 192 * @param Response data. 193 * @param Response data length. 194 */ 195 static void sOnUnsolicitedResponse(int unsolResponse, const void *data, 196 size_t datalen); 197 #endif 198 }; 199 200 #endif /*RIL_UIM_SOCKET_H_INCLUDED*/ 201