phonebookengines/VirtualPhonebook/VPbkCntModel/src/CSdndVoiceTagAttributeOperation.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CSdndVoiceTagAttributeOperation.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2002-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:  Virtual phonebook speaker dependent voice dialing
+*
+*/
+
+
+
+#include "csdndvoicetagattributeoperation.h"
+#include "ccontactstore.h"
+#include "tcontactfield.h"
+#include "ccontact.h"
+#include "ccontactfilter.h"
+
+#include <cvpbkvoicetagattribute.h>
+
+#include <mvpbkstorecontactfield.h>
+#include <mvpbkcontactattributemanager.h>
+#include <mvpbkcontactattribute.h>
+#include <cvpbkasyncoperation.h>
+#include <cvpbkasynccallback.h>
+#include <cvpbkcontactmanager.h>
+#include <mvpbkcontactstorelist.h>
+#include <vpbkstoreuriliterals.h>
+#include <tvpbkcontactstoreuriptr.h>
+#include <mvpbkcontactfindobserver.h>
+
+// From Contacts Model
+#include <cntitem.h>
+
+namespace VPbkCntModel {
+
+#define KVoiceTagValue      KUidContactsVoiceDialFieldValue
+
+CSdndVoiceTagAttributeOperation::CSdndVoiceTagAttributeOperation(
+        TOperationMode aOperationMode,
+        CContactStore& aContactStore,
+        MVPbkStoreContactField& aField,
+        MVPbkSetAttributeObserver& aObserver ) :
+    iOperationMode( aOperationMode ),
+    iContactStore( aContactStore ),
+    iField( &aField ),
+    iSetObserver( &aObserver )
+    {
+    }
+
+CSdndVoiceTagAttributeOperation::CSdndVoiceTagAttributeOperation(
+        TOperationMode aOperationMode,
+        CContactStore& aContactStore,
+        MVPbkContactFindObserver& aObserver ) :
+    iOperationMode( aOperationMode ),
+    iContactStore( aContactStore ),
+    iFindObserver( &aObserver )
+    {
+    }
+
+void CSdndVoiceTagAttributeOperation::ConstructL(
+        const CVPbkVoiceTagAttribute& aAttribute)
+    {
+    iAsyncOperation = new ( ELeave ) VPbkEngUtils::CVPbkAsyncOperation;
+    iAttribute = static_cast<CVPbkVoiceTagAttribute*>(aAttribute.CloneLC() );
+    CleanupStack::Pop();
+    }
+
+CSdndVoiceTagAttributeOperation* CSdndVoiceTagAttributeOperation::NewSetLC(
+        CContactStore& aContactStore,
+        MVPbkStoreContactField& aField,
+        const CVPbkVoiceTagAttribute& aAttribute,
+        MVPbkSetAttributeObserver& aObserver )
+    {
+    CSdndVoiceTagAttributeOperation* self = new( ELeave ) 
+    CSdndVoiceTagAttributeOperation( ESet, aContactStore, aField, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAttribute );
+    return self;
+    }
+
+CSdndVoiceTagAttributeOperation* CSdndVoiceTagAttributeOperation::NewRemoveLC(
+        CContactStore& aContactStore,
+        MVPbkStoreContactField& aField,
+        const CVPbkVoiceTagAttribute& aAttribute,
+        MVPbkSetAttributeObserver& aObserver )
+    {
+    CSdndVoiceTagAttributeOperation* self = new ( ELeave ) 
+            CSdndVoiceTagAttributeOperation( ERemove, aContactStore, 
+                                             aField, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAttribute );
+    return self;
+    }
+
+CSdndVoiceTagAttributeOperation* CSdndVoiceTagAttributeOperation::NewListLC(
+        CContactStore& aContactStore,
+        const CVPbkVoiceTagAttribute& aAttribute,
+        MVPbkContactFindObserver& aObserver )
+    {
+    CSdndVoiceTagAttributeOperation* self = new ( ELeave ) 
+        CSdndVoiceTagAttributeOperation( EList, aContactStore, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL( aAttribute );
+    return self;
+    }
+
+CSdndVoiceTagAttributeOperation::~CSdndVoiceTagAttributeOperation()
+    {
+    delete iContactFilter;
+    delete iAsyncOperation;
+    delete iAttribute;
+    }
+
+void CSdndVoiceTagAttributeOperation::StartL()
+    {
+    if ( iOperationMode == EList )
+        {
+        VPbkEngUtils::MAsyncCallback* callback =
+            VPbkEngUtils::CreateAsyncCallbackLC(
+                *this,
+                &CSdndVoiceTagAttributeOperation::DoListOperationL,
+                &CSdndVoiceTagAttributeOperation::ListOperationError,
+                *iFindObserver);
+        iAsyncOperation->CallbackL( callback );
+        CleanupStack::Pop( callback );
+        }
+    else
+        {
+        VPbkEngUtils::MAsyncCallback* callback =
+            VPbkEngUtils::CreateAsyncCallbackLC(
+                *this,
+                &CSdndVoiceTagAttributeOperation::DoSetOperationL,
+                &CSdndVoiceTagAttributeOperation::SetOperationError,
+                *iSetObserver );
+        iAsyncOperation->CallbackL( callback );
+        CleanupStack::Pop( callback );
+        }
+    }
+
+void CSdndVoiceTagAttributeOperation::DoListOperationL(
+        MVPbkContactFindObserver& /*aObserver*/)
+    {
+    delete iContactFilter;
+    iContactFilter = NULL;
+    
+    iContactFilter = CContactFilter::NewL( *this, iContactStore );
+    iContactFilter->StartL();
+    }
+
+void CSdndVoiceTagAttributeOperation::ListOperationError(
+        MVPbkContactFindObserver& aObserver,
+        TInt aError )
+    {
+    aObserver.FindFailed( aError );
+    }
+
+void CSdndVoiceTagAttributeOperation::DoSetOperationL(
+        MVPbkSetAttributeObserver& aObserver)
+    {
+    if ( &iField->ContactStore() == &iContactStore )
+        {
+        CContact& contact = static_cast<CContact&>(iField->ParentContact() );
+        TContactField& field = static_cast<TContactField&>( *iField );
+
+        if (iOperationMode == ESet )
+            {
+	        TFieldType fieldType = TFieldType::Uid( KVoiceTagValue );
+	        if ( fieldType == KNullUid )
+		        {
+		        User::Leave( KErrNotSupported );
+		        }
+            // Add specified type to field
+		    field.NativeField()->AddFieldTypeL( fieldType) ;
+            }
+        else if ( iOperationMode == ERemove )
+            {
+	        TFieldType fieldType = TFieldType::Uid( KVoiceTagValue );
+	        if ( fieldType == KNullUid )
+		        {
+		        User::Leave( KErrNotSupported );
+		        }
+
+            // Remove specified type from field
+            field.NativeField()->RemoveFieldType(fieldType);
+            }
+        }
+
+    aObserver.AttributeOperationComplete( *this );
+    }
+
+void CSdndVoiceTagAttributeOperation::SetOperationError(
+        MVPbkSetAttributeObserver& aObserver,
+        TInt aError )
+    {
+    aObserver.AttributeOperationFailed( *this, aError );
+    }
+
+void CSdndVoiceTagAttributeOperation::Cancel()
+    {
+    iAsyncOperation->Purge();
+    }
+
+TBool CSdndVoiceTagAttributeOperation::IsIncluded( MVPbkStoreContact& aContact )
+	{
+	TBool result( EFalse );
+	CContact& contact = static_cast<CContact&>( aContact );
+	CContactItemFieldSet& fields = contact.NativeContact()->CardFields();
+    const TInt count = fields.Count();
+
+    for ( TInt i = 0; i < count && !result; ++i )
+        {
+		TFieldType fieldType = TFieldType::Uid(KVoiceTagValue );
+        if ( fields[i].ContentType().ContainsFieldType(fieldType) )
+            {
+            result = ETrue;
+            break;
+        	}
+        }
+    return result;
+	}
+
+void CSdndVoiceTagAttributeOperation::FilteringDoneL( MVPbkContactLinkArray* 
+                                                        aLinkArray )
+	{
+	iFindObserver->FindCompleteL( aLinkArray );
+	}
+
+void CSdndVoiceTagAttributeOperation::FilteringError( TInt aError )
+	{
+	iFindObserver->FindFailed(aError);
+	}
+
+} // namespace VPbkCntModel
+
+// End of File