//
// Copyright 2005 The Android Open Source Project
//
// Management of the simulated device.
//
// For compilers that support precompilation, include "wx/wx.h".
#include "wx/wxprec.h"
// Otherwise, include all standard headers
#ifndef WX_PRECOMP
# include "wx/wx.h"
#endif
#include "wx/image.h"
#include "ExternalRuntime.h"
#include "MyApp.h"
#include "UserEvent.h"
#include "UserEventMessage.h"
#include "SimRuntime.h"
#include "LocalBiChannel.h"
#include "utils.h"
using namespace android;
/*
* Destructor.
*/
ExternalRuntime::~ExternalRuntime(void)
{
if (IsRunning()) {
// TODO: cause thread to stop, then Wait for it
}
printf("Sim: in ~ExternalRuntime()\n");
}
/*
* Create and run the thread.
*/
bool ExternalRuntime::StartThread(void)
{
if (Create() != wxTHREAD_NO_ERROR) {
fprintf(stderr, "Sim: ERROR: can't create ExternalRuntime thread\n");
return false;
}
Run();
return true;
}
/*
* Thread entry point.
*
* This just sits and waits for a new connection. It hands it off to the
* main thread and then goes back to waiting.
*
* There is currently no "polite" way to shut this down.
*/
void* ExternalRuntime::Entry(void)
{
LocalBiChannel lbic;
Pipe* reader;
Pipe* writer;
reader = writer = NULL;
if (!lbic.create(ANDROID_PIPE_NAME)) {
fprintf(stderr, "Sim: failed creating named pipe '%s'\n",
ANDROID_PIPE_NAME);
return NULL;
}
while (lbic.listen(&reader, &writer)) {
/*
* Throw it over the wall.
*/
wxWindow* pMainFrame = ((MyApp*)wxTheApp)->GetMainFrame();
UserEventMessage* pUem = new UserEventMessage;
pUem->CreateExternalRuntime(reader, writer);
UserEvent uev(0, (void*) pUem);
pMainFrame->AddPendingEvent(uev);
reader = writer = NULL;
}
printf("Sim: ExternalRuntime thread wants to bail\n");
return NULL;
}