phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactImageAssigner.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2ContactImageAssigner.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,360 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 contact image assigner.
+*
+*/
+
+
+#include "CPbk2ContactImageAssigner.h"
+
+// Phonebook 2
+#include "MPbk2ContactAssignerObserver.h"
+#include "Pbk2AssignValidateField.h"
+#include <CPbk2ImageManager.h>
+#include <CPbk2DrmManager.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2FieldPropertyArray.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldTextData.h>
+#include <VPbkEng.rsg>
+
+// System includes
+#include <featmgr.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+
+enum TPanicCode
+    {
+    EInvalidFieldIndex,
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT( KPanicText, "CPbk2ContactImageAssigner" );
+    User::Panic( KPanicText, aReason );
+    }
+#endif //_DEBUG
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::CPbk2ContactImageAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2ContactImageAssigner::CPbk2ContactImageAssigner
+        ( MPbk2ContactAssignerObserver& aObserver,
+          CVPbkContactManager& aContactManager,
+          CPbk2FieldPropertyArray& aFieldProperties ):
+            CActive( EPriorityIdle ), iObserver( aObserver ),
+            iContactManager( aContactManager ),
+            iFieldProperties( aFieldProperties ),
+            iIndex( KErrNotSupported )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::~CPbk2ContactImageAssigner
+// --------------------------------------------------------------------------
+//
+CPbk2ContactImageAssigner::~CPbk2ContactImageAssigner()
+    {
+    Cancel();
+    delete iImageOperation;
+    delete iImageManager;
+    delete iDrmManager;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2ContactImageAssigner* CPbk2ContactImageAssigner::NewL
+        ( MPbk2ContactAssignerObserver& aObserver,
+          CVPbkContactManager& aContactManager,
+          CPbk2FieldPropertyArray& aFieldProperties )
+    {
+    CPbk2ContactImageAssigner* self =
+        new ( ELeave ) CPbk2ContactImageAssigner
+            ( aObserver, aContactManager, aFieldProperties );
+    CleanupStack::PushL( self );
+    self->ConstructL( aContactManager );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::ConstructL
+        ( CVPbkContactManager& aContactManager )
+    {
+    iImageManager = CPbk2ImageManager::NewL( aContactManager );
+    iDrmManager = CPbk2DrmManager::NewL();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::AssignDataL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::AssignDataL
+        ( MVPbkStoreContact& aStoreContact,
+          MVPbkStoreContactField* /*aContactField*/,
+          const MVPbkFieldType* aFieldType, const HBufC* aDataBuffer )
+    {
+    iContact = &aStoreContact;
+    iFieldType = aFieldType;
+    iDataBuffer = aDataBuffer;
+
+    iState = EAssigningImage;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::AssignAttributeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::AssignAttributeL
+        ( MVPbkStoreContact& /*aStoreContact*/,
+          MVPbkStoreContactField* /*aContactField*/,
+          TPbk2AttributeAssignData /*aAttributeAssignData*/ )
+    {
+    // Not supported
+    User::Leave( KErrNotSupported );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::RunL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::RunL()
+    {
+   switch ( iState )
+        {
+        case EAssigningImage:
+            {
+            AssignImageL();
+            break;
+            }
+        case EAssigningImageFileName:
+            {
+            AssignImageFileNameL();
+            break;
+            }
+        case EStopping:
+            {
+            if ( iError == KErrNone )
+                {
+                iObserver.AssignComplete( *this, iIndex );
+                }
+            else
+                {
+                iObserver.AssignFailed( *this, iError );
+                }
+            break;
+            }
+        case EDrmProtected:
+            {
+            iObserver.AssignFailed( *this, iError );
+            break;
+            }            
+        default:
+            {
+            // Do nothing
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::DoCancel()
+    {
+    // Nothing to do
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactImageAssigner::RunError( TInt aError )
+    {
+    iObserver.AssignFailed( *this, aError );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::Pbk2ImageSetComplete
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::Pbk2ImageSetComplete
+        ( MPbk2ImageOperation& /*aOperation*/ )
+    {
+    delete iImageOperation;
+    iImageOperation = NULL;
+
+    iState = EAssigningImageFileName;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::Pbk2ImageSetFailed
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::Pbk2ImageSetFailed
+        ( MPbk2ImageOperation& /*aOperation*/, TInt aError )
+    {
+    delete iImageOperation;
+    iImageOperation = NULL;
+
+    iState = EStopping;
+    iError = aError;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::PassesDrmCheckL
+// --------------------------------------------------------------------------
+//
+TInt CPbk2ContactImageAssigner::PassesDrmCheckL( 
+        const HBufC* aDataBuffer,
+        TBool& aIsProtected )
+    {
+    aIsProtected = ETrue;
+    TInt error( KErrNone );
+    
+    if ( aDataBuffer )
+        {
+        error = iDrmManager->IsThumbnailForbidden( *aDataBuffer, aIsProtected );
+        }
+
+    return error;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::AssignImageL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::AssignImageL()
+    {
+    TBool isProtected( ETrue );
+    TInt error = PassesDrmCheckL( iDataBuffer, isProtected );
+    if ( !isProtected && error == KErrNone )
+        {
+        delete iImageOperation;
+        iImageOperation = NULL;
+
+        // First delete a previous thumbnail, if any
+        iImageManager->RemoveImage( *iContact, *iFieldType );
+
+        // Then set new image
+        iImageOperation = iImageManager->SetImageAsyncL
+            ( *iContact, *iFieldType, *this, *iDataBuffer );
+        }
+    else
+        {
+        // Notify observer asynchronously
+        iError = error;
+        iState = EDrmProtected;
+        IssueRequest();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::AssignImageFileNameL
+// Assigns image file name, does not assign caller object text
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::AssignImageFileNameL()
+    {
+    const MVPbkFieldType* codFieldType = NULL;
+    if ( FeatureManager::FeatureSupported( KFeatureIdCallImagetext ) )
+        {
+        codFieldType = iContactManager.FieldTypes().Find
+            ( R_VPBK_FIELD_TYPE_CALLEROBJIMG );
+        }
+
+    if ( codFieldType )
+        {
+        CPbk2PresentationContact* contact = CPbk2PresentationContact::NewL
+            ( *iContact, iFieldProperties );
+        CleanupStack::PushL( contact );
+
+        // Check is the field already used
+        TInt fieldIndex = KErrNotFound;
+        TInt result =
+            Pbk2AssignValidateField::ValidateFieldTypeUsageInContactL
+                ( *contact, *codFieldType, iContactManager.FsSession(),
+                  fieldIndex );
+
+        MVPbkStoreContactField* field = NULL;
+        if ( result == KErrAlreadyExists || result == KErrPathNotFound )
+            {
+            // If the contact has the field, then the field should be updated
+            __ASSERT_DEBUG( fieldIndex > KErrNotFound,
+                Panic( EInvalidFieldIndex ) );
+            field = &iContact->Fields().FieldAt( fieldIndex );
+            if ( field )
+                {
+                InsertTextDataL( *field, *iDataBuffer );
+                }
+            }
+        else
+            {
+            field = iContact->CreateFieldLC( *codFieldType );
+            InsertTextDataL( *field, *iDataBuffer );
+            CleanupStack::Pop(); // field
+            iIndex = iContact->AddFieldL( field ); // takes ownership
+            }
+
+        CleanupStack::PopAndDestroy( contact );
+        }
+
+    iState = EStopping;
+    IssueRequest();
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::InsertTextDataL
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::InsertTextDataL
+        ( MVPbkStoreContactField& aField, const HBufC& aDataBuffer ) const
+    {
+    MVPbkContactFieldTextData::Cast( aField.FieldData() ).
+        SetTextL( aDataBuffer );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ContactImageAssigner::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2ContactImageAssigner::IssueRequest()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    SetActive();
+    }
+
+// End of File