diff -r ccd0fd43f247 -r 208a4ba3894c harvesterplugins/messaging/smsmms/src/cmessageplugin.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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 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(aArg1); + TMsvId folderId = *( reinterpret_cast(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 ( 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 ( aArg1 ); + // aArg2 is the TMsvId of the new parent. aArg3 is the TMsvId of + // the old parent entry. + TMsvId newFolderId = *(reinterpret_cast(aArg2)); + TMsvId oldFolderId = *(reinterpret_cast(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(aArg1)); + UnMount(drive); + drive = *(reinterpret_cast(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(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(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 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