1aad997bdSTyler Dauwalder // TestApp.cpp
2aad997bdSTyler Dauwalder
37e5f681fSIngo Weinhold #include <stdio.h>
4*58481f0fSOliver Tappe #include <stdlib.h>
57e5f681fSIngo Weinhold #include <string.h>
67e5f681fSIngo Weinhold
7b229fec8SIngo Weinhold #include <Autolock.h>
8b229fec8SIngo Weinhold
9aad997bdSTyler Dauwalder #include <TestApp.h>
10aad997bdSTyler Dauwalder
11aad997bdSTyler Dauwalder // TestHandler
12aad997bdSTyler Dauwalder
13aad997bdSTyler Dauwalder // MessageReceived
141b89aa98SIngo Weinhold _EXPORT
15aad997bdSTyler Dauwalder void
MessageReceived(BMessage * message)16242a6db2STyler Dauwalder BTestHandler::MessageReceived(BMessage *message)
17aad997bdSTyler Dauwalder {
18aad997bdSTyler Dauwalder // clone and push it
19aad997bdSTyler Dauwalder BMessage *clone = new BMessage(*message);
20aad997bdSTyler Dauwalder fQueue.Lock();
21aad997bdSTyler Dauwalder fQueue.AddMessage(clone);
22aad997bdSTyler Dauwalder fQueue.Unlock();
23aad997bdSTyler Dauwalder }
24aad997bdSTyler Dauwalder
25aad997bdSTyler Dauwalder // Queue
261b89aa98SIngo Weinhold _EXPORT
27aad997bdSTyler Dauwalder BMessageQueue &
Queue()28242a6db2STyler Dauwalder BTestHandler::Queue()
29aad997bdSTyler Dauwalder {
30aad997bdSTyler Dauwalder return fQueue;
31aad997bdSTyler Dauwalder }
32aad997bdSTyler Dauwalder
33aad997bdSTyler Dauwalder
34aad997bdSTyler Dauwalder // TestApp
35aad997bdSTyler Dauwalder
367e5f681fSIngo Weinhold static status_t sInitError;
377e5f681fSIngo Weinhold
38aad997bdSTyler Dauwalder // constructor
391b89aa98SIngo Weinhold _EXPORT
BTestApp(const char * signature)40242a6db2STyler Dauwalder BTestApp::BTestApp(const char *signature)
417e5f681fSIngo Weinhold : BApplication(signature, &sInitError),
42aad997bdSTyler Dauwalder fAppThread(B_ERROR),
43b229fec8SIngo Weinhold fHandlers()
44aad997bdSTyler Dauwalder {
457e5f681fSIngo Weinhold if (sInitError != B_OK) {
467e5f681fSIngo Weinhold fprintf(stderr, "BTestApp::BTestApp(): Failed to create BApplication: "
477e5f681fSIngo Weinhold "%s\n", strerror(sInitError));
487e5f681fSIngo Weinhold exit(1);
497e5f681fSIngo Weinhold }
507e5f681fSIngo Weinhold
51b229fec8SIngo Weinhold CreateTestHandler();
52aad997bdSTyler Dauwalder Unlock();
53aad997bdSTyler Dauwalder }
54aad997bdSTyler Dauwalder
55b229fec8SIngo Weinhold // destructor
561b89aa98SIngo Weinhold _EXPORT
~BTestApp()57b229fec8SIngo Weinhold BTestApp::~BTestApp()
58b229fec8SIngo Weinhold {
59b229fec8SIngo Weinhold int32 count = fHandlers.CountItems();
60b229fec8SIngo Weinhold for (int32 i = count - 1; i >= 0; i--)
61b229fec8SIngo Weinhold DeleteTestHandler(TestHandlerAt(i));
62b229fec8SIngo Weinhold }
63b229fec8SIngo Weinhold
64aad997bdSTyler Dauwalder // Init
651b89aa98SIngo Weinhold _EXPORT
66aad997bdSTyler Dauwalder status_t
Init()67242a6db2STyler Dauwalder BTestApp::Init()
68aad997bdSTyler Dauwalder {
69aad997bdSTyler Dauwalder status_t error = B_OK;
70aad997bdSTyler Dauwalder fAppThread = spawn_thread(&_AppThreadStart, "query app",
71aad997bdSTyler Dauwalder B_NORMAL_PRIORITY, this);
72aad997bdSTyler Dauwalder if (fAppThread < 0)
73aad997bdSTyler Dauwalder error = fAppThread;
74aad997bdSTyler Dauwalder else {
75aad997bdSTyler Dauwalder error = resume_thread(fAppThread);
76aad997bdSTyler Dauwalder if (error != B_OK)
77aad997bdSTyler Dauwalder kill_thread(fAppThread);
78aad997bdSTyler Dauwalder }
79aad997bdSTyler Dauwalder if (error != B_OK)
80aad997bdSTyler Dauwalder fAppThread = B_ERROR;
81aad997bdSTyler Dauwalder return error;
82aad997bdSTyler Dauwalder }
83aad997bdSTyler Dauwalder
84aad997bdSTyler Dauwalder // Terminate
851b89aa98SIngo Weinhold _EXPORT
86aad997bdSTyler Dauwalder void
Terminate()87242a6db2STyler Dauwalder BTestApp::Terminate()
88aad997bdSTyler Dauwalder {
89aad997bdSTyler Dauwalder PostMessage(B_QUIT_REQUESTED, this);
90aad997bdSTyler Dauwalder int32 result;
91aad997bdSTyler Dauwalder wait_for_thread(fAppThread, &result);
92aad997bdSTyler Dauwalder }
93aad997bdSTyler Dauwalder
94aad997bdSTyler Dauwalder // ReadyToRun
951b89aa98SIngo Weinhold _EXPORT
96aad997bdSTyler Dauwalder void
ReadyToRun()97242a6db2STyler Dauwalder BTestApp::ReadyToRun()
98aad997bdSTyler Dauwalder {
99aad997bdSTyler Dauwalder }
100aad997bdSTyler Dauwalder
101b229fec8SIngo Weinhold // CreateTestHandler
1021b89aa98SIngo Weinhold _EXPORT
103b229fec8SIngo Weinhold BTestHandler *
CreateTestHandler()104b229fec8SIngo Weinhold BTestApp::CreateTestHandler()
105b229fec8SIngo Weinhold {
106b229fec8SIngo Weinhold BTestHandler *handler = new BTestHandler;
107b229fec8SIngo Weinhold Lock();
108b229fec8SIngo Weinhold AddHandler(handler);
109b229fec8SIngo Weinhold fHandlers.AddItem(handler);
110b229fec8SIngo Weinhold Unlock();
111b229fec8SIngo Weinhold return handler;
112b229fec8SIngo Weinhold }
113b229fec8SIngo Weinhold
114b229fec8SIngo Weinhold // DeleteTestHandler
1151b89aa98SIngo Weinhold _EXPORT
116b229fec8SIngo Weinhold bool
DeleteTestHandler(BTestHandler * handler)117b229fec8SIngo Weinhold BTestApp::DeleteTestHandler(BTestHandler *handler)
118b229fec8SIngo Weinhold {
119b229fec8SIngo Weinhold bool result = false;
120b229fec8SIngo Weinhold Lock();
121b229fec8SIngo Weinhold result = fHandlers.RemoveItem(handler);
122b229fec8SIngo Weinhold if (result)
123b229fec8SIngo Weinhold RemoveHandler(handler);
124b229fec8SIngo Weinhold Unlock();
125b229fec8SIngo Weinhold if (result)
126b229fec8SIngo Weinhold delete handler;
127b229fec8SIngo Weinhold return result;
128b229fec8SIngo Weinhold }
129b229fec8SIngo Weinhold
130aad997bdSTyler Dauwalder // Handler
1311b89aa98SIngo Weinhold _EXPORT
132242a6db2STyler Dauwalder BTestHandler &
Handler()133242a6db2STyler Dauwalder BTestApp::Handler()
134aad997bdSTyler Dauwalder {
135b229fec8SIngo Weinhold // The returned handler must never passed to DeleteTestHandler() by the
136b229fec8SIngo Weinhold // caller!
137b229fec8SIngo Weinhold return *TestHandlerAt(0);
138b229fec8SIngo Weinhold }
139b229fec8SIngo Weinhold
140b229fec8SIngo Weinhold // TestHandlerAt
1411b89aa98SIngo Weinhold _EXPORT
142b229fec8SIngo Weinhold BTestHandler *
TestHandlerAt(int32 index)143b229fec8SIngo Weinhold BTestApp::TestHandlerAt(int32 index)
144b229fec8SIngo Weinhold {
145b229fec8SIngo Weinhold BAutolock _lock(this);
146b229fec8SIngo Weinhold return (BTestHandler*)fHandlers.ItemAt(index);
147aad997bdSTyler Dauwalder }
148aad997bdSTyler Dauwalder
149aad997bdSTyler Dauwalder // _AppThreadStart
1501b89aa98SIngo Weinhold _EXPORT
151aad997bdSTyler Dauwalder int32
_AppThreadStart(void * data)152242a6db2STyler Dauwalder BTestApp::_AppThreadStart(void *data)
153aad997bdSTyler Dauwalder {
154242a6db2STyler Dauwalder if (BTestApp *app = (BTestApp*)data) {
155aad997bdSTyler Dauwalder app->Lock();
156aad997bdSTyler Dauwalder app->Run();
157aad997bdSTyler Dauwalder }
158aad997bdSTyler Dauwalder return 0;
159aad997bdSTyler Dauwalder }
160aad997bdSTyler Dauwalder
161