pimappservices/calendar/server/src/agsbackuprestoreagent.cpp
changeset 0 f979ecb2b13e
child 74 97232defd20e
--- /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 <connect/sbdefs.h> // 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();
+	}