1129202Scognet// AppRunner.h
2141379Sdas
3129202Scognet#ifndef APP_RUNNER_H
4129202Scognet#define APP_RUNNER_H
5129202Scognet
6129202Scognet#include <stdio.h>
7129202Scognet
8129202Scognet#include <DataIO.h>
9129202Scognet#include <Entry.h>
10129202Scognet#include <Locker.h>
11129202Scognet
12129202Scognetclass AppRunner {
13129202Scognetpublic:
14129202Scognet	AppRunner(bool requestQuitOnDestruction = false);
15129202Scognet	~AppRunner();
16129202Scognet
17129202Scognet	status_t Run(const char *command, const char *args = NULL,
18129202Scognet				 bool findCommand = true);
19129202Scognet	bool HasQuitted();
20129202Scognet	void WaitFor(bool requestQuit = false);
21129202Scognet	team_id Team();
22129202Scognet	port_id AppLooperPort();
23129202Scognet	status_t GetRef(entry_ref *ref);
24129202Scognet	status_t RequestQuit();
25129202Scognet
26129202Scognet	status_t GetOutput(BString *buffer);
27129202Scognet	ssize_t ReadOutput(void *buffer, size_t size);
28129202Scognet	ssize_t ReadOutputAt(off_t position, void *buffer, size_t size);
29186461Smarcel
30186461Smarcelprivate:
31186461Smarcel	static int32 _ReaderEntry(void *data);
32186461Smarcel	int32 _ReaderLoop();
33186461Smarcel
34186461Smarcel	static bool _LockTeamPort();
35129202Scognet	static void _UnlockTeamPort();
36129202Scognet	static port_id _ReadPortID(BMessenger &messenger);
37129202Scognet
38186461Smarcelprivate:
39186461Smarcel	BLocker		fOutputLock;
40129202Scognet	port_id		fRemotePort;
41186461Smarcel	BMallocIO	fOutput;
42143858Scognet	thread_id	fReader;
43143858Scognet	team_id		fTeam;
44129202Scognet	entry_ref	fRef;
45186461Smarcel	BMessenger	fMessenger;
46186461Smarcel	bool		fRequestQuitOnDestruction;
47186461Smarcel
48186461Smarcel	static port_id	fTeamPort;
49143858Scognet	static BLocker	fTeamPortLock;
50143858Scognet};
51143858Scognet
52143858Scognetstatus_t find_test_app(const char *testApp, BString *path);
53143858Scognetstatus_t find_test_app(const char *testApp, entry_ref *ref);
54129202Scognet
55129202Scognet#endif	// APP_RUNNER_H
56129202Scognet