191 lines
5.4 KiB
C++
191 lines
5.4 KiB
C++
#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
|