1#ifndef _XSPROTOCOL_HPP
2#define _XSPROTOCOL_HPP
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program Execution Server
5 * ---------------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Execution Server Protocol.
24 *//*--------------------------------------------------------------------*/
25
26#include "xsDefs.hpp"
27#include "deMemory.h"
28
29#include <string>
30#include <vector>
31
32namespace xs
33{
34
35enum
36{
37	PROTOCOL_VERSION			= 18,
38	MESSAGE_HEADER_SIZE			= 8,
39
40	// Times are in milliseconds.
41	KEEPALIVE_SEND_INTERVAL		= 5000,
42	KEEPALIVE_TIMEOUT			= 30000,
43};
44
45enum MessageType
46{
47	MESSAGETYPE_NONE					= 0,	//!< Not valid.
48
49	// Commands (from Client to ExecServer).
50	MESSAGETYPE_HELLO					= 100,	//!< First message from client, specifies the protocol version
51	MESSAGETYPE_TEST					= 101,	//!< Debug only
52	MESSAGETYPE_EXECUTE_BINARY			= 111,	//!< Request execution of a test package binary.
53	MESSAGETYPE_STOP_EXECUTION			= 112,	//!< Request cancellation of the currently executing binary.
54
55	// Responses (from ExecServer to Client)
56	MESSAGETYPE_PROCESS_STARTED			= 200,	//!< Requested process has started.
57	MESSAGETYPE_PROCESS_LAUNCH_FAILED	= 201,	//!< Requested process failed to launch.
58	MESSAGETYPE_PROCESS_FINISHED		= 202,	//!< Requested process has finished (for any reason).
59	MESSAGETYPE_PROCESS_LOG_DATA		= 203,	//!< Unprocessed log data from TestResults.qpa.
60	MESSAGETYPE_INFO					= 204,	//!< Generic info message from ExecServer (for debugging purposes).
61
62	MESSAGETYPE_KEEPALIVE				= 102	//!< Keep-alive packet
63};
64
65class MessageWriter;
66
67class Message
68{
69public:
70	MessageType		type;
71
72					Message			(MessageType type_) : type(type_) {}
73	virtual			 ~Message		(void) {}
74
75	virtual void	write			(std::vector<deUint8>& buf) const = DE_NULL;
76
77	static void		parseHeader		(const deUint8* data, int dataSize, MessageType& type, int& messageSize);
78	static void		writeHeader		(MessageType type, int messageSize, deUint8* dst, int bufSize);
79
80protected:
81	void			writeNoData		(std::vector<deUint8>& buf) const;
82
83					Message			(const Message& other);
84	Message&		operator=		(const Message& other);
85};
86
87// Simple messages without any data.
88template <int MsgType>
89class SimpleMessage : public Message
90{
91public:
92					SimpleMessage	(const deUint8* data, int dataSize) : Message((MessageType)MsgType) { DE_UNREF(data); XS_CHECK_MSG(dataSize == 0, "No payload expected"); }
93					SimpleMessage	(void) : Message((MessageType)MsgType) {}
94					~SimpleMessage	(void) {}
95
96	void			write			(std::vector<deUint8>& buf) const { writeNoData(buf); }
97};
98
99typedef SimpleMessage<MESSAGETYPE_STOP_EXECUTION>			StopExecutionMessage;
100typedef SimpleMessage<MESSAGETYPE_PROCESS_STARTED>			ProcessStartedMessage;
101typedef SimpleMessage<MESSAGETYPE_KEEPALIVE>				KeepAliveMessage;
102
103class HelloMessage : public Message
104{
105public:
106	int				version;
107
108					HelloMessage	(const deUint8* data, int dataSize);
109					HelloMessage	(void) : Message(MESSAGETYPE_HELLO), version(PROTOCOL_VERSION) {}
110					~HelloMessage	(void) {}
111
112	void			write			(std::vector<deUint8>& buf) const;
113};
114
115class ExecuteBinaryMessage : public Message
116{
117public:
118	std::string		name;
119	std::string		params;
120	std::string		workDir;
121	std::string		caseList;
122
123					ExecuteBinaryMessage	(const deUint8* data, int dataSize);
124					ExecuteBinaryMessage	(void) : Message(MESSAGETYPE_EXECUTE_BINARY) {}
125					~ExecuteBinaryMessage	(void) {};
126
127	void			write			(std::vector<deUint8>& buf) const;
128};
129
130class ProcessLogDataMessage : public Message
131{
132public:
133	std::string		logData;
134
135					ProcessLogDataMessage		(const deUint8* data, int dataSize);
136					~ProcessLogDataMessage		(void) {}
137
138	void			write						(std::vector<deUint8>& buf) const;
139};
140
141class ProcessLaunchFailedMessage : public Message
142{
143public:
144	std::string		reason;
145
146					ProcessLaunchFailedMessage			(const deUint8* data, int dataSize);
147					ProcessLaunchFailedMessage			(const char* reason_) : Message(MESSAGETYPE_PROCESS_LAUNCH_FAILED), reason(reason_) {}
148					~ProcessLaunchFailedMessage			(void) {}
149
150	void			write								(std::vector<deUint8>& buf) const;
151};
152
153class ProcessFinishedMessage : public Message
154{
155public:
156	int				exitCode;
157
158					ProcessFinishedMessage			(const deUint8* data, int dataSize);
159					ProcessFinishedMessage			(int exitCode_) : Message(MESSAGETYPE_PROCESS_FINISHED), exitCode(exitCode_) {}
160					~ProcessFinishedMessage			(void) {}
161
162	void			write							(std::vector<deUint8>& buf) const;
163};
164
165class InfoMessage : public Message
166{
167public:
168	std::string		info;
169
170					InfoMessage			(const deUint8* data, int dataSize);
171					~InfoMessage		(void) {}
172
173	void			write				(std::vector<deUint8>& buf) const;
174};
175
176// For debug purposes only.
177class TestMessage : public Message
178{
179public:
180	std::string		test;
181
182					TestMessage		(const deUint8* data, int dataSize);
183					~TestMessage	(void) {}
184
185	void			write			(std::vector<deUint8>& buf) const;
186};
187
188} // xs
189
190#endif // _XSPROTOCOL_HPP
191