--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commonappservices/backuprestorenotification/src/CBackupRestoreNotification.cpp Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,202 @@
+// Copyright (c) 2004-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 "CBackupRestoreNotification.h"
+
+
+/** Default constructor.
+ * @param aCallback reference to observer class object.
+ */
+CBackupRestoreNotification::CBackupRestoreNotification(MBackupRestoreNotificationObserver& aCallback)
+:
+ CActive(CActive::EPriorityStandard),
+ iObserver(aCallback)
+ {
+
+ CActiveScheduler::Add(this);
+ }
+
+
+/** Destructor.
+ */
+EXPORT_C CBackupRestoreNotification::~CBackupRestoreNotification()
+ {
+ Cancel();
+ iBackupNotification.Close();
+ }
+
+/**
+ * A class wishing to be notified of a Backup/Restore shoud be derived from
+ * MBackupRestoreNotificationObserver and pass a self reference.
+ * @param aFilename full filename of the file which needs monitoring.
+ * @param aCallback should usually be a pointer to the class calling this function.
+ */
+EXPORT_C CBackupRestoreNotification* CBackupRestoreNotification::NewL(const TDesC& aFilename,
+ MBackupRestoreNotificationObserver& aCallback)
+ {
+ CBackupRestoreNotification* self = new(ELeave) CBackupRestoreNotification(aCallback);
+ CleanupStack::PushL(self);
+ self->ConstructL(aFilename);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+/**
+ * Indicates if a Backup operation is currently taking place.
+ * @return ETrue if operation in progress else EFalse.
+ */
+EXPORT_C TBool CBackupRestoreNotification::BackupInProgress() const
+ {
+ return (iCurrentState & (conn::EBURBackupPartial | conn::EBURBackupFull));
+ }
+
+/**
+ * Indicates if a Restore operation is currently taking place.
+ * @return ETrue if operation in progress else EFalse.
+ */
+EXPORT_C TBool CBackupRestoreNotification::RestoreInProgress() const
+ {
+ return (iCurrentState & (conn::EBURRestorePartial | conn::EBURRestoreFull));
+ }
+
+
+
+/**
+ * Initial registration with Publish&Subscribe for KUidBackupRestoreKey.
+ * @param full filename of the file being backed and which needs monitoring.
+ */
+void CBackupRestoreNotification::ConstructL(const TDesC& /*aFilename*/)
+ {
+ // Initial subscribe to the Backup and Restore Flag.
+ // The first ID indicates the type of flag being subscribed to.
+ // The second ID is the actual Backup/Restore flag.
+ iBackupNotification.Attach(KUidSystemCategory, conn::KUidBackupRestoreKey);
+ iBackupNotification.Subscribe(iStatus);
+
+ // Check to see if a Backup/Restore is currently underway.
+ TInt newState=0;
+ if (iBackupNotification.Get(newState)!=KErrNotFound)
+ {
+ ProcessInitialStateL(newState);
+ }
+
+ SetActive();
+ }
+
+
+/**
+ * Have been notifed of a change in the backup/restore falg value.
+ * Re-register for changes to the backup flag. Then evaluate which observer
+ * function need to be called.
+ * @see CActive
+ */
+void CBackupRestoreNotification::RunL()
+ {
+ // Resubscribe before dealing with the current notification.
+ iBackupNotification.Subscribe(iStatus);
+ SetActive();
+
+ // Flag updated. What to do..
+ TInt newState=0;
+ if (iBackupNotification.Get(newState)!=KErrNotFound)
+ {
+ ReceivedNotificationL(newState);
+ }
+ }
+
+
+TInt CBackupRestoreNotification::RunError(TInt /* aError */)
+ { // recover after handler for notification left
+ return (KErrNone);
+ }
+
+
+/**
+ * @see CActive
+ */
+void CBackupRestoreNotification::DoCancel()
+ {
+ iBackupNotification.Cancel();
+ }
+
+
+/**
+ * Determines what operation is starting or has completed
+ * and calls the relevant observer function.
+ * @param aNewState flags indicating what the new backup/restore state is:
+ * ENoBackup or EBackupBase or EBackupIncremetal. Only interesed in BaseBackup.
+ * EBUR (Unset, Normal, BackupFull, BackupPartial, RestoreFull, RestorePartial)
+ *
+ * 1. No backup/restore is taking place = EBURNormal | ENoBackup
+ * 2. Backup operation starting = (EBURBackupFull || EBURBackupPartial) && EBackupBase
+ * 3. Restore operation starting = (EBURRestoreFull || EBURRestorePartial) && EBackupBase
+ *
+ */
+void CBackupRestoreNotification::ReceivedNotificationL(TInt aNewState)
+ {
+ // We are starting a a new operation...
+ // Was there a previous Restore which failed to complete ?
+ if (!(aNewState & (conn::EBURNormal | conn::EBURUnset)) && RestoreInProgress())
+ {
+ iCurrentState=aNewState;
+ iObserver.RestoreCompletedL(KErrAbort);
+ }
+
+ // A Backup or Restore taking place.
+ if (aNewState & (conn::EBURBackupPartial | conn::EBURBackupFull) )
+ {
+ // Backup is taking place (either partial or full)
+ iCurrentState=aNewState;
+ iObserver.BackupBeginningL();
+ }
+ else if (aNewState & (conn::EBURRestorePartial | conn::EBURRestoreFull))
+ {
+ // Restore is taking place (either partial or full)
+ iCurrentState=aNewState;
+ iObserver.RestoreBeginningL();
+ }
+ else if (aNewState & (conn::EBURNormal | conn::EBURUnset))
+ {
+ // The state has changed to no backup/restore
+ // Decide which operation has just completed.
+ if (BackupInProgress())
+ {
+ iCurrentState=aNewState;
+ iObserver.BackupCompletedL();
+ }
+ else if (RestoreInProgress())
+ {
+ iCurrentState=aNewState;
+ iObserver.RestoreCompletedL(KErrNone);
+ }
+ }
+ }
+
+void CBackupRestoreNotification::ProcessInitialStateL(TInt aNewState)
+ {
+ // A Backup or Restore is taking place.
+ if (aNewState & (conn::EBURBackupPartial | conn::EBURBackupFull) )
+ {
+ // Backup is taking place (either partial or full)
+ iObserver.BackupBeginningL();
+ }
+ else if (aNewState & (conn::EBURRestorePartial | conn::EBURRestoreFull))
+ {
+ // Restore is taking place (either partial or full)
+ iObserver.RestoreBeginningL();
+ }
+ iCurrentState=aNewState;
+ }
+