blob: 72e2d5efb3f750bcaacd887319355af62825bd93 [file] [log] [blame]
#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