diff -r 000000000000 -r e686773b3f54 phonebookengines/VirtualPhonebook/VPbkCntModel/src/CDefaultAttributeOperation.cpp --- /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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// From Contacts Model +#include + + +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(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(iField->ParentContact()); + TContactField& field = static_cast(*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(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