mirror of
https://review.haiku-os.org/haiku
synced 2025-02-01 19:26:13 +01:00
7e5f681ff4
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@13314 a95241bf-73f2-0310-859d-f6bbb57e9c96
160 lines
2.4 KiB
C++
160 lines
2.4 KiB
C++
// TestApp.cpp
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <Autolock.h>
|
|
|
|
#include <TestApp.h>
|
|
|
|
// TestHandler
|
|
|
|
// MessageReceived
|
|
_EXPORT
|
|
void
|
|
BTestHandler::MessageReceived(BMessage *message)
|
|
{
|
|
// clone and push it
|
|
BMessage *clone = new BMessage(*message);
|
|
fQueue.Lock();
|
|
fQueue.AddMessage(clone);
|
|
fQueue.Unlock();
|
|
}
|
|
|
|
// Queue
|
|
_EXPORT
|
|
BMessageQueue &
|
|
BTestHandler::Queue()
|
|
{
|
|
return fQueue;
|
|
}
|
|
|
|
|
|
// TestApp
|
|
|
|
static status_t sInitError;
|
|
|
|
// constructor
|
|
_EXPORT
|
|
BTestApp::BTestApp(const char *signature)
|
|
: BApplication(signature, &sInitError),
|
|
fAppThread(B_ERROR),
|
|
fHandlers()
|
|
{
|
|
if (sInitError != B_OK) {
|
|
fprintf(stderr, "BTestApp::BTestApp(): Failed to create BApplication: "
|
|
"%s\n", strerror(sInitError));
|
|
exit(1);
|
|
}
|
|
|
|
CreateTestHandler();
|
|
Unlock();
|
|
}
|
|
|
|
// destructor
|
|
_EXPORT
|
|
BTestApp::~BTestApp()
|
|
{
|
|
int32 count = fHandlers.CountItems();
|
|
for (int32 i = count - 1; i >= 0; i--)
|
|
DeleteTestHandler(TestHandlerAt(i));
|
|
}
|
|
|
|
// Init
|
|
_EXPORT
|
|
status_t
|
|
BTestApp::Init()
|
|
{
|
|
status_t error = B_OK;
|
|
fAppThread = spawn_thread(&_AppThreadStart, "query app",
|
|
B_NORMAL_PRIORITY, this);
|
|
if (fAppThread < 0)
|
|
error = fAppThread;
|
|
else {
|
|
error = resume_thread(fAppThread);
|
|
if (error != B_OK)
|
|
kill_thread(fAppThread);
|
|
}
|
|
if (error != B_OK)
|
|
fAppThread = B_ERROR;
|
|
return error;
|
|
}
|
|
|
|
// Terminate
|
|
_EXPORT
|
|
void
|
|
BTestApp::Terminate()
|
|
{
|
|
PostMessage(B_QUIT_REQUESTED, this);
|
|
int32 result;
|
|
wait_for_thread(fAppThread, &result);
|
|
}
|
|
|
|
// ReadyToRun
|
|
_EXPORT
|
|
void
|
|
BTestApp::ReadyToRun()
|
|
{
|
|
}
|
|
|
|
// CreateTestHandler
|
|
_EXPORT
|
|
BTestHandler *
|
|
BTestApp::CreateTestHandler()
|
|
{
|
|
BTestHandler *handler = new BTestHandler;
|
|
Lock();
|
|
AddHandler(handler);
|
|
fHandlers.AddItem(handler);
|
|
Unlock();
|
|
return handler;
|
|
}
|
|
|
|
// DeleteTestHandler
|
|
_EXPORT
|
|
bool
|
|
BTestApp::DeleteTestHandler(BTestHandler *handler)
|
|
{
|
|
bool result = false;
|
|
Lock();
|
|
result = fHandlers.RemoveItem(handler);
|
|
if (result)
|
|
RemoveHandler(handler);
|
|
Unlock();
|
|
if (result)
|
|
delete handler;
|
|
return result;
|
|
}
|
|
|
|
// Handler
|
|
_EXPORT
|
|
BTestHandler &
|
|
BTestApp::Handler()
|
|
{
|
|
// The returned handler must never passed to DeleteTestHandler() by the
|
|
// caller!
|
|
return *TestHandlerAt(0);
|
|
}
|
|
|
|
// TestHandlerAt
|
|
_EXPORT
|
|
BTestHandler *
|
|
BTestApp::TestHandlerAt(int32 index)
|
|
{
|
|
BAutolock _lock(this);
|
|
return (BTestHandler*)fHandlers.ItemAt(index);
|
|
}
|
|
|
|
// _AppThreadStart
|
|
_EXPORT
|
|
int32
|
|
BTestApp::_AppThreadStart(void *data)
|
|
{
|
|
if (BTestApp *app = (BTestApp*)data) {
|
|
app->Lock();
|
|
app->Run();
|
|
}
|
|
return 0;
|
|
}
|
|
|