diff -r 000000000000 -r dfb7c4ff071f commsfwtools/commstools/utracedecoder/src/logevents/nodemessageevent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwtools/commstools/utracedecoder/src/logevents/nodemessageevent.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,180 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include + +#include "utracedecoderapp.h" +#include "logevents\nodemessageevent.h" +#include "messagedefparser\definitionparser.h" +#include "messagedefparser\signatureidentifier.h" +#include "messagedefparser\contextidentifier.h" +#include "messagedefparser\messageidentifier.h" + +CNodeMessageEvent::CNodeMessageEvent(const CUTraceFrame& aFrame, MEventOutputHandler& aOutputHandler) + : CSimpleLogEvent(aFrame, aOutputHandler) + { + SetPrefix("ENodeMessages"); + } + +CNodeMessageEvent::CNodeMessageEvent(const CMultiPartFrameCollection& aFrameCollection, MEventOutputHandler& aOutputHandler) + : CSimpleLogEvent(aFrameCollection, aOutputHandler) + { + SetPrefix("ENodeMessages"); + } + +void CNodeMessageEvent::Describe(std::ostream& aOutput) const + { + unsigned char* payload = Data(); + unsigned int length = DataLength(); + unsigned int subCategory = SubCategory(); + unsigned int textLength = Arg1(); + + if (subCategory == ELogMessage || subCategory == ELogAddress || subCategory == ELogNode) + { + if (textLength > length) + { + aOutput << "**** ERROR: Corrupt event. Embedded text length > Event length **** "; + return; + } + + if (textLength > 0) + { + std::string embeddedText = std::string(reinterpret_cast(Data())).substr(0, textLength); + aOutput << embeddedText << " "; + payload += textLength; + length -= textLength; + } + + if (length <= 0) + { + aOutput << "**** ERROR: Corrupt event. No data after embedded text **** "; + return; + } + } + + switch (subCategory) + { + case ELogMessage: + { + const SMessageHeader& header = *reinterpret_cast(payload); + const Parser::CSignatureIdentifier* msgSig = ::gMsgDefParser->FindSignatureByTypeId(header.iTypeId); + if (msgSig) + { + aOutput << "[Signature=" + std::string(msgSig->Name()) + "] "; + + //if (msgSig->IsNodeSignalDerived()) + // { + // const TMessageId& msgId = *reinterpret_cast(payload + header.iLength - sizeof(TMessageId)); + + // const Parser::CMessageIdentifier* msg = ::gMsgDefParser->FindMessageByMessageId(msgId); + // if (msg) + // { + // aOutput << "[Message=" + std::string(msg->Name()) + "] "; + // } + // } + if (header.iLength - sizeof(header) == msgSig->TotalSize()) + { + msgSig->Describe(payload + sizeof(header), header.iLength - sizeof(header), NULL, aOutput); + } + else + { + aOutput << "**** ERROR: Corrupt event or incorrect signature definition - " + << "[Signature=0x" << std::noshowbase << std::setw(8) << std::setfill('0') + << std::nouppercase << std::hex << header.iTypeId.iUid + << ":0x" << std::noshowbase << std::setw(8) << std::setfill('0') + << std::nouppercase << std::hex << header.iTypeId.iType << "] **** "; + } + + } + else + { + aOutput << "**** ERROR: Undefined signature - [Signature=0x" + << std::noshowbase << std::setw(8) << std::setfill('0') << std::nouppercase << std::hex << header.iTypeId.iUid + << ":0x" + << std::noshowbase << std::setw(8) << std::setfill('0') << std::nouppercase << std::hex << header.iTypeId.iType + << "] **** "; + } + } + break; + + case ELogBlockStart: + EventOutputHandler().PushNewLineEnabled(false); + aOutput << "[STARTBLOCK="; + CSimpleLogEvent::DescribeText(aOutput); + aOutput << "] "; + break; + + case ELogBlockEnd: + aOutput << "[ENDBLOCK="; + CSimpleLogEvent::DescribeText(aOutput); + aOutput << "] "; + EventOutputHandler().PopNewLineEnabled(); + break; + + case ELogNodeCreate: + case ELogNodeDestroy: + case ELogInfo: + CSimpleLogEvent::DescribeText(aOutput); + break; + + case ELogAddress: + { + const SRuntimeContextBase& rtCtx = *reinterpret_cast(payload); + if (rtCtx.iSize & 0x80) // top bit set indicates not null + { + aOutput << "[Address="; + const Parser::CContextIdentifier* context = ::gMsgDefParser->FindContextBySize(rtCtx.iSize & 0x7f); // top bit indicates NULL + if (context) + { + if (length == context->TotalSize()) + { + context->Describe(payload, length, NULL, aOutput); + } + else + { + aOutput << "**** ERROR: ELogAddress - Event data size and context size don't match **** "; + } + } + else + { + aOutput << "**** ERROR: ELogAddress - Logged address uses undefined context type **** "; + } + aOutput << "] "; + } + else + { + aOutput << "[Address=Null] "; + } + } + break; + + case ELogNode: + { + aOutput << "[ANode=0x" << std::hex << std::setw(8) + << std::setfill('0') << std::nouppercase << std::noshowbase + << BytesToInt(payload) + << "] "; + } + break; + + default: + aOutput << "**** ERROR: Unknown or unsupported log statement **** "; + break; + } + } +