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