/* * 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_SOCKET_H_INCLUDED #define RIL_SOCKET_H_INCLUDED #include <libril/ril_ex.h> #include "rilSocketQueue.h" #include <ril_event.h> using namespace std; extern "C" void *ril_socket_process_requests_loop(void *arg); /** * Abstract socket class representing sockets in rild. * <p> * This class performs the following functions : * <ul> * <li> Start socket listen. * <li> Handle socket listen and command callbacks. * </ul> */ class RilSocket { protected: /** * Socket name. */ const char* name; /** * Socket id. */ RIL_SOCKET_ID id; /** * Listen socket file descriptor. */ int listenFd = -1; /** * Commands socket file descriptor. */ int commandFd = -1; /** * Socket request loop thread id. */ pthread_t socketThreadId; /** * Listen event callack. Callback called when the other ends does accept. */ ril_event_cb listenCb; /** * Commands event callack.Callback called when there are requests from the other side. */ ril_event_cb commandCb; /** * Listen event to be added to eventloop after socket listen. */ struct ril_event listenEvent; /** * Commands event to be added to eventloop after accept. */ struct ril_event callbackEvent; /** * Static socket listen handler. Chooses the socket to call the listen callback * from ril.cpp. * * @param Listen fd. * @param flags. * @param Parameter for the listen handler. */ static void sSocketListener(int fd, short flags, void *param); /** * Static socket request handler. Chooses the socket to call the request handler on. * * @param Commands fd. * @param flags. * @param Parameter for the request handler. */ static void sSocketRequestsHandler(int fd, short flags, void *param); /** * Process record from the record stream and push the requests onto the queue. * * @param record data. * @param record length. */ virtual void pushRecord(void *record, size_t recordlen) = 0; /** * Socket lock for writing data on the socket. */ pthread_mutex_t write_lock = PTHREAD_MUTEX_INITIALIZER; /** * The loop to process the incoming requests. */ virtual void *processRequestsLoop(void) = 0; private: friend void *::ril_socket_process_requests_loop(void *arg); public: /** * Constructor. * * @param Socket name. * @param Socket id. */ RilSocket(const char* socketName, RIL_SOCKET_ID socketId) { name = socketName; id = socketId; } /** * Clean up function on commands socket close. */ virtual void onCommandsSocketClosed(void) = 0; /** * Function called on new commands socket connect. Request loop thread is started here. */ void onNewCommandConnect(void); /** * Set listen socket fd. * * @param Input fd. */ void setListenFd(int listenFd); /** * Set commands socket fd. * * @param Input fd. */ void setCommandFd(int commandFd); /** * Get listen socket fd. * * @return Listen fd. */ int getListenFd(void); /** * Get commands socket fd. * * @return Commands fd. */ int getCommandFd(void); /** * Set listen event callback. * * @param Input event callback. */ void setListenCb(ril_event_cb listenCb); /** * Set command event callback. * * @param Input event callback. */ void setCommandCb(ril_event_cb commandCb); /** * Get listen event callback. * * @return Listen event callback. */ ril_event_cb getListenCb(void); /** * Gey command event callback. * * @return Command event callback. */ ril_event_cb getCommandCb(void); /** * Set listen event. * * @param Input event. */ void setListenEvent(ril_event listenEvent); /** * Set command callback event. * * @param Input event. */ void setCallbackEvent(ril_event commandEvent); /** * Get listen event. * * @return Listen event. */ ril_event* getListenEvent(void); /** * Get commands callback event. * * @return Commands callback event. */ ril_event* getCallbackEvent(void); virtual ~RilSocket(){} protected: /** * Start listening on the socket and add the socket listen callback event. * * @return Result of the socket listen. */ int socketInit(void); /** * Socket request handler * * @param Commands fd. * @param flags. * @param Record stream. */ void socketRequestsHandler(int fd, short flags, RecordStream *rs); }; class socketClient { public: RilSocket *socketPtr; RecordStream *rs; socketClient(RilSocket *socketPtr, RecordStream *rs) { this->socketPtr = socketPtr; this->rs = rs; } }; typedef struct MySocketListenParam { SocketListenParam sListenParam; RilSocket *socket; } MySocketListenParam; typedef void* (RilSocket::*RilSocketFuncPtr)(void); typedef void (RilSocket::*RilSocketEventPtr)(int fd,short flags, void *param); typedef void* (*PthreadPtr)(void*); #endif