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