diff -r 000000000000 -r c53acadfccc6 harvester/monitorplugins/messageplugin/src/messagescannerao.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/monitorplugins/messageplugin/src/messagescannerao.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,320 @@ +/* +* Copyright (c) 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 +#include +#include +#include +#include "mdesession.h" +#include "mdeconstants.h" +#include "mdenamespacedef.h" +#include "messagescannerao.h" +#include "harvesterlog.h" +#include "messagemonitorplugin.h" +#include "clientkeywatcherkeys.h" + +CMessageScannerAO* CMessageScannerAO::NewL( CMsvSession* aMsvSession, + CMdESession* aMdeSession, + MMonitorPluginObserver* aMonitorPluginObserver ) + { + CMessageScannerAO* self = new (ELeave) CMessageScannerAO( + aMsvSession, aMdeSession, aMonitorPluginObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +CMessageScannerAO::CMessageScannerAO( CMsvSession* aMsvSession, + CMdESession* aMdeSession, + MMonitorPluginObserver* aMonitorPluginObserver ) : + CActive( CActive::EPriorityStandard ), + iFindOperation( NULL ), iObjectQuery( NULL ) + { + CActiveScheduler::Add( this ); + iMsvSession = aMsvSession; + iMdeSession = aMdeSession; + iMonitorPluginObserver = aMonitorPluginObserver; + iState = EScannerIdle; + } + +CMessageScannerAO::~CMessageScannerAO() + { + Cancel(); + Cleanup(); + } + +void CMessageScannerAO::StartL() + { + WRITELOG("CMessageScannerAO::Start()"); + _LIT( KEmpty, "" ); + iFindOperation = CMsvFindOperation::FindInChildrenL( *iMsvSession, KEmpty, + KMsvRootIndexEntryId, KMsvMessagePartNone, iStatus ); + SetActive(); + iState = EScannerRunning; + WRITELOG("CMessageScannerAO::Start() - ends"); + } + +void CMessageScannerAO::ConstructL() + { + WRITELOG("CMessageScannerAO::ConstructL()"); + User::LeaveIfError( iProperty.Attach( KPSRestoreWatcherCategory, + KPSRestoreWatcherClientsKey, EOwnerThread ) ); + + TInt registeredClients = 0; + iProperty.Get( registeredClients ); + TInt error = iProperty.Set( registeredClients + 1 ); + + WRITELOG1("CMessageScannerAO::ConstructL() - error: %d", error); + } + +void CMessageScannerAO::RunL() + { + WRITELOG("CMessageScannerAO::RunL()"); + if ( iStatus.Int() != KErrNone ) + { +#ifdef _DEBUG + WRITELOG1("CMessageScannerAO::RunL() . error %d", iStatus.Int()); +#endif + return; + } + + switch ( iState ) + { + case EScannerRunning: + { + QueryAllMessagesL(); + break; + } + case EScannerFinished: + { + Cleanup(); + break; + } + } + } + +void CMessageScannerAO::DoCancel() + { + iFindOperation->Cancel(); + iProperty.Cancel(); + } + +#ifdef _DEBUG +TInt CMessageScannerAO::RunError( TInt aError ) +#else +TInt CMessageScannerAO::RunError( TInt /*aError*/ ) +#endif + { + WRITELOG1( "CMessageScannerAO::RunError - error: %d", aError ); + return KErrNone; + } + +void CMessageScannerAO::QueryAllMessagesL() + { + WRITELOG("CMessageScannerAO::QueryAllMessagesL()"); + CMdENamespaceDef& namespaceDef = iMdeSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& messageDef = namespaceDef.GetObjectDefL( MdeConstants::Message::KMessageObject ); + + iObjectQuery = iMdeSession->NewObjectQueryL( namespaceDef, messageDef, this ); + iObjectQuery->SetResultMode( EQueryResultModeItem ); + + iObjectQuery->FindL(); + WRITELOG("CMessageScannerAO::QueryAllMessagesL() - ends"); + } + +void CMessageScannerAO::HandleQueryNewResults( CMdEQuery& /*aQuery*/, TInt /*aFirstNewItemIndex*/, + TInt /*aNewItemCount*/ ) + { + } + +void CMessageScannerAO::HandleQueryCompleted( CMdEQuery& aQuery, TInt /*aError*/ ) + { + WRITELOG("CMessageScannerAO::HandleQueryCompleted()"); + RArray messages; + TInt error = KErrNone; + + if ( aQuery.Count() > 0 ) + { +#ifdef _DEBUG + WRITELOG1("CMessageScannerAO::HandleQueryCompleted() - aQuery count %d", aQuery.Count()); +#endif + TRAP( error, ProcessMessagesL( aQuery, messages ) ); + } + + if ( error == KErrNone ) + { + TRAP_IGNORE( ScanMessagesL( messages ) ); + } + + messages.Close(); + Unregister(); + iState = EScannerFinished; + + SetActive(); + TRequestStatus* pStatus = &iStatus; + User::RequestComplete( pStatus, KErrNone ); + } + +void CMessageScannerAO::ProcessMessagesL( CMdEQuery& aQuery, RArray& aMessages ) + { + _LIT( KPeriod, "." ); + + CMdENamespaceDef& namespaceDef = iMdeSession->GetDefaultNamespaceDefL(); + CMdEObjectDef& messageDef = namespaceDef.GetObjectDefL( MdeConstants::Message::KMessageObject ); + CMdEPropertyDef& creationDateDef = messageDef.GetPropertyDefL( + MdeConstants::Object::KCreationDateProperty ); + + TInt count = aQuery.Count(); + + for (TInt i = 0; i < count; i++ ) + { + CMdEObject& object = static_cast( aQuery.ResultItem( i ) ); + TInt index = object.Uri().Find( KPeriod ); + if ( index != KErrNotFound ) + { + TLex16 lex( object.Uri().Left( index ) ); + TMessage message; + message.iMdeId = object.Id(); + + CMdEProperty* creationDateProp = NULL; + object.Property( creationDateDef, creationDateProp, 0 ); + message.iCreationDate = creationDateProp->TimeValueL(); + + TInt error = lex.Val( message.iMsvId ); + if ( error == KErrNone ) + { + aMessages.Append( message ); + } + } + } + } + +void CMessageScannerAO::ScanMessagesL( RArray& aMessages ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL()"); + const CMsvFindResultSelection& findResults = iFindOperation->GetFindResult(); + CMdENamespaceDef& defaultNamespace = iMdeSession->GetDefaultNamespaceDefL(); + TInt msvCount = findResults.Count(); + + for ( TInt i = 0; i < msvCount; i++ ) + { + WRITELOG1("CMessageScannerAO::ScanMessagesL() - MSV item %d", i); + TBool idMatched = EFalse; + for ( TInt j = 0; j < aMessages.Count(); j++ ) + { + WRITELOG1("CMessageScannerAO::ScanMessagesL() - MDE item %d", j); + if ( findResults[i].iId == aMessages[j].iMsvId ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL() - id matches"); + idMatched = ETrue; + CMsvEntry* e = iMsvSession->GetEntryL( findResults[i].iId ); + if ( !e ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL() - message entry is NULL!?"); + continue; + } + + CleanupStack::PushL( e ); + const TMsvEntry& entry = e->Entry(); + WRITELOG("CMessageScannerAO::ScanMessagesL() - comparing dates"); + if ( entry.iDate != aMessages[j].iCreationDate ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL() - creation dates don't match"); + // Harvest the message with EHarvesterEdit event type. + HBufC* uri = CMessageMonitorPlugin::CreateUriL( entry.iMtm, entry.Id() ); + CleanupStack::PushL( uri ); + CHarvesterData* hd = CHarvesterData::NewL( uri ); + CleanupStack::Pop( uri ); + hd->SetEventType( EHarvesterEdit ); + hd->SetTakeSnapshot( EFalse ); + hd->SetBinary( EFalse ); + iMonitorPluginObserver->MonitorEvent( hd ); + } + + CleanupStack::PopAndDestroy( e ); + aMessages.Remove( j ); + j--; + break; + } + } + + if ( !idMatched ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL() - harvesting new message"); + // Harvest the message as new message. + CMsvEntry* e = iMsvSession->GetEntryL( findResults[i].iId ); + if ( !e ) + { + WRITELOG("CMessageScannerAO::ScanMessagesL() - message entry is NULL!?"); + continue; + } + + CleanupStack::PushL( e ); + const TMsvEntry& entry = e->Entry(); + HBufC* uri = CMessageMonitorPlugin::CreateUriL( entry.iMtm, entry.Id() ); + CleanupStack::PushL( uri ); + CHarvesterData* hd = CHarvesterData::NewL( uri ); + CleanupStack::Pop( uri ); + hd->SetEventType( EHarvesterAdd ); + hd->SetTakeSnapshot( EFalse ); + hd->SetBinary( EFalse ); + iMonitorPluginObserver->MonitorEvent( hd ); + + CleanupStack::PopAndDestroy( e ); + } + } + + // Remove extra messages in MdS db. + if ( aMessages.Count() > 0 ) + { + WRITELOG1("CMessageScannerAO::ScanMessagesL() - removing extra messages from mde (%d)", + aMessages.Count() ); + RArray extraMessages; + CleanupClosePushL( extraMessages ); + + for ( TInt i = 0; i < aMessages.Count(); i++ ) + { + extraMessages.Append( aMessages[i].iMdeId ); + } + + RArray results; + CleanupClosePushL( results ); + iMdeSession->RemoveObjectsL( extraMessages, results, &defaultNamespace ); + CleanupStack::PopAndDestroy( 2 ); // extramessages, results + } + } + +void CMessageScannerAO::Unregister() + { + TInt registeredClients = 0; + iProperty.Get( registeredClients ); + WRITELOG1("CMessageScannerAO::Unregister() - registered clients: %d", registeredClients); + if ( registeredClients > 0 ) + { + iProperty.Set( registeredClients - 1 ); + } + } + +void CMessageScannerAO::Cleanup() + { + iProperty.Close(); + delete iFindOperation; + iFindOperation = NULL; + delete iObjectQuery; + iObjectQuery = NULL; + } +