searchfw/plugins/messagingplugin/inc/messagessearcher.h
author Maximilian Odendahl <maxodendahl@gmail.com>
Mon, 15 Feb 2010 16:38:49 +0100
changeset 4 c1a7ca8407fe
parent 0 f979ecb2b13e
permissions -rw-r--r--
fix for Bug 1908

/*
* Copyright (c) 2006-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:   ECom search interface definition
*
*/




#ifndef C_MESSAGESSEARCHER_H
#define C_MESSAGESSEARCHER_H

//SYSTEM INCLUDES
#include <smtcmtm.h>
#include <popcmtm.h>
#include <impcmtm.h>

#include <mmsclient.h>
#include <sendas2.h>
#include <msvreg.h>
#include <searchcontentsearcher.h>


#include <apgcli.h>
#include <apacmdln.h>
#include <barsread2.h>
#include <MuiuMsgEditorLauncher.h>


// FORWARD DECLARATIONS
class CSmsClientMtm;
class CClientMtmRegistry;
class MSearchPluginObserver;
class CSearchTextSearcher;
class CSearchCriteriaArray;
class CSearchResult;
class CSearchResultArray;
class CSearchDocumentId;
class CSearchSnippet;
class CSearchSnippetInfo;
class MSearchFScanObserver;
class CMsgDesC;
class CSearchSnippetCreator;
class MSearchContentSearcher;
class CSearchCondition;
class TMsvSessionEvent;

class TEditorParameters;

/**
 *  This class is the searcher class for the messages
 *
 *  This class searches the contacts using the message server apis
 *
 *  @lib 
 */
class CMessagesSearcher : public CActive, 
						  public MSearchContentSearcher, 
						  public MMsvSessionObserver
{	
public:

enum TSearchField 				// what fields to search
	{
	ESearchFieldAll = 0,    	// all
	ESearchFieldTitleOnly,  	// title only
	ESearchFieldBodyOnly    	// doby only
	};

enum TSearchType 				// what type of message to search
	{
	ESearchTypeSms = 0, 		// sms
	ESearchTypeEmail,   		// email
	ESearchTypeAll,     		// all
	ESearchTypeNone     		// none
	};

enum TSearching 				// what is currently under search
{
	ESearchingBody = 0,     	// sms body
	ESearchingSender,       	// sms sender
	ESearchingSMTPSubject,  	// smtp subject
	ESearchingSMTPSender,   	// smtp sender
	ESearchingSMTPBody,     	// smtp body
	ESearchingPOP3Subject,  	// pop3 subject
	ESearchingPOP3Sender,   	// pop3 sender
	ESearchingPOP3Body,     	// pop3 body
	ESearchingIMAP4Subject, 	// imap4 subject
	ESearchingIMAP4Sender,  	// imap4 sender
	ESearchingIMAP4Body,    	// imap4 body
	ESearchingMMSBody,      	// mms body
	ESearchingMMSSender,     	// mms sender
	ESearchingGenericEmailSubject,  // pop3 subject
	ESearchingGenericEmailSender,   // pop3 sender
	ESearchingGenericEmailBody     // pop3 body
	};



/**
* 1st phase constructor 
*
* @param aContentIdArray - content id
* @param aCondition - condition
* @param aPluginId - Implementation id
* @return returns pointer to the constructed object of type CContactsSearcher
*/
static CMessagesSearcher* NewL( const RArray<TUid>& aContentIdArray, 
								                    const CSearchCondition& aCondition, 
								                    const TUid& aPluginId,
								                    MSearchPluginObserver& aObserver );
/**
* Destructor
*/
~CMessagesSearcher();
   
/**
* Checks the deltion of the entry before launching.
*
* @param aDocumentId Id of the document.
* @ return ETrue if entry is deleted.
*/
TBool IsEntryDeleted( TMsvId& aMsgEntryId );
    
public: //from base class MSearchContentSearcher    
/**
* From MSearchContentSearcher
* Releses the object.
*
*/
void Destroy(); 

/**
 * From MSearchContentSearcher
 * Starts the search. Progress of the search is notified through aObserver. 
 * Notice that this call must be asynchronous.
 *
 * @param aObserver Observer for search progress.
*/
void SearchL( );


/**
* From MSearchContentSearcher 
* Cancels the ongoing search. This call must complete synchronously and no calls for
* observers must be made after this call.
*
*/
void CancelSearch();

/**
* From MSearchContentSearcher 
* Gets the results indicated by the given document ids. Asynchronous. Results will be given
* through callback in MSearchPlugInObserver given in Search request.
* 
* @param aResults Results of the search process. Ownership transfers to caller.
*/
void GetResultsL( const RPointerArray<CSearchDocumentId>& aDocumentIdArray );

/**
* From MSearchContentSearcher 
* Cancels the result retrieval process.
*
*/
void CancelResultsRetrieve();


/**
* From MSearchContentSearcher , through MSearchTextSearcherObserver
* Called when all search criteria are met.
*
* @param aKeyWordPos The character position of the keyword match within the original text
*/
void HitL( TInt aKeyWordPos );


/**
* This funcion returns the launch info corresponding to a particular document id.
*
* @param aDocumentID The document id for which launch info is required.
*/       
HBufC8* LaunchInfoL( const CSearchDocumentId& aDocumentID );
          

/**
* Is called when contentsearcher finishes it's operation or it is unable to
* search further.
* @param aTotalNumOfItems
* @param aSearchResult
*/
void ReportFinishedL( TInt aTotalNumOfItems, TInt aSearchResult = 0 );


public: //from base class MMsvSessionObserver

/**
* From MMsvSessionObserver
*Provides the interface for notification of events from a Message Server session.
* The types of event are given in the enumeration TMsvSessionEvent. Clients must provide an object that implements
* the interface, and set it to be notified through CMsvSession::OpenSyncL() or CMsvSession::OpenASyncL().
* Additional observers can also be added and removed through CMsvSession.
*
* @TMsvSessionEvent  the session event
* @param 
*/
void HandleSessionEventL( TMsvSessionEvent, TAny*, TAny*, TAny* );


void LaunchApplicationL(  const TDesC8& aLaunchInfo );

/**
* Finds the right application id to be started and returns it.
*
* @param        aParams Editor parameters
* @param        aMtmType Result's Mtm type
*
* @return Editor application's uid
*
*/
TUid DiscoverL( const TEditorParameters aParams, TUid aMtmType );


/**
* Reads the parameters ( service type (View/Edit), MtmType) from 
* the opaque data. If type and mtm match, sets aAppUi as
* the application id and returns ETrue. If not found, returns EFalse.
*/ 
TBool TryMatchL( const TEditorParameters aParams, 
                                   TUid aMtmType, 
                                   const TApaAppServiceInfo aInfo, 
                                   TUid& aAppUid );      


protected: // From base class CActive

/**
* From CActive
* Implements cancellation of an outstanding request.
*
* This function is called as part of the active object's Cancel().
*/
void DoCancel() ;

/**
* From CActive
* Handles an active object's request completion event.
*
* The function is called by the active scheduler when a request
* completion event occurs, i.e. after the active scheduler's
* WaitForAnyRequest() function completes.
*
* Before calling this active object's RunL() function, the active scheduler 
* has:
* 	
* 1. decided that this is the highest priority active object with
*   a completed request
*
* 2. marked this active object's request as complete (i.e. the request is no 
*   longer outstanding)
*
* RunL() runs under a trap harness in the active scheduler. If it leaves,
* then the active scheduler calls RunError() to handle the leave.
*
* Note that once the active scheduler's Start() function has been called, 
* all user code is run under one of the program's active object's RunL() or 
* RunError() functions.
*
*/
void RunL();


/**
* From CActive 
* If the RunL function leaves,
* then the active scheduler calls RunError() to handle the leave.
*
*/
TInt RunError( TInt aError );


private:	
/**
* Constructor
*
*
* @param aPluginId
*/
CMessagesSearcher( const TUid&  aPluginId);

/** 
* 2nd phase constructor
*
* @param aContentIdArray
* @param aCondition
*/
void ConstructL( const RArray<TUid>& aContentIdArray, 
				 const CSearchCondition& aCondition,
				 MSearchPluginObserver& aObserver );

/**
* Cleans up the memory held
*
*/
void CleanUp();

/**
* Does actual search
*
*
*/
TBool DoActualSearchL();



/**
* Sets the folder(s) to be searched by the plug-in.
*
*/
void SetTargetFolderL(  );




/**
* Checks all folders that need to be searched.  Folders to be searched are
*  set via SetTargetFolderL.
* Calls AddFolderWithSubFoldersL to add the folder to the array of folders to be
*  searched.
*
* @param
*/
void ListSubFoldersL( const CMsvEntry& aFolderEntry );

/**
* Will add the specified folder to the folder array to be searched.
*  Subfolders of the specified folder are checked by calling ListSubFoldersL.
*
* @param
*/
void AddFolderWithSubFoldersL( const TMsvId& aFolderId );

/**
* Prepares the object for the search. MoveOnToNextMessageL is called
*  to find the 1st message in the to be searched folders.
*
* @return		ETrue		When messages are available
*				EFalse		When 0 messages are available
*/
TBool PrepareForSearchL();

/**
* Moves through all messages under those folders to be searched and returns
*  with ETrue when a message is found.
*
* @return 	ETrue		When a message is found.
*			EFalse		When no more messages are available under the to be
*						 searched folders.
*/
TBool MoveOnToNextMessageL();

/**
* Searches SMS message.
*
* @param
*/
void SearchSmsL( TMsvId& aMessageId );

/**
* Searches MMS message.
*
* @param
*/
void SearchInMmsMessageL(const TMsvId& aMessageId);

/**
* Searches Email message.
*
* @param
*/
void SearchGenericEmailL(  TMsvId& aMessageId, TUid aMessageUid);

/**
* Generates results from a hit in sms message.
*
* @param
*/
void ReportHitInSmsL( TInt aKeyWordPos );

/**
* Generates results from a hit in mms message.
*
* @param
*/
void ReportHitInMmsL( TInt aKeyWordPos );

/**
* Generates results from a hit in email message.
*
* @param
*/
void ReportHitInEmailL( TInt aKeyWordPos );

/**
* Searches for Mtm -class from the array that can be used to open the message specified by aUid
* If proper class is not found, it's created by using method AddIntoMtmArrayL().
*
* @param aUid
*/
CBaseMtm* SearchFromMtmArrayL( TUid aUid );

/**
* Checks if there's any entry in at least one folder
*
* 	
*/
TBool AnyEntriesInAllFolders();

private: // Data

/**
*client for opening sms
*/
CSmsClientMtm*	iSmsMtm;                    

/**
*client for opening mms
*/
CMmsClientMtm*	iMmsMtm;                    

/**
*client for opening emails
*/
CBaseMtm*		iGenericMtm; 
		       
/**
*pointer to ClientMtmRegistry
*/		
CClientMtmRegistry*	iMtmReg;                    

/**
*pointer to message session
*/		
CMsvSession*	iSession;                   

/**
*array containing Mtm -objects used for opening messages.
*/		
RPointerArray<CBaseMtm>	iMtmArray; 

/**
*Array of folders to be searched.
*/		
RArray<TMsvId>  	iToBeSearchedFolders;    
   
/**
*index of folder currently being
*/		
TInt	iToBeSearchedFoldersIdx;	 
																
/**
*reference to the file system
*/		
RFs iFs;                                                   

/**
*folder currently being searched
*/		
CMsvEntry*	iFolderEntry;				 

/**
* Message Entry
*/
CMsvEntrySelection* iEntryDeleted;
/**
*message currently being searched
*/		
CMsvEntry*		iMessageEntry; 

/**
*message currently being searched
*/		
CMsvEntrySelection*	iMessageEntries;			

/**
*Id of messageentry
*/		
TInt	iMessageEntriesIdx;			


/**
*no of matches found
*/		
TInt  iStatusItemCounter;

/**
*no of max entires found
*/		
TInt iTotalNumOfItems;           

/**
*What field is under search. Affects snippet handling.
*/		
TSearching iFieldCurrentlyUnderSearch;  

/**
*arrray contains heavyResults
*/	
RPointerArray<CSearchResult> iHeavyResultsArray; 



/**
*pluginID 
*/		
const TUid	iPluginId;

/**
*Is search cancelled
*/		
TBool	iSearchNotCancelled;  	//when cancelled search..


/**
*Message Description array 
*/		
RPointerArray<CMsgDesC> iMsgDesCArray;

/**
*array informing num messge entries in a folder
*/		
RArray<TInt>  iMsgEntriesInFoldersArray;


/**
* Text searcher
* Own.  
*/
CSearchTextSearcher* iTextSearcher; // Text searcher

/**
* Search Plugin Observer
* Own.  
*/
MSearchPluginObserver*      iObserver;

/**
* The current text being searched 
* Own.  
*/
HBufC* iCurrentTextBeingSearched;
HBufC*  iSenderReciever;
	

/**
* Flags for checking searchcontent
*/
TBool  iHitFound;

CMsvStore* iMsvStore;


};





#endif //C_MESSAGESSEARCHER_H