libraries/btrace_parser/src/btrace_domainevent.cpp
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libraries/btrace_parser/src/btrace_domainevent.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,147 @@
+// btrace_domainevent.cpp
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include "btrace_parser.h"
+
+EXPORT_C CBtraceDomainEvent* CBtraceDomainEvent::NewL(CBtraceReader& aReader)
+	{
+	CBtraceDomainEvent* self = new (ELeave) CBtraceDomainEvent(aReader);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CBtraceDomainEvent::CBtraceDomainEvent(CBtraceReader& aReader)
+	: iReader(aReader)
+	{
+	}
+
+EXPORT_C CBtraceDomainEvent::~CBtraceDomainEvent()
+	{
+	iReader.RemoveObserver(KAmTraceCategory, *this);
+	iNotifs.Close();
+	}
+
+void CBtraceDomainEvent::ConstructL()
+	{
+	iReader.AddObserverL(KAmTraceCategory, *this);
+	}
+
+EXPORT_C void CBtraceDomainEvent::NotifyDomainEventL(TUint aSubCategory, MBtraceDomainEventObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TDomainEventNotif notif(aSubCategory, aObserver, aPersistence);
+	iNotifs.AppendL(notif);
+	}
+
+EXPORT_C void CBtraceDomainEvent::NotifyDomainEventL(TUint aSubCategory, TUint aData1, MBtraceDomainEventObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TDomainEventNotif notif(aSubCategory, aObserver, aPersistence);
+	notif.AddDataItem(aData1);
+	iNotifs.AppendL(notif);
+	}
+
+EXPORT_C void CBtraceDomainEvent::NotifyDomainEventL(TUint aSubCategory, TUint aData1, TUint aData2, MBtraceDomainEventObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TDomainEventNotif notif(aSubCategory, aObserver, aPersistence);
+	notif.AddDataItem(aData1);
+	notif.AddDataItem(aData2);
+	iNotifs.AppendL(notif);
+	}
+
+EXPORT_C void CBtraceDomainEvent::NotifyDomainEventL(TUint aSubCategory, TUint aData1, TUint aData2, TUint aData3, MBtraceDomainEventObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	{
+	TDomainEventNotif notif(aSubCategory, aObserver, aPersistence);
+	notif.AddDataItem(aData1);
+	notif.AddDataItem(aData2);
+	notif.AddDataItem(aData3);
+	iNotifs.AppendL(notif);
+	}
+
+EXPORT_C void CBtraceDomainEvent::CancelNotifyDomainEvent(MBtraceDomainEventObserver& aObserver)
+	{
+	for (TInt i = (iNotifs.Count() - 1); i >= 0; --i)
+		{
+		const TDomainEventNotif& thisNotif = iNotifs[i];
+		if (thisNotif.iObserver == &aObserver)
+			{
+			iNotifs.Remove(i);
+			}
+		}
+	}
+
+void CBtraceDomainEvent::HandleBtraceFrameL(const TBtraceFrame& aFrame)
+	{
+	if (aFrame.iCategory == KAmTraceCategory && aFrame.iSubCategory > EAmTraceSubCategoryDomainEventBase)
+		{
+		const TInt numDataItems = (aFrame.iData.Length() / sizeof(TUint));
+		if (numDataItems <= TDomainEventNotif::KMaxNumDataItems)
+			{
+			const TUint* data = reinterpret_cast<const TUint*>(aFrame.iData.Ptr());
+			TDomainEventNotif notif(aFrame.iSubCategory);
+			for (TInt i = 0; i < numDataItems; ++i)
+				{
+				notif.AddDataItem(*(data + i));
+				}
+
+			for (TInt i = (iNotifs.Count() - 1); i >= 0; --i)
+				{
+				const TDomainEventNotif& thisNotif = iNotifs[i];
+				if (thisNotif == notif)
+					{
+					MBtraceDomainEventObserver* observer = thisNotif.iObserver;
+					if (thisNotif.iPersistence == ENotificationOneShot)
+						{
+						iNotifs.Remove(i);
+						}
+					observer->HandleDomainEventL(aFrame.iTickCount, *observer);
+					}
+				}
+			}
+		}
+	}
+
+CBtraceDomainEvent::TDomainEventNotif::TDomainEventNotif(TUint aSubCategory)
+	: iSubCategory(aSubCategory), iObserver(NULL), iPersistence(ENotificationOneShot), iDataCount(0)
+	{
+	}
+
+CBtraceDomainEvent::TDomainEventNotif::TDomainEventNotif(TUint aSubCategory, MBtraceDomainEventObserver& aObserver, TBtraceNotificationPersistence aPersistence)
+	: iSubCategory(aSubCategory), iObserver(&aObserver), iPersistence(aPersistence), iDataCount(0)
+	{
+	}
+
+void CBtraceDomainEvent::TDomainEventNotif::AddDataItem(TUint aData)
+	{
+	__ASSERT_ALWAYS(iDataCount < KMaxNumDataItems, Panic(EBtpPanicTooManyDomainEventDataItems));
+	iData[iDataCount++] = aData;
+	}
+
+TBool CBtraceDomainEvent::TDomainEventNotif::operator==(const TDomainEventNotif& aNotif) const
+	{
+	if ((aNotif.iSubCategory == iSubCategory) && (aNotif.iDataCount == iDataCount))
+		{
+		for (TInt i = 0; i < iDataCount; ++i)
+			{
+			if (aNotif.iData[i] != iData[i])
+				{
+				return EFalse;
+				}
+			}
+		return ETrue;
+		}
+	else
+		{
+		return EFalse;
+		}
+	}
+