phonebookengines/VirtualPhonebook/VPbkCntModel/src/CDefaultAttributeOperation.cpp
changeset 0 e686773b3f54
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2004-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  The virtual phonebook default attribute operation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CDefaultAttributeOperation.h"
       
    20 #include "CContactStore.h"
       
    21 #include "TContactField.h"
       
    22 #include "CContact.h"
       
    23 #include "VPbkCntModelUid.h"
       
    24 #include "CContactFilter.h"
       
    25 
       
    26 #include <CVPbkDefaultAttribute.h>
       
    27 
       
    28 #include <MVPbkStoreContactField.h>
       
    29 #include <MVPbkContactAttributeManager.h>
       
    30 #include <MVPbkContactAttribute.h>
       
    31 #include <CVPbkAsyncOperation.h>
       
    32 #include <CVPbkAsyncCallback.h>
       
    33 #include <CVPbkContactManager.h>
       
    34 #include <MVPbkContactStoreList.h>
       
    35 #include <VPbkStoreUriLiterals.h>
       
    36 #include <TVPbkContactStoreUriPtr.h>
       
    37 #include <MVPbkContactFindObserver.h>
       
    38 
       
    39 // From Contacts Model
       
    40 #include <cntitem.h>
       
    41 
       
    42 
       
    43 namespace VPbkCntModel {
       
    44 
       
    45 namespace {
       
    46 
       
    47 	struct TFieldTypePair
       
    48 	    {
       
    49 	    TInt iProperty;
       
    50 	    TInt iUid;
       
    51 	    };
       
    52 
       
    53 	static const TFieldTypePair fieldTypeMap[] =
       
    54 	    {
       
    55 	    /// default phone number field type
       
    56 	    {EVPbkDefaultTypePhoneNumber, KIntVPbkDefaultFieldPref},
       
    57 	    /// default video number field type
       
    58 	    {EVPbkDefaultTypeVideoNumber, KIntVPbkDefaultFieldVideo},
       
    59 	    /// default sms field type
       
    60 	    {EVPbkDefaultTypeSms, KIntVPbkDefaultFieldSms},
       
    61 	    /// default mms field type
       
    62 	    {EVPbkDefaultTypeMms, KIntVPbkDefaultFieldMms},
       
    63 	    /// default email field type
       
    64 	    {EVPbkDefaultTypeEmail, KIntVPbkDefaultFieldPref},
       
    65 	    /// default email over sms field type
       
    66 	    {EVPbkDefaultTypeEmailOverSms, KIntVPbkDefaultFieldEmailOverSms},
       
    67 	    /// default poc field type
       
    68 	    {EVPbkDefaultTypePOC, KIntVPbkDefaultFieldPoc},
       
    69 	    /// default voip field type
       
    70 	    {EVPbkDefaultTypeVoIP, KIntVPbkDefaultFieldVoip},
       
    71         /// default chat field type
       
    72         {EVPbkDefaultTypeChat, KIntVPbkDefaultFieldChat},
       
    73         /// default url field type
       
    74         {EVPbkDefaultTypeOpenLink, KIntVPbkDefaultFieldOpenLink},
       
    75 	    
       
    76 	    // Always the last one
       
    77 	    {EVPbkLastDefaultType, 0}
       
    78 	    };
       
    79 
       
    80 	TFieldType FindFieldTypeForProperty(TVPbkDefaultType aProperty)
       
    81 	    {
       
    82 	    for (TInt i = 0; fieldTypeMap[i].iProperty != EVPbkLastDefaultType;
       
    83 	         ++i)
       
    84 	        {
       
    85 	        if (aProperty == fieldTypeMap[i].iProperty)
       
    86 	            {
       
    87 	            return TFieldType::Uid(fieldTypeMap[i].iUid);
       
    88 	            }
       
    89 
       
    90 	        }
       
    91 	    return KNullUid;
       
    92 	    }	    
       
    93 } // unnamed namespace
       
    94 
       
    95 CDefaultAttributeOperation::CDefaultAttributeOperation(
       
    96         TOperationMode aOperationMode,
       
    97         CContactStore& aContactStore,
       
    98         MVPbkStoreContactField& aField,
       
    99         MVPbkSetAttributeObserver& aObserver) :
       
   100     iOperationMode(aOperationMode),
       
   101     iContactStore(aContactStore),
       
   102     iField(&aField),
       
   103     iSetObserver(&aObserver)
       
   104     {
       
   105     }
       
   106 
       
   107 CDefaultAttributeOperation::CDefaultAttributeOperation(
       
   108         TOperationMode aOperationMode,
       
   109         CContactStore& aContactStore,
       
   110         MVPbkContactFindObserver& aObserver) :
       
   111     iOperationMode(aOperationMode),
       
   112     iContactStore(aContactStore),
       
   113     iFindObserver(&aObserver)
       
   114     {
       
   115     }
       
   116 
       
   117 void CDefaultAttributeOperation::ConstructL(
       
   118         const CVPbkDefaultAttribute& aAttribute)
       
   119     {
       
   120     iAsyncOperation = new(ELeave) VPbkEngUtils::CVPbkAsyncOperation;
       
   121     iAttribute = static_cast<CVPbkDefaultAttribute*>(aAttribute.CloneLC());
       
   122     CleanupStack::Pop();
       
   123     }
       
   124 
       
   125 CDefaultAttributeOperation* CDefaultAttributeOperation::NewSetLC(
       
   126         CContactStore& aContactStore,
       
   127         MVPbkStoreContactField& aField,
       
   128         const CVPbkDefaultAttribute& aAttribute,
       
   129         MVPbkSetAttributeObserver& aObserver)
       
   130     {
       
   131     CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
       
   132             ESet, aContactStore, aField, aObserver);
       
   133     CleanupStack::PushL(self);
       
   134     self->ConstructL(aAttribute);
       
   135     return self;
       
   136     }
       
   137 
       
   138 CDefaultAttributeOperation* CDefaultAttributeOperation::NewRemoveLC(
       
   139         CContactStore& aContactStore,
       
   140         MVPbkStoreContactField& aField,
       
   141         const CVPbkDefaultAttribute& aAttribute,
       
   142         MVPbkSetAttributeObserver& aObserver)
       
   143     {
       
   144     CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
       
   145             ERemove, aContactStore, aField, aObserver);
       
   146     CleanupStack::PushL(self);
       
   147     self->ConstructL(aAttribute);
       
   148     return self;
       
   149     }
       
   150 
       
   151 CDefaultAttributeOperation* CDefaultAttributeOperation::NewListLC(
       
   152         CContactStore& aContactStore,
       
   153         const CVPbkDefaultAttribute& aAttribute,
       
   154         MVPbkContactFindObserver& aObserver)
       
   155     {
       
   156     CDefaultAttributeOperation* self = new(ELeave) CDefaultAttributeOperation(
       
   157             EList, aContactStore, aObserver);
       
   158     CleanupStack::PushL(self);
       
   159     self->ConstructL(aAttribute);
       
   160     return self;
       
   161     }
       
   162 
       
   163 CDefaultAttributeOperation::~CDefaultAttributeOperation()
       
   164     {
       
   165     delete iContactFilter;
       
   166     delete iAsyncOperation;
       
   167     delete iAttribute;
       
   168     }
       
   169 
       
   170 void CDefaultAttributeOperation::StartL()
       
   171     {
       
   172     if (iOperationMode == EList)
       
   173         {
       
   174         VPbkEngUtils::MAsyncCallback* callback =
       
   175             VPbkEngUtils::CreateAsyncCallbackLC(
       
   176                 *this,
       
   177                 &CDefaultAttributeOperation::DoListOperationL,
       
   178                 &CDefaultAttributeOperation::ListOperationError,
       
   179                 *iFindObserver);
       
   180         iAsyncOperation->CallbackL(callback);
       
   181         CleanupStack::Pop(callback);
       
   182         }
       
   183     else
       
   184         {
       
   185         VPbkEngUtils::MAsyncCallback* callback =
       
   186             VPbkEngUtils::CreateAsyncCallbackLC(
       
   187                 *this,
       
   188                 &CDefaultAttributeOperation::DoSetOperationL,
       
   189                 &CDefaultAttributeOperation::SetOperationError,
       
   190                 *iSetObserver);
       
   191         iAsyncOperation->CallbackL(callback);
       
   192         CleanupStack::Pop(callback);
       
   193         }
       
   194     }
       
   195 
       
   196 void CDefaultAttributeOperation::DoListOperationL(
       
   197         MVPbkContactFindObserver& /*aObserver*/)
       
   198     {
       
   199     delete iContactFilter;
       
   200     iContactFilter = NULL;
       
   201     
       
   202     iContactFilter = CContactFilter::NewL(*this, iContactStore);
       
   203     iContactFilter->StartL();
       
   204     }
       
   205 
       
   206 void CDefaultAttributeOperation::ListOperationError(
       
   207         MVPbkContactFindObserver& aObserver,
       
   208         TInt aError)
       
   209     {
       
   210     aObserver.FindFailed(aError);
       
   211     }
       
   212 
       
   213 void CDefaultAttributeOperation::DoSetOperationL(
       
   214         MVPbkSetAttributeObserver& aObserver)
       
   215     {
       
   216     if (&iField->ContactStore() == &iContactStore)
       
   217         {
       
   218         CContact& contact = static_cast<CContact&>(iField->ParentContact());
       
   219         TContactField& field = static_cast<TContactField&>(*iField);
       
   220 
       
   221         if (iOperationMode == ESet)
       
   222             {
       
   223 	        TFieldType fieldType = FindFieldTypeForProperty(iAttribute->DefaultType());
       
   224 	        if (fieldType == KNullUid)
       
   225 		        {
       
   226 		        User::Leave(KErrNotSupported);
       
   227 		        }
       
   228 
       
   229 		    field.NativeField()->AddFieldTypeL(fieldType);
       
   230             }
       
   231         else if (iOperationMode == ERemove)
       
   232             {
       
   233             if (iAttribute->DefaultType() == CVPbkDefaultAttribute::KDefaultTypeNotDefined)
       
   234                 {
       
   235                 // If field contains any default type, remove it
       
   236                 for (TInt n = 0;
       
   237                 	fieldTypeMap[n].iProperty != EVPbkLastDefaultType;
       
   238                 	++n)
       
   239                 	{
       
   240 					TFieldType fieldType = TFieldType::Uid(fieldTypeMap[n].iUid);
       
   241                     if (field.NativeField()->ContentType().ContainsFieldType(fieldType))
       
   242                         {
       
   243                         field.NativeField()->RemoveFieldType(fieldType);
       
   244                         }
       
   245                 	}
       
   246                 }
       
   247             else
       
   248                 {
       
   249 		        TFieldType fieldType = FindFieldTypeForProperty(iAttribute->DefaultType());
       
   250 		        if (fieldType == KNullUid)
       
   251 			        {
       
   252 			        User::Leave(KErrNotSupported);
       
   253 			        }
       
   254 
       
   255                 // Remove specified type from field
       
   256                 field.NativeField()->RemoveFieldType(fieldType);
       
   257                 }
       
   258             }
       
   259         }
       
   260 
       
   261     aObserver.AttributeOperationComplete(*this);
       
   262     }
       
   263 
       
   264 void CDefaultAttributeOperation::SetOperationError(
       
   265         MVPbkSetAttributeObserver& aObserver,
       
   266         TInt aError)
       
   267     {
       
   268     aObserver.AttributeOperationFailed(*this, aError);
       
   269     }
       
   270 
       
   271 void CDefaultAttributeOperation::Cancel()
       
   272     {
       
   273     iAsyncOperation->Purge();
       
   274     }
       
   275 
       
   276 TBool CDefaultAttributeOperation::IsIncluded(MVPbkStoreContact& aContact)
       
   277 	{
       
   278 	TBool result(EFalse);
       
   279 	CContact& contact = static_cast<CContact&>(aContact);
       
   280 	CContactItemFieldSet& fields = contact.NativeContact()->CardFields();
       
   281     const TInt count = fields.Count();
       
   282 
       
   283     for (TInt i = 0; i < count && !result; ++i)
       
   284         {
       
   285 		if (iAttribute->DefaultType() == CVPbkDefaultAttribute::KDefaultTypeNotDefined)
       
   286 			{
       
   287 			for (TInt n = 0;
       
   288             	fieldTypeMap[n].iProperty != EVPbkLastDefaultType;
       
   289             	++n)
       
   290             	{
       
   291 				TFieldType fieldType = TFieldType::Uid(fieldTypeMap[n].iUid);
       
   292                 if (fields[i].ContentType().ContainsFieldType(fieldType))
       
   293                     {
       
   294                     result = ETrue;
       
   295                     break;
       
   296                     }
       
   297             	}
       
   298 			}
       
   299 		else
       
   300 			{
       
   301 			TFieldType fieldType = FindFieldTypeForProperty(iAttribute->DefaultType());
       
   302 	        if (fields[i].ContentType().ContainsFieldType(fieldType))
       
   303 	            {
       
   304 	            result = ETrue;
       
   305 	            break;
       
   306 	        	}
       
   307 			}
       
   308         }
       
   309     return result;
       
   310 	}
       
   311 
       
   312 void CDefaultAttributeOperation::FilteringDoneL(MVPbkContactLinkArray* aLinkArray)
       
   313 	{
       
   314 	iFindObserver->FindCompleteL(aLinkArray);
       
   315 	}
       
   316 
       
   317 void CDefaultAttributeOperation::FilteringError(TInt aError)
       
   318 	{
       
   319 	iFindObserver->FindFailed(aError);
       
   320 	}
       
   321 
       
   322 } // namespace VPbkCntModel
       
   323 
       
   324 // End of File