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 
32 namespace xs
33 {
34 
35 enum
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 
45 enum 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 
65 class MessageWriter;
66 
67 class Message
68 {
69 public:
70 	MessageType		type;
71 
Message(MessageType type_)72 					Message			(MessageType type_) : type(type_) {}
~Message(void)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 
80 protected:
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.
88 template <int MsgType>
89 class SimpleMessage : public Message
90 {
91 public:
SimpleMessage(const deUint8 * data,int dataSize)92 					SimpleMessage	(const deUint8* data, int dataSize) : Message((MessageType)MsgType) { DE_UNREF(data); XS_CHECK_MSG(dataSize == 0, "No payload expected"); }
SimpleMessage(void)93 					SimpleMessage	(void) : Message((MessageType)MsgType) {}
~SimpleMessage(void)94 					~SimpleMessage	(void) {}
95 
write(std::vector<deUint8> & buf) const96 	void			write			(std::vector<deUint8>& buf) const { writeNoData(buf); }
97 };
98 
99 typedef SimpleMessage<MESSAGETYPE_STOP_EXECUTION>			StopExecutionMessage;
100 typedef SimpleMessage<MESSAGETYPE_PROCESS_STARTED>			ProcessStartedMessage;
101 typedef SimpleMessage<MESSAGETYPE_KEEPALIVE>				KeepAliveMessage;
102 
103 class HelloMessage : public Message
104 {
105 public:
106 	int				version;
107 
108 					HelloMessage	(const deUint8* data, int dataSize);
HelloMessage(void)109 					HelloMessage	(void) : Message(MESSAGETYPE_HELLO), version(PROTOCOL_VERSION) {}
~HelloMessage(void)110 					~HelloMessage	(void) {}
111 
112 	void			write			(std::vector<deUint8>& buf) const;
113 };
114 
115 class ExecuteBinaryMessage : public Message
116 {
117 public:
118 	std::string		name;
119 	std::string		params;
120 	std::string		workDir;
121 	std::string		caseList;
122 
123 					ExecuteBinaryMessage	(const deUint8* data, int dataSize);
ExecuteBinaryMessage(void)124 					ExecuteBinaryMessage	(void) : Message(MESSAGETYPE_EXECUTE_BINARY) {}
~ExecuteBinaryMessage(void)125 					~ExecuteBinaryMessage	(void) {};
126 
127 	void			write			(std::vector<deUint8>& buf) const;
128 };
129 
130 class ProcessLogDataMessage : public Message
131 {
132 public:
133 	std::string		logData;
134 
135 					ProcessLogDataMessage		(const deUint8* data, int dataSize);
~ProcessLogDataMessage(void)136 					~ProcessLogDataMessage		(void) {}
137 
138 	void			write						(std::vector<deUint8>& buf) const;
139 };
140 
141 class ProcessLaunchFailedMessage : public Message
142 {
143 public:
144 	std::string		reason;
145 
146 					ProcessLaunchFailedMessage			(const deUint8* data, int dataSize);
ProcessLaunchFailedMessage(const char * reason_)147 					ProcessLaunchFailedMessage			(const char* reason_) : Message(MESSAGETYPE_PROCESS_LAUNCH_FAILED), reason(reason_) {}
~ProcessLaunchFailedMessage(void)148 					~ProcessLaunchFailedMessage			(void) {}
149 
150 	void			write								(std::vector<deUint8>& buf) const;
151 };
152 
153 class ProcessFinishedMessage : public Message
154 {
155 public:
156 	int				exitCode;
157 
158 					ProcessFinishedMessage			(const deUint8* data, int dataSize);
ProcessFinishedMessage(int exitCode_)159 					ProcessFinishedMessage			(int exitCode_) : Message(MESSAGETYPE_PROCESS_FINISHED), exitCode(exitCode_) {}
~ProcessFinishedMessage(void)160 					~ProcessFinishedMessage			(void) {}
161 
162 	void			write							(std::vector<deUint8>& buf) const;
163 };
164 
165 class InfoMessage : public Message
166 {
167 public:
168 	std::string		info;
169 
170 					InfoMessage			(const deUint8* data, int dataSize);
~InfoMessage(void)171 					~InfoMessage		(void) {}
172 
173 	void			write				(std::vector<deUint8>& buf) const;
174 };
175 
176 // For debug purposes only.
177 class TestMessage : public Message
178 {
179 public:
180 	std::string		test;
181 
182 					TestMessage		(const deUint8* data, int dataSize);
~TestMessage(void)183 					~TestMessage	(void) {}
184 
185 	void			write			(std::vector<deUint8>& buf) const;
186 };
187 
188 } // xs
189 
190 #endif // _XSPROTOCOL_HPP
191