You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.4 KiB
190 lines
5.4 KiB
#ifndef _XSPROTOCOL_HPP |
|
#define _XSPROTOCOL_HPP |
|
/*------------------------------------------------------------------------- |
|
* drawElements Quality Program Execution Server |
|
* --------------------------------------------- |
|
* |
|
* Copyright 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. |
|
* |
|
*//*! |
|
* \file |
|
* \brief Execution Server Protocol. |
|
*//*--------------------------------------------------------------------*/ |
|
|
|
#include "xsDefs.hpp" |
|
#include "deMemory.h" |
|
|
|
#include <string> |
|
#include <vector> |
|
|
|
namespace xs |
|
{ |
|
|
|
enum |
|
{ |
|
PROTOCOL_VERSION = 18, |
|
MESSAGE_HEADER_SIZE = 8, |
|
|
|
// Times are in milliseconds. |
|
KEEPALIVE_SEND_INTERVAL = 5000, |
|
KEEPALIVE_TIMEOUT = 30000, |
|
}; |
|
|
|
enum MessageType |
|
{ |
|
MESSAGETYPE_NONE = 0, //!< Not valid. |
|
|
|
// Commands (from Client to ExecServer). |
|
MESSAGETYPE_HELLO = 100, //!< First message from client, specifies the protocol version |
|
MESSAGETYPE_TEST = 101, //!< Debug only |
|
MESSAGETYPE_EXECUTE_BINARY = 111, //!< Request execution of a test package binary. |
|
MESSAGETYPE_STOP_EXECUTION = 112, //!< Request cancellation of the currently executing binary. |
|
|
|
// Responses (from ExecServer to Client) |
|
MESSAGETYPE_PROCESS_STARTED = 200, //!< Requested process has started. |
|
MESSAGETYPE_PROCESS_LAUNCH_FAILED = 201, //!< Requested process failed to launch. |
|
MESSAGETYPE_PROCESS_FINISHED = 202, //!< Requested process has finished (for any reason). |
|
MESSAGETYPE_PROCESS_LOG_DATA = 203, //!< Unprocessed log data from TestResults.qpa. |
|
MESSAGETYPE_INFO = 204, //!< Generic info message from ExecServer (for debugging purposes). |
|
|
|
MESSAGETYPE_KEEPALIVE = 102 //!< Keep-alive packet |
|
}; |
|
|
|
class MessageWriter; |
|
|
|
class Message |
|
{ |
|
public: |
|
MessageType type; |
|
|
|
Message (MessageType type_) : type(type_) {} |
|
virtual ~Message (void) {} |
|
|
|
virtual void write (std::vector<deUint8>& buf) const = DE_NULL; |
|
|
|
static void parseHeader (const deUint8* data, size_t dataSize, MessageType& type, size_t& messageSize); |
|
static void writeHeader (MessageType type, size_t messageSize, deUint8* dst, size_t bufSize); |
|
|
|
protected: |
|
void writeNoData (std::vector<deUint8>& buf) const; |
|
|
|
Message (const Message& other); |
|
Message& operator= (const Message& other); |
|
}; |
|
|
|
// Simple messages without any data. |
|
template <int MsgType> |
|
class SimpleMessage : public Message |
|
{ |
|
public: |
|
SimpleMessage (const deUint8* data, size_t dataSize) : Message((MessageType)MsgType) { DE_UNREF(data); XS_CHECK_MSG(dataSize == 0, "No payload expected"); } |
|
SimpleMessage (void) : Message((MessageType)MsgType) {} |
|
~SimpleMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const { writeNoData(buf); } |
|
}; |
|
|
|
typedef SimpleMessage<MESSAGETYPE_STOP_EXECUTION> StopExecutionMessage; |
|
typedef SimpleMessage<MESSAGETYPE_PROCESS_STARTED> ProcessStartedMessage; |
|
typedef SimpleMessage<MESSAGETYPE_KEEPALIVE> KeepAliveMessage; |
|
|
|
class HelloMessage : public Message |
|
{ |
|
public: |
|
int version; |
|
|
|
HelloMessage (const deUint8* data, size_t dataSize); |
|
HelloMessage (void) : Message(MESSAGETYPE_HELLO), version(PROTOCOL_VERSION) {} |
|
~HelloMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
class ExecuteBinaryMessage : public Message |
|
{ |
|
public: |
|
std::string name; |
|
std::string params; |
|
std::string workDir; |
|
std::string caseList; |
|
|
|
ExecuteBinaryMessage (const deUint8* data, size_t dataSize); |
|
ExecuteBinaryMessage (void) : Message(MESSAGETYPE_EXECUTE_BINARY) {} |
|
~ExecuteBinaryMessage (void) {}; |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
class ProcessLogDataMessage : public Message |
|
{ |
|
public: |
|
std::string logData; |
|
|
|
ProcessLogDataMessage (const deUint8* data, size_t dataSize); |
|
~ProcessLogDataMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
class ProcessLaunchFailedMessage : public Message |
|
{ |
|
public: |
|
std::string reason; |
|
|
|
ProcessLaunchFailedMessage (const deUint8* data, size_t dataSize); |
|
ProcessLaunchFailedMessage (const char* reason_) : Message(MESSAGETYPE_PROCESS_LAUNCH_FAILED), reason(reason_) {} |
|
~ProcessLaunchFailedMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
class ProcessFinishedMessage : public Message |
|
{ |
|
public: |
|
int exitCode; |
|
|
|
ProcessFinishedMessage (const deUint8* data, size_t dataSize); |
|
ProcessFinishedMessage (int exitCode_) : Message(MESSAGETYPE_PROCESS_FINISHED), exitCode(exitCode_) {} |
|
~ProcessFinishedMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
class InfoMessage : public Message |
|
{ |
|
public: |
|
std::string info; |
|
|
|
InfoMessage (const deUint8* data, size_t dataSize); |
|
~InfoMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
// For debug purposes only. |
|
class TestMessage : public Message |
|
{ |
|
public: |
|
std::string test; |
|
|
|
TestMessage (const deUint8* data, size_t dataSize); |
|
~TestMessage (void) {} |
|
|
|
void write (std::vector<deUint8>& buf) const; |
|
}; |
|
|
|
} // xs |
|
|
|
#endif // _XSPROTOCOL_HPP
|
|
|