--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkCntModel/src/CDefaultAttributeOperation.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,324 @@
+/*
+* Copyright (c) 2004-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: The virtual phonebook default attribute operation
+*
+*/
+
+
+#include "CDefaultAttributeOperation.h"
+#include "CContactStore.h"
+#include "TContactField.h"
+#include "CContact.h"
+#include "VPbkCntModelUid.h"
+#include "CContactFilter.h"
+
+#include <CVPbkDefaultAttribute.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 {
+
+namespace {
+
+ struct TFieldTypePair
+ {
+ TInt iProperty;
+ TInt iUid;
+ };
+
+ static const TFieldTypePair fieldTypeMap[] =
+ {
+ /// default phone number field type
+ {EVPbkDefaultTypePhoneNumber, KIntVPbkDefaultFieldPref},
+ /// default video number field type
+ {EVPbkDefaultTypeVideoNumber, KIntVPbkDefaultFieldVideo},
+ /// default sms field type
+ {EVPbkDefaultTypeSms, KIntVPbkDefaultFieldSms},
+ /// default mms field type
+ {EVPbkDefaultTypeMms, KIntVPbkDefaultFieldMms},
+ /// default email field type
+ {EVPbkDefaultTypeEmail, KIntVPbkDefaultFieldPref},
+ /// default email over sms field type
+ {EVPbkDefaultTypeEmailOverSms, KIntVPbkDefaultFieldEmailOverSms},
+ /// default poc field type
+ {EVPbkDefaultTypePOC, KIntVPbkDefaultFieldPoc},
+ /// default voip field type
+ {EVPbkDefaultTypeVoIP, KIntVPbkDefaultFieldVoip},
+ /// default chat field type
+ {EVPbkDefaultTypeChat, KIntVPbkDefaultFieldChat},
+ /// default url field type
+ {EVPbkDefaultTypeOpenLink, KIntVPbkDefaultFieldOpenLink},
+
+ // Always the last one
+ {EVPbkLastDefaultType, 0}
+ };
+
+ TFieldType FindFieldTypeForProperty(TVPbkDefaultType aProperty)
+ {
+ for (TInt i = 0; fieldTypeMap[i].iProperty != EVPbkLastDefaultType;
+ ++i)
+ {
+ if (aProperty == fieldTypeMap[i].iProperty)
+ {
+ return TFieldType::Uid(fieldTypeMap[i].iUid);
+ }
+
+ }
+ return KNullUid;
+ }
+} // unnamed namespace
+
+CDefaultAttributeOperation::CDefaultAttributeOperation(
+ TOperationMode aOperationMode,
+ CContactStore& aContactStore,
+ MVPbkStoreContactField& aField,
+ MVPbkSetAttributeObserver& aObserver) :
+ iOperationMode(aOperationMode),
+ iContactStore(aContactStore),
+ iField(&aField),
+ iSetObserver(&aObserver)
+ {
+ }
+
+CDefaultAttributeOperation::CDefaultAttributeOperation(
+ TOperationMode aOperationMode,
+ CContactStore& aContactStore,
+ MVPbkContactFindObserver& aObserver) :
+ iOperationMode(aOperationMode),
+ iContactStore(aContactStore),
+ iFindObserver(&aObserver)
+ {
+ }
+
+void CDefaultAttributeOperation::ConstructL(
+ const CVPbkDefaultAttribute& aAttribute)
+ {
+ iAsyncOperation = new(ELeave) VPbkEngUtils::CVPbkAsyncOperation;
+ iAttribute = static_cast<CVPbkDefaultAttribute*>(aAttribute.CloneLC());
+ CleanupStack::Pop();
+ }
+
+CDefaultAttributeOperation* CDefaultAttributeOperation::NewSetLC(
+ CContactStore& aContactStore,
+ MVPbkStoreContactField& aField,
+ const CVPbkDefaultAttribute& aAttribute,
+ MVPbkSetAttributeObserver& aObserver)
+ {
+ CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
+ ESet, aContactStore, aField, aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL(aAttribute);
+ return self;
+ }
+
+CDefaultAttributeOperation* CDefaultAttributeOperation::NewRemoveLC(
+ CContactStore& aContactStore,
+ MVPbkStoreContactField& aField,
+ const CVPbkDefaultAttribute& aAttribute,
+ MVPbkSetAttributeObserver& aObserver)
+ {
+ CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
+ ERemove, aContactStore, aField, aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL(aAttribute);
+ return self;
+ }
+
+CDefaultAttributeOperation* CDefaultAttributeOperation::NewListLC(
+ CContactStore& aContactStore,
+ const CVPbkDefaultAttribute& aAttribute,
+ MVPbkContactFindObserver& aObserver)
+ {
+ CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
+ EList, aContactStore, aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL(aAttribute);
+ return self;
+ }
+
+CDefaultAttributeOperation::~CDefaultAttributeOperation()
+ {
+ delete iContactFilter;
+ delete iAsyncOperation;
+ delete iAttribute;
+ }
+
+void CDefaultAttributeOperation::StartL()
+ {
+ if (iOperationMode == EList)
+ {
+ VPbkEngUtils::MAsyncCallback* callback =
+ VPbkEngUtils::CreateAsyncCallbackLC(
+ *this,
+ &CDefaultAttributeOperation::DoListOperationL,
+ &CDefaultAttributeOperation::ListOperationError,
+ *iFindObserver);
+ iAsyncOperation->CallbackL(callback);
+ CleanupStack::Pop(callback);
+ }
+ else
+ {
+ VPbkEngUtils::MAsyncCallback* callback =
+ VPbkEngUtils::CreateAsyncCallbackLC(
+ *this,
+ &CDefaultAttributeOperation::DoSetOperationL,
+ &CDefaultAttributeOperation::SetOperationError,
+ *iSetObserver);
+ iAsyncOperation->CallbackL(callback);
+ CleanupStack::Pop(callback);
+ }
+ }
+
+void CDefaultAttributeOperation::DoListOperationL(
+ MVPbkContactFindObserver& /*aObserver*/)
+ {
+ delete iContactFilter;
+ iContactFilter = NULL;
+
+ iContactFilter = CContactFilter::NewL(*this, iContactStore);
+ iContactFilter->StartL();
+ }
+
+void CDefaultAttributeOperation::ListOperationError(
+ MVPbkContactFindObserver& aObserver,
+ TInt aError)
+ {
+ aObserver.FindFailed(aError);
+ }
+
+void CDefaultAttributeOperation::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 = FindFieldTypeForProperty(iAttribute->DefaultType());
+ if (fieldType == KNullUid)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ field.NativeField()->AddFieldTypeL(fieldType);
+ }
+ else if (iOperationMode == ERemove)
+ {
+ if (iAttribute->DefaultType() == CVPbkDefaultAttribute::KDefaultTypeNotDefined)
+ {
+ // If field contains any default type, remove it
+ for (TInt n = 0;
+ fieldTypeMap[n].iProperty != EVPbkLastDefaultType;
+ ++n)
+ {
+ TFieldType fieldType = TFieldType::Uid(fieldTypeMap[n].iUid);
+ if (field.NativeField()->ContentType().ContainsFieldType(fieldType))
+ {
+ field.NativeField()->RemoveFieldType(fieldType);
+ }
+ }
+ }
+ else
+ {
+ TFieldType fieldType = FindFieldTypeForProperty(iAttribute->DefaultType());
+ if (fieldType == KNullUid)
+ {
+ User::Leave(KErrNotSupported);
+ }
+
+ // Remove specified type from field
+ field.NativeField()->RemoveFieldType(fieldType);
+ }
+ }
+ }
+
+ aObserver.AttributeOperationComplete(*this);
+ }
+
+void CDefaultAttributeOperation::SetOperationError(
+ MVPbkSetAttributeObserver& aObserver,
+ TInt aError)
+ {
+ aObserver.AttributeOperationFailed(*this, aError);
+ }
+
+void CDefaultAttributeOperation::Cancel()
+ {
+ iAsyncOperation->Purge();
+ }
+
+TBool CDefaultAttributeOperation::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)
+ {
+ if (iAttribute->DefaultType() == CVPbkDefaultAttribute::KDefaultTypeNotDefined)
+ {
+ for (TInt n = 0;
+ fieldTypeMap[n].iProperty != EVPbkLastDefaultType;
+ ++n)
+ {
+ TFieldType fieldType = TFieldType::Uid(fieldTypeMap[n].iUid);
+ if (fields[i].ContentType().ContainsFieldType(fieldType))
+ {
+ result = ETrue;
+ break;
+ }
+ }
+ }
+ else
+ {
+ TFieldType fieldType = FindFieldTypeForProperty(iAttribute->DefaultType());
+ if (fields[i].ContentType().ContainsFieldType(fieldType))
+ {
+ result = ETrue;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+void CDefaultAttributeOperation::FilteringDoneL(MVPbkContactLinkArray* aLinkArray)
+ {
+ iFindObserver->FindCompleteL(aLinkArray);
+ }
+
+void CDefaultAttributeOperation::FilteringError(TInt aError)
+ {
+ iFindObserver->FindFailed(aError);
+ }
+
+} // namespace VPbkCntModel
+
+// End of File