diff -r 000000000000 -r 7f656887cf89 libraries/btrace_parser/src/btrace_textonscreen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libraries/btrace_parser/src/btrace_textonscreen.cpp Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,186 @@ +// btrace_textonscreen.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 +#include "btrace_parser.h" + + +EXPORT_C CBtraceTextOnScreen* CBtraceTextOnScreen::NewL(CBtraceReader& aReader) + { + CBtraceTextOnScreen* self = new (ELeave) CBtraceTextOnScreen(aReader); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CBtraceTextOnScreen::CBtraceTextOnScreen(CBtraceReader& aReader) + : iReader(aReader) + { + } + +EXPORT_C CBtraceTextOnScreen::~CBtraceTextOnScreen() + { + iReader.RemoveObserver(KAmTraceCategory, *this); + iScreenNotifs.Close(); + } + +void CBtraceTextOnScreen::ConstructL() + { + iReader.AddObserverL(KAmTraceCategory, *this); + + LtkUtils::W32CrackL(); // In case no-one's called it yet + } + +// +// CBtraceTextOnScreen::HandleBtraceFrameL +// process the btrace frame, stripping out the relevant text +// +void CBtraceTextOnScreen::HandleBtraceFrameL(const TBtraceFrame& aFrame) + { + if (aFrame.iCategory == KAmTraceCategory && aFrame.iSubCategory == EAmTraceSubCategoryScreenText) + { + // First 2 words have packed windowgroup id and coordinates of text - TODO + TUint16 windowGroupId = *((const TUint16*)aFrame.iData.Mid(2).Ptr()); + TPtrC8 data = aFrame.iData.Mid(8); + TPtrC text((const TUint16*)data.Ptr(), data.Length() / 2); + SeenL(aFrame.iTickCount, text, windowGroupId); + } + } + +// +// CBtraceTextOnScreen::Seen +// inform any observers that text has arrived on-screen, passing a reference to the text +// note the observer may ask for any or a specific pattern of text to be notified on +// +void CBtraceTextOnScreen::SeenL(const TBtraceTickCount& aTickCount, const TDesC& aData, TInt aWindowGroupId) + { + iReader.Log(_L("Screen text: '%S' (%d)\r\n"), &aData, aWindowGroupId); + TInt ii = iScreenNotifs.Count(); + while (--ii >= 0) + { + TTextOnScreenNotif& nt = iScreenNotifs[ii]; + + if (nt.iWindowGroupId && (nt.iWindowGroupId != aWindowGroupId)) + { + continue; + } + + + switch (nt.iMatchMode) + { + case EWildNonSpanning: + { + if (aData.MatchF(nt.iTxtPtr) != KErrNotFound) + { + MBtraceTextOnScreenObserver* observer = nt.iObserver; + if (nt.iPersistence == ENotificationOneShot) + { + iScreenNotifs.Remove(ii); + } + observer->HandleTextSeenL(aTickCount, aData, aWindowGroupId); + } + break; + } + case ESpanningNonWild: + { + const TInt length = aData.Length(); + for (TInt i = 0; i < length; ++i) + { + if (aData[i] == nt.iTxtPtr[nt.iMatchedChars]) + { + ++nt.iMatchedChars; + } + else + { + nt.iMatchedChars = 0; + } + + if (nt.iMatchedChars == nt.iTxtPtr.Length()) + { + MBtraceTextOnScreenObserver* observer = nt.iObserver; + if (nt.iPersistence == ENotificationOneShot) + { + iScreenNotifs.Remove(ii); + } + observer->HandleTextSeenL(aTickCount, aData, aWindowGroupId); + break; + } + } + break; + } + default: + ASSERT(EFalse); + } + } + } + +// +// CBtraceTextOnScreen::NotifyTextOnScreenL +// called by the client to register an interest in any text drawn to screen (via wserv only) +// +EXPORT_C void CBtraceTextOnScreen::NotifyTextOnScreenL(const TDesC& aText, MBtraceTextOnScreenObserver& aObserver) + { + NotifyTextOnScreenL(aText, aObserver, ENotificationOneShot); + } + +EXPORT_C void CBtraceTextOnScreen::NotifyTextOnScreenL(const TDesC& aText, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + TTextOnScreenNotif notify(aText, aObserver, aPersistence); + iScreenNotifs.AppendL(notify); + } + +EXPORT_C void CBtraceTextOnScreen::NotifyTextOnScreenL(const TDesC& aText, TMatchMode aMatchMode, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + TTextOnScreenNotif notify(aText, aMatchMode, aObserver, aPersistence); + iScreenNotifs.AppendL(notify); + } + +EXPORT_C void CBtraceTextOnScreen::NotifyTextOnScreenL(const TDesC& aText, TInt aWindowGroupId, TMatchMode aMatchMode, MBtraceTextOnScreenObserver& aObserver) + { + NotifyTextOnScreenL(aText, aWindowGroupId, aMatchMode, aObserver, ENotificationOneShot); + } + +EXPORT_C void CBtraceTextOnScreen::NotifyTextOnScreenL(const TDesC& aText, TInt aWindowGroupId, TMatchMode aMatchMode, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + { + TTextOnScreenNotif notify(aText, aWindowGroupId, aMatchMode, aObserver, aPersistence); + iScreenNotifs.AppendL(notify); + } + +EXPORT_C void CBtraceTextOnScreen::CancelNotifyTextOnScreen(MBtraceTextOnScreenObserver& aObserver) + { + for (TInt i = iScreenNotifs.Count()-1; i>=0; i--) + { + if (iScreenNotifs[i].iObserver == &aObserver) + { + iScreenNotifs.Remove(i); + } + } + } + +// +// TTextOnScreenNotif +// +CBtraceTextOnScreen::TTextOnScreenNotif::TTextOnScreenNotif(const TDesC& aText, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + : iTxtPtr(aText), iWindowGroupId(0), iMatchedChars(0), iMatchMode(EWildNonSpanning), iObserver(&aObserver), iPersistence(aPersistence) + { + } + +CBtraceTextOnScreen::TTextOnScreenNotif::TTextOnScreenNotif(const TDesC& aText, TMatchMode aMatchMode, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + : iTxtPtr(aText), iWindowGroupId(0), iMatchedChars(0), iMatchMode(aMatchMode), iObserver(&aObserver), iPersistence(aPersistence) + { + } + +CBtraceTextOnScreen::TTextOnScreenNotif::TTextOnScreenNotif(const TDesC& aText, TInt aWindowGroupId, TMatchMode aMatchMode, MBtraceTextOnScreenObserver& aObserver, TBtraceNotificationPersistence aPersistence) + : iTxtPtr(aText), iWindowGroupId(aWindowGroupId), iMatchedChars(0), iMatchMode(aMatchMode), iObserver(&aObserver), iPersistence(aPersistence) + { + }