diff -r 000000000000 -r f979ecb2b13e pimappservices/calendar/server/src/agsbackuprestoreagent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappservices/calendar/server/src/agsbackuprestoreagent.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,124 @@ +// Copyright (c) 2007-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 "agsbackuprestoreagent.h" +#include // For conn::EBURNormal etc. + +CAgnServBackupRestoreAgent* CAgnServBackupRestoreAgent::NewL(CAgnServFileMgr& aFileMgr) + { + CAgnServBackupRestoreAgent* self = new(ELeave) CAgnServBackupRestoreAgent(aFileMgr); + return self; + } + +CAgnServBackupRestoreAgent::~CAgnServBackupRestoreAgent() + { + Cancel(); + iBackupRestoreNotification.Close(); + } + +CAgnServBackupRestoreAgent::CAgnServBackupRestoreAgent(CAgnServFileMgr& aFileMgr) + : CActive(CActive::EPriorityStandard), iFileMgr(aFileMgr) + { + CActiveScheduler::Add(this); + + // Attach and subscribe to the Backup/Restore property used by the SBEngine + // component. + iBackupRestoreNotification.Attach(KUidSystemCategory, conn::KUidBackupRestoreKey); + iBackupRestoreNotification.Subscribe(iStatus); + } + +/** Indicates if a Backup operation is currently in progress. +@return ETrue if operation in progress else EFalse. +*/ +TBool CAgnServBackupRestoreAgent::BackupInProgress() const + { + return (iCurrentState & (conn::EBURBackupPartial | conn::EBURBackupFull)); + } + +/** Indicates if a Restore operation is currently in progress. +@return ETrue if operation in progress else EFalse. +*/ +TBool CAgnServBackupRestoreAgent::RestoreInProgress() const + { + return (iCurrentState & (conn::EBURRestorePartial | conn::EBURRestoreFull)); + } + +/** Instructs the agent to listen for backup or restore events. */ +void CAgnServBackupRestoreAgent::Start() + { + // Check to see if a Backup/Restore is currently in progress. + TInt newState = 0; + if (iBackupRestoreNotification.Get(newState) != KErrNotFound) + { + iCurrentState = newState; + } + SetActive(); + } + +/** +Called when a backup or restore event is received. + +When a backup or restore event is received we change the state so that BackupInProgress() and +RestoreInProgress() return the correct state. These functions will be queried when a file is being closed +to check if they should be closed immediately or after a small delay. + +In addition to this we also call CloseScheduledFilesNow() on the file manager to close all files that have +been scheduled for close so they are closed immediately. +*/ +void CAgnServBackupRestoreAgent::RunL() + { + // Resubscribe before dealing with the current notification. + iBackupRestoreNotification.Subscribe(iStatus); + SetActive(); + + TInt newState = 0; + + // Flag updated. + if (iBackupRestoreNotification.Get(newState) != KErrNotFound) + { + if ( newState& (conn::EBURBackupPartial | conn::EBURBackupFull) && !BackupInProgress()) + { + iFileMgr.CloseScheduledFilesImmediately(); + iFileMgr.BackupReStoreChanged(MCalChangeCallBack2::EBackupStart); + } + else if (newState & (conn::EBURRestoreFull | conn::EBURRestorePartial)&& !RestoreInProgress()) + { + iFileMgr.CloseScheduledFilesImmediately(); + iFileMgr.BackupReStoreChanged(MCalChangeCallBack2::ERestoreStart); + } + else if (newState & (conn::EBURNormal | conn::EBURUnset) && BackupInProgress()) + { + iFileMgr.BackupReStoreChanged(MCalChangeCallBack2::EBackupEnd); + } + else if (newState & (conn::EBURNormal | conn::EBURUnset) && RestoreInProgress()) + { + iFileMgr.BackupReStoreChanged(MCalChangeCallBack2::ERestoreEnd); + } + iCurrentState = newState; + } + } + +/** Called when an error occurs. If an error occurs we will not be notified of backup or restore +events. This may cause problems during backup and restore but terminating the server is excessive as +it can continue normal operation. */ +TInt CAgnServBackupRestoreAgent::RunError(TInt /*aError*/) + { + return KErrNone; + } + +void CAgnServBackupRestoreAgent::DoCancel() + { + iBackupRestoreNotification.Cancel(); + }