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