--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/Engine/src/CPbkDbRecovery.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2002 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:
+* Methods for DB recovery.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkDbRecovery.h"
+#include "MPbkRecoveryErrorHandler.h"
+#include <PbkDebug.h>
+
+
+// ==================== MEMBER FUNCTIONS ====================
+
+inline CPbkDbRecovery::CPbkDbRecovery(CContactDatabase& aDb) :
+ iDb(aDb)
+ {
+ }
+
+inline void CPbkDbRecovery::ConstructL()
+ {
+ iDbChangeNotifier = CContactChangeNotifier::NewL(iDb,this);
+ // High priority is used to prevent input events getting through before
+ // the recover is started
+ iStarter = CIdle::NewL(CActive::EPriorityHigh);
+ }
+
+EXPORT_C CPbkDbRecovery* CPbkDbRecovery::NewL(CContactDatabase& aDb)
+ {
+ CPbkDbRecovery* self = new(ELeave) CPbkDbRecovery(aDb);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CPbkDbRecovery::~CPbkDbRecovery()
+ {
+ delete iStarter;
+ delete iDbChangeNotifier;
+ }
+
+EXPORT_C void CPbkDbRecovery::SetErrorHandler
+ (MPbkRecoveryErrorHandler* aErrorHandler)
+ {
+ iErrorHandler = aErrorHandler;
+ }
+
+void CPbkDbRecovery::HandleDatabaseEventL(TContactDbObserverEvent aEvent)
+ {
+ if (aEvent.iType == EContactDbObserverEventRollback)
+ {
+ PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+ ("CPbkDbRecovery::HandleDatabaseEventL(0x%x,EContactDbObserverEventRollback)"),
+ this);
+ StartRecovery();
+ }
+ }
+
+void CPbkDbRecovery::StartRecovery()
+ {
+ if(iStarter->IsActive())
+ {
+ iStarter->Cancel();
+ }
+ // Start the recovery using an asynchronous callback so that the Contact
+ // DB event handler is able to return before starting the recovery.
+ iStarter->Start(TCallBack(CPbkDbRecovery::DoRecoveryL,this));
+ }
+
+TBool CPbkDbRecovery::DoRecoveryL()
+ {
+ PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkDbRecovery::DoRecoveryL(0x%x)"),
+ this);
+ TBool result = EFalse;
+
+ TRAPD(err, iDb.RecoverL());
+
+ PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+ ("CPbkDbRecovery::DoRecoveryL(0x%x) recovery result=%d"), this, err);
+
+ if (err != KErrNone)
+ {
+ if (iErrorHandler)
+ {
+ // Use error handler to determine if recovery is to be tried again
+ result = iErrorHandler->HandleDbRecoveryError(err);
+ }
+ else
+ {
+ // No error handler -> just leave with the error code
+ User::Leave(err);
+ }
+ }
+
+ return result;
+ }
+
+TInt CPbkDbRecovery::DoRecoveryL(TAny* aSelf)
+ {
+ return (static_cast<CPbkDbRecovery*>(aSelf)->DoRecoveryL());
+ }
+
+
+// End of File