phonebookui/Phonebook/PbkAiwProviders/src/CPbkAssignImageCmd.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/PbkAiwProviders/src/CPbkAssignImageCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,514 @@
+/*
+* 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: 
+*     Implements assign image functionality.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkAssignImageCmd.h"
+
+#include <aknnotedialog.h>
+#include <StringLoader.h>
+#include <PbkAiwProvidersRes.rsg>
+#include <PbkView.rsg>
+#include <CPbkContactEngine.h>
+#include <AknNoteWrappers.h>
+#include <AknWaitDialog.h>
+#include <CPbkContactItem.h>
+#include <CPbkThumbnailManager.h>
+#include <CPbkDrmManager.h>
+#include <MPbkCommandObserver.h>
+#include <AiwCommon.h>
+#include <AiwCommon.hrh>
+#include <CPbkFFSCheck.h>
+
+#include <pbkdebug.h>
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_PbkImageSetComplete,
+    EPanicPreCond_PbkImageSetFailed,
+    EPanicPreCond_PbkImageGetComplete,
+    EPanicPreCond_PbkImageGetFailed,
+    ERunL_InvalidState
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkAssignImageCmd");
+    User::Panic(KPanicText, aReason);
+    }
+
+#endif  // _DEBUG
+}
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkAssignImageCmd* CPbkAssignImageCmd::NewL
+        (const TDesC& aFileName, CContactIdArray* aContacts,
+        TPbkFieldId aFieldId, CPbkContactEngine& aEngine,
+        const CAiwGenericParamList& aInParamList,
+        MAiwNotifyCallback* aNotifyCallback)
+    {
+	CPbkAssignImageCmd* self = new(ELeave) CPbkAssignImageCmd
+        (aFileName, aContacts, aFieldId, aEngine,
+        aInParamList, aNotifyCallback);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+    }
+
+CPbkAssignImageCmd::CPbkAssignImageCmd
+        (const TDesC& aFileName, CContactIdArray* aContacts,
+        TPbkFieldId aFieldId, CPbkContactEngine& aEngine,
+        const CAiwGenericParamList& aInParamList,
+        MAiwNotifyCallback* aNotifyCallback) :
+        CActive(CActive::EPriorityIdle),
+        iEngine(aEngine), iContacts(aContacts),
+        iFieldId(aFieldId), iFileName(aFileName),
+        iInParamList(aInParamList),
+        iNotifyCallback(aNotifyCallback)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+void CPbkAssignImageCmd::ConstructL()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkAssignImageCmd::ConstructL start"));
+
+    iImageManager = CPbkThumbnailManager::NewL(iEngine);
+    iPbkFFSCheck = CPbkFFSCheck::NewL();
+    
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkAssignImageCmd::ConstructL end"));
+    }
+
+CPbkAssignImageCmd::~CPbkAssignImageCmd()
+    {
+    Cancel();
+    delete iWaitNote;
+    delete iItem;
+    delete iImageOperation;
+    delete iImageManager;
+    delete iContacts;
+    delete iBitmap;
+    delete iTitleForNote;
+    delete iPbkFFSCheck;
+    }
+
+
+void CPbkAssignImageCmd::AssignImageL()
+    {    
+    TInt count = iContacts->Count();
+
+    delete iItem;
+    iItem = NULL;
+    
+    delete iBitmap;
+    iBitmap = NULL;
+
+    // Read the last contact of the array. Array is zerobased,
+    // therefore reduce one
+    iItem = iEngine.OpenContactL((*iContacts)[count-1]);
+    
+    // Remove the last contact from the array
+    iContacts->Remove(count-1);
+
+	if (ConfirmAssignL(*iItem, iFieldId))
+		{		
+        SetImageAsyncL();
+        ShowWaitNoteL();
+		}
+	else
+		{
+        // Close contact and continue
+        iEngine.CloseContactL(iItem->Id());
+        IssueRequest();
+		}
+    }
+    
+inline TBool CPbkAssignImageCmd::ConfirmAssignL
+        (CPbkContactItem& aItem, TPbkFieldId /*aId*/)
+	{
+	TBool ret = ETrue;
+	
+    // Check does the contact already have a image
+    if (iImageManager->HasThumbnail(aItem))
+        {
+        DismissWaitNoteL();
+
+        // Ask the user for confirmation
+        HBufC* title = aItem.GetContactTitleL();
+        CleanupStack::PushL(title);
+        HBufC* prompt = StringLoader::LoadL(R_QTN_PHOB_FETCH_IMG_REPLACE,
+            *title);
+        CleanupStack::PopAndDestroy(title);
+        CleanupStack::PushL(prompt);
+        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+		CleanupStack::PushL(dlg);
+        dlg->SetPromptL(*prompt);
+		CleanupStack::Pop(); // dlg
+
+        if(!dlg->ExecuteLD(R_PBKAIW_GENERAL_CONFIRMATION_QUERY))
+            {
+            ret = EFalse;
+            }
+        CleanupStack::PopAndDestroy(prompt);	
+        }
+	
+	return ret;
+	}
+
+void CPbkAssignImageCmd::SetImageAsyncL()
+    {    
+    // Set image to contact
+    delete iImageOperation;
+    iImageOperation = NULL;
+    
+    // Check disk space before assigning. 
+    // If not enough memory then leaves with KErrDiskFull.
+    iPbkFFSCheck->FFSClCheckL();
+    
+    if (!iBitmap)
+        {
+        iImageOperation = iImageManager->SetThumbnailAsyncL
+            (*this, *iItem, iFileName);
+        }
+    else
+        {
+        iImageOperation = iImageManager->SetThumbnailAsyncL
+            (*this, *iItem, *iBitmap);
+        }
+    }
+
+void CPbkAssignImageCmd::ShowEndNotesL()
+    {
+    DismissWaitNoteL();
+
+    if (iImagesAdded > 0)
+        {
+        HBufC* prompt = NULL;
+
+        // Select prompt
+        if (iImagesAdded == 1)
+            {
+            prompt = StringLoader::LoadL(R_QTN_PHOB_FETCH_NOTE_IMG_ADD_ONE,
+                *iTitleForNote);
+            CleanupStack::PushL(prompt);
+            }
+        else if (iImagesAdded > 1)
+            {
+            prompt = StringLoader::LoadLC(R_QTN_PHOB_FETCH_NOTE_IMG_ADD_SEV,
+                iImagesAdded);
+            }
+
+        // Prepare the note
+        CAknNoteWrapper * note = new (ELeave) CAknNoteWrapper;
+        CleanupStack::PushL(note);
+        note->SetTextL(*prompt);
+        CleanupStack::Pop(note);
+        CleanupStack::PopAndDestroy(prompt);
+
+        // Show the note
+        note->ExecuteLD(R_PBKAIW_GENERAL_NOTE);
+        }
+
+    // Destroy itself (observer performs deletion of this command)
+    iCmdObserver->CommandFinished(*this);
+    DoSendNotifyEventL(KAiwEventCompleted);
+    }
+
+void CPbkAssignImageCmd::FetchImageL()
+    {
+    // If we are to continue the image set process
+    // get the image from the previous item,
+    // so there's no need to perform scale and other
+    // operations for every contact
+    delete iImageOperation;
+    iImageOperation = NULL;
+    iImageOperation = iImageManager->GetThumbnailAsyncL
+        (*this, *iItem);
+    }
+
+void CPbkAssignImageCmd::PbkThumbnailSetComplete
+        (MPbkThumbnailOperation& 
+        #ifdef _DEBUG
+        aOperation
+        #endif
+        )
+    {
+    __ASSERT_DEBUG(&aOperation == iImageOperation, 
+        Panic(EPanicPreCond_PbkImageSetComplete));
+
+    // Commit changes
+    TRAPD(err, iEngine.CommitContactL(*iItem, ETrue));
+    delete iImageOperation;
+    iImageOperation = NULL;        
+    if (err == KErrNone)
+        {
+        // Save contact title for note
+        HBufC* title = NULL;        
+        TRAP(err, title = iItem->GetContactTitleL());        
+        if (err == KErrNone)
+            {
+            delete iTitleForNote;
+            iTitleForNote = title;
+            // Increase the count only if commit and title name
+            // fetch succeeded
+            ++iImagesAdded;    
+            }
+        else
+            {
+            CCoeEnv::Static()->HandleError(err);
+            }        
+        }
+    else
+        {
+        CCoeEnv::Static()->HandleError(err);
+        }
+    
+    // Continue
+    IssueRequest();
+    }
+
+void CPbkAssignImageCmd::PbkThumbnailSetFailed
+        (MPbkThumbnailOperation& 
+        #ifdef _DEBUG
+        aOperation
+        #endif
+        , TInt aError)
+    {
+    __ASSERT_DEBUG(&aOperation == iImageOperation, 
+        Panic(EPanicPreCond_PbkImageSetFailed));
+
+    delete iImageOperation;
+    iImageOperation = NULL;
+
+    // We can ignore the error, report only the
+    // original error to user
+    TRAP_IGNORE(iEngine.CloseContactL(iItem->Id()));
+
+    // Report the failure to the user
+    CCoeEnv::Static()->HandleError(aError);
+
+    // Continue
+    IssueRequest();
+    }
+
+
+void CPbkAssignImageCmd::PbkThumbnailGetComplete
+        (MPbkThumbnailOperation& 
+        #ifdef _DEBUG
+        aOperation
+        #endif
+        , CFbsBitmap* aBitmap)
+    {
+    __ASSERT_DEBUG(&aOperation == iImageOperation, 
+        Panic(EPanicPreCond_PbkImageSetComplete));
+
+    // Store the bitmap
+    iBitmap = aBitmap;
+
+    // Continue
+    IssueRequest();
+    }
+
+void CPbkAssignImageCmd::PbkThumbnailGetFailed
+        (MPbkThumbnailOperation& 
+        #ifdef _DEBUG
+        aOperation
+        #endif
+        , TInt /*aError*/)
+    {
+    __ASSERT_DEBUG(&aOperation == iImageOperation, 
+        Panic(EPanicPreCond_PbkImageGetFailed));
+
+    // Continue
+    IssueRequest();
+    }
+
+
+void CPbkAssignImageCmd::ShowWaitNoteL()
+    {
+    if (!iWaitNote)
+        {
+        CAknWaitDialog* waitNote = new(ELeave)
+        CAknWaitDialog(reinterpret_cast<CEikDialog**>(&iWaitNote));
+        waitNote->ExecuteLD(R_QTN_GEN_NOTE_PROCESSING);
+        iWaitNote = waitNote;
+        }
+    }
+
+void CPbkAssignImageCmd::DismissWaitNoteL()
+    {
+    if (iWaitNote)
+        {
+	    TRAPD(err, iWaitNote->ProcessFinishedL());
+	    if (err != KErrNone)
+		    {
+		    delete iWaitNote;
+            iWaitNote = NULL;
+		    }
+        }
+    }
+
+void CPbkAssignImageCmd::ExecuteLD()
+    {
+    CleanupStack::PushL(this);
+    
+    // Check is the image DRM protected
+    CPbkDrmManager* drmManager = CPbkDrmManager::NewL();
+    CleanupStack::PushL(drmManager);
+    if (drmManager->IsProtectedFile(iFileName))
+        {
+        // Show user copyright note
+        HBufC* prompt = 
+            CCoeEnv::Static()->AllocReadResourceLC(R_QTN_DRM_NOT_ALLOWED);
+        CAknInformationNote* dlg = new(ELeave) CAknInformationNote(ETrue);
+        dlg->ExecuteLD(*prompt);
+        CleanupStack::PopAndDestroy(); // prompt
+        IssueStopRequest(KErrCancel);
+        }
+    else
+        {        
+        iState = EAssigningFirst;
+        IssueRequest();
+        }
+    CleanupStack::PopAndDestroy(drmManager);
+    CleanupStack::Pop(this);
+    }
+
+void CPbkAssignImageCmd::AddObserver(MPbkCommandObserver& aObserver)
+    {
+    iCmdObserver = &aObserver;
+    }
+
+void CPbkAssignImageCmd::RunL()
+    {
+    switch (iState)
+        {
+        case EAssigningFirst:
+            {                        
+            AssignImageL();
+
+            if (iContacts->Count() > 0)
+                {
+                // Fetch the assigned image for the next contacts, if any
+                iState = EFetching;
+                }
+            else
+                {
+                // Only one contact was selected, stop
+                iState = EStopping;
+                }
+            break;
+            }
+        case EFetching:
+            {
+            FetchImageL();
+
+            iState = EAssigning;
+            break;
+            }
+        case EAssigning:
+            {
+            if (iContacts->Count() > 0)
+                {
+                // Assign image to next contact
+                AssignImageL();
+                iState = EAssigning;
+                }
+            else
+                {
+                IssueStopRequest(KErrNone);
+                }
+            break;
+            }
+        case EStopping:
+            {
+            // Show notes to user
+            ShowEndNotesL();
+            break;
+            }
+        default:
+            {
+            __ASSERT_DEBUG(EFalse, Panic(ERunL_InvalidState));
+            break;
+            }
+        }
+    }
+
+
+void CPbkAssignImageCmd::DoCancel()
+    {
+    // Safe to ignore this, notify is not so critical
+    TRAP_IGNORE(DoSendNotifyEventL(KAiwEventCanceled));
+    }
+    
+
+TInt CPbkAssignImageCmd::RunError(TInt aError)
+    {
+    if (iItem)
+        {
+        // We can ignore the error since stopping anyways
+        TRAP_IGNORE(iEngine.CloseContactL(iItem->Id()));
+        }
+    CCoeEnv::Static()->HandleError(aError);
+    IssueStopRequest(aError);
+    return KErrNone;
+    }
+
+void CPbkAssignImageCmd::DoSendNotifyEventL(TInt aEvent)
+    {
+    if (iNotifyCallback)
+        {
+        CAiwGenericParamList* eventParamList = CAiwGenericParamList::NewL();
+        CleanupStack::PushL(eventParamList);
+        iNotifyCallback->HandleNotifyL(
+		    KAiwCmdAssign,
+		    aEvent,
+		    *eventParamList,
+		    iInParamList);
+        CleanupStack::PopAndDestroy(eventParamList);
+        }
+    }
+
+void CPbkAssignImageCmd::IssueRequest()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    SetActive();
+    }
+
+void CPbkAssignImageCmd::IssueStopRequest(TInt /*aError*/)
+    {
+    iState = EStopping;
+    if (!IsActive())
+        {
+        IssueRequest();
+        }
+    }
+
+// End of File
+