/* * 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*/