--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/ipssosplugin/src/ipsplgsearchop.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,421 @@
+/*
+* Copyright (c) 2007 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: Operation that searches string from email.
+*
+*/
+
+
+
+#include "emailtrace.h"
+#include "ipsplgheaders.h"
+
+/** Snippet length, for HTML tags. */
+const TInt KIpsPlgSnippetLen = 300;
+// Defines the number of mails handled in one scheduler round
+const TInt KIpsPlgSearchMailsInRound = 10;
+
+// ======== CONSTRUCTORS & DESTRUCTOR ========
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::NewL()
+// ---------------------------------------------------------------------------
+//
+CIpsPlgSearchOp* CIpsPlgSearchOp::NewL(
+ CIpsPlgSearch& aObserver )
+ {
+ FUNC_LOG;
+ CIpsPlgSearchOp* self = CIpsPlgSearchOp::NewLC( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::NewLC()
+// ---------------------------------------------------------------------------
+//
+CIpsPlgSearchOp* CIpsPlgSearchOp::NewLC(
+ CIpsPlgSearch& aObserver )
+ {
+ FUNC_LOG;
+ CIpsPlgSearchOp* self = new( ELeave ) CIpsPlgSearchOp( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::~CIpsPlgSearchOp()
+// ---------------------------------------------------------------------------
+//
+CIpsPlgSearchOp::~CIpsPlgSearchOp()
+ {
+ FUNC_LOG;
+ delete iMessage;
+ iMessage = NULL;
+ delete iHeader;
+ iHeader = NULL;
+ if ( iSearcher )
+ {
+ iSearcher->Cleanup();
+ }
+ delete iSearcher;
+ iSearcher = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::CIpsPlgSearchOp()
+// ---------------------------------------------------------------------------
+//
+CIpsPlgSearchOp::CIpsPlgSearchOp(
+ CIpsPlgSearch& aObserver )
+ :
+ CActive( EPriorityStandard ),
+ iObserver( aObserver ),
+ iMessage( NULL )
+ {
+ FUNC_LOG;
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::ConstructL()
+ {
+ FUNC_LOG;
+ iState = EStarted;
+
+ iSearcher = CIpsPlgTextSearcher::NewL( *this );
+ iSearcher->SetParametersL(
+ iObserver.SearchStringsL(),
+ EIpsPlgCriteriaOperationOR,
+ EFalse,
+ KIpsPlgSnippetLen );
+
+ ActivateAndComplete();
+ }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// From class CIpsPlgBaseOperation.
+// CIpsPlgSearchOp::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::DoCancel()
+ {
+ FUNC_LOG;
+ iSearcher->Cleanup();
+ iState = ECanceled;
+ }
+
+// ---------------------------------------------------------------------------
+// From class CIpsPlgBaseOperation.
+// CIpsPlgSearchOp::RunL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::RunL()
+ {
+ FUNC_LOG;
+ switch ( iState )
+ {
+ case EStarted:
+ {
+ // Collect all message id's in the mailbox and sort them.
+ iObserver.CollectMessagesL();
+ iObserver.Sort();
+ iState = ERunning;
+ ActivateAndComplete();
+ break;
+ }
+ case ERunning:
+ {
+ for ( TInt i(0); i < KIpsPlgSearchMailsInRound; i++ )
+ {
+ if ( NextMailL() )
+ {
+ // Mail found, read the content and search for the string.
+ // It must be made sure, that the search string contains valid
+ // data to search the body, i.e. character set must match.
+ // The following line is commented out since it currently doesn't do anything
+ // HandleHtmlL();
+ SearchL();
+ }
+ else
+ {
+ FinalizeL();
+ return;
+ }
+ }
+
+ iState = ERunning;
+ ActivateAndComplete();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ }
+
+// ---------------------------------------------------------------------------
+// From class CIpsPlgBaseOperation.
+// CIpsPlgSearchOp::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CIpsPlgSearchOp::RunError( TInt /* aError */ )
+ {
+ FUNC_LOG;
+ return KErrGeneral;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::NextMailL()
+// ---------------------------------------------------------------------------
+//
+TBool CIpsPlgSearchOp::NextMailL()
+ {
+ FUNC_LOG;
+ // In case the operation is cancelled, do not try to any extra steps.
+ if ( iState == ERunning )
+ {
+ // Delete object before creating new. Previous object is not needed.
+ delete iMessage;
+ iMessage = NULL;
+ delete iHeader;
+ iHeader = NULL;
+ iMessage = iObserver.NextMessageL();
+
+ // If message is not set, the search is finished.
+ // Run down the operation.
+ if ( !iMessage )
+ {
+ iState = EFinished;
+ return EFalse;
+ }
+
+ // Retrieve the message header also.
+ iHeader = iObserver.MessageHeaderL();
+ }
+ else
+ {
+ // Stop the loop, cancel should not continue.
+ return EFalse;
+ }
+ return ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::HandleHtmlL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::HandleHtmlL()
+ {
+ FUNC_LOG;
+ if ( iState == ERunning )
+ {
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchBodyL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::SearchBodyL()
+ {
+ FUNC_LOG;
+ if ( iState == ERunning )
+ {
+ // Just small amount of code to find the strings from the body.
+ CParaFormatLayer* para = CParaFormatLayer::NewL();
+ CleanupStack::PushL( para );
+ CCharFormatLayer* chars = CCharFormatLayer::NewL();
+ CleanupStack::PushL( chars );
+ CRichText* txt = CRichText::NewL( para, chars );
+ CleanupStack::PushL( txt );
+
+ iMessage->GetBodyTextL(
+ iObserver.CurrentMessage().Id(),
+ CImEmailMessage::EThisMessageOnly,
+ *txt,
+ *para,
+ *chars );
+
+ RBuf temp;
+ temp.CreateL( txt->DocumentLength() );
+ CleanupClosePushL( temp );
+
+ txt->Extract( temp );
+ SearchFromStringL( temp );
+
+ CleanupStack::PopAndDestroy( &temp );
+ CleanupStack::PopAndDestroy( txt );
+ CleanupStack::PopAndDestroy( chars );
+ CleanupStack::PopAndDestroy( para );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchFromArrayL()
+// ---------------------------------------------------------------------------
+//
+TBool CIpsPlgSearchOp::SearchFromArrayL( const CDesCArray& aArray )
+ {
+ FUNC_LOG;
+ TBool found( EFalse );
+ for ( TInt item(0); iState == ERunning && item < aArray.Count() && !found; item++ )
+ {
+ found = SearchFromStringL( aArray[item] );
+ }
+ return found;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchFromStringL()
+// ---------------------------------------------------------------------------
+//
+TBool CIpsPlgSearchOp::SearchFromStringL( const TDesC& aString )
+ {
+ FUNC_LOG;
+ TBool found( EFalse );
+ if ( iState == ERunning )
+ {
+ found = iSearcher->SearchL( aString );
+ }
+ return found;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::SearchL()
+ {
+ FUNC_LOG;
+ if ( iState == ERunning )
+ {
+ iSearcher->Cleanup();
+
+ // Mail is fetched, search from entire mail.
+ if ( iHeader )
+ {
+ SearchFromEntireMailL();
+ }
+ // Mail not fetched, search only from subject.
+ else
+ {
+ SearchFromSubjectL();
+ }
+ iState = ( iState == EHit ) ? ERunning : iState;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::HitL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::HitL(
+ const TDesC& /* aSnippet */,
+ TInt /* aSnippetCharPos */,
+ TBool /* aStartIncomplete */,
+ TBool /* aEndIncomplete */ )
+ {
+ FUNC_LOG;
+ iObserver.MatchFoundL();
+ iState = EHit;
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::FinalizeL()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::FinalizeL()
+ {
+ FUNC_LOG;
+ // In case of cancel, the stop should not be indicated.
+ if ( iState == EFinished )
+ {
+ iObserver.SearchFinishedL();
+ iState = EStopped;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::ActivateAndComplete()
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::ActivateAndComplete( )
+ {
+ FUNC_LOG;
+ iStatus = KRequestPending;
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete( status, KErrNone );
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchFromEntireMailL( )
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::SearchFromEntireMailL( )
+ {
+ FUNC_LOG;
+ if ( SearchFromStringL( iHeader->Subject() ) )
+ {
+ return;
+ }
+ if ( SearchFromStringL( iHeader->From() ) )
+ {
+ return;
+ }
+ if ( SearchFromArrayL( iHeader->ToRecipients() ) )
+ {
+ return;
+ }
+ if ( SearchFromArrayL( iHeader->CcRecipients() ) )
+ {
+ return;
+ }
+ SearchBodyL();
+ }
+
+// ---------------------------------------------------------------------------
+// CIpsPlgSearchOp::SearchFromSubjectL( )
+// ---------------------------------------------------------------------------
+//
+void CIpsPlgSearchOp::SearchFromSubjectL( )
+ {
+ FUNC_LOG;
+ RBuf subject;
+ CleanupClosePushL( subject );
+ iObserver.GetSubjectL( subject );
+ TBool found = SearchFromStringL( subject );
+ CleanupStack::PopAndDestroy( &subject );
+
+ if ( !found )
+ {
+ RBuf sender;
+ CleanupClosePushL( sender );
+ iObserver.GetSenderL( sender );
+ found = SearchFromStringL( sender );
+ CleanupStack::PopAndDestroy( &sender );
+ }
+ }
+
+// End of File
+