1// TestApp.cpp
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#include <Autolock.h>
8
9#include <TestApp.h>
10
11// TestHandler
12
13// MessageReceived
14_EXPORT
15void
16BTestHandler::MessageReceived(BMessage *message)
17{
18	// clone and push it
19	BMessage *clone = new BMessage(*message);
20	fQueue.Lock();
21	fQueue.AddMessage(clone);
22	fQueue.Unlock();
23}
24
25// Queue
26_EXPORT
27BMessageQueue &
28BTestHandler::Queue()
29{
30	return fQueue;
31}
32
33
34// TestApp
35
36static status_t sInitError;
37
38// constructor
39_EXPORT
40BTestApp::BTestApp(const char *signature)
41	   : BApplication(signature, &sInitError),
42		 fAppThread(B_ERROR),
43		 fHandlers()
44{
45	if (sInitError != B_OK) {
46		fprintf(stderr, "BTestApp::BTestApp(): Failed to create BApplication: "
47			"%s\n", strerror(sInitError));
48		exit(1);
49	}
50
51	CreateTestHandler();
52	Unlock();
53}
54
55// destructor
56_EXPORT
57BTestApp::~BTestApp()
58{
59	int32 count = fHandlers.CountItems();
60	for (int32 i = count - 1; i >= 0; i--)
61		DeleteTestHandler(TestHandlerAt(i));
62}
63
64// Init
65_EXPORT
66status_t
67BTestApp::Init()
68{
69	status_t error = B_OK;
70	fAppThread = spawn_thread(&_AppThreadStart, "query app",
71							  B_NORMAL_PRIORITY, this);
72	if (fAppThread < 0)
73		error = fAppThread;
74	else {
75		error = resume_thread(fAppThread);
76		if (error != B_OK)
77			kill_thread(fAppThread);
78	}
79	if (error != B_OK)
80		fAppThread = B_ERROR;
81	return error;
82}
83
84// Terminate
85_EXPORT
86void
87BTestApp::Terminate()
88{
89	PostMessage(B_QUIT_REQUESTED, this);
90	int32 result;
91	wait_for_thread(fAppThread, &result);
92}
93
94// ReadyToRun
95_EXPORT
96void
97BTestApp::ReadyToRun()
98{
99}
100
101// CreateTestHandler
102_EXPORT
103BTestHandler *
104BTestApp::CreateTestHandler()
105{
106	BTestHandler *handler = new BTestHandler;
107	Lock();
108	AddHandler(handler);
109	fHandlers.AddItem(handler);
110	Unlock();
111	return handler;
112}
113
114// DeleteTestHandler
115_EXPORT
116bool
117BTestApp::DeleteTestHandler(BTestHandler *handler)
118{
119	bool result = false;
120	Lock();
121	result = fHandlers.RemoveItem(handler);
122	if (result)
123		RemoveHandler(handler);
124	Unlock();
125	if (result)
126		delete handler;
127	return result;
128}
129
130// Handler
131_EXPORT
132BTestHandler &
133BTestApp::Handler()
134{
135	// The returned handler must never passed to DeleteTestHandler() by the
136	// caller!
137	return *TestHandlerAt(0);
138}
139
140// TestHandlerAt
141_EXPORT
142BTestHandler *
143BTestApp::TestHandlerAt(int32 index)
144{
145	BAutolock _lock(this);
146	return (BTestHandler*)fHandlers.ItemAt(index);
147}
148
149// _AppThreadStart
150_EXPORT
151int32
152BTestApp::_AppThreadStart(void *data)
153{
154	if (BTestApp *app = (BTestApp*)data) {
155		app->Lock();
156		app->Run();
157	}
158	return 0;
159}
160
161