phonebookengines/VirtualPhonebook/VPbkEng/src/CVPbkContactStoreUriArray.cpp
changeset 0 e686773b3f54
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     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:  Array of Contact store Uri
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "CVPbkContactStoreUriArray.h"
       
    20 #include "CVPbkContactStoreUri.h"
       
    21 #include <TVPbkContactStoreUriPtr.h>
       
    22 #include <VPbkError.h>
       
    23 
       
    24 
       
    25 #include <s32mem.h>
       
    26 
       
    27 namespace KUriArrayStatic 
       
    28     {
       
    29     const TInt KVPbkPackagedUriArrayVersion = 1;
       
    30     }
       
    31     
       
    32 namespace KUriArrayExternalizeSizes
       
    33     {
       
    34     const TInt KVersionNumberSize = 1;
       
    35     const TInt KUriCountSize = 4;
       
    36     const TInt KUriLengthSize = 2;
       
    37     }
       
    38 
       
    39 CVPbkContactStoreUriArray::CVPbkContactStoreUriArray()
       
    40     {
       
    41     }
       
    42     
       
    43 inline void CVPbkContactStoreUriArray::ConstructL()
       
    44     {
       
    45     }
       
    46 
       
    47 EXPORT_C CVPbkContactStoreUriArray* CVPbkContactStoreUriArray::NewLC()
       
    48     {
       
    49     CVPbkContactStoreUriArray* self = new(ELeave) CVPbkContactStoreUriArray;
       
    50     CleanupStack::PushL(self);
       
    51     self->ConstructL();
       
    52     return self;
       
    53     }
       
    54     
       
    55 EXPORT_C CVPbkContactStoreUriArray* CVPbkContactStoreUriArray::NewL()
       
    56     {
       
    57     CVPbkContactStoreUriArray* self = CVPbkContactStoreUriArray::NewLC();
       
    58     CleanupStack::Pop(self);
       
    59     return self;
       
    60     }
       
    61 
       
    62 inline void CVPbkContactStoreUriArray::ConstructL(const TDesC8& aPackedUris)
       
    63     {
       
    64     // unencrypt the packed links descriptor to this array
       
    65     RDesReadStream readStream(aPackedUris);
       
    66     readStream.PushL();
       
    67     
       
    68     const TInt versionNumber = readStream.ReadUint8L();
       
    69     __ASSERT_ALWAYS(versionNumber == KUriArrayStatic::KVPbkPackagedUriArrayVersion, 
       
    70             VPbkError::Panic(VPbkError::EInvalidTypeParameter));
       
    71     
       
    72     // read uri count from the stream
       
    73     TInt uriCount = readStream.ReadUint32L();
       
    74     while (uriCount--)
       
    75         {
       
    76         const TInt uriLength = readStream.ReadUint16L();
       
    77         HBufC* uriBuffer = HBufC::NewLC(uriLength);
       
    78         TPtr uriPtr = uriBuffer->Des();
       
    79         readStream.ReadL(uriPtr, uriLength);
       
    80         
       
    81         AppendL(TVPbkContactStoreUriPtr(uriPtr));
       
    82         
       
    83         CleanupStack::PopAndDestroy(uriBuffer);
       
    84         }
       
    85     
       
    86     CleanupStack::PopAndDestroy(&readStream);
       
    87     }
       
    88 
       
    89 EXPORT_C CVPbkContactStoreUriArray* CVPbkContactStoreUriArray::NewLC(const TDesC8& aPackedUris)
       
    90     {
       
    91     CVPbkContactStoreUriArray* self = CVPbkContactStoreUriArray::NewLC();
       
    92     self->ConstructL(aPackedUris);
       
    93     return self;
       
    94     }
       
    95     
       
    96 CVPbkContactStoreUriArray::~CVPbkContactStoreUriArray()
       
    97     {
       
    98     iUris.ResetAndDestroy();
       
    99     }
       
   100     
       
   101 EXPORT_C void CVPbkContactStoreUriArray::AppendL(const TVPbkContactStoreUriPtr& aStoreUri)
       
   102     {
       
   103     CVPbkContactStoreUri* uri = CVPbkContactStoreUri::NewL(aStoreUri);
       
   104     CleanupStack::PushL(uri);
       
   105     iUris.AppendL(uri);
       
   106     CleanupStack::Pop(uri);
       
   107     }
       
   108     
       
   109 EXPORT_C void CVPbkContactStoreUriArray::AppendAllL(
       
   110         const CVPbkContactStoreUriArray& aUriArray)
       
   111     {
       
   112     const TInt count = aUriArray.Count();
       
   113     for (TInt i = 0; i < count; ++i)
       
   114         {
       
   115         AppendL(aUriArray[i]);
       
   116         }
       
   117     }
       
   118     
       
   119 EXPORT_C void CVPbkContactStoreUriArray::Remove(const TVPbkContactStoreUriPtr& aStoreUri)
       
   120     {
       
   121     const TInt count = Count();
       
   122     for (TInt i = 0; i < count; ++i)
       
   123         {
       
   124         if (iUris[i]->Uri().Compare(aStoreUri, 
       
   125             TVPbkContactStoreUriPtr::EContactStoreUriAllComponents) == 0)
       
   126             {
       
   127             CVPbkContactStoreUri* uri = iUris[i];
       
   128             iUris.Remove(i);
       
   129             delete uri;
       
   130             break;
       
   131             }
       
   132         }
       
   133     }
       
   134     
       
   135 EXPORT_C TInt CVPbkContactStoreUriArray::Count() const
       
   136     {
       
   137     return iUris.Count();
       
   138     }
       
   139 
       
   140 EXPORT_C TVPbkContactStoreUriPtr CVPbkContactStoreUriArray::operator[](TInt aIndex) const
       
   141     {
       
   142     return iUris[aIndex]->Uri();
       
   143     }
       
   144 
       
   145 EXPORT_C HBufC8* CVPbkContactStoreUriArray::PackLC() const
       
   146     {
       
   147     HBufC8* packed = HBufC8::NewLC(CalculateExternalizedSize());
       
   148     TPtr8 ptr = packed->Des();
       
   149 
       
   150     RDesWriteStream writeStream(ptr);
       
   151     writeStream.PushL();
       
   152     
       
   153     // Write version number
       
   154     writeStream.WriteUint8L(KUriArrayStatic::KVPbkPackagedUriArrayVersion);
       
   155     // URI count
       
   156     const TInt count = iUris.Count();
       
   157     writeStream.WriteUint32L(count);
       
   158 
       
   159     for (TInt i = 0; i < count; ++i)
       
   160         {
       
   161         const TDesC& uri = iUris[i]->Uri().UriDes();
       
   162         writeStream.WriteUint16L(uri.Length());
       
   163         writeStream.WriteL(uri, uri.Length());
       
   164         }
       
   165     
       
   166     writeStream.CommitL();
       
   167     CleanupStack::PopAndDestroy(&writeStream);
       
   168     
       
   169     return packed;
       
   170     }
       
   171     
       
   172 EXPORT_C TBool CVPbkContactStoreUriArray::IsIncluded(
       
   173         const TVPbkContactStoreUriPtr& aStoreUri) const
       
   174     {
       
   175     TBool result = EFalse;
       
   176     
       
   177     const TInt count = iUris.Count();
       
   178     for (TInt i = 0; i < count; ++i)
       
   179         {
       
   180         if (iUris[i]->Uri().Compare(aStoreUri, 
       
   181             TVPbkContactStoreUriPtr::EContactStoreUriAllComponents) == 0)
       
   182             {
       
   183             result = ETrue;
       
   184             break;
       
   185             }
       
   186         }
       
   187         
       
   188     return result;
       
   189     }
       
   190     
       
   191 TInt CVPbkContactStoreUriArray::CalculateExternalizedSize() const
       
   192     {
       
   193     TInt result = KUriArrayExternalizeSizes::KVersionNumberSize + 
       
   194         KUriArrayExternalizeSizes::KUriCountSize;
       
   195         
       
   196     const TInt count = iUris.Count();
       
   197     for (TInt i = 0; i < count; ++i)
       
   198         {
       
   199         result += KUriArrayExternalizeSizes::KUriLengthSize;
       
   200         result += iUris[i]->Uri().UriDes().Size();
       
   201         }
       
   202     return result;
       
   203     }
       
   204     
       
   205 // End of File