diff options
author | Dheeraj Shetty <dshetty@codeaurora.org> | 2014-07-02 21:27:57 +0200 |
---|---|---|
committer | Andre Eisenbach <eisenbach@google.com> | 2015-04-08 22:58:37 -0700 |
commit | 27976c479473bb772703fe4caa100e535e635e84 (patch) | |
tree | a2c1bd91533a7e7ce0d6a9bde31b5298c5c1b0a4 /libril/RilSapSocket.h | |
parent | 8905d89997ee4e4884a563254da87a3d341dbebb (diff) | |
download | android_hardware_ril-27976c479473bb772703fe4caa100e535e635e84.tar.gz android_hardware_ril-27976c479473bb772703fe4caa100e535e635e84.tar.bz2 android_hardware_ril-27976c479473bb772703fe4caa100e535e635e84.zip |
Introduction of the new SAP-UIM socket
Added new socket connection for communication between the SAP module
in Telephony and User Identity Module with DSDA support.
New classes added are:
RilSocket
---------
Base class(virtual) for any type of socket. Has listen
and commands callbacks similar to that of the existing
telephony->rild socket.
RilSapSocket
------------
Derived class for socket for communication between BT SAP
and the sim module in the modem. It initialises
socket, calls Sap_Uim_Init to get the handles and
starts the socket thread.
rilSocketQueue
--------------
Queue for managing socket requests.
Change-Id: I8828173941d6ae76f1f9cc0d567efaf41a77d175
Diffstat (limited to 'libril/RilSapSocket.h')
-rw-r--r-- | libril/RilSapSocket.h | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/libril/RilSapSocket.h b/libril/RilSapSocket.h new file mode 100644 index 0000000..4261f93 --- /dev/null +++ b/libril/RilSapSocket.h @@ -0,0 +1,262 @@ +/* +* 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); + + /** + * Process requests from the dispatch request queue. + * @param Request to be dispatched. + */ + int processRequest(MsgHeader *request); + + /** + * 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); + + /** + * Called by the processRequest method to dispatch 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*/ |