| #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 |