diff -r 000000000000 -r c53acadfccc6 harvester/monitorplugins/messageplugin/src/messagemonitorplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/monitorplugins/messageplugin/src/messagemonitorplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,493 @@ +/* +* Copyright (c) 2006-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: +* +*/ + + +// INCLUDE FILES +#include "messagemonitorplugin.h" +#include "harvesterlog.h" +#include "mdesession.h" +#include "clientkeywatcherkeys.h" + +#include +#include // MMsvAttachmentManager +#include // CMsvEntry +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +#ifdef _DEBUG +_LIT( KMsgMonitorHarvesterMsvPanic, "Message monitor harvester: Message server terminated" ); +#endif +_LIT( KMsgURI, "%d.MSG" ); + +const TInt KUriLength = 127; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::NewL +// ----------------------------------------------------------------------------- +// +CMessageMonitorPlugin* CMessageMonitorPlugin::NewL() + { + CMessageMonitorPlugin* self = new ( ELeave ) CMessageMonitorPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::~CMessageMonitorPlugin +// ----------------------------------------------------------------------------- +// +CMessageMonitorPlugin::~CMessageMonitorPlugin() + { + WRITELOG("ENTER ~CMessageMonitorPlugin"); + delete iMsvSession; + WRITELOG("END ~CMessageMonitorPlugin"); + } + + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::StartMonitoring +// ----------------------------------------------------------------------------- +// +TBool CMessageMonitorPlugin::StartMonitoring( MMonitorPluginObserver& aObserver, + CMdESession* aMdEClient, + CContextEngine* /*aCtxEngine*/, + CHarvesterPluginFactory* /*aHarvesterPluginFactory*/ ) + { + WRITELOG("ENTER CMessageMonitorPlugin::StartMonitoring"); + + iMonitorPluginObserver = &aObserver; + iMdeSession = aMdEClient; + + if ( iMsvSession ) + { + delete iMsvSession; + iMsvSession = NULL; + } + TInt error( KErrNone ); + // Open a new session to the message server + TRAP( error, iMsvSession = CMsvSession::OpenSyncL( *this ) ); + WRITELOG1("Open msgSession error: %d" , error ); + + TRAP_IGNORE( CheckRestoreL() ); + + TBool result = error ? EFalse : ETrue ; + WRITELOG("END CMessageMonitorPlugin::StartMonitoring"); + + return result; + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::CreateFileNameL +// Filename flag can be changed to use cen rep! +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::CreateFileNameL() + { + TInt drive ( 0 ); + User::LeaveIfError( + DriveInfo::GetDefaultDrive( DriveInfo::EDefaultSystem, drive ) ); + + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); + + TChar driveLetter; + fsSession.DriveToChar( drive, driveLetter ); + + iFileName.Append( driveLetter ); + iFileName.Append( KRestoreFile ); // result-> C:\\private\\200009F5\\restoredone + + fsSession.Close(); + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::StopMonitoring +// ----------------------------------------------------------------------------- +// +TBool CMessageMonitorPlugin::StopMonitoring() + { + WRITELOG("ENTER CMessageMonitorPlugin::StopMonitoring"); + if( iMsvSession ) + { + delete iMsvSession; + iMsvSession = NULL; + } + + WRITELOG("END CMessageMonitorPlugin::StopMonitoring"); + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::ResumeMonitoring +// ----------------------------------------------------------------------------- +// +TBool CMessageMonitorPlugin::ResumeMonitoring( MMonitorPluginObserver& /*aObserver*/, + CMdESession* /*aMdEClient*/, + CContextEngine* /*aCtxEngine*/, + CHarvesterPluginFactory* /*aHarvesterPluginFactory*/ ) + { + WRITELOG("ENTER CMessageMonitorPlugin::ResumeMonitoring"); + WRITELOG("END CMessageMonitorPlugin::ResumeMonitoring"); + + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::PauseMonitoring +// ----------------------------------------------------------------------------- +// +TBool CMessageMonitorPlugin::PauseMonitoring() + { + WRITELOG("ENTER CMessageMonitorPlugin::PauseMonitoring"); + WRITELOG("END CMessageMonitorPlugin::PauseMonitoring"); + + return ETrue; + } + +void CMessageMonitorPlugin::CheckRestoreL() + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + RFile64 file; + CleanupClosePushL( file ); + // only needed information is does file exist + TInt fileError = file.Open( fs, iFileName, EFileShareReadersOrWriters ); + WRITELOG1("CMessageMonitorPlugin::CheckRestoreL - fileError: %d", fileError); + User::LeaveIfError( fileError ); + + CleanupStack::PopAndDestroy( &file ); + CleanupStack::PopAndDestroy( &fs ); + + iMessageScannerAO = CMessageScannerAO::NewL( iMsvSession, iMdeSession, + iMonitorPluginObserver ); + iMessageScannerAO->StartL(); + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::CMessageMonitorPlugin +// ----------------------------------------------------------------------------- +// +CMessageMonitorPlugin::CMessageMonitorPlugin() : CMonitorPlugin(), + iMonitorPluginObserver( NULL ), + iMsvSession( NULL ), + iMdeSession( NULL ), + iMessageScannerAO( NULL ) + { + WRITELOG("ENTER CMessageMonitorPlugin::CMessageMonitorPlugin"); + WRITELOG("END CMessageMonitorPlugin::CMessageMonitorPlugin"); + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::ConstructL() + { + WRITELOG("ENTER CMessageMonitorPlugin::ConstructL"); + + CreateFileNameL(); + + WRITELOG("END CMessageMonitorPlugin::ConstructL"); + } + + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::HandleSessionEventL +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::HandleSessionEventL( TMsvSessionEvent aEvent, + TAny* aArg1, + TAny* aArg2, + TAny* aArg3 ) + { + WRITELOG("ENTER CMessageMonitorPlugin::HandleSessionEventL"); + WRITELOG1("TMsvSessionEvent aEvent: %d", aEvent ); + + switch( aEvent ) + { + case EMsvEntriesCreated: + case EMsvEntriesChanged: + { + CMsvEntrySelection* selection = + reinterpret_cast ( aArg1 ); + TMsvId folderId = *( reinterpret_cast ( aArg2 ) ); + HandleMsgCreatedChangedL( *selection, folderId, aEvent ); + break; + } + case EMsvEntriesDeleted: + { + CMsvEntrySelection* selection = + reinterpret_cast ( aArg1 ); + HandleMsgDeletedL( *selection ); + break; + } + case EMsvEntriesMoved: + { + // track move operations + // or sent folder + // ... extract the useful parameters + if( aArg1 && aArg2 && aArg3 ) + { + CMsvEntrySelection* selection = + reinterpret_cast ( aArg1 ); + TMsvId folderId1 = *( reinterpret_cast ( aArg2 ) ); + TMsvId folderId2 = *( reinterpret_cast ( aArg3 ) ); + HandleMsgMovedL( folderId1, folderId2, *selection ); + } + break; + } + case EMsvServerFailedToStart: + case EMsvCloseSession: + case EMsvServerTerminated: + { + __ASSERT_DEBUG( EFalse, User::Panic( KMsgMonitorHarvesterMsvPanic, KErrServerTerminated )); + break; + } + case EMsvMtmGroupInstalled: + case EMsvMtmGroupDeInstalled: + case EMsvGeneralError: // not used after v5 + case EMsvServerReady: + case EMsvCorruptedIndexRebuilt: + case EMsvMediaChanged: + case EMsvMediaUnavailable: + case EMsvMediaAvailable: + case EMsvMediaIncorrect: + case EMsvCorruptedIndexRebuilding: + default: + { + break; + } + } + WRITELOG("END CMessageMonitorPlugin::HandleSessionEventL"); + + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::HandleMsgMovedL +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::HandleMsgMovedL( const TMsvId aFolderId1, + const TMsvId aFolderId2, + const CMsvEntrySelection& aSelection ) + { + + + + WRITELOG("ENTER CMessageMonitorPlugin::HandleMsgMovedL"); + + TInt count( aSelection.Count() ); + // cycle through every message in the CMsvEntrySelection + for ( TInt i=0; i < count; ++i ) + { + TMsvId msgId = aSelection[i]; + WRITELOG1("msgId: %d", msgId ); + + TMsvId service = 0; + TMsvEntry entry; + TInt err = iMsvSession->GetEntry( msgId, service, entry ); + + // if we have a message and it has been moved from the outbox to the sent + // items, and it is a valid message + if ( ( !err ) && + ( KUidMsvMessageEntry == entry.iType ) && + ( KMsvSentEntryId == aFolderId1 ) && + ( KMsvGlobalOutBoxIndexEntryId == aFolderId2 ) && + ( IsValidMessageTypeL( entry, *iMsvSession ) ) ) + { + HBufC* uri = CreateUriL( entry.iMtm, msgId ); + CleanupStack::PushL( uri ); + CHarvesterData* hd = CHarvesterData::NewL( uri ); + CleanupStack::Pop( uri ); + hd->SetEventType( EHarvesterAdd ); + hd->SetTakeSnapshot( EFalse ); + hd->SetBinary( EFalse ); + iMonitorPluginObserver->MonitorEvent( hd ); + } + } + WRITELOG("END CMessageMonitorPlugin::HandleMsgMovedL"); + } + + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::HandleMsgCreatedChangedL +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::HandleMsgCreatedChangedL( const CMsvEntrySelection& aSelection, + const TMsvId aFolderId, + const TMsvSessionEvent aEvent ) + { + WRITELOG("ENTER CMessageMonitorPlugin::HandleMsgCreatedChangedL"); + + TInt count( aSelection.Count() ); + + // cycle through every message in the CMsvEntrySelection + for ( TInt i=0; i < count; ++i ) + { + // extract the message server entry from the parameters + TMsvId msgId = aSelection[i]; + WRITELOG1("msgId: %d", msgId ); + + TMsvId service = 0; + TMsvEntry entry; + TInt err = iMsvSession->GetEntry( msgId, service, entry ); + + WRITELOG1("HandleMsgCreatedChangedL error: %d ", err); + + THarvesterEventType event = + ( aEvent == EMsvEntriesCreated ) || entry.Unread() ? + EHarvesterAdd : + EHarvesterEdit; + + + // ... we only want to process message entries, that are in the inbox + // ... and are valid for adding to Mds. + if ( ( !err ) && + ( KUidMsvMessageEntry == entry.iType ) && + ( KMsvGlobalInBoxIndexEntryId == aFolderId ) && + ( entry.Visible() && entry.Complete() && !entry.InPreparation() ) && + ( IsValidMessageTypeL( entry, *iMsvSession ) ) ) + { + HBufC* uri = CreateUriL( entry.iMtm, msgId ); + CleanupStack::PushL( uri ); + CHarvesterData* hd = CHarvesterData::NewL( uri ); + CleanupStack::Pop( uri ); + hd->SetEventType( event ); + hd->SetBinary( EFalse ); + hd->SetTakeSnapshot( EFalse ); + iMonitorPluginObserver->MonitorEvent( hd ); + } + } + WRITELOG("END CMessageMonitorPlugin::HandleMsgCreatedChangedL"); + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::HandleMsgDeletedL +// ----------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::HandleMsgDeletedL( const CMsvEntrySelection& aSelection ) + { + WRITELOG("ENTER CMessageMonitorPlugin::HandleMsgDeletedL"); + + TInt count( aSelection.Count() ); + // cycle through every message in the CMsvEntrySelection + for( TInt i = 0; i < count; ++i ) + { + TMsvId msgId = aSelection[i]; + WRITELOG1("msgId: %d", msgId ); + HBufC* uri = CreateUriL( KUidMsgTypeSMS, msgId ); + CleanupStack::PushL( uri ); + RemoveObjectL( *uri ); + CleanupStack::PopAndDestroy( uri ); + } + WRITELOG("END CMessageMonitorPlugin::HandleMsgDeletedL"); + } + +// --------------------------------------------------------------------------- +// CHarvesterMessagePluginAO::RemoveObjectL +// --------------------------------------------------------------------------- +// +void CMessageMonitorPlugin::RemoveObjectL( const TDesC& aUri ) + { + WRITELOG( "CMessageMonitorPlugin::RemoveObjectL enter" ); + CMdEObject* mdeObject = iMdeSession->GetObjectL( aUri ); + + // check if in mde + if ( mdeObject ) + { + TItemId objectId = mdeObject->Id(); + delete mdeObject; + mdeObject = NULL; + + TTime time( 0 ); + CMdENamespaceDef& nsDef = iMdeSession->GetDefaultNamespaceDefL(); + CMdEEventDef& eventDef = nsDef.GetEventDefL( MdeConstants::Events::KDeleted ); + + iMdeSession->RemoveObjectL( aUri, &nsDef ); + WRITELOG1( "aUri: %S", &aUri ); + time.UniversalTime(); + CMdEEvent* event = iMdeSession->NewEventL( eventDef, objectId, time,NULL,NULL ); + + iMdeSession->AddEventL( *event ); + delete event; + } + + WRITELOG( "CMessageMonitorPlugin::RemoveObjectL return" ); + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::IsValidMessageTypeL +// ----------------------------------------------------------------------------- +// +TBool CMessageMonitorPlugin::IsValidMessageTypeL( const TMsvEntry& aEntry, + CMsvSession& /*aSession*/) + { + WRITELOG("ENTER CMessageMonitorPlugin::IsValidMessageTypeL"); + + TBool isValidMsg( EFalse ); + + // Mms message + if ( aEntry.iMtm.iUid == KUidMsgTypeMultimedia.iUid ) + { + isValidMsg = ETrue; + } + // check if this is a BIO message, if so exclude it from Hoover + else if ( aEntry.iBioType != 0 ) + { + isValidMsg = EFalse; + } + // else if we have a normal text based SMS it is valid + else if ( aEntry.iMtm.iUid == KUidMsgTypeSMS.iUid ) + { + isValidMsg = ETrue; + } + WRITELOG1( "isValidMsg: %d" , isValidMsg ); + + WRITELOG("END CMessageMonitorPlugin::IsValidMessageTypeL"); + + return isValidMsg; + } + +// ----------------------------------------------------------------------------- +// CMessageMonitorPlugin::CreateUriL +// ----------------------------------------------------------------------------- +// +HBufC* CMessageMonitorPlugin::CreateUriL( const TUid& /*aMsgTypeUid*/, const TMsvId aMsgId ) + { + WRITELOG("ENTER CMessageMonitorPlugin::CreateUriL"); + + HBufC* uri = HBufC::NewL( KUriLength ); + TPtr ptrUri = uri->Des(); + ptrUri.Format( KMsgURI, aMsgId ); + + WRITELOG("END CMessageMonitorPlugin::CreateUriL"); + + return uri; + } + +// End Of File