#ifndef _TCUANDROIDEXECSERVICE_HPP #define _TCUANDROIDEXECSERVICE_HPP /*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * 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 Android ExecService. *//*--------------------------------------------------------------------*/ #include "tcuDefs.hpp" #include "deThread.hpp" #include "xsExecutionServer.hpp" #include "xsPosixFileReader.hpp" #include namespace tcu { namespace Android { enum { DEFAULT_PORT = 50016, DEFAULT_SOCKETFAMILY = DE_SOCKETFAMILY_INET4 }; class TestProcess : public xs::TestProcess { public: TestProcess(JavaVM *vm, jobject context); ~TestProcess(void); virtual void start(const char *name, const char *params, const char *workingDir, const char *caseList); virtual void terminate(void); virtual void cleanup(void); virtual bool isRunning(void); virtual int getExitCode(void) const; virtual int readTestLog(uint8_t *dst, int numBytes); virtual int readInfoLog(uint8_t *dst, int numBytes); private: JNIEnv *getCurrentThreadEnv(void); JavaVM *m_vm; jclass m_remoteCls; jobject m_remote; jmethodID m_start; jmethodID m_kill; jmethodID m_isRunning; uint64_t m_launchTime; uint64_t m_lastQueryTime; bool m_lastRunningStatus; xs::posix::FileReader m_logReader; }; class ExecutionServer : public xs::ExecutionServer { public: ExecutionServer(JavaVM *vm, xs::TestProcess *testProcess, deSocketFamily family, int port, RunMode runMode); xs::ConnectionHandler *createHandler(de::Socket *socket, const de::SocketAddress &clientAddress); private: JavaVM *m_vm; }; class ConnectionHandler : public xs::ExecutionRequestHandler { public: ConnectionHandler(JavaVM *vm, xs::ExecutionServer *server, de::Socket *socket); void run(void); private: JavaVM *m_vm; }; class ServerThread : public de::Thread { public: ServerThread(JavaVM *vm, xs::TestProcess *testProcess, deSocketFamily family, int port); void run(void); void stop(void); private: ExecutionServer m_server; }; class ExecService { public: ExecService(JavaVM *vm, jobject context, int port, deSocketFamily family = (deSocketFamily)DEFAULT_SOCKETFAMILY); ~ExecService(void); void start(void); void stop(void); private: ExecService(const ExecService &other); ExecService &operator=(const ExecService &other); TestProcess m_process; ServerThread m_thread; }; } // namespace Android } // namespace tcu #endif // _TCUANDROIDEXECSERVICE_HPP