commsfwtools/commstools/utracedecoder/src/messagedefparser/signatureidentifier.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/commstools/utracedecoder/src/messagedefparser/signatureidentifier.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,115 @@
+// 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 <cassert>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+
+#include "messagedefparser\signatureidentifier.h"
+
+namespace Parser
+{
+
+void CSignatureIdentifier::AddMember(TMember* aMember)
+    {
+    assert(aMember);
+    assert(aMember->iMemberType->Type() == Parser::EPadTypeIdentifier || aMember->iMemberName[0] != 0);
+    assert(!FindMember(aMember->iMemberName));
+    iMembers.push_back(aMember);
+    aMember->iOffset = iSize;
+    iSize += aMember->iMemberType->TotalSize() * aMember->iArraySize;
+    }
+
+
+void CSignatureIdentifier::SetBaseSignature(const CSignatureIdentifier* aBaseSignature)
+    {
+    iBaseSignature = aBaseSignature;
+    }
+
+
+const TMember* CSignatureIdentifier::FindMember(const std::string& aName)
+    {
+    unsigned int i;
+    TMember* tmp;
+
+    if (aName[0] == 0)
+        {
+        return NULL;
+        }
+
+    for (i=0; i<iMembers.size(); i++)
+        {
+        tmp = iMembers.at(i);
+        if (!_strcmpi(tmp->iMemberName.c_str(), aName.c_str()))
+            {
+            return tmp;
+            }
+        }
+    return NULL;
+    }
+
+
+bool CSignatureIdentifier::IsNodeSignalDerived() const
+    {
+    const CSignatureIdentifier* baseSig = this;
+    while (baseSig)
+        {
+        if (!_strcmpi(baseSig->Name(), "TNodeSignal"))
+            {
+            return true;
+            }
+        baseSig = baseSig->iBaseSignature;
+        }
+    return false;
+    }
+
+int CSignatureIdentifier::TotalSize() const
+    {
+    if (iBaseSignature)
+        {
+        return Size() + iBaseSignature->TotalSize();
+        }
+    else
+        {
+        return Size();
+        }
+    }
+
+
+void CSignatureIdentifier::Describe(const unsigned char* aData, unsigned int aLength, const void* aOptions, std::ostream& aOutput) const
+    {
+    if (iBaseSignature)
+        {
+        iBaseSignature->Describe(aData + Size(), aLength - Size(), NULL, aOutput);
+        }
+
+    unsigned int i;
+    TMember* member;
+    for (i=0; i<iMembers.size(); i++)
+        {
+        member = iMembers.at(i);
+        if (member->iMemberName[0] != 0) // padding members have no name
+            {
+            aOutput << "[" + std::string(member->iMemberName) + "=";
+            member->iMemberType->Describe(aData + member->iOffset, member->iMemberType->Size(), member->iIdentifierOptions, aOutput);
+            aOutput << "] ";
+            }
+        }
+    }
+
+} // namespace Parser
+