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