auto import from //depot/cupcake/@135843
diff --git a/simulator/app/UserEventMessage.h b/simulator/app/UserEventMessage.h
new file mode 100644
index 0000000..4a66cc2
--- /dev/null
+++ b/simulator/app/UserEventMessage.h
@@ -0,0 +1,84 @@
+//
+// Copyright 2005 The Android Open Source Project
+//
+// Contents of the "user event" sent from the device thread.
+//
+#ifndef _SIM_USER_EVENT_MESSAGE_H
+#define _SIM_USER_EVENT_MESSAGE_H
+
+#include <utils.h>
+#include "LogMessage.h"
+
+/*
+ * This gets stuffed into a UserEvent, which is posted to the main thread
+ * from a worker thread.
+ *
+ * The object does NOT own anything you stuff into it.  It's just a vehicle
+ * for carting data from one thread to another in a wxWidgets-safe manner,
+ * usually as pointers to data that can be shared between threads.
+ */
+class UserEventMessage {
+public:
+    /*
+     * What type of message is this?
+     */
+    typedef enum UEMType {
+        kUnknown = 0,
+
+        kRuntimeStarted,
+        kRuntimeStopped,
+        kErrorMessage,      // message in mString
+        kLogMessage,        // ptr to heap-allocated LogMessage
+        kExternalRuntime,   // external runtime wants to party
+    } UEMType;
+
+    UserEventMessage(void)
+        : mType(kUnknown), mpLogMessage(NULL)
+        {}
+    ~UserEventMessage(void) {
+    }
+
+    /*
+     * Create one of our various messages.
+     */
+    void CreateRuntimeStarted(void) {
+        mType = kRuntimeStarted;
+    }
+    void CreateRuntimeStopped(void) {
+        mType = kRuntimeStopped;
+    }
+    void CreateErrorMessage(wxString& str) {
+        mType = kErrorMessage;
+        mString = str;
+    }
+    void CreateLogMessage(LogMessage* pLogMessage) {
+        mType = kLogMessage;
+        mpLogMessage = pLogMessage;
+    }
+    void CreateExternalRuntime(android::Pipe* reader, android::Pipe* writer) {
+        mType = kExternalRuntime;
+        mReader = reader;
+        mWriter = writer;
+    }
+
+    /*
+     * Accessors.
+     */
+    UEMType GetType(void) const { return mType; }
+    const wxString& GetString(void) const { return mString; }
+    LogMessage* GetLogMessage(void) const { return mpLogMessage; }
+    android::Pipe* GetReader(void) const { return mReader; }
+    android::Pipe* GetWriter(void) const { return mWriter; }
+
+private:
+    UserEventMessage& operator=(const UserEventMessage&);   // not implemented
+    UserEventMessage(const UserEventMessage&);              // not implemented
+
+    UEMType     mType;
+    wxString    mString;            // for kErrorMessage
+    LogMessage* mpLogMessage;       // for kLogMessage
+    android::Pipe*  mReader;        // for kExternalRuntime
+    android::Pipe*  mWriter;        // for kExternalRuntime
+};
+
+#endif // _SIM_USER_EVENT_MESSAGE_H