harvesterplugins/messaging/smsmms/src/cmessageplugin.cpp
changeset 2 208a4ba3894c
child 9 4a2987baf8f7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/harvesterplugins/messaging/smsmms/src/cmessageplugin.cpp	Mon May 03 12:32:15 2010 +0300
@@ -0,0 +1,644 @@
+/*
+* Copyright (c) 2010 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:  
+*
+*/
+
+
+#include <e32base.h> 
+#include <msvids.h>
+#include <msvuids.h>
+#include <mmsconst.h>
+#include <mmsclient.h>
+#include <smsclnt.h>
+#include <txtrich.h>
+#include <smuthdr.h>
+#include <smut.h>
+#include <miutset.h>
+#include <SendUiConsts.h>
+#include <mtclreg.h>
+#include <gsmuelem.h>
+#include <msventry.h>
+#include <ccpixindexer.h>
+
+#include "cmessageplugin.h"
+#include "cmessagemonitor.h"
+#include "cmessageharvester.h"
+#include "cmessagedatahandler.h"
+#include "harvesterserverlogger.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cmessagepluginTraces.h"
+#endif
+
+
+// maximum length that the fully qualified msg Plugin base app class descriptor can be
+// e.g. "@c:root msg"
+const TInt KMsgPluginBaseAppClassMaxLen = 64;
+
+
+// local declarations and functions
+namespace {
+
+_LIT(KCPixSearchServerPrivateDirectory, "\\Private\\2001f6f7\\");
+_LIT(KPathIndexDbPath, CPIX_INDEVICE_INDEXDB);
+
+_LIT(KPathTrailer, "\\root\\msg\\smsmms");
+_LIT(KMsgBaseAppClassGeneric, ":root msg smsmms");
+_LIT(KAtSign, "@");
+_LIT(KColon, ":");
+
+/**
+* MapFileToDrive - gets the TDriveNumber associated with the aBaseAppClass.
+* @aBaseAppClass e.g. "@c:root file"
+* @aDrive returns the TDriveNumber for the aBaseAppClass
+* returns KErrNone on success or a standard error code
+*/
+TInt MapBaseAppClassToDrive(const TDesC& aBaseAppClass, TDriveNumber& aDrive)
+    {
+    if (KErrNone != aBaseAppClass.Left(1).Compare(KAtSign))
+        {
+        return KErrGeneral;
+        }
+
+    TPtrC drvChar = aBaseAppClass.Left(2).Right(1);
+    TChar d(drvChar[0]);
+    TInt drive;
+    const TInt ret = RFs::CharToDrive(d, drive);
+    if (!ret)
+        {
+        aDrive = TDriveNumber(drive);
+        }
+
+    return ret;
+    }
+
+}// anonymous namespace
+
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::NewL
+// ---------------------------------------------------------------------------
+//  
+CMessagePlugin* CMessagePlugin::NewL()
+{
+	CMessagePlugin* instance = CMessagePlugin::NewLC();
+    CleanupStack::Pop(instance);
+    return instance;
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::NewLC
+// ---------------------------------------------------------------------------
+//  
+CMessagePlugin* CMessagePlugin::NewLC()
+{
+	CMessagePlugin* instance = new (ELeave)CMessagePlugin();
+    CleanupStack::PushL(instance);
+    instance->ConstructL();
+    return instance;
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::CMessagePlugin
+// ---------------------------------------------------------------------------
+//  
+CMessagePlugin::CMessagePlugin()
+{
+	iMessageDataHandler = NULL;
+	iMessageHarvester = NULL;
+	iMessageMonitor = NULL;
+	iMsvSession = NULL;
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::~CMessagePlugin
+// ---------------------------------------------------------------------------
+//  
+CMessagePlugin::~CMessagePlugin()
+{
+    // remove notification paths before destroying iMonitor
+    for (TInt i=EDriveA; i<=EDriveZ; i++)
+        UnMount(TDriveNumber(i), EFalse);
+	delete iMessageDataHandler;
+	delete iMessageHarvester;	
+	delete iMessageMonitor;	
+	delete iMsvSession;
+	iFs.Close();
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::ConstructL
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::ConstructL()
+{
+    TInt err = iFs.Connect();
+    OstTrace1( TRACE_NORMAL, CMESSAGEPLUGIN_CONSTRUCTL, "CMessagePlugin::ConstructL;iFs Connect Error=%d", err );
+    CPIXLOGSTRING2("CMessagePlugin::ConstructL, iFs.Connect: %i", err);
+    User::LeaveIfError(err);
+    iCurrentDrive = EDriveC; //Default drive is C drive
+    iMsvSession = CMsvSession::OpenSyncL(*this);
+    iMessageMonitor = CMessageMonitor::NewL( *this, *iMsvSession );    
+    iMessageHarvester = CMessageHarvester::NewL( *this, *iMsvSession );    
+    iMessageDataHandler = CMessageDataHandler::NewL( *this, *iMsvSession );    
+    for (TInt i=EDriveA; i<=EDriveZ; i++)
+        {
+        iIndexer[i] = NULL; //Initialize to NULL
+        }
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::StartPluginL
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::StartPluginL()
+	{
+	//Get the current Drive for storage
+	iCurrentDrive = iMsvSession->CurrentDriveL();
+	OstTrace1( TRACE_NORMAL, CMESSAGEPLUGIN_STARTPLUGINL, "CMessagePlugin::StartPluginL;Current Drive for Messaging =%d", iCurrentDrive );
+	CPIXLOGSTRING2("currentDrive from messaging app : %d", iCurrentDrive );
+	MountL(TDriveNumber(iCurrentDrive)); //Mount current drive
+	// Define this base application class, use default location
+	}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::StartHarvestingL
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::StartHarvestingL(const TDesC& aQualifiedBaseAppClass)
+	{
+	OstTraceFunctionEntry0( CMESSAGEPLUGIN_STARTHARVESTINGL_ENTRY );
+	CPIXLOGSTRING("START CMessagePlugin::StartHarvestingL");
+	// Map base app class to a drive number
+	TDriveNumber drive ( EDriveA );//Initialize to silence compiler warnings.
+	if (KErrNone != MapBaseAppClassToDrive(aQualifiedBaseAppClass, drive))
+	   User::Leave(KErrGeneral);
+
+    // Leave if no indexer for this drive
+	if (!iIndexer[drive])
+	   User::Leave(KErrGeneral);
+	        
+    // Reset the database
+	iIndexer[drive]->ResetL();
+#ifdef __PERFORMANCE_DATA
+    iStartTime.UniversalTime();
+#endif
+    iMessageHarvester->StartHarvestingL();
+	OstTraceFunctionExit0( CMESSAGEPLUGIN_STARTHARVESTINGL_EXIT );
+	}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::MountL
+// ---------------------------------------------------------------------------
+//
+void CMessagePlugin::MountL(TDriveNumber aMedia,TBool aForceReharvesting)
+    {
+    OstTraceFunctionEntry0( CMESSAGEPLUGIN_MOUNTL_ENTRY );
+    CPIXLOGSTRING("START CMessagePlugin::MountL");
+    // Check if already exists
+    if (iIndexer[aMedia])
+        return;
+    
+    // Form the baseappclass for this media
+    TBuf<KMsgPluginBaseAppClassMaxLen> baseAppClass;
+    FormBaseAppClass(aMedia, baseAppClass);
+
+    // Define this volume
+    HBufC* path = DatabasePathLC(aMedia);
+    User::LeaveIfError(iSearchSession.DefineVolume(baseAppClass, *path));
+    CleanupStack::PopAndDestroy(path);
+    
+    // construct and open the database
+    TRAPD(err,iIndexer[aMedia] = CCPixIndexer::NewL(iSearchSession));
+    OstTrace1( TRACE_NORMAL, CMESSAGEPLUGIN_MOUNTL, "CMessagePlugin::MountL;Indexer NewL return error=%d", err );
+    CPIXLOGSTRING2("CCPixIndexer::NewL returned : %d", err );
+    TRAP(err,iIndexer[aMedia]->OpenDatabaseL(baseAppClass));
+
+    // Add to harvesting queue
+    iObserver->AddHarvestingQueue(this, baseAppClass,aForceReharvesting);  
+    CPIXLOGSTRING("END CMessagePlugin::MountL");
+    OstTraceFunctionExit0( CMESSAGEPLUGIN_MOUNTL_EXIT );
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::UnMount
+// ---------------------------------------------------------------------------
+//
+void CMessagePlugin::UnMount(TDriveNumber aMedia, TBool aUndefineAsWell)
+    {
+    OstTraceFunctionEntry0( CMESSAGEPLUGIN_UNMOUNT_ENTRY );
+    CPIXLOGSTRING("START CMessagePlugin::UnMount");
+    // Check if already exists
+    if (!iIndexer[aMedia])
+        return;
+    
+    // Form the baseappclass for this media
+    TBuf<KMsgPluginBaseAppClassMaxLen> baseAppClass;
+    FormBaseAppClass(aMedia, baseAppClass);             
+        
+    // Remove from harvesting queue
+    iObserver->RemoveHarvestingQueue(this, baseAppClass);   
+    
+    // Delete the index object
+    if (iIndexer[aMedia])
+        {
+        delete iIndexer[aMedia];
+        iIndexer[aMedia] = NULL;
+        }
+    
+    // if the aActionType is EFFMmcDismount, then the
+    // parameter aFilename is the baseAppClass of the Index database
+    // to be dropped.
+    if (aUndefineAsWell)
+        iSearchSession.UnDefineVolume(baseAppClass);
+    OstTraceFunctionExit0( CMESSAGEPLUGIN_UNMOUNT_EXIT );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::FormBaseAppClass
+// ---------------------------------------------------------------------------
+//  
+TInt CMessagePlugin::FormBaseAppClass(TDriveNumber aMedia, TDes& aBaseAppClass)
+    {
+    TChar chr;
+    const TInt ret = RFs::DriveToChar(aMedia, chr);
+    if (KErrNone == ret)
+        {
+        aBaseAppClass.Copy(KAtSign);
+        aBaseAppClass.Append(chr);
+        aBaseAppClass.LowerCase();
+        aBaseAppClass.Append(KMsgBaseAppClassGeneric);
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::DatabasePathLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CMessagePlugin::DatabasePathLC(TDriveNumber aMedia)
+    {
+    OstTraceFunctionEntry0( CMESSAGEPLUGIN_DATABASEPATHLC_ENTRY );
+    CPIXLOGSTRING("START CMessagePlugin::DatabasePathLC");
+    // Allocate extra space for root path e.g. "C:\\Private\\2001f6f7\\"
+    const TInt KRootPathMaxLength = 30;
+    HBufC* indexDbPath = HBufC::NewLC(KRootPathMaxLength + KPathIndexDbPath().Length() + KPathTrailer().Length());
+    TPtr indexDbPathPtr = indexDbPath->Des();
+
+#if 1 // Data caging implementation
+    iFs.CreatePrivatePath(aMedia);
+
+    TChar chr;
+    RFs::DriveToChar(aMedia, chr);
+    indexDbPathPtr.Append(chr);
+    indexDbPathPtr.Append(KColon);
+
+    TFileName pathWithoutDrive;
+    iFs.PrivatePath(pathWithoutDrive);
+    indexDbPathPtr.Append(KCPixSearchServerPrivateDirectory);
+#else // here is the way to calculate the path if data caging is not being used.
+    TFileName rootPath;
+    PathInfo::GetRootPath(rootPath, aMedia);
+    indexDbPathPtr.Append(rootPath);
+#endif 
+
+    indexDbPathPtr.Append(KPathIndexDbPath);
+    indexDbPathPtr.Append(KPathTrailer);
+
+    OstTraceFunctionExit0( CMESSAGEPLUGIN_DATABASEPATHLC_EXIT );
+    return indexDbPath;
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::GetIndexer
+// ---------------------------------------------------------------------------
+//
+CCPixIndexer* CMessagePlugin::GetIndexer()
+    {
+    return iIndexer[iCurrentDrive];
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::IsMediaRemovableL
+// ---------------------------------------------------------------------------
+// 
+TBool CMessagePlugin::IsMediaRemovableL(TDriveNumber& aDrive)
+    {
+    TDriveInfo driveInfo; 
+    User::LeaveIfError(iFs.Drive(driveInfo,aDrive));
+    TBool mediaRemovable(EFalse);
+    driveInfo.iDriveAtt & KDriveAttRemovable ? mediaRemovable = ETrue : mediaRemovable = EFalse;
+    return mediaRemovable;
+    }
+// ---------------------------------------------------------------------------
+// CMessagePlugin::HandleSessionEventL
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::HandleSessionEventL( TMsvSessionEvent aEvent, 
+										  		 TAny* aArg1, 
+										  		 TAny* aArg2, 
+										  		 TAny* aArg3 )
+	{		
+	OstTraceFunctionEntry0( CMESSAGEPLUGIN_HANDLESESSIONEVENTL_ENTRY );
+	CPIXLOGSTRING("ENTER CMessagePlugin::HandleSessionEventL");
+	OstTrace1( TRACE_NORMAL, CMESSAGEPLUGIN_HANDLESESSIONEVENTL, "CMessagePlugin::HandleSessionEventL;aEvent=%d", aEvent );
+	CPIXLOGSTRING2("TMsvSessionEvent aEvent: %d", aEvent );			
+		
+	switch( aEvent )
+		{
+		case EMsvEntriesCreated:
+		case EMsvEntriesChanged:
+			{
+			// Handle changed / created event
+            CMsvEntrySelection* selection = reinterpret_cast<CMsvEntrySelection*>(aArg1);
+            TMsvId folderId = *( reinterpret_cast<TMsvId*>(aArg2));
+#ifdef __PERFORMANCE_DATA
+            iStartTime.UniversalTime();
+		    iMessageMonitor->HandleMsgCreatedChangedL(*selection, folderId, aEvent);
+		    UpdatePerformaceDataL(EMsvEntriesChanged);
+#else
+		    iMessageMonitor->HandleMsgCreatedChangedL(*selection, folderId, aEvent);
+#endif		    
+			break;
+			}		
+		case EMsvEntriesDeleted:
+			{
+			// Handle deletion event
+		    CMsvEntrySelection* selection = reinterpret_cast<CMsvEntrySelection*> ( aArg1 );
+#ifdef __PERFORMANCE_DATA
+            iStartTime.UniversalTime();
+		    iMessageMonitor->HandleMsgDeletedL( *selection );
+		    UpdatePerformaceDataL(EMsvEntriesDeleted);
+#else
+		    iMessageMonitor->HandleMsgDeletedL( *selection );
+#endif
+			break;
+			}
+		case EMsvEntriesMoved:
+			{
+			// track move operations
+			// or sent folder
+			// ... extract the useful parameters
+            if( aArg1 && aArg2 && aArg3 )
+                {
+                CMsvEntrySelection* selection = reinterpret_cast<CMsvEntrySelection*> ( aArg1 );
+                // aArg2 is the TMsvId of the new parent. aArg3 is the TMsvId of 
+                // the old parent entry.
+                TMsvId newFolderId = *(reinterpret_cast<TMsvId*>(aArg2));
+                TMsvId oldFolderId = *(reinterpret_cast<TMsvId*>(aArg3));
+#ifdef __PERFORMANCE_DATA
+                iStartTime.UniversalTime();
+                iMessageMonitor->HandleMsgMovedL(newFolderId, oldFolderId, *selection);
+                UpdatePerformaceDataL(EMsvEntriesMoved);
+#else
+                iMessageMonitor->HandleMsgMovedL(newFolderId, oldFolderId, *selection);
+#endif
+                }
+			break;
+			}			
+		case EMsvMediaChanged:
+		    {
+		    //Unmount old media drive
+		    OstTrace0( TRACE_NORMAL, DUP1_CMESSAGEPLUGIN_HANDLESESSIONEVENTL, "ENTER CMessagePlugin::HandleSessionEventL EMsvMediaChanged" );
+		    CPIXLOGSTRING("ENTER CMessagePlugin::HandleSessionEventL EMsvMediaChanged");
+		    TDriveNumber drive = *(reinterpret_cast<TDriveNumber*>(aArg1));
+		    UnMount(drive);
+		    drive = *(reinterpret_cast<TDriveNumber*>(aArg2));
+		    //Check if Media is removable then force reharvesting else keep indexes same
+		    MountL(drive,IsMediaRemovableL(drive)); //Mount new media drive for harvesting
+		    iCurrentDrive = drive;//Index of current drive
+		    }
+		    break;
+		case EMsvMediaUnavailable:
+		    {
+		    //No need to handle as when drive will be removed EMsvMediaChanged event
+		    //will be received for default media drive can be handled there
+		    //Unmount old media drive
+		    OstTrace0( TRACE_NORMAL, DUP2_CMESSAGEPLUGIN_HANDLESESSIONEVENTL, "ENTER CMessagePlugin::HandleSessionEventL EMsvMediaUnavailable" );
+		    CPIXLOGSTRING("ENTER CMessagePlugin::HandleSessionEventL EMsvMediaUnavailable");
+		    TDriveNumber drive = *(reinterpret_cast<TDriveNumber*>(aArg1));
+		    UnMount(drive);
+		    }
+		    break;
+		case EMsvMediaAvailable:
+			{
+			OstTrace0( TRACE_NORMAL, DUP3_CMESSAGEPLUGIN_HANDLESESSIONEVENTL, "ENTER CMessagePlugin::HandleSessionEventL EMsvMediaAvailable" );
+			CPIXLOGSTRING("ENTER CMessagePlugin::HandleSessionEventL EMsvMediaAvailable");
+			//Removed media drive available again mount media drive and unmount default
+			UnMount(TDriveNumber(iCurrentDrive)); //Unmount current drive
+			TDriveNumber drive = *(reinterpret_cast<TDriveNumber*>(aArg1));
+			MountL(drive,IsMediaRemovableL(drive)); //Mount avilable media drive for harvesting
+			}
+			break;
+		case EMsvServerFailedToStart:			
+		case EMsvCloseSession:
+		case EMsvServerTerminated:
+			{
+			User::Panic(_L("CMessagePlugin PANIC"), KErrServerTerminated);
+			break;				
+			}			
+		case EMsvMtmGroupInstalled:
+		case EMsvMtmGroupDeInstalled:
+		case EMsvGeneralError: // not used after v5
+		case EMsvServerReady:
+		case EMsvCorruptedIndexRebuilt:
+		case EMsvMediaIncorrect:
+		case EMsvCorruptedIndexRebuilding:
+		default:
+			{
+			break;
+			}							
+		}	
+	CPIXLOGSTRING("END CMessagePlugin::HandleSessionEventL");	
+		
+	OstTraceFunctionExit0( CMESSAGEPLUGIN_HANDLESESSIONEVENTL_EXIT );
+	}	
+
+// ---------------------------------------------------------------------------
+// CMessageDataHandler::CalculateMessageType
+// ---------------------------------------------------------------------------
+//	    
+TMsgType CMessagePlugin::CalculateMessageType (const TMsvEntry& aEntry )
+{
+    OstTraceFunctionEntry0( CMESSAGEPLUGIN_CALCULATEMESSAGETYPE_ENTRY );
+    CPIXLOGSTRING("ENTER CMessagePlugin::CalculateMessageType");
+	TMsgType ret = EMsgTypeInvalid;
+	OstTrace1( TRACE_NORMAL, CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin::CalculateMessageType;uid=%x", aEntry.iMtm.iUid );
+	CPIXLOGSTRING2("CMessagePlugin::CalculateMessageType uid: %x", aEntry.iMtm.iUid );
+    if( aEntry.iMtm.iUid  == KUidMsgTypeMultimedia.iUid ) 
+        {
+        OstTrace0( TRACE_NORMAL, DUP1_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ###  Mms Message ###" );
+        CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ###  Mms Message ###");
+        ret = EMsgTypeMms;
+        }
+    else if( aEntry.iMtm.iUid  == KUidMsgTypeSMTP.iUid )
+		{
+		OstTrace0( TRACE_NORMAL, DUP2_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ### ESmtpEmail ###" );
+		CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ### ESmtpEmail ###");
+        ret = EMsgTypeEmailSmtp;
+		}
+	else if( aEntry.iMtm.iUid  == KUidMsgTypePOP3.iUid )
+		{
+		OstTrace0( TRACE_NORMAL, DUP3_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ### EPop3Email ###" );
+		CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ### EPop3Email ###");
+        ret = EMsgTypeEmailPop3;
+		}
+	else if( aEntry.iMtm.iUid  == KUidMsgTypeIMAP4.iUid )
+		{
+		OstTrace0( TRACE_NORMAL, DUP4_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ### EImap4Email ###" );
+		CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ### EImap4Email ###");
+        ret = EMsgTypeEmailImap4;
+		}
+	// Add J.J	
+#ifndef __SERIES60_30__ // Not supported before S60 3d FP1
+   	else if ( aEntry.iMtm.iUid == KSenduiMtmUniMessageUid.iUid )
+	    {
+	    OstTrace0( TRACE_NORMAL, DUP5_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ### EDraftMessage ###" );
+	    CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ### EDraftMessage ###");
+        ret = EMsgTypeDraft;
+	    }
+#endif
+    // else if we have a normal text based SMS it is valid    
+ 	else if ( aEntry.iMtm.iUid == KUidMsgTypeSMS.iUid )
+ 		{
+ 		OstTrace0( TRACE_NORMAL, DUP6_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ###  SMS Message ###" );
+ 		CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ###  SMS Message ###");
+        ret = EMsgTypeSms;
+ 		}
+   	else if ( aEntry.iMtm.iUid == KSenduiMtmSmsUid.iUid )
+		{
+		OstTrace0( TRACE_NORMAL, DUP7_CMESSAGEPLUGIN_CALCULATEMESSAGETYPE, "CMessagePlugin:CalculateMessageType  ### Sms Message ###" );
+		CPIXLOGSTRING("CMessagePlugin:CalculateMessageType  ### Sms Message ###");
+        ret = EMsgTypeSms;
+		}
+    CPIXLOGSTRING("END CMessagePlugin::CalculateMessageType");
+	OstTraceFunctionExit0( CMESSAGEPLUGIN_CALCULATEMESSAGETYPE_EXIT );
+	return ret;
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::MessageItemL
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::MessageItemL( TMsvId aMsgId, TCPixActionType aActionType, TMsvId aFolderId  )	
+    {
+    //New item found gather data from that.
+     iMessageDataHandler->GatherDataL( aMsgId, aActionType, aFolderId ); 
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::HarvestingCompleted
+// ---------------------------------------------------------------------------
+//  
+void CMessagePlugin::HarvestingCompleted(TInt aError)
+{
+	// Notifies the indexing manager of completed harvesting, called by CMessageHarvester
+    Flush( *GetIndexer() );
+    TBuf<KMsgPluginBaseAppClassMaxLen> baseAppClass;
+    FormBaseAppClass(TDriveNumber(iCurrentDrive), baseAppClass);
+#ifdef __PERFORMANCE_DATA
+    TRAP_IGNORE( UpdatePerformaceDataL() );
+#endif
+    iObserver->HarvestingCompleted(this, baseAppClass, aError);
+}
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::UpdatePerformaceDataL
+// ---------------------------------------------------------------------------
+//
+#ifdef __PERFORMANCE_DATA
+void CMessagePlugin::UpdatePerformaceDataL()
+    {
+    TTime now;
+   
+    
+    iCompleteTime.UniversalTime();
+    TTimeIntervalMicroSeconds timeDiff = iCompleteTime.MicroSecondsFrom(iStartTime);
+    
+    RFs fileSession;
+    RFile perfFile;
+    User::LeaveIfError( fileSession.Connect () );
+    
+    
+    /* Open file if it exists, otherwise create it and write content in it */
+    
+        if(perfFile.Open(fileSession, _L("c:\\data\\MessagePerf.txt"), EFileWrite))
+                   User::LeaveIfError(perfFile.Create (fileSession, _L("c:\\data\\MessagePerf.txt"), EFileWrite));
+    
+    HBufC8 *heap = HBufC8::NewL(100);
+    TPtr8 ptr = heap->Des();
+    now.HomeTime();
+    TBuf<50> timeString;             
+                
+    _LIT(KOwnTimeFormat,"%:0%H%:1%T%:2%S");
+    now.FormatL(timeString,KOwnTimeFormat);
+    ptr.AppendNum(now.DateTime().Day());
+    ptr.Append(_L("/"));
+    ptr.AppendNum(now.DateTime().Month());
+    ptr.Append(_L("/"));
+    ptr.AppendNum(now.DateTime().Year());
+    ptr.Append(_L(":"));
+    ptr.Append(timeString);
+    ptr.Append( _L("Time taken for Harvesting Message is : "));
+    ptr.AppendNum(timeDiff.Int64()/1000) ;
+    ptr.Append(_L(" MilliSeonds \n"));
+    TInt myInt = 0;
+    perfFile.Seek(ESeekEnd,myInt);
+    perfFile.Write (ptr);
+    perfFile.Close ();
+    fileSession.Close ();
+    delete heap;
+    }
+
+// ---------------------------------------------------------------------------
+// CMessagePlugin::UpdatePerformaceDataL
+// ---------------------------------------------------------------------------
+//
+void CMessagePlugin::UpdatePerformaceDataL(TMsvSessionEvent action) {
+    
+        iCompleteTime.UniversalTime();
+        TTimeIntervalMicroSeconds timeDiff = iCompleteTime.MicroSecondsFrom(iStartTime);
+        
+        RFs fileSession;
+        RFile perfFile;
+        User::LeaveIfError( fileSession.Connect () );
+        
+        
+        /* Open file if it exists, otherwise create it and write content in it */
+        
+            if(perfFile.Open(fileSession, _L("c:\\data\\MessagePerf.txt"), EFileWrite))
+                       User::LeaveIfError(perfFile.Create (fileSession, _L("c:\\data\\MessagePerf.txt"), EFileWrite));
+        
+        HBufC8 *heap = HBufC8::NewL(100);
+        TPtr8 ptr = heap->Des();
+
+        switch (action) {
+            case EMsvEntriesDeleted: ptr.Append( _L("del "));break;
+            case EMsvEntriesChanged: ptr.Append( _L("upd "));break;
+            case EMsvEntriesMoved: ptr.Append( _L("mov "));break;
+        }
+        ptr.AppendNum(timeDiff.Int64()/1000) ;
+        ptr.Append(_L("\n"));
+        TInt myInt = 0;
+        perfFile.Seek(ESeekEnd,myInt);
+        perfFile.Write (ptr);
+        perfFile.Close ();
+        fileSession.Close ();
+        delete heap;
+    }
+
+#endif