phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactFieldIterator.cpp
branchRCL_3
changeset 20 f4a778e096c2
equal deleted inserted replaced
19:5b6f26637ad3 20:f4a778e096c2
       
     1 /*
       
     2 * Copyright (c) 2005-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:  Virtual Phonebook contact field iterator interface.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDES
       
    20 #include "CVPbkContactFieldIterator.h"
       
    21 #include <MVPbkStoreContactField.h>
       
    22 #include <MVPbkStoreContactFieldCollection.h>
       
    23 #include <MVPbkFieldType.h>
       
    24 
       
    25 // -----------------------------------------------------------------------------
       
    26 // CFielfByTypeIterator definition
       
    27 // -----------------------------------------------------------------------------
       
    28 //
       
    29 template<typename TypeOfCollection, typename TypeOfField>
       
    30 NONSHARABLE_CLASS( CFieldByTypeIterator ): public CBase
       
    31     {
       
    32 public:
       
    33     CFieldByTypeIterator(
       
    34         const MVPbkFieldType& aFieldType,
       
    35         TypeOfCollection& aFields );
       
    36 
       
    37     TypeOfField* Next();
       
    38     TBool HasNext();
       
    39 private:
       
    40     const MVPbkFieldType& iFieldType;
       
    41     TypeOfCollection& iFields;
       
    42     TInt iIteratorIndex;
       
    43     };
       
    44 
       
    45 // -----------------------------------------------------------------------------
       
    46 // CFieldByTypeIterator<TypeOfCollection, TypeOfField>::CFieldByTypeIterator
       
    47 // -----------------------------------------------------------------------------
       
    48 //
       
    49 template<typename TypeOfCollection, typename TypeOfField>
       
    50 CFieldByTypeIterator<TypeOfCollection, TypeOfField>::CFieldByTypeIterator(
       
    51     const MVPbkFieldType& aFieldType, TypeOfCollection& aFields)
       
    52     :   iFieldType( aFieldType ),
       
    53         iFields( aFields )
       
    54     {
       
    55     }
       
    56 
       
    57 // -----------------------------------------------------------------------------
       
    58 // CFieldByTypeIterator<TypeOfCollection, TypeOfField>::Next
       
    59 // -----------------------------------------------------------------------------
       
    60 //
       
    61 template<typename TypeOfCollection, typename TypeOfField>
       
    62 TypeOfField* CFieldByTypeIterator<TypeOfCollection, TypeOfField>::Next()
       
    63     {
       
    64     TypeOfField* nextField = NULL;
       
    65     // advance to next field and return it, otherwise NULL
       
    66     const TInt fieldCount = iFields.FieldCount();
       
    67     for (TInt i = iIteratorIndex; i < fieldCount; ++i)
       
    68         {
       
    69         TypeOfField& field = iFields.FieldAt(i);
       
    70         const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
    71         if ( fieldType && fieldType->IsSame( iFieldType ) )
       
    72             {
       
    73             // next field found
       
    74             nextField = &field;
       
    75             iIteratorIndex = i+1;
       
    76             break;
       
    77             }
       
    78         }
       
    79 
       
    80     return nextField;
       
    81     }
       
    82 
       
    83 // -----------------------------------------------------------------------------
       
    84 // CFieldByTypeIterator<TypeOfCollection, TypeOfField>::HasNext
       
    85 // -----------------------------------------------------------------------------
       
    86 //
       
    87 template<typename TypeOfCollection, typename TypeOfField>
       
    88 TBool CFieldByTypeIterator<TypeOfCollection, TypeOfField>::HasNext()
       
    89     {
       
    90     TBool ret = EFalse;
       
    91     // detect whether there is just a field in the remaining fields
       
    92     const TInt fieldCount = iFields.FieldCount();
       
    93     for (TInt i = iIteratorIndex; i < fieldCount; ++i)
       
    94         {
       
    95         TypeOfField& field = iFields.FieldAt(i);
       
    96         const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
    97         if ( fieldType && fieldType->IsSame( iFieldType ) )
       
    98             {
       
    99             // field type matches
       
   100             ret = ETrue;
       
   101             break;
       
   102             }
       
   103         }
       
   104     return ret;
       
   105     }
       
   106 
       
   107 // -----------------------------------------------------------------------------
       
   108 // CFieldByTypeListIterator definition
       
   109 // -----------------------------------------------------------------------------
       
   110 //
       
   111 template<typename TypeOfCollection, typename TypeOfField>
       
   112 NONSHARABLE_CLASS( CFieldByTypeListIterator ): public CBase
       
   113     {
       
   114 public:
       
   115     CFieldByTypeListIterator(
       
   116         const MVPbkFieldTypeList& aFieldTypeList,
       
   117         TypeOfCollection& aFields );
       
   118 
       
   119     TypeOfField* Next();
       
   120     TBool HasNext();
       
   121 private:
       
   122     const MVPbkFieldTypeList& iFieldTypeList;
       
   123     TypeOfCollection& iFields;
       
   124     TInt iIteratorIndex;
       
   125     };
       
   126 
       
   127 // -----------------------------------------------------------------------------
       
   128 // CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::
       
   129 // CFieldByTypeListIterator
       
   130 // -----------------------------------------------------------------------------
       
   131 //
       
   132 template<typename TypeOfCollection, typename TypeOfField>
       
   133 CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::
       
   134 CFieldByTypeListIterator(
       
   135         const MVPbkFieldTypeList& aFieldTypeList,
       
   136         TypeOfCollection& aFields)
       
   137     :   iFieldTypeList( aFieldTypeList ),
       
   138         iFields( aFields )
       
   139     {
       
   140     }
       
   141 
       
   142 // -----------------------------------------------------------------------------
       
   143 // CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::Next
       
   144 // -----------------------------------------------------------------------------
       
   145 //
       
   146 template<typename TypeOfCollection, typename TypeOfField>
       
   147 TypeOfField* CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::Next()
       
   148     {
       
   149     TypeOfField* nextField = NULL;
       
   150     // advance to next field and return it, otherwise NULL
       
   151     const TInt fieldCount = iFields.FieldCount();
       
   152     for (TInt i = iIteratorIndex; i < fieldCount; ++i)
       
   153         {
       
   154         TypeOfField& field = iFields.FieldAt(i);
       
   155         const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
   156         if ( fieldType && iFieldTypeList.ContainsSame( *fieldType ) )
       
   157             {
       
   158             // next field found
       
   159             nextField = &field;
       
   160             iIteratorIndex = i+1;
       
   161             break;
       
   162             }
       
   163         }
       
   164 
       
   165     return nextField;
       
   166     }
       
   167 
       
   168 // -----------------------------------------------------------------------------
       
   169 // CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::HasNext
       
   170 // -----------------------------------------------------------------------------
       
   171 //
       
   172 template<typename TypeOfCollection, typename TypeOfField>
       
   173 TBool CFieldByTypeListIterator<TypeOfCollection, TypeOfField>::HasNext()
       
   174     {
       
   175     TBool ret = EFalse;
       
   176     // detect whether there is just a field in the remaining fields
       
   177     const TInt fieldCount = iFields.FieldCount();
       
   178     for (TInt i = iIteratorIndex; i < fieldCount; ++i)
       
   179         {
       
   180         TypeOfField& field = iFields.FieldAt(i);
       
   181         const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
       
   182         if ( fieldType && iFieldTypeList.ContainsSame( *fieldType ) )
       
   183             {
       
   184             // field type matches
       
   185             ret = ETrue;
       
   186             break;
       
   187             }
       
   188         }
       
   189     return ret;
       
   190     }
       
   191 
       
   192 // -----------------------------------------------------------------------------
       
   193 // Iterator for MVPbkStoreContactFieldCollection by Type
       
   194 // -----------------------------------------------------------------------------
       
   195 //
       
   196 NONSHARABLE_CLASS(CStoreFieldByTypeIterator)
       
   197     :   public CFieldByTypeIterator<
       
   198             MVPbkStoreContactFieldCollection,
       
   199             MVPbkStoreContactField>
       
   200     {
       
   201 public:
       
   202     CStoreFieldByTypeIterator(
       
   203         const MVPbkFieldType& aFieldType,
       
   204         MVPbkStoreContactFieldCollection& aFields );
       
   205     };
       
   206 
       
   207 CStoreFieldByTypeIterator::CStoreFieldByTypeIterator(
       
   208         const MVPbkFieldType& aFieldType,
       
   209         MVPbkStoreContactFieldCollection& aFields )
       
   210     :   CFieldByTypeIterator<
       
   211             MVPbkStoreContactFieldCollection,
       
   212             MVPbkStoreContactField>( aFieldType, aFields )
       
   213     {
       
   214     }
       
   215 
       
   216 // -----------------------------------------------------------------------------
       
   217 // Iterator for const MVPbkBaseContactFieldCollection by Type
       
   218 // -----------------------------------------------------------------------------
       
   219 //
       
   220 NONSHARABLE_CLASS(CBaseFieldByTypeIterator)
       
   221     :   public CFieldByTypeIterator<
       
   222             const MVPbkBaseContactFieldCollection,
       
   223             const MVPbkBaseContactField>
       
   224     {
       
   225 public:
       
   226     CBaseFieldByTypeIterator(
       
   227         const MVPbkFieldType& aFieldType,
       
   228         const MVPbkBaseContactFieldCollection& aFields );
       
   229     };
       
   230 
       
   231 CBaseFieldByTypeIterator::CBaseFieldByTypeIterator(
       
   232         const MVPbkFieldType& aFieldType,
       
   233         const MVPbkBaseContactFieldCollection& aFields )
       
   234     :   CFieldByTypeIterator<
       
   235             const MVPbkBaseContactFieldCollection,
       
   236             const MVPbkBaseContactField>( aFieldType, aFields )
       
   237 
       
   238     {
       
   239     }
       
   240 
       
   241 // -----------------------------------------------------------------------------
       
   242 // Iterator for const MVPbkBaseContactFieldCollection by TypeList
       
   243 // -----------------------------------------------------------------------------
       
   244 //
       
   245 NONSHARABLE_CLASS(CBaseFieldByTypeListIterator)
       
   246     :   public CFieldByTypeListIterator<
       
   247             const MVPbkBaseContactFieldCollection,
       
   248             const MVPbkBaseContactField>
       
   249     {
       
   250 public:
       
   251     CBaseFieldByTypeListIterator(
       
   252         const MVPbkFieldTypeList& aFieldTypeList,
       
   253         const MVPbkBaseContactFieldCollection& aFields );
       
   254     };
       
   255 
       
   256 CBaseFieldByTypeListIterator::CBaseFieldByTypeListIterator(
       
   257         const MVPbkFieldTypeList& aFieldTypeList,
       
   258         const MVPbkBaseContactFieldCollection& aFields )
       
   259         :   CFieldByTypeListIterator<
       
   260             const MVPbkBaseContactFieldCollection,
       
   261             const MVPbkBaseContactField>( aFieldTypeList, aFields )
       
   262     {
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 // Implementation for CVPbkBaseContactFieldTypeIterator class
       
   267 // -----------------------------------------------------------------------------
       
   268 //
       
   269 // -----------------------------------------------------------------------------
       
   270 // CVPbkBaseContactFieldTypeIterator::ConstructL
       
   271 // -----------------------------------------------------------------------------
       
   272 //
       
   273 void CVPbkBaseContactFieldTypeIterator::ConstructL(
       
   274         const MVPbkFieldType& aFieldType,
       
   275         const MVPbkBaseContactFieldCollection& aStoreFields )
       
   276     {
       
   277     iIterator = new (ELeave ) CBaseFieldByTypeIterator( aFieldType, aStoreFields );
       
   278     }
       
   279 
       
   280 // -----------------------------------------------------------------------------
       
   281 // CVPbkBaseContactFieldTypeIterator::NewLC
       
   282 // -----------------------------------------------------------------------------
       
   283 //
       
   284 EXPORT_C CVPbkBaseContactFieldTypeIterator* CVPbkBaseContactFieldTypeIterator::NewLC(
       
   285         const MVPbkFieldType& aFieldType,
       
   286         const MVPbkBaseContactFieldCollection& aFields)
       
   287     {
       
   288     CVPbkBaseContactFieldTypeIterator* self =
       
   289         new(ELeave) CVPbkBaseContactFieldTypeIterator;
       
   290     CleanupStack::PushL(self);
       
   291     self->ConstructL( aFieldType, aFields  );
       
   292     return self;
       
   293     }
       
   294 
       
   295 // -----------------------------------------------------------------------------
       
   296 // CVPbkBaseContactFieldTypeIterator::~CVPbkBaseContactFieldTypeIterator
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 CVPbkBaseContactFieldTypeIterator::~CVPbkBaseContactFieldTypeIterator()
       
   300     {
       
   301     delete iIterator;
       
   302     }
       
   303 
       
   304 // -----------------------------------------------------------------------------
       
   305 // CVPbkBaseContactFieldTypeIterator::Next
       
   306 // -----------------------------------------------------------------------------
       
   307 //
       
   308 const MVPbkBaseContactField* CVPbkBaseContactFieldTypeIterator::Next() const
       
   309     {
       
   310     return iIterator->Next();
       
   311     }
       
   312 
       
   313 // -----------------------------------------------------------------------------
       
   314 // CVPbkBaseContactFieldTypeIterator::HasNext
       
   315 // -----------------------------------------------------------------------------
       
   316 //
       
   317 TBool CVPbkBaseContactFieldTypeIterator::HasNext() const
       
   318     {
       
   319     return iIterator->HasNext();
       
   320     }
       
   321 
       
   322 // -----------------------------------------------------------------------------
       
   323 // Implementation for CVPbkBaseContactFieldTypeListIterator class
       
   324 // -----------------------------------------------------------------------------
       
   325 //
       
   326 // -----------------------------------------------------------------------------
       
   327 // CVPbkBaseContactFieldTypeListIterator::ConstructL
       
   328 // -----------------------------------------------------------------------------
       
   329 //
       
   330 void CVPbkBaseContactFieldTypeListIterator::ConstructL(
       
   331         const MVPbkFieldTypeList& aFieldTypeList,
       
   332         const MVPbkBaseContactFieldCollection& aStoreFields )
       
   333     {
       
   334     iIterator = new (ELeave ) CBaseFieldByTypeListIterator( aFieldTypeList, aStoreFields );
       
   335     }
       
   336 
       
   337 // -----------------------------------------------------------------------------
       
   338 // CVPbkBaseContactFieldTypeListIterator::NewLC
       
   339 // -----------------------------------------------------------------------------
       
   340 //
       
   341 EXPORT_C CVPbkBaseContactFieldTypeListIterator* CVPbkBaseContactFieldTypeListIterator::NewLC(
       
   342         const MVPbkFieldTypeList& aFieldTypeList,
       
   343         const MVPbkBaseContactFieldCollection& aFields)
       
   344     {
       
   345     CVPbkBaseContactFieldTypeListIterator* self =
       
   346         new(ELeave) CVPbkBaseContactFieldTypeListIterator;
       
   347     CleanupStack::PushL(self);
       
   348     self->ConstructL( aFieldTypeList, aFields  );
       
   349     return self;
       
   350     }
       
   351 
       
   352 // -----------------------------------------------------------------------------
       
   353 // CVPbkBaseContactFieldTypeListIterator::~CVPbkBaseContactFieldTypeListIterator
       
   354 // -----------------------------------------------------------------------------
       
   355 //
       
   356 CVPbkBaseContactFieldTypeListIterator::~CVPbkBaseContactFieldTypeListIterator()
       
   357     {
       
   358     delete iIterator;
       
   359     }
       
   360 
       
   361 // -----------------------------------------------------------------------------
       
   362 // CVPbkBaseContactFieldTypeListIterator::Next
       
   363 // -----------------------------------------------------------------------------
       
   364 //
       
   365 const MVPbkBaseContactField* CVPbkBaseContactFieldTypeListIterator::Next() const
       
   366     {
       
   367     return iIterator->Next();
       
   368     }
       
   369 
       
   370 // -----------------------------------------------------------------------------
       
   371 // CVPbkBaseContactFieldTypeListIterator::HasNext
       
   372 // -----------------------------------------------------------------------------
       
   373 //
       
   374 TBool CVPbkBaseContactFieldTypeListIterator::HasNext() const
       
   375     {
       
   376     return iIterator->HasNext();
       
   377     }
       
   378 
       
   379 // -----------------------------------------------------------------------------
       
   380 // Implementation for CVPbkContactFieldTypeIterator class
       
   381 // -----------------------------------------------------------------------------
       
   382 //
       
   383 // -----------------------------------------------------------------------------
       
   384 // CVPbkContactFieldTypeIterator::ConstructL
       
   385 // -----------------------------------------------------------------------------
       
   386 //
       
   387 void CVPbkContactFieldTypeIterator::ConstructL(
       
   388         const MVPbkFieldType& aFieldType,
       
   389         MVPbkStoreContactFieldCollection& aStoreFields )
       
   390     {
       
   391     iIterator = new (ELeave ) CStoreFieldByTypeIterator( aFieldType, aStoreFields );
       
   392     }
       
   393 
       
   394 // -----------------------------------------------------------------------------
       
   395 // CVPbkContactFieldTypeIterator::NewLC
       
   396 // -----------------------------------------------------------------------------
       
   397 //
       
   398 EXPORT_C CVPbkContactFieldTypeIterator* CVPbkContactFieldTypeIterator::NewLC(
       
   399         const MVPbkFieldType& aFieldType,
       
   400         MVPbkStoreContactFieldCollection& aFields)
       
   401     {
       
   402     CVPbkContactFieldTypeIterator* self =
       
   403         new(ELeave) CVPbkContactFieldTypeIterator;
       
   404     CleanupStack::PushL(self);
       
   405     self->ConstructL( aFieldType, aFields  );
       
   406     return self;
       
   407     }
       
   408 
       
   409 // -----------------------------------------------------------------------------
       
   410 // CVPbkContactFieldTypeIterator::~CVPbkContactFieldTypeIterator
       
   411 // -----------------------------------------------------------------------------
       
   412 //
       
   413 CVPbkContactFieldTypeIterator::~CVPbkContactFieldTypeIterator()
       
   414     {
       
   415     delete iIterator;
       
   416     }
       
   417 
       
   418 // -----------------------------------------------------------------------------
       
   419 // CVPbkContactFieldTypeIterator::Next
       
   420 // -----------------------------------------------------------------------------
       
   421 //
       
   422 const MVPbkStoreContactField* CVPbkContactFieldTypeIterator::Next() const
       
   423     {
       
   424     return iIterator->Next();
       
   425     }
       
   426 
       
   427 // -----------------------------------------------------------------------------
       
   428 // CVPbkContactFieldTypeIterator::Next
       
   429 // -----------------------------------------------------------------------------
       
   430 //
       
   431 MVPbkStoreContactField* CVPbkContactFieldTypeIterator::Next()
       
   432     {
       
   433     return iIterator->Next();
       
   434     }
       
   435 
       
   436 // -----------------------------------------------------------------------------
       
   437 // CVPbkContactFieldTypeIterator::HasNext
       
   438 // -----------------------------------------------------------------------------
       
   439 //
       
   440 TBool CVPbkContactFieldTypeIterator::HasNext() const
       
   441     {
       
   442     return iIterator->HasNext();
       
   443     }
       
   444 
       
   445 // end of file
       
   446