13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _XETCPIPLINK_HPP 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _XETCPIPLINK_HPP 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Test Executor 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------ 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Tcp/Ip communication link. 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xeDefs.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xeCommLink.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deSocket.hpp" 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRingBuffer.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deBlockBuffer.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "xsProtocol.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deThread.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deTimer.h" 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector> 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace xe 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TcpIpLinkState 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpLinkState (CommLinkState initialState, const char* initialErr); 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~TcpIpLinkState (void); 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CommLinkState getState (void) const; 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CommLinkState getState (std::string& error) const; 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setCallbacks (CommLink::StateChangedFunc stateChangedCallback, CommLink::LogDataFunc testLogDataCallback, CommLink::LogDataFunc infoLogDataCallback, void* userPtr); 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setState (CommLinkState state, const char* error = ""); 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void onTestLogData (const deUint8* bytes, int numBytes) const; 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void onInfoLogData (const deUint8* bytes, int numBytes) const; 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void onKeepaliveReceived (void); 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint64 getLastKeepaliveRecevied (void) const; 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry mutable de::Mutex m_lock; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry volatile CommLinkState m_state; 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::string m_error; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry volatile deUint64 m_lastKeepaliveReceived; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry volatile CommLink::StateChangedFunc m_stateChangedCallback; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry volatile CommLink::LogDataFunc m_testLogDataCallback; 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry volatile CommLink::LogDataFunc m_infoLogDataCallback; 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void* volatile m_userPtr; 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TcpIpSendThread : public de::Thread 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpSendThread (de::Socket& socket, TcpIpLinkState& state); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~TcpIpSendThread (void); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void start (void); 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void run (void); 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void stop (void); 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isRunning (void) const { return m_isRunning; } 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::BlockBuffer<deUint8>& getBuffer (void) { return m_buffer; } 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Socket& m_socket; 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpLinkState& m_state; 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::BlockBuffer<deUint8> m_buffer; 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool m_isRunning; 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TcpIpRecvThread : public de::Thread 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpRecvThread (de::Socket& socket, TcpIpLinkState& state); 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~TcpIpRecvThread (void); 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void start (void); 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void run (void); 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void stop (void); 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isRunning (void) const { return m_isRunning; } 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void handleMessage (xs::MessageType messageType, const deUint8* data, int dataSize); 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Socket& m_socket; 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpLinkState& m_state; 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::vector<deUint8> m_curMsgBuf; 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int m_curMsgPos; 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool m_isRunning; 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TcpIpLink : public CommLink 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpLink (void); 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~TcpIpLink (void); 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // TcpIpLink -specific API 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void connect (const de::SocketAddress& address); 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void disconnect (void); 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // CommLink API 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void reset (void); 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CommLinkState getState (void) const; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry CommLinkState getState (std::string& error) const; 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setCallbacks (StateChangedFunc stateChangedCallback, LogDataFunc testLogDataCallback, LogDataFunc infoLogDataCallback, void* userPtr); 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void startTestProcess (const char* name, const char* params, const char* workingDir, const char* caseList); 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void stopTestProcess (void); 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void closeConnection (void); 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry static void keepaliveTimerCallback (void* ptr); 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Socket m_socket; 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpLinkState m_state; 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpSendThread m_sendThread; 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TcpIpRecvThread m_recvThread; 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deTimer* m_keepaliveTimer; 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // xe 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _XETCPIPLINK_HPP 156