phonebookui/Phonebook/View/src/CPbkWaitNoteWrapperBase.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkWaitNoteWrapperBase.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,364 @@
+/*
+* 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: 
+*       Provides methods for a wait note wrapper.
+*
+*/
+
+
+// INCLUDE FILES
+#include <CPbkWaitNoteWrapperBase.h>
+#include <eikprogi.h>
+#include <AknWaitDialog.h>
+#include <MPbkBackgroundProcess.h>
+#include <PbkDebug.h>
+
+#ifdef __WINS__
+// Disable warning from CPbkWaitNoteWrapperBase constructor
+#pragma warning( disable : 4355 )
+#endif
+
+namespace {
+
+#ifdef _DEBUG
+// LOCAL CONSTANTS
+enum TPanicCode
+    {
+    EPanicPreCond_ExecuteL_MPbkBackgroundProcess = 1
+    };
+
+// ================= LOCAL FUNCTIONS =======================
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText,"CPbkWaitNoteWrapperBase");
+    User::Panic(KPanicText,aReason);
+    }
+#endif // _DEBUG
+}
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// CPbkWaitNoteWrapperBase::CIdleCallback
+inline CPbkWaitNoteWrapperBase::CIdleCallback::CIdleCallback
+        (CPbkWaitNoteWrapperBase& aWaitNoteWrapper) :
+    CActive(EPriorityIdle),
+    iWaitNoteWrapper(aWaitNoteWrapper)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+CPbkWaitNoteWrapperBase::CIdleCallback::~CIdleCallback()
+    {
+    Cancel();
+    }
+
+void CPbkWaitNoteWrapperBase::CIdleCallback::IssueRequest()
+    {
+    TRequestStatus* sp = &iStatus;
+    User::RequestComplete(sp, KErrNone);
+    SetActive();
+    }
+
+void CPbkWaitNoteWrapperBase::CIdleCallback::DoCancel()
+    {
+    }
+
+void CPbkWaitNoteWrapperBase::CIdleCallback::RunL()
+    {
+    iWaitNoteWrapper.IdleRunL();
+    }
+
+TInt CPbkWaitNoteWrapperBase::CIdleCallback::RunError(TInt aError)
+    {
+    return iWaitNoteWrapper.IdleRunError(aError);
+    }
+
+
+// CPbkWaitNoteWrapperBase::TNoteParams
+EXPORT_C CPbkWaitNoteWrapperBase::TNoteParams::TNoteParams() :
+    iVisibilityDelayOff(EFalse),
+    iTone(CAknNoteDialog::ENoTone),
+    iText(NULL),
+    iObserver(NULL)
+    {
+	}
+
+// CPbkWaitNoteWrapperBase
+CPbkWaitNoteWrapperBase::CPbkWaitNoteWrapperBase() :
+    iIdleCallback(*this), iNoteOpen(EFalse)
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::CPbkWaitNoteWrapperBase(0x%x)"),this);
+    }
+
+CPbkWaitNoteWrapperBase::~CPbkWaitNoteWrapperBase()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::~CPbkWaitNoteWrapperBase(0x%x)"),this);
+
+	// Wait dialog gets deleted automatically, but delete it by force
+	// if it somehow still exists
+	if (iWaitDialog)
+		{
+		delete iWaitDialog;
+		iWaitDialog=NULL;
+		}
+    Cancel();
+    }
+
+EXPORT_C void CPbkWaitNoteWrapperBase::DisplayL
+        (TInt aResId, 
+        const TNoteParams& aNoteParams /*=TNoteParams()*/)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkWaitNoteWrapperBase::DisplayL(0x%x,%d)"),
+        this, aResId);
+
+    Cancel();
+    iObserver = aNoteParams.iObserver;
+    iWaitDialog = CreateDialogL
+        (reinterpret_cast<CEikDialog**>(&iWaitDialog),
+		aNoteParams.iVisibilityDelayOff);
+    iWaitDialog->SetCallback(this);
+    iWaitDialog->SetTone(aNoteParams.iTone);
+    iWaitDialog->PrepareLC(aResId);
+    if (aNoteParams.iText)
+        {
+        iWaitDialog->SetTextL(*aNoteParams.iText);
+        }
+	iNoteOpen = ETrue;
+    iWaitDialog->RunLD();
+    }
+
+EXPORT_C void CPbkWaitNoteWrapperBase::Execute
+        (MPbkBackgroundProcess& aProcess)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkWaitNoteWrapperBase::Execute(0x%x,0x%x)"),
+        this, &aProcess);
+    __ASSERT_DEBUG(iWaitDialog && !iBackgroundProcess,
+        Panic(EPanicPreCond_ExecuteL_MPbkBackgroundProcess));
+
+    iBackgroundProcess = &aProcess;
+    // Request IdleRunL call
+    iIdleCallback.IssueRequest();
+    }
+
+EXPORT_C void CPbkWaitNoteWrapperBase::ExecuteL
+        (MPbkBackgroundProcess& aProcess,
+        TInt aResId, 
+        const TNoteParams& aNoteParams /*=TNoteParams()*/)
+    {
+    DisplayL(aResId,aNoteParams);
+    Execute(aProcess);
+    }
+
+EXPORT_C TBool CPbkWaitNoteWrapperBase::IsNoteClosed() const
+    {
+    return (!iNoteOpen);
+    }
+
+EXPORT_C void CPbkWaitNoteWrapperBase::SetProgressDialogCallback
+        (MProgressDialogCallback& aCallback)
+    {
+    iDialogCallbackObserver = &aCallback;
+    }
+
+void CPbkWaitNoteWrapperBase::Cancel()
+    {
+    iIdleCallback.Cancel();
+    ProcessCanceled();
+    }
+
+void CPbkWaitNoteWrapperBase::IdleRunL()
+    {
+    if (!iBackgroundProcess)
+        {
+        return;
+        }
+
+    if (ShowProgressInfo() && !iProgressInfoControl)
+        {
+		if (iNoteOpen)
+			{
+			iProgressInfoControl = iWaitDialog->GetProgressInfoL();
+			}
+        }
+    if (iProgressInfoControl)
+        {
+        const TInt numberOfSteps = iBackgroundProcess->TotalNumberOfSteps();
+        if (numberOfSteps > 0 && 
+            iProgressInfoControl->Info().iFinalValue != numberOfSteps)
+            {
+            iProgressInfoControl->SetFinalValue(numberOfSteps);
+            }
+        }
+
+    if (iBackgroundProcess->IsProcessDone())
+        {
+        ProcessFinished();
+        }
+    else if (!iNoteOpen)
+        {
+        ProcessCanceled();
+        }
+    else
+        {
+        // Do one step of processing
+        iBackgroundProcess->StepL();
+        // Update progress info
+        if (iProgressInfoControl)
+            {
+            iProgressInfoControl->IncrementAndDraw(1);
+            }
+        // Request next cycle
+        iIdleCallback.IssueRequest();
+        }
+    }
+
+TInt CPbkWaitNoteWrapperBase::IdleRunError
+        (TInt aError)
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::IdleRunError(0x%x,%d)"),this,aError);
+
+    TInt translatedError = aError;
+    if (iBackgroundProcess)
+        {
+        translatedError = iBackgroundProcess->HandleStepError(aError);
+        }
+
+    if (translatedError == KErrNone)
+        {
+        // Continue processing
+        iIdleCallback.IssueRequest();
+        }
+    else
+        {
+        if (iBackgroundProcess)
+            {
+            MPbkBackgroundProcess& process = *iBackgroundProcess;
+            iBackgroundProcess = NULL;
+            KillNote();
+            NotifyObserver(process);
+            }
+        }
+ 
+    return translatedError;
+    }
+
+void CPbkWaitNoteWrapperBase::DialogDismissedL
+        (TInt aButtonId)
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::DialogDismissedL(0x%x)"),this);
+    
+    if (iDialogCallbackObserver)
+        {
+        iDialogCallbackObserver->DialogDismissedL(aButtonId);
+        }
+
+	iNoteOpen = EFalse;
+    ProcessCanceled();
+    }
+
+/**
+ * Closes wait note gracefully.
+ */
+void CPbkWaitNoteWrapperBase::CloseNote()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::CloseNote(0x%x)"),this);
+
+    if (iWaitDialog)
+        {
+        iWaitDialog->SetCallback(NULL);
+        TRAPD(err,iWaitDialog->ProcessFinishedL());
+        if (err != KErrNone)
+            {
+            // Graceful close was unsuccesful -> stop
+			// being nice and kill the dialog
+            KillNote();
+            }
+		iNoteOpen = EFalse;
+        }
+	}
+
+/**
+ * Closes wait note immediately.
+ */
+void CPbkWaitNoteWrapperBase::KillNote()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::KillNote(0x%x)"),this);
+
+    if (iWaitDialog)
+        {
+        iWaitDialog->SetCallback(NULL);
+		delete iWaitDialog;
+		iWaitDialog=NULL;
+        }
+
+	iNoteOpen = EFalse;
+    }
+
+void CPbkWaitNoteWrapperBase::ProcessFinished()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::ProcessFinished(0x%x)"),this);
+
+    if (iBackgroundProcess)
+        {
+        MPbkBackgroundProcess& process = *iBackgroundProcess;
+        iBackgroundProcess = NULL;
+        process.ProcessFinished();
+        CloseNote();
+        NotifyObserver(process);
+		}
+    }
+
+void CPbkWaitNoteWrapperBase::ProcessCanceled()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+		("CPbkWaitNoteWrapperBase::ProcessCanceled(0x%x)"),this);
+
+    if (iBackgroundProcess)
+        {
+        MPbkBackgroundProcess& process = *iBackgroundProcess;
+        iBackgroundProcess = NULL;
+        process.ProcessCanceled();
+		// Do not kill the note, if it already has been done
+		if (iNoteOpen)
+			{
+			KillNote();
+			}
+        NotifyObserver(process);
+        }
+    }
+
+/**
+ * Notifies observer about process completion.
+ */
+void CPbkWaitNoteWrapperBase::NotifyObserver(MPbkBackgroundProcess& aProcess)
+    {
+    if (iObserver)
+        {
+        MPbkProcessObserver& observer = *iObserver;
+        iObserver = NULL;
+        observer.ProcessFinished(aProcess);
+        }
+    }
+
+//  End of File