diff -r 000000000000 -r 7f656887cf89 libraries/btrace_parser/src/btrace_pubsub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/btrace_parser/src/btrace_pubsub.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,142 @@ +// btrace_pubsub.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 CBtracePubSub* CBtracePubSub::NewL(CBtraceReader& aReader) + { + CBtracePubSub* self = new(ELeave) CBtracePubSub(aReader); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CBtracePubSub::CBtracePubSub(CBtraceReader& aReader) + : iReader(aReader) + { + } + +EXPORT_C CBtracePubSub::~CBtracePubSub() + { + iNotifs.Close(); + iReader.RemoveObserver(ExtraBTrace::EPubSub, *this); + } + +void CBtracePubSub::ConstructL() + { + iReader.AddObserverL(ExtraBTrace::EPubSub, *this); + } + +EXPORT_C void CBtracePubSub::NotifyPropertyChangedL(MBtracePubSubObserver& aObserver) + { + iNotifs.AppendL(TPubSubNotif(NULL, NULL, NULL, NULL, aObserver, ENotificationOneShot)); + } + +EXPORT_C void CBtracePubSub::NotifyPropertyChangedL(TUint* aCategory, TUint* aKey, MBtracePubSubObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + iNotifs.AppendL(TPubSubNotif(aCategory, aKey, NULL, NULL, aObserver, aPersistence)); + } + +EXPORT_C void CBtracePubSub::NotifyIntegerPropertyChangedL(TUint* aCategory, TUint* aKey, TInt* aValue, MBtracePubSubObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + iNotifs.AppendL(TPubSubNotif(aCategory, aKey, aValue, NULL, aObserver, aPersistence)); + } + +EXPORT_C void CBtracePubSub::NotifyDataPropertyChangedL(TUint* aCategory, TUint* aKey, const TDesC8* aValue, MBtracePubSubObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + iNotifs.AppendL(TPubSubNotif(aCategory, aKey, NULL, aValue, aObserver, aPersistence)); + } + +EXPORT_C void CBtracePubSub::CancelNotifyPropertyChanged(MBtracePubSubObserver& aObserver) + { + for (TInt i = (iNotifs.Count() - 1); i >= 0; --i) + { + if (&iNotifs[i].iObserver == &aObserver) + { + iNotifs.Remove(i); + } + } + } + +void CBtracePubSub::HandleBtraceFrameL(const TBtraceFrame& aFrame) + { + if (aFrame.iCategory != ExtraBTrace::EPubSub) return; + + const TUint8* data = aFrame.iData.Ptr(); + TUint cat = *(TUint32*)data; + TUint key = *((TUint32*)data + 1); + + switch (aFrame.iSubCategory) + { + case ExtraBTrace::EPubSubIntPropertyChanged: + { + TInt val = *((TUint32*)data + 2); + for (TInt i = 0; i < iNotifs.Count(); i++) + { + if (iNotifs[i].Matches(cat, key, val)) + { + iNotifs[i].iObserver.HandlePropertyChangedL(aFrame.iTickCount, cat, key, val); + } + } + break; + } + case ExtraBTrace::EPubSubDataPropertyChanged: + { + TPtrC8 val = aFrame.iData.Mid(8); + for (TInt i = 0; i < iNotifs.Count(); i++) + { + if (iNotifs[i].Matches(cat, key, val)) + { + iNotifs[i].iObserver.HandlePropertyChangedL(aFrame.iTickCount, cat, key, val); + } + } + break; + } + } + } + +CBtracePubSub::TPubSubNotif::TPubSubNotif(TUint* aCategory, TUint* aKey, TInt* aIntegerValue, const TDesC8* aDataValue, MBtracePubSubObserver& aObserver, TBtraceNotificationPersistence aPersistence) + : iCategory(aCategory), iKey(aKey), iIntegerValue(aIntegerValue), iDataValue(aDataValue), iObserver(aObserver), iPersistence(aPersistence) + { + __ASSERT_ALWAYS(!(iIntegerValue && iDataValue), Panic(EBtpPanicIncompatiblePubSubArgs)); + } + +TBool CBtracePubSub::TPubSubNotif::Matches(TUint aCategory, TUint aKey, TInt aIntegerValue) const + { + if ((iCategory == NULL) || (*iCategory == aCategory)) + { + if ((iKey == NULL) || (*iKey == aKey)) + { + if (((iIntegerValue == NULL) && (iDataValue == NULL)) || (*iIntegerValue == aIntegerValue)) + { + return ETrue; + } + } + } + return EFalse; + } + +TBool CBtracePubSub::TPubSubNotif::Matches(TUint aCategory, TUint aKey, const TDesC8& aDataValue) const + { + if ((iCategory == NULL) || (*iCategory == aCategory)) + { + if ((iKey == NULL) || (*iKey == aKey)) + { + if (((iIntegerValue == NULL) && (iDataValue == NULL)) || (*iDataValue == aDataValue)) + { + return ETrue; + } + } + } + return EFalse; + }