diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/csdagt/script/SCHAT.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/csdagt/script/SCHAT.CPP Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,277 @@ +// Copyright (c) 2003-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: +// For manipulting of received data +// +// + +/** + @file schat.cpp +*/ + +#include "SCHAT.H" +#include "ND_STD.H" + +// +// CCommChatter definitions +// + +CCommChatter* CCommChatter::NewL(MCommChatNotify* aNotify,TInt aPriority,TInt aBufferSize) +/** +2 phased constructor for CCommChatter, first phase. + +@param aNotify a pointer to chat notifier. +@param aPriority is priority for this timer. +@param aBufferSize is buffer size for this object. +@exception Leaves if ConstructL() leaves, or not enough memory is available. +@return a new CCommChatter object. +*/ + { + CCommChatter* cc=new(ELeave) CCommChatter(aNotify,aPriority); + CleanupStack::PushL(cc); + cc->ConstructL(aBufferSize); + CleanupStack::Pop(); + return cc; + } + +CCommChatter::CCommChatter(MCommChatNotify* aNotify, TInt aPriority) + : CTimer(aPriority), iNotify(aNotify) +/** +Private constructor for CCommChatter, used in the first phase of construction. + +@param aNotify a pointer to chat notifier. +@param aPriority is priority for this timer. +*/ + { + CActiveScheduler::Add(this); + iList.SetOffset(_FOFF(CCommChatString,iLink)); + } + +void CCommChatter::ConstructL(TInt aBufSize) +/** +Instantiates member variables. + +@param aBufSize is buffer size for this object. +@exception Leaves if CTimer::ConstructL() or User::AllocL() leaves. +*/ + { + CTimer::ConstructL(); + iBuffer=(TText8*)User::AllocL(aBufSize); + iBufferEnd=(iBuffer+aBufSize)-1; + ClearHistory(); + } + +CCommChatter::~CCommChatter() +/** +Destructor. +Frees iBuffer's allocated memory. +*/ + { + User::Free(iBuffer); + } + +void CCommChatter::ClearHistory() +/** +Empties history. +*/ + { + iLastChar=iBuffer; + iCount=0; + } + +void CCommChatter::AddChar(TText8 aChar) +/** +Adds a character to the history buffer. +Scan all strings to find any matches that may be completed. +*/ + { + if (++iLastChar>iBufferEnd) + iLastChar=iBuffer; + *iLastChar=aChar; + ++iCount; + + TText8 fchar=(TText8)User::Fold(aChar); + + // Scan for matching last character + CCommChatString* cs; + TDblQueIter iter(iList); + TInt index=0; + + while (cs=iter++, cs!=NULL) + { + if (cs->IsFolded() + ? (cs->LastChar()==fchar && MatchF(cs)) + : (cs->LastChar()==aChar && Match(cs)) ) + { + iNotify->ChatStringMatch(index); + cs=iter; // In case user removed cs; + } + index++; + } + } + +TBool CCommChatter::Match(const CCommChatString* aString) const +/** +Matches a chat string against the history buffer (Case sensitive). +*/ + { + __ASSERT_ALWAYS(aString!=NULL, NetDialPanic(ENullCommChatString)); + + const TText8* s=aString->Ptr(); + const TText8* sp=aString->EndPtr(); + const TText8* bp=iLastChar; + + if (iCountLength()) + return EFalse; + + while (*bp==*sp && sp>=s) + { + --sp; + if (--bpPtr(); + const TText8* sp=aString->EndPtr(); + const TText8* bp=iLastChar; + + if (iCountLength()) + return EFalse; + + while (User::Fold(*bp)==*sp && sp>=s) + { + --sp; + if (--bpChatTimeout(); + } + +void CCommChatter::AddString(CCommChatString* aString) +/** +Adds a string to the list. +*/ + { + __ASSERT_ALWAYS(aString!=NULL, NetDialPanic(ENullCommChatString)); + iList.AddLast(*aString); + } + +void CCommChatter::RemoveString(CCommChatString* aString) +/** +Removes a string from the list. +*/ + { + __ASSERT_ALWAYS(aString!=NULL, NetDialPanic(ENullCommChatString)); + aString->iLink.Deque(); + } + +void CCommChatter::DeleteAllAndStop() +/** +Removes all strings from the list. +*/ + { + StopTimer(); + CCommChatString* cs; + while (!iList.IsEmpty()) + { + cs=iList.First(); + RemoveString(cs); + delete cs; + } + } + +void CCommChatter::StartTimer(const TTimeIntervalMicroSeconds32& aTimeout) +/** +Starts timer. +*/ + { + + if (IsActive()) + Cancel(); + After(aTimeout); + } + +void CCommChatter::StopTimer() +/** +Stops timer. +*/ + { + Cancel(); + } + +// +// CCommChatString definitions +// + +CCommChatString* CCommChatString::NewL(const TDesC8& aDes,TBool aIsFolded) +/** +2 phased constructor for CCommChatString, first phase. + +@param aDes a pointer to chat notifier. +@param aIsFolded is buffer size for this object. +@exception Leaves if ConstructL() leaves, or not enough memory is available. +@return a new CCommChatString object. +*/ + { + CCommChatString* cs=new (ELeave) CCommChatString; + CleanupStack::PushL(cs); + cs->ConstructL(aDes,aIsFolded); + CleanupStack::Pop(); + return cs; + } + +CCommChatString::CCommChatString() +/** +Private constructor for CCommChatString, used in the first phase of construction. +*/ + {} + +void CCommChatString::ConstructL(const TDesC8& aDes,TBool aIsFolded) +/** +Instantiates member variables. +*/ + { + __ASSERT_ALWAYS(aDes.Length()>0, NetDialPanic(ENullCommChatString)); + iIsFolded=aIsFolded; + iString=(TText8*)User::AllocL(aDes.Length()); + iLastChar=(iString+aDes.Length())-1; + Mem::Copy(iString, (TText8*)aDes.Ptr(), aDes.Length()); + } + +CCommChatString::~CCommChatString() +/** +Destructor. +Deletes allocations/objects. +*/ + { + User::Free(iString); + }