diff -r 6b1d113cdff3 -r 6638e7f4bd8f telephonyserverplugins/multimodetsy/hayes/SCHAT.CPP --- a/telephonyserverplugins/multimodetsy/hayes/SCHAT.CPP Mon May 03 13:37:20 2010 +0300 +++ b/telephonyserverplugins/multimodetsy/hayes/SCHAT.CPP Thu May 06 15:10:38 2010 +0100 @@ -1,217 +1,217 @@ -// Copyright (c) 1997-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: -// Send/Expect Algorithms -// -// - -#include "ATSTD.H" -#include "SCHAT.H" -#include "mSLOGGER.H" - -CCommChatString* CCommChatString::NewL(const TDesC8& aDes, TBool aIsPartialLine) - { - CCommChatString* cs = new (ELeave) CCommChatString; - CleanupStack::PushL(cs); - cs->CreateL(aDes, aIsPartialLine); - CleanupStack::Pop(); - return cs; - } - -CCommChatString::CCommChatString() - { - } - -CCommChatString::~CCommChatString() - { - } - -void CCommChatString::CreateL(const TDesC8& aDes, TBool aIsPartialLine) - { - iIsPartialLine = aIsPartialLine; - iMatch.Set(aDes); - } - -// -// CCommChatter -// -CCommChatter::CCommChatter(MCommChatNotify* aNotify, TInt aPriority) - : CTimer(aPriority), iNotify(aNotify) - { - CActiveScheduler::Add(this); - iList.SetOffset(_FOFF(CCommChatString,iLink)); - } - -CCommChatter::~CCommChatter() - { - DeleteAllAndStop(); - User::Free(iBuffer); - } - -void CCommChatter::CreateL(TInt aBufSize) - { - CTimer::ConstructL(); - iBuffer = (TText8*)User::AllocL(aBufSize); - iBufferEnd = (iBuffer+aBufSize)-1; - ClearBuffer(); - } - -void CCommChatter::ClearBuffer() -// -// Empty history -// - { - iLastChar = iBuffer; - iLineStart = iBuffer; - iInDelimiter = ETrue; // as though the last character was the end of a line - } - -void CCommChatter::ClearCurrentLine() -// -// Remove current line, which is always at the end of the buffer -// - { - iLastChar = iLineStart; - iInDelimiter = ETrue; // as though the last character was the end of a line - } - -TPtrC8 CCommChatter::Buffer() const - { - return TPtrC8(iBuffer, iLastChar-iBuffer); - } - -TPtrC8 CCommChatter::CurrentLine() const - { - TInt len=iLastChar-iLineStart; - if (len>0 && iInDelimiter) - len-=1; - return TPtrC8(iLineStart, len); - } - -void CCommChatter::AddCharL(TText8 aChar) -// -// Add a character to the history buffer -// Scan all strings to find any matches that may -// be completed. -// - { - // Prevent reading of multiple delimiters into buffer - if (iInDelimiter && (aChar == '\r' || aChar == '\n')) - return; - - *iLastChar++=aChar; - if (iLastChar>=iBufferEnd) - { - iLastChar = iBufferEnd; // Discarding characters at this point - } - - if (aChar=='\r' || aChar=='\n') - { - if (iInDelimiter) - return; // still in delimiting sequence - iInDelimiter=ETrue; - } - else - { - if (iInDelimiter) - { - iInDelimiter=EFalse; - iLineStart=iLastChar-1; - } - if (iPartLineMatchers==0) - return; // wait for end of line before trying to match - } - - // Scan for matching expect string - - TPtrC8 line(CurrentLine()); - CCommChatString* cs; - TDblQueIter iter(iList); - - if (iInDelimiter) - { - // Simple match at end of line - test all strings - while (cs = iter++, cs!=NULL) - { - if (line.Match(cs->iMatch)==0) - { - LOGTEXT2(_L8("SChat:\tFound match against =>%S<"), &cs->iMatch); - iNotify->ChatStringMatchL(cs); - cs = iter; // In case user removed cs; - } - } - } - else - { - // partial match - use only selected matchers - while (cs = iter++, cs!=NULL) - { - if (cs->iIsPartialLine && line.Match(cs->iMatch)==0) - { - LOGTEXT2(_L8("SChat:\tFound match against partial line =>%S<"), &cs->iMatch); - iNotify->ChatStringMatchL(cs); - cs = iter; // In case user removed cs; - } - } - } - } - -void CCommChatter::RunL() - { - iNotify->ChatTimeout(); - } - -CCommChatString* CCommChatter::AddStringL(const TDesC8& aString, TBool aPartLine) - { - CCommChatString* chatString=CCommChatString::NewL(aString,aPartLine); - iList.AddLast(*chatString); - if (aPartLine) - iPartLineMatchers+=1; - return chatString; - } - -void CCommChatter::RemoveString(CCommChatString* aString) - { - _LIT(KCCommChatterPanic, "GSMTSY-CHAT"); - aString->iLink.Deque(); - if (aString->iIsPartialLine) - { - iPartLineMatchers-=1; - __ASSERT_ALWAYS(iPartLineMatchers>=0, User::Panic(KCCommChatterPanic,1)); - } - } - -void CCommChatter::DeleteAllAndStop() - { - StopTimer(); - CCommChatString* cs; - while (!iList.IsEmpty()) - { - cs = iList.First(); - RemoveString(cs); - delete cs; - } - iPartLineMatchers=0; - } - -void CCommChatter::StartTimer(const TTimeIntervalMicroSeconds32 aTimeout) - { - if (IsActive()) - Cancel(); - After(aTimeout); - } - -void CCommChatter::StopTimer() - { - Cancel(); - } +// Copyright (c) 1997-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: +// Send/Expect Algorithms +// +// + +#include "ATSTD.H" +#include "SCHAT.H" +#include "mSLOGGER.H" + +CCommChatString* CCommChatString::NewL(const TDesC8& aDes, TBool aIsPartialLine) + { + CCommChatString* cs = new (ELeave) CCommChatString; + CleanupStack::PushL(cs); + cs->CreateL(aDes, aIsPartialLine); + CleanupStack::Pop(); + return cs; + } + +CCommChatString::CCommChatString() + { + } + +CCommChatString::~CCommChatString() + { + } + +void CCommChatString::CreateL(const TDesC8& aDes, TBool aIsPartialLine) + { + iIsPartialLine = aIsPartialLine; + iMatch.Set(aDes); + } + +// +// CCommChatter +// +CCommChatter::CCommChatter(MCommChatNotify* aNotify, TInt aPriority) + : CTimer(aPriority), iNotify(aNotify) + { + CActiveScheduler::Add(this); + iList.SetOffset(_FOFF(CCommChatString,iLink)); + } + +CCommChatter::~CCommChatter() + { + DeleteAllAndStop(); + User::Free(iBuffer); + } + +void CCommChatter::CreateL(TInt aBufSize) + { + CTimer::ConstructL(); + iBuffer = (TText8*)User::AllocL(aBufSize); + iBufferEnd = (iBuffer+aBufSize)-1; + ClearBuffer(); + } + +void CCommChatter::ClearBuffer() +// +// Empty history +// + { + iLastChar = iBuffer; + iLineStart = iBuffer; + iInDelimiter = ETrue; // as though the last character was the end of a line + } + +void CCommChatter::ClearCurrentLine() +// +// Remove current line, which is always at the end of the buffer +// + { + iLastChar = iLineStart; + iInDelimiter = ETrue; // as though the last character was the end of a line + } + +TPtrC8 CCommChatter::Buffer() const + { + return TPtrC8(iBuffer, iLastChar-iBuffer); + } + +TPtrC8 CCommChatter::CurrentLine() const + { + TInt len=iLastChar-iLineStart; + if (len>0 && iInDelimiter) + len-=1; + return TPtrC8(iLineStart, len); + } + +void CCommChatter::AddCharL(TText8 aChar) +// +// Add a character to the history buffer +// Scan all strings to find any matches that may +// be completed. +// + { + // Prevent reading of multiple delimiters into buffer + if (iInDelimiter && (aChar == '\r' || aChar == '\n')) + return; + + *iLastChar++=aChar; + if (iLastChar>=iBufferEnd) + { + iLastChar = iBufferEnd; // Discarding characters at this point + } + + if (aChar=='\r' || aChar=='\n') + { + if (iInDelimiter) + return; // still in delimiting sequence + iInDelimiter=ETrue; + } + else + { + if (iInDelimiter) + { + iInDelimiter=EFalse; + iLineStart=iLastChar-1; + } + if (iPartLineMatchers==0) + return; // wait for end of line before trying to match + } + + // Scan for matching expect string + + TPtrC8 line(CurrentLine()); + CCommChatString* cs; + TDblQueIter iter(iList); + + if (iInDelimiter) + { + // Simple match at end of line - test all strings + while (cs = iter++, cs!=NULL) + { + if (line.Match(cs->iMatch)==0) + { + LOGTEXT2(_L8("SChat:\tFound match against =>%S<"), &cs->iMatch); + iNotify->ChatStringMatchL(cs); + cs = iter; // In case user removed cs; + } + } + } + else + { + // partial match - use only selected matchers + while (cs = iter++, cs!=NULL) + { + if (cs->iIsPartialLine && line.Match(cs->iMatch)==0) + { + LOGTEXT2(_L8("SChat:\tFound match against partial line =>%S<"), &cs->iMatch); + iNotify->ChatStringMatchL(cs); + cs = iter; // In case user removed cs; + } + } + } + } + +void CCommChatter::RunL() + { + iNotify->ChatTimeout(); + } + +CCommChatString* CCommChatter::AddStringL(const TDesC8& aString, TBool aPartLine) + { + CCommChatString* chatString=CCommChatString::NewL(aString,aPartLine); + iList.AddLast(*chatString); + if (aPartLine) + iPartLineMatchers+=1; + return chatString; + } + +void CCommChatter::RemoveString(CCommChatString* aString) + { + _LIT(KCCommChatterPanic, "GSMTSY-CHAT"); + aString->iLink.Deque(); + if (aString->iIsPartialLine) + { + iPartLineMatchers-=1; + __ASSERT_ALWAYS(iPartLineMatchers>=0, User::Panic(KCCommChatterPanic,1)); + } + } + +void CCommChatter::DeleteAllAndStop() + { + StopTimer(); + CCommChatString* cs; + while (!iList.IsEmpty()) + { + cs = iList.First(); + RemoveString(cs); + delete cs; + } + iPartLineMatchers=0; + } + +void CCommChatter::StartTimer(const TTimeIntervalMicroSeconds32 aTimeout) + { + if (IsActive()) + Cancel(); + After(aTimeout); + } + +void CCommChatter::StopTimer() + { + Cancel(); + }