// // 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; }