| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef RIL_UIM_SOCKET_H_INCLUDED |
| #define RIL_UIM_SOCKET_H_INCLUDED |
| #define RIL_SHLIB |
| #include "telephony/ril.h" |
| #include "RilSocket.h" |
| #include <hardware/ril/librilutils/proto/sap-api.pb.h> |
| |
| /** |
| * RilSapSocket is a derived class, derived from the RilSocket abstract |
| * class, representing sockets for communication between bluetooth SAP module and |
| * the ril daemon. |
| * <p> |
| * This class performs the following functions : |
| * <ul> |
| * <li>Initialize the socket. |
| * <li>Process the requests coming on the socket. |
| * <li>Provide handlers for Unsolicited and request responses. |
| * <li>Request and pending response queue handling. |
| * </ul> |
| */ |
| class RilSapSocket : public RilSocket { |
| /** |
| * Function pointer to the ril initialization funtion. |
| * |
| * @param Ril environment variable with place request and |
| * response handlers and timeout handler. |
| * |
| * @param Number of arguements for the initialization function. |
| * |
| * @param Arguements to the initialization function used to |
| * generate instance id of the ril daemon. |
| * |
| * @return Radio functions with handlers for onRequest, onStateRequest, |
| * supports, onCancel and getVersion. |
| */ |
| RIL_RadioFunctions *(*UimInit)(const struct RIL_Env *, int argc, char **argv); |
| |
| /** |
| * Place holder for the radio functions returned by the initialization |
| * function. Currenty only onRequest handler is being used. |
| */ |
| RIL_RadioFunctions* uimFuncs; |
| |
| /** |
| * Wrapper struct for handling the requests in the queue. |
| */ |
| typedef struct SapSocketRequest { |
| int token; |
| MsgHeader* curr; |
| struct SapSocketRequest* p_next; |
| RIL_SOCKET_ID socketId; |
| } SapSocketRequest; |
| |
| /** |
| * Queue for requests that are pending dispatch. |
| */ |
| Ril_queue<SapSocketRequest> dispatchQueue; |
| |
| /** |
| * Queue for requests that are dispatched but are pending response |
| */ |
| Ril_queue<SapSocketRequest> pendingResponseQueue; |
| |
| public: |
| /** |
| * Initialize the socket and add the socket to the list. |
| * |
| * @param Name of the socket. |
| * @param Radio functions to be used by the socket. |
| */ |
| static void initSapSocket(const char *socketName, |
| RIL_RadioFunctions *uimFuncs); |
| |
| /** |
| * Ril envoronment variable that holds the request and |
| * unsol response handlers. |
| */ |
| static struct RIL_Env uimRilEnv; |
| |
| /** |
| * Function to print the socket list. |
| */ |
| static void printList(); |
| |
| /** |
| * Clean up method to be called on command close. |
| */ |
| void onCommandsSocketClosed(void); |
| |
| /** |
| * Datatype to handle the socket list. |
| */ |
| typedef struct RilSapSocketList { |
| RilSapSocket* socket; |
| RilSapSocketList *next; |
| } RilSapSocketList; |
| |
| protected: |
| /** |
| * Process each record read from the socket and |
| * push a new request created from that record to |
| * the dispatch request queue. |
| * |
| * @param The record data. |
| * @param The record length. |
| */ |
| void pushRecord(void *record, size_t recordlen); |
| |
| /** |
| * Socket handler to be called when a request has |
| * been completed. |
| * |
| * @param Token associated with the request. |
| * @param Error, if any, while processing the request. |
| * @param The response payload. |
| * @param Response payload length. |
| */ |
| void onRequestComplete(RIL_Token t,RIL_Errno e, |
| void *response, size_t response_len); |
| |
| /** |
| * Socket handler to be called when there is an |
| * unsolicited response. |
| * |
| * @param Message id. |
| * @param Response data. |
| * @param Response data length. |
| */ |
| void onUnsolicitedResponse(int unsolResponse, |
| void *data, size_t datalen); |
| |
| /** |
| * Class method to get the socket from the socket list. |
| * |
| * @param Socket id. |
| * @return the sap socket. |
| */ |
| static RilSapSocket* getSocketById(RIL_SOCKET_ID socketId); |
| |
| /** |
| * Method to send response to SAP. It does an atomic write operation on the |
| * socket. |
| * |
| * @param the response header with the payload. |
| */ |
| void sendResponse(MsgHeader *hdr); |
| |
| /** |
| * A loop for processing the requests in the request dispatch queue. |
| */ |
| void *processRequestsLoop(void); |
| |
| /** |
| * Class method to add the sap socket to the list of sockets. |
| * Does nothing if the socket is already present in the list. |
| * Otherwise, calls the constructor of the parent class(To startlistening) |
| * and add socket to the socket list. |
| */ |
| static void addSocketToList(const char *socketName, RIL_SOCKET_ID socketid, |
| RIL_RadioFunctions *uimFuncs); |
| |
| /** |
| * Check if a socket of the given name exists in the socket list. |
| * |
| * @param Socket name. |
| * @return true if exists, false otherwise. |
| */ |
| static bool SocketExists(const char *socketName); |
| |
| /** |
| * Send a clean up SAP DISCONNECT if the socket disconnects before doing a SAP |
| * disconnect. |
| */ |
| void sendDisconnect(void); |
| |
| /** |
| * Dispatch the clean up disconnect request. |
| */ |
| void dispatchDisconnect(MsgHeader *req); |
| |
| |
| private: |
| /** |
| * Constructor. |
| * |
| * @param Socket name. |
| * @param Socket id. |
| * @param Radio functions. |
| */ |
| RilSapSocket(const char *socketName, |
| RIL_SOCKET_ID socketId, |
| RIL_RadioFunctions *inputUimFuncs); |
| |
| /** |
| * Dispatches the request to the lower layers. |
| * It calls the on request function. |
| * |
| * @param The request message. |
| */ |
| void dispatchRequest(MsgHeader *request); |
| |
| /** |
| * Class method that selects the socket on which the onRequestComplete |
| * is called. |
| * |
| * @param Token associated with the request. |
| * @param Error, if any, while processing the request. |
| * @param The response payload. |
| * @param Response payload length. |
| */ |
| static void sOnRequestComplete(RIL_Token t, |
| RIL_Errno e, void *response, size_t responselen); |
| |
| #if defined(ANDROID_MULTI_SIM) |
| /** |
| * Class method that selects the socket on which the onUnsolicitedResponse |
| * is called. |
| * |
| * @param Message id. |
| * @param Response data. |
| * @param Response data length. |
| * @param Socket id. |
| */ |
| static void sOnUnsolicitedResponse(int unsolResponse, const void *data, |
| size_t datalen, RIL_SOCKET_ID socket_id); |
| #else |
| /** |
| * Class method that selects the socket on which the onUnsolicitedResponse |
| * is called. |
| * |
| * @param Message id. |
| * @param Response data. |
| * @param Response data length. |
| */ |
| static void sOnUnsolicitedResponse(int unsolResponse, const void *data, |
| size_t datalen); |
| #endif |
| }; |
| |
| #endif /*RIL_UIM_SOCKET_H_INCLUDED*/ |