1*35238bceSAndroid Build Coastguard Worker #ifndef _XETCPIPLINK_HPP 2*35238bceSAndroid Build Coastguard Worker #define _XETCPIPLINK_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Test Executor 5*35238bceSAndroid Build Coastguard Worker * ------------------------------------------ 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Tcp/Ip communication link. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "xeDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "xeCommLink.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "deSocket.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "deRingBuffer.hpp" 30*35238bceSAndroid Build Coastguard Worker #include "deBlockBuffer.hpp" 31*35238bceSAndroid Build Coastguard Worker #include "xsProtocol.hpp" 32*35238bceSAndroid Build Coastguard Worker #include "deThread.hpp" 33*35238bceSAndroid Build Coastguard Worker #include "deTimer.h" 34*35238bceSAndroid Build Coastguard Worker 35*35238bceSAndroid Build Coastguard Worker #include <vector> 36*35238bceSAndroid Build Coastguard Worker 37*35238bceSAndroid Build Coastguard Worker namespace xe 38*35238bceSAndroid Build Coastguard Worker { 39*35238bceSAndroid Build Coastguard Worker 40*35238bceSAndroid Build Coastguard Worker class TcpIpLinkState 41*35238bceSAndroid Build Coastguard Worker { 42*35238bceSAndroid Build Coastguard Worker public: 43*35238bceSAndroid Build Coastguard Worker TcpIpLinkState(CommLinkState initialState, const char *initialErr); 44*35238bceSAndroid Build Coastguard Worker ~TcpIpLinkState(void); 45*35238bceSAndroid Build Coastguard Worker 46*35238bceSAndroid Build Coastguard Worker CommLinkState getState(void) const; 47*35238bceSAndroid Build Coastguard Worker CommLinkState getState(std::string &error) const; 48*35238bceSAndroid Build Coastguard Worker 49*35238bceSAndroid Build Coastguard Worker void setCallbacks(CommLink::StateChangedFunc stateChangedCallback, CommLink::LogDataFunc testLogDataCallback, 50*35238bceSAndroid Build Coastguard Worker CommLink::LogDataFunc infoLogDataCallback, void *userPtr); 51*35238bceSAndroid Build Coastguard Worker 52*35238bceSAndroid Build Coastguard Worker void setState(CommLinkState state, const char *error = ""); 53*35238bceSAndroid Build Coastguard Worker void onTestLogData(const uint8_t *bytes, size_t numBytes) const; 54*35238bceSAndroid Build Coastguard Worker void onInfoLogData(const uint8_t *bytes, size_t numBytes) const; 55*35238bceSAndroid Build Coastguard Worker 56*35238bceSAndroid Build Coastguard Worker void onKeepaliveReceived(void); 57*35238bceSAndroid Build Coastguard Worker uint64_t getLastKeepaliveRecevied(void) const; 58*35238bceSAndroid Build Coastguard Worker 59*35238bceSAndroid Build Coastguard Worker private: 60*35238bceSAndroid Build Coastguard Worker mutable de::Mutex m_lock; 61*35238bceSAndroid Build Coastguard Worker volatile CommLinkState m_state; 62*35238bceSAndroid Build Coastguard Worker std::string m_error; 63*35238bceSAndroid Build Coastguard Worker 64*35238bceSAndroid Build Coastguard Worker volatile uint64_t m_lastKeepaliveReceived; 65*35238bceSAndroid Build Coastguard Worker 66*35238bceSAndroid Build Coastguard Worker volatile CommLink::StateChangedFunc m_stateChangedCallback; 67*35238bceSAndroid Build Coastguard Worker volatile CommLink::LogDataFunc m_testLogDataCallback; 68*35238bceSAndroid Build Coastguard Worker volatile CommLink::LogDataFunc m_infoLogDataCallback; 69*35238bceSAndroid Build Coastguard Worker void *volatile m_userPtr; 70*35238bceSAndroid Build Coastguard Worker }; 71*35238bceSAndroid Build Coastguard Worker 72*35238bceSAndroid Build Coastguard Worker class TcpIpSendThread : public de::Thread 73*35238bceSAndroid Build Coastguard Worker { 74*35238bceSAndroid Build Coastguard Worker public: 75*35238bceSAndroid Build Coastguard Worker TcpIpSendThread(de::Socket &socket, TcpIpLinkState &state); 76*35238bceSAndroid Build Coastguard Worker ~TcpIpSendThread(void); 77*35238bceSAndroid Build Coastguard Worker 78*35238bceSAndroid Build Coastguard Worker void start(void); 79*35238bceSAndroid Build Coastguard Worker void run(void); 80*35238bceSAndroid Build Coastguard Worker void stop(void); 81*35238bceSAndroid Build Coastguard Worker isRunning(void) const82*35238bceSAndroid Build Coastguard Worker bool isRunning(void) const 83*35238bceSAndroid Build Coastguard Worker { 84*35238bceSAndroid Build Coastguard Worker return m_isRunning; 85*35238bceSAndroid Build Coastguard Worker } 86*35238bceSAndroid Build Coastguard Worker getBuffer(void)87*35238bceSAndroid Build Coastguard Worker de::BlockBuffer<uint8_t> &getBuffer(void) 88*35238bceSAndroid Build Coastguard Worker { 89*35238bceSAndroid Build Coastguard Worker return m_buffer; 90*35238bceSAndroid Build Coastguard Worker } 91*35238bceSAndroid Build Coastguard Worker 92*35238bceSAndroid Build Coastguard Worker private: 93*35238bceSAndroid Build Coastguard Worker de::Socket &m_socket; 94*35238bceSAndroid Build Coastguard Worker TcpIpLinkState &m_state; 95*35238bceSAndroid Build Coastguard Worker 96*35238bceSAndroid Build Coastguard Worker de::BlockBuffer<uint8_t> m_buffer; 97*35238bceSAndroid Build Coastguard Worker 98*35238bceSAndroid Build Coastguard Worker bool m_isRunning; 99*35238bceSAndroid Build Coastguard Worker }; 100*35238bceSAndroid Build Coastguard Worker 101*35238bceSAndroid Build Coastguard Worker class TcpIpRecvThread : public de::Thread 102*35238bceSAndroid Build Coastguard Worker { 103*35238bceSAndroid Build Coastguard Worker public: 104*35238bceSAndroid Build Coastguard Worker TcpIpRecvThread(de::Socket &socket, TcpIpLinkState &state); 105*35238bceSAndroid Build Coastguard Worker ~TcpIpRecvThread(void); 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Worker void start(void); 108*35238bceSAndroid Build Coastguard Worker void run(void); 109*35238bceSAndroid Build Coastguard Worker void stop(void); 110*35238bceSAndroid Build Coastguard Worker isRunning(void) const111*35238bceSAndroid Build Coastguard Worker bool isRunning(void) const 112*35238bceSAndroid Build Coastguard Worker { 113*35238bceSAndroid Build Coastguard Worker return m_isRunning; 114*35238bceSAndroid Build Coastguard Worker } 115*35238bceSAndroid Build Coastguard Worker 116*35238bceSAndroid Build Coastguard Worker private: 117*35238bceSAndroid Build Coastguard Worker void handleMessage(xs::MessageType messageType, const uint8_t *data, size_t dataSize); 118*35238bceSAndroid Build Coastguard Worker 119*35238bceSAndroid Build Coastguard Worker de::Socket &m_socket; 120*35238bceSAndroid Build Coastguard Worker TcpIpLinkState &m_state; 121*35238bceSAndroid Build Coastguard Worker 122*35238bceSAndroid Build Coastguard Worker std::vector<uint8_t> m_curMsgBuf; 123*35238bceSAndroid Build Coastguard Worker size_t m_curMsgPos; 124*35238bceSAndroid Build Coastguard Worker 125*35238bceSAndroid Build Coastguard Worker bool m_isRunning; 126*35238bceSAndroid Build Coastguard Worker }; 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker class TcpIpLink : public CommLink 129*35238bceSAndroid Build Coastguard Worker { 130*35238bceSAndroid Build Coastguard Worker public: 131*35238bceSAndroid Build Coastguard Worker TcpIpLink(void); 132*35238bceSAndroid Build Coastguard Worker ~TcpIpLink(void); 133*35238bceSAndroid Build Coastguard Worker 134*35238bceSAndroid Build Coastguard Worker // TcpIpLink -specific API 135*35238bceSAndroid Build Coastguard Worker void connect(const de::SocketAddress &address); 136*35238bceSAndroid Build Coastguard Worker void disconnect(void); 137*35238bceSAndroid Build Coastguard Worker 138*35238bceSAndroid Build Coastguard Worker // CommLink API 139*35238bceSAndroid Build Coastguard Worker void reset(void); 140*35238bceSAndroid Build Coastguard Worker 141*35238bceSAndroid Build Coastguard Worker CommLinkState getState(void) const; 142*35238bceSAndroid Build Coastguard Worker CommLinkState getState(std::string &error) const; 143*35238bceSAndroid Build Coastguard Worker 144*35238bceSAndroid Build Coastguard Worker void setCallbacks(StateChangedFunc stateChangedCallback, LogDataFunc testLogDataCallback, 145*35238bceSAndroid Build Coastguard Worker LogDataFunc infoLogDataCallback, void *userPtr); 146*35238bceSAndroid Build Coastguard Worker 147*35238bceSAndroid Build Coastguard Worker void startTestProcess(const char *name, const char *params, const char *workingDir, const char *caseList); 148*35238bceSAndroid Build Coastguard Worker void stopTestProcess(void); 149*35238bceSAndroid Build Coastguard Worker 150*35238bceSAndroid Build Coastguard Worker private: 151*35238bceSAndroid Build Coastguard Worker void closeConnection(void); 152*35238bceSAndroid Build Coastguard Worker 153*35238bceSAndroid Build Coastguard Worker static void keepaliveTimerCallback(void *ptr); 154*35238bceSAndroid Build Coastguard Worker 155*35238bceSAndroid Build Coastguard Worker de::Socket m_socket; 156*35238bceSAndroid Build Coastguard Worker TcpIpLinkState m_state; 157*35238bceSAndroid Build Coastguard Worker 158*35238bceSAndroid Build Coastguard Worker TcpIpSendThread m_sendThread; 159*35238bceSAndroid Build Coastguard Worker TcpIpRecvThread m_recvThread; 160*35238bceSAndroid Build Coastguard Worker 161*35238bceSAndroid Build Coastguard Worker deTimer *m_keepaliveTimer; 162*35238bceSAndroid Build Coastguard Worker }; 163*35238bceSAndroid Build Coastguard Worker 164*35238bceSAndroid Build Coastguard Worker } // namespace xe 165*35238bceSAndroid Build Coastguard Worker 166*35238bceSAndroid Build Coastguard Worker #endif // _XETCPIPLINK_HPP 167