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