1#ifndef _XSEXECUTIONSERVER_HPP
2#define _XSEXECUTIONSERVER_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 Test Execution Server.
24 *//*--------------------------------------------------------------------*/
25
26#include "xsDefs.hpp"
27#include "xsTcpServer.hpp"
28#include "xsTestDriver.hpp"
29#include "xsProtocol.hpp"
30#include "xsTestProcess.hpp"
31
32#include <vector>
33
34namespace xs
35{
36
37class ExecutionServer : public TcpServer
38{
39public:
40	enum RunMode
41	{
42		RUNMODE_SINGLE_EXEC	= 0,
43		RUNMODE_FOREVER,
44
45		RUNMODE_LAST
46	};
47
48							ExecutionServer			(xs::TestProcess* testProcess, deSocketFamily family, int port, RunMode runMode);
49							~ExecutionServer		(void);
50
51	ConnectionHandler*		createHandler			(de::Socket* socket, const de::SocketAddress& clientAddress);
52
53	TestDriver*				acquireTestDriver		(void);
54	void					releaseTestDriver		(TestDriver* driver);
55
56	void					connectionDone			(ConnectionHandler* handler);
57
58private:
59	TestDriver				m_testDriver;
60	de::Mutex				m_testDriverLock;
61	RunMode					m_runMode;
62};
63
64class MessageBuilder
65{
66public:
67							MessageBuilder		(void) { clear(); }
68							~MessageBuilder		(void) {}
69
70	void					read				(ByteBuffer& buffer);
71	void					clear				(void);
72
73	bool					isComplete			(void) const;
74	MessageType				getMessageType		(void) const	{ return m_messageType;	}
75	size_t					getMessageSize		(void) const	{ return m_messageSize; }
76	const deUint8*			getMessageData		(void) const;
77	size_t					getMessageDataSize	(void) const;
78
79private:
80	std::vector<deUint8>	m_buffer;
81	MessageType				m_messageType;
82	size_t					m_messageSize;
83};
84
85class ExecutionRequestHandler : public ConnectionHandler
86{
87public:
88								ExecutionRequestHandler			(ExecutionServer* server, de::Socket* socket);
89								~ExecutionRequestHandler		(void);
90
91protected:
92	void						handle							(void);
93
94private:
95								ExecutionRequestHandler			(const ExecutionRequestHandler& handler);
96	ExecutionRequestHandler&	operator=						(const ExecutionRequestHandler& handler);
97
98	void						processSession					(void);
99	void						processMessage					(MessageType type, const deUint8* data, size_t dataSize);
100
101	inline TestDriver*			getTestDriver					(void) { if (!m_testDriver) acquireTestDriver(); return m_testDriver; }
102	void						acquireTestDriver				(void);
103
104	void						initKeepAlives					(void);
105	void						keepAliveReceived				(void);
106	void						pollKeepAlives					(void);
107
108	bool						receive							(void);
109	bool						send							(void);
110
111	ExecutionServer*			m_execServer;
112	TestDriver*					m_testDriver;
113
114	ByteBuffer					m_bufferIn;
115	ByteBuffer					m_bufferOut;
116
117	bool						m_run;
118	MessageBuilder				m_msgBuilder;
119
120	// \todo [2011-09-30 pyry] Move to some watchdog class instead.
121	deUint64					m_lastKeepAliveSent;
122	deUint64					m_lastKeepAliveReceived;
123
124	std::vector<deUint8>		m_sendRecvTmpBuf;
125};
126
127} // xs
128
129#endif // _XSEXECUTIONSERVER_HPP
130