auto import from //depot/cupcake/@135843
diff --git a/simulator/app/LogMessage.cpp b/simulator/app/LogMessage.cpp
new file mode 100644
index 0000000..63cb764
--- /dev/null
+++ b/simulator/app/LogMessage.cpp
@@ -0,0 +1,98 @@
+//
+// Copyright 2005 The Android Open Source Project
+//
+// Hold a single log message.
+//
+#include "LogMessage.h"
+#include <assert.h>
+
+/*
+ * Constructor.
+ *
+ * Initializers here aren't necessary, since we can only create one of
+ * these through Create(), which touches every field.
+ */
+LogMessage::LogMessage(void)
+{
+}
+
+/*
+ * Destructor.
+ */
+LogMessage::~LogMessage(void)
+{
+    delete[] mTag;
+    delete[] mMsg;
+}
+
+/*
+ * Create a new LogMessage object, and populate it with the contents of
+ * "*pBundle".
+ */
+/*static*/ LogMessage* LogMessage::Create(const android_LogBundle* pBundle)
+{
+    LogMessage* newMsg = new LogMessage;
+
+    if (newMsg == NULL)
+        return NULL;
+    assert(pBundle != NULL);
+
+    newMsg->mWhen = pBundle->when;
+    newMsg->mPriority = pBundle->priority;
+    newMsg->mPid = pBundle->pid;
+    newMsg->mTag = android::strdupNew(pBundle->tag);
+
+    size_t len = 0;
+    size_t i;
+    for (i=0; i<pBundle->msgCount; i++) len += pBundle->msgVec[i].iov_len;
+    newMsg->mMsg = new char[len+1];
+    char* p = newMsg->mMsg;
+    for (i=0; i<pBundle->msgCount; i++) {
+        memcpy(p, pBundle->msgVec[i].iov_base, pBundle->msgVec[i].iov_len);
+        p += pBundle->msgVec[i].iov_len;
+    }
+    *p = 0;
+
+    newMsg->mRefCnt = 1;
+    newMsg->mInternal = false;
+    newMsg->mFootprint = 8 * sizeof(int) + strlen(newMsg->mTag) +
+        strlen(newMsg->mMsg) + 4;
+    newMsg->mTextCtrlLen = 0;
+    newMsg->mpPrev = NULL;
+    newMsg->mpNext = NULL;
+
+    return newMsg;
+}
+
+/*
+ * Create a new LogMessage object, with a simple message in it.
+ *
+ * Sets "mInternal" so we display it appropriately.
+ */
+/*static*/ LogMessage* LogMessage::Create(const char* msg)
+{
+    LogMessage* newMsg;
+    android_LogBundle bundle;
+
+    assert(msg != NULL);
+
+    memset(&bundle, 0, sizeof(bundle));
+    bundle.when = time(NULL);
+    bundle.priority = ANDROID_LOG_ERROR;
+    bundle.pid = getpid();
+    bundle.tag = "-";
+    iovec iov;
+    iov.iov_base = (void*)msg;
+    iov.iov_len = strlen(msg);
+    bundle.msgVec = &iov;
+    bundle.msgCount = 1;
+
+    newMsg = Create(&bundle);
+
+    if (newMsg != NULL) {
+        newMsg->mInternal = true;
+    }
+
+    return newMsg;
+}
+