omads/omadsextensions/adapters/contactsgroup/src/contactsgrpconverter.cpp
author hgs
Tue, 13 Jul 2010 03:39:25 +0530
changeset 40 b63e67867dcd
permissions -rw-r--r--
201025
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Contacts Group object conversion routines
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
// INCLUDES
hgs
parents:
diff changeset
    20
#include <utf.h>
hgs
parents:
diff changeset
    21
#include <cntdef.h>
hgs
parents:
diff changeset
    22
#include <cntitem.h>
hgs
parents:
diff changeset
    23
#include <cntfldst.h>
hgs
parents:
diff changeset
    24
#include <vcard.h>
hgs
parents:
diff changeset
    25
#include <vprop.h> 
hgs
parents:
diff changeset
    26
#include <vutil.h>
hgs
parents:
diff changeset
    27
#include <s32mem.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include "contactsgrpconverter.h"
hgs
parents:
diff changeset
    30
#include "logger.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// CONSTANTS
hgs
parents:
diff changeset
    33
/*
hgs
parents:
diff changeset
    34
vCard format example:
hgs
parents:
diff changeset
    35
BEGIN:VCARD
hgs
parents:
diff changeset
    36
VERSION:2.1
hgs
parents:
diff changeset
    37
FN:GroupName
hgs
parents:
diff changeset
    38
X-CNTGRP:4;14;54
hgs
parents:
diff changeset
    39
END:VCARD
hgs
parents:
diff changeset
    40
*/
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
// Group label property
hgs
parents:
diff changeset
    43
_LIT8(KCntGrpFN, "FN");
hgs
parents:
diff changeset
    44
// Group contacts propetry
hgs
parents:
diff changeset
    45
_LIT8(KCntGrpXCntGrp, "X-CNTGRP");
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    48
// CContactsGrpConverter::NewL
hgs
parents:
diff changeset
    49
// Two-phased constructor.
hgs
parents:
diff changeset
    50
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
CContactsGrpConverter* CContactsGrpConverter::NewL()
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    CContactsGrpConverter* self = CContactsGrpConverter::NewLC();
hgs
parents:
diff changeset
    54
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    55
    return self;
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
// CContactsGrpConverter::NewLC
hgs
parents:
diff changeset
    60
// Two-phased constructor.
hgs
parents:
diff changeset
    61
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    62
CContactsGrpConverter* CContactsGrpConverter::NewLC()
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
    65
    CContactsGrpConverter* self = new (ELeave) CContactsGrpConverter();
hgs
parents:
diff changeset
    66
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    67
    self->ConstructL();
hgs
parents:
diff changeset
    68
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
    69
    return self;
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    73
// CContactsGrpConverter::CContactsGrpConverter
hgs
parents:
diff changeset
    74
// C++ default constructor can NOT contain any code, that might leave
hgs
parents:
diff changeset
    75
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
CContactsGrpConverter::CContactsGrpConverter()
hgs
parents:
diff changeset
    77
    {
hgs
parents:
diff changeset
    78
    }
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    81
// CContactsGrpConverter::ConstructL
hgs
parents:
diff changeset
    82
// Symbian 2nd phase constructor can leave.
hgs
parents:
diff changeset
    83
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    84
void CContactsGrpConverter::ConstructL()
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    ResetL();
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// CContactsGrpConverter::~CContactsGrpConverter
hgs
parents:
diff changeset
    91
// Destructor.
hgs
parents:
diff changeset
    92
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    93
CContactsGrpConverter::~CContactsGrpConverter()
hgs
parents:
diff changeset
    94
    {
hgs
parents:
diff changeset
    95
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
    96
    delete iContactsIdArray;
hgs
parents:
diff changeset
    97
    delete iGroupLabel;
hgs
parents:
diff changeset
    98
    
hgs
parents:
diff changeset
    99
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   100
    }
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
// CContactsGrpConverter::GroupLabel
hgs
parents:
diff changeset
   104
// returns group label
hgs
parents:
diff changeset
   105
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   106
const TDesC& CContactsGrpConverter::GroupLabel() const
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
    return *iGroupLabel;
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   112
// CContactsGrpConverter::ItemsContained
hgs
parents:
diff changeset
   113
// returns contact items belonging to this group
hgs
parents:
diff changeset
   114
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   115
const CContactIdArray& CContactsGrpConverter::ItemsContained() const
hgs
parents:
diff changeset
   116
    {
hgs
parents:
diff changeset
   117
    return *iContactsIdArray;
hgs
parents:
diff changeset
   118
    }
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
// CContactsGrpConverter::ImportDbItemL
hgs
parents:
diff changeset
   122
// Imports group item
hgs
parents:
diff changeset
   123
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   124
void CContactsGrpConverter::ImportDbItemL( CContactGroup& aItem )
hgs
parents:
diff changeset
   125
    {
hgs
parents:
diff changeset
   126
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   127
    if ( aItem.Type() != KUidContactGroup )
hgs
parents:
diff changeset
   128
        {
hgs
parents:
diff changeset
   129
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   130
        }
hgs
parents:
diff changeset
   131
    ResetL();
hgs
parents:
diff changeset
   132
    
hgs
parents:
diff changeset
   133
    if ( aItem.HasItemLabelField() )
hgs
parents:
diff changeset
   134
        {
hgs
parents:
diff changeset
   135
        TPtrC label = aItem.GetGroupLabelL();
hgs
parents:
diff changeset
   136
        delete iGroupLabel;
hgs
parents:
diff changeset
   137
        iGroupLabel = NULL;
hgs
parents:
diff changeset
   138
        iGroupLabel = label.AllocL();
hgs
parents:
diff changeset
   139
        }
hgs
parents:
diff changeset
   140
    else
hgs
parents:
diff changeset
   141
        {
hgs
parents:
diff changeset
   142
        delete iGroupLabel;
hgs
parents:
diff changeset
   143
        iGroupLabel = NULL;
hgs
parents:
diff changeset
   144
        iGroupLabel = KNullDesC().AllocL();
hgs
parents:
diff changeset
   145
        }
hgs
parents:
diff changeset
   146
    
hgs
parents:
diff changeset
   147
    // this is NULL, if no items
hgs
parents:
diff changeset
   148
    CContactIdArray* tempIdArray = aItem.ItemsContainedLC();
hgs
parents:
diff changeset
   149
    if ( tempIdArray )
hgs
parents:
diff changeset
   150
        {
hgs
parents:
diff changeset
   151
        delete iContactsIdArray;
hgs
parents:
diff changeset
   152
        iContactsIdArray = tempIdArray;
hgs
parents:
diff changeset
   153
        CleanupStack::Pop( tempIdArray );
hgs
parents:
diff changeset
   154
        }
hgs
parents:
diff changeset
   155
    
hgs
parents:
diff changeset
   156
    LOGGER_WRITE_1("GroupName: %S", iGroupLabel);
hgs
parents:
diff changeset
   157
    if ( iContactsIdArray )
hgs
parents:
diff changeset
   158
        {
hgs
parents:
diff changeset
   159
        LOGGER_WRITE_1("contacts count: %d", iContactsIdArray->Count() );
hgs
parents:
diff changeset
   160
        }
hgs
parents:
diff changeset
   161
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   162
    }
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   165
// CContactsGrpConverter::ExportVCardL
hgs
parents:
diff changeset
   166
// Export contact group as vCard
hgs
parents:
diff changeset
   167
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
void CContactsGrpConverter::ExportVCardL( CBufBase& aBuffer )
hgs
parents:
diff changeset
   169
    {
hgs
parents:
diff changeset
   170
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   171
    RBufWriteStream stream( aBuffer, 0);
hgs
parents:
diff changeset
   172
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   173
    ExportVCardL( stream );
hgs
parents:
diff changeset
   174
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   175
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
// CContactsGrpConverter::ExportL
hgs
parents:
diff changeset
   180
// Exports contact group as to vCard
hgs
parents:
diff changeset
   181
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   182
void CContactsGrpConverter::ExportVCardL( RWriteStream& aWriteStream )
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   185
    CParserVCard* vCardParser = CParserVCard::NewL();
hgs
parents:
diff changeset
   186
    CleanupStack::PushL( vCardParser );
hgs
parents:
diff changeset
   187
    
hgs
parents:
diff changeset
   188
    // add group name
hgs
parents:
diff changeset
   189
    CParserPropertyValue* FNvalue = CParserPropertyValueHBufC::NewL( *iGroupLabel );
hgs
parents:
diff changeset
   190
    // Associate the property params and property value with the FN property
hgs
parents:
diff changeset
   191
    CParserProperty* FNproperty=CParserProperty::NewL( *FNvalue, KCntGrpFN, NULL );
hgs
parents:
diff changeset
   192
    // Finally add the FN property to the vCard using the parser object.
hgs
parents:
diff changeset
   193
    vCardParser->AddPropertyL( FNproperty );
hgs
parents:
diff changeset
   194
    
hgs
parents:
diff changeset
   195
    // add group contacts
hgs
parents:
diff changeset
   196
    const TInt KDefaultGranularity = 5;
hgs
parents:
diff changeset
   197
    CDesCArrayFlat* flatArray = new (ELeave) CDesCArrayFlat(KDefaultGranularity);
hgs
parents:
diff changeset
   198
    CleanupStack::PushL( flatArray );
hgs
parents:
diff changeset
   199
    TInt count = iContactsIdArray->Count();
hgs
parents:
diff changeset
   200
    const TInt KMaxIdLength = 10;
hgs
parents:
diff changeset
   201
    TBuf<KMaxIdLength> idnum;
hgs
parents:
diff changeset
   202
    for ( TInt i=0; i<count; i++ )
hgs
parents:
diff changeset
   203
        {
hgs
parents:
diff changeset
   204
        const TContactItemId id = (*iContactsIdArray)[i];
hgs
parents:
diff changeset
   205
        idnum.Zero();
hgs
parents:
diff changeset
   206
        idnum.AppendNum( id );
hgs
parents:
diff changeset
   207
        flatArray->AppendL( idnum );
hgs
parents:
diff changeset
   208
        }
hgs
parents:
diff changeset
   209
    CParserPropertyValueCDesCArray* grPropertyValueArray =
hgs
parents:
diff changeset
   210
        new (ELeave) CParserPropertyValueCDesCArray( flatArray );
hgs
parents:
diff changeset
   211
    CleanupStack::Pop( flatArray );
hgs
parents:
diff changeset
   212
    
hgs
parents:
diff changeset
   213
    CParserProperty* grProperty = 
hgs
parents:
diff changeset
   214
        CParserProperty::NewL( *grPropertyValueArray, KCntGrpXCntGrp, NULL );
hgs
parents:
diff changeset
   215
    vCardParser->AddPropertyL( grProperty );
hgs
parents:
diff changeset
   216
    
hgs
parents:
diff changeset
   217
    // Set default sharacterset
hgs
parents:
diff changeset
   218
    vCardParser->SetDefaultCharSet( Versit::EUTF8CharSet );
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    vCardParser->ExternalizeL( aWriteStream );
hgs
parents:
diff changeset
   221
    
hgs
parents:
diff changeset
   222
    CleanupStack::PopAndDestroy( vCardParser );
hgs
parents:
diff changeset
   223
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   224
    }
hgs
parents:
diff changeset
   225
hgs
parents:
diff changeset
   226
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   227
// CContactsGrpConverter::ImportVCardL
hgs
parents:
diff changeset
   228
// Import vCard item
hgs
parents:
diff changeset
   229
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   230
void CContactsGrpConverter::ImportVCardL( const TDesC8& aBuffer )
hgs
parents:
diff changeset
   231
    {
hgs
parents:
diff changeset
   232
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   233
    ResetL();
hgs
parents:
diff changeset
   234
    CParserVCard* vCardParser = CParserVCard::NewL();
hgs
parents:
diff changeset
   235
    vCardParser->SetDefaultCharSet( Versit::EUTF8CharSet );
hgs
parents:
diff changeset
   236
    CleanupStack::PushL( vCardParser );
hgs
parents:
diff changeset
   237
    
hgs
parents:
diff changeset
   238
    RDesReadStream stream( aBuffer );
hgs
parents:
diff changeset
   239
    vCardParser->InternalizeL( stream ); // To import a vCard.
hgs
parents:
diff changeset
   240
    stream.Close(); // Close the file stream once the import is done.
hgs
parents:
diff changeset
   241
    
hgs
parents:
diff changeset
   242
    CArrayPtr<CParserProperty>* properties = vCardParser->ArrayOfProperties( EFalse );
hgs
parents:
diff changeset
   243
    LOGGER_WRITE_1("properties count: %d", properties->Count());
hgs
parents:
diff changeset
   244
    for (TInt i=0; i<properties->Count(); i++)
hgs
parents:
diff changeset
   245
        {
hgs
parents:
diff changeset
   246
        const CParserProperty* property = properties->At(i);
hgs
parents:
diff changeset
   247
        // FN
hgs
parents:
diff changeset
   248
        if ( property->Name() == KCntGrpFN )
hgs
parents:
diff changeset
   249
            {
hgs
parents:
diff changeset
   250
            LOGGER_WRITE("group name found");
hgs
parents:
diff changeset
   251
            delete iGroupLabel;
hgs
parents:
diff changeset
   252
            iGroupLabel = NULL;
hgs
parents:
diff changeset
   253
            CParserPropertyValue* pvalue = property->Value();
hgs
parents:
diff changeset
   254
            TPtrC val = (static_cast<CParserPropertyValueHBufC*> (pvalue))->Value();
hgs
parents:
diff changeset
   255
            iGroupLabel = val.AllocL();
hgs
parents:
diff changeset
   256
            LOGGER_WRITE_1("iGroupLabel: %S", iGroupLabel);
hgs
parents:
diff changeset
   257
            }
hgs
parents:
diff changeset
   258
        // X-CNTGRP
hgs
parents:
diff changeset
   259
        else if ( property->Name() == KCntGrpXCntGrp )
hgs
parents:
diff changeset
   260
            {
hgs
parents:
diff changeset
   261
            LOGGER_WRITE("group contacts found");
hgs
parents:
diff changeset
   262
            CParserPropertyValue* pvalue = property->Value();
hgs
parents:
diff changeset
   263
            TPtrC val = (static_cast<CParserPropertyValueHBufC*> (pvalue))->Value();
hgs
parents:
diff changeset
   264
            SetContactItemsL( val );
hgs
parents:
diff changeset
   265
            }
hgs
parents:
diff changeset
   266
        else
hgs
parents:
diff changeset
   267
            {
hgs
parents:
diff changeset
   268
            // skip other properties
hgs
parents:
diff changeset
   269
            }
hgs
parents:
diff changeset
   270
        }
hgs
parents:
diff changeset
   271
    CleanupStack::PopAndDestroy( vCardParser );
hgs
parents:
diff changeset
   272
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   273
    }
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   276
// CContactsGrpConverter::ResetL
hgs
parents:
diff changeset
   277
// Reset all data
hgs
parents:
diff changeset
   278
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   279
void CContactsGrpConverter::ResetL()
hgs
parents:
diff changeset
   280
    {
hgs
parents:
diff changeset
   281
    delete iGroupLabel;
hgs
parents:
diff changeset
   282
    iGroupLabel = NULL;
hgs
parents:
diff changeset
   283
    iGroupLabel = KNullDesC().AllocL();
hgs
parents:
diff changeset
   284
    if ( iContactsIdArray )
hgs
parents:
diff changeset
   285
        {
hgs
parents:
diff changeset
   286
        iContactsIdArray->Reset();
hgs
parents:
diff changeset
   287
        }
hgs
parents:
diff changeset
   288
    else
hgs
parents:
diff changeset
   289
        {
hgs
parents:
diff changeset
   290
        iContactsIdArray = CContactIdArray::NewL();
hgs
parents:
diff changeset
   291
        }
hgs
parents:
diff changeset
   292
    }
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   295
// CContactsGrpConverter::SetContactItemsL
hgs
parents:
diff changeset
   296
// Parses contact items from aValue
hgs
parents:
diff changeset
   297
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   298
void CContactsGrpConverter::SetContactItemsL( const TDesC& aValue )
hgs
parents:
diff changeset
   299
    {
hgs
parents:
diff changeset
   300
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   301
    const TInt KDefaultGranularity = 5;
hgs
parents:
diff changeset
   302
    RArray<TPtrC> arr(KDefaultGranularity);
hgs
parents:
diff changeset
   303
    CleanupClosePushL( arr );
hgs
parents:
diff changeset
   304
    const TChar separator(';');
hgs
parents:
diff changeset
   305
    SplitL( aValue, separator, arr );
hgs
parents:
diff changeset
   306
    if ( iContactsIdArray )
hgs
parents:
diff changeset
   307
        {
hgs
parents:
diff changeset
   308
        iContactsIdArray->Reset();
hgs
parents:
diff changeset
   309
        }
hgs
parents:
diff changeset
   310
    else
hgs
parents:
diff changeset
   311
        {
hgs
parents:
diff changeset
   312
        iContactsIdArray = CContactIdArray::NewL();
hgs
parents:
diff changeset
   313
        }
hgs
parents:
diff changeset
   314
    for (TInt i=0; i<arr.Count(); i++ )
hgs
parents:
diff changeset
   315
        {
hgs
parents:
diff changeset
   316
        TLex lex( arr[i] );
hgs
parents:
diff changeset
   317
        TInt32 id;
hgs
parents:
diff changeset
   318
        TInt err = lex.Val( id );
hgs
parents:
diff changeset
   319
        if ( err )
hgs
parents:
diff changeset
   320
            {
hgs
parents:
diff changeset
   321
            LOGGER_WRITE_1("lex.val returned err: %d, leaving with KErrCorrupt", err);
hgs
parents:
diff changeset
   322
            iContactsIdArray->Reset();
hgs
parents:
diff changeset
   323
            User::Leave( KErrCorrupt );
hgs
parents:
diff changeset
   324
            }
hgs
parents:
diff changeset
   325
        LOGGER_WRITE_1("add: %d", id);
hgs
parents:
diff changeset
   326
        iContactsIdArray->AddL( id );
hgs
parents:
diff changeset
   327
        }
hgs
parents:
diff changeset
   328
    CleanupStack::PopAndDestroy( &arr );
hgs
parents:
diff changeset
   329
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   330
    }
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   333
// CContactsGrpConverter::SplitL
hgs
parents:
diff changeset
   334
// Function splits string (eg "name1, name2, name3") into substrings.
hgs
parents:
diff changeset
   335
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   336
void CContactsGrpConverter::SplitL(const TDesC& aText, const TChar aSeparator, 
hgs
parents:
diff changeset
   337
                    RArray<TPtrC>& aArray)
hgs
parents:
diff changeset
   338
    {
hgs
parents:
diff changeset
   339
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   340
    TPtrC ptr;
hgs
parents:
diff changeset
   341
    ptr.Set(aText);
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
    for (;;)
hgs
parents:
diff changeset
   344
        {
hgs
parents:
diff changeset
   345
        TInt pos=ptr.Locate(aSeparator);
hgs
parents:
diff changeset
   346
        if (pos==KErrNotFound)
hgs
parents:
diff changeset
   347
            {
hgs
parents:
diff changeset
   348
            TrimAll( ptr );
hgs
parents:
diff changeset
   349
            if ( ptr.Length() > 0 )
hgs
parents:
diff changeset
   350
                {
hgs
parents:
diff changeset
   351
                aArray.AppendL(ptr);
hgs
parents:
diff changeset
   352
                }
hgs
parents:
diff changeset
   353
            break;
hgs
parents:
diff changeset
   354
            }
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
        TPtrC subStr=ptr.Left(pos); // get pos characters starting from position 0
hgs
parents:
diff changeset
   357
        TrimAll( subStr );
hgs
parents:
diff changeset
   358
        if ( subStr.Length() > 0 )
hgs
parents:
diff changeset
   359
            {
hgs
parents:
diff changeset
   360
            aArray.AppendL(subStr);
hgs
parents:
diff changeset
   361
            }
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
        if ( !(ptr.Length()>pos+1) )
hgs
parents:
diff changeset
   364
            {
hgs
parents:
diff changeset
   365
            break;
hgs
parents:
diff changeset
   366
            }
hgs
parents:
diff changeset
   367
            
hgs
parents:
diff changeset
   368
        ptr.Set( ptr.Mid(pos+1) ); // get all characters starting from position pos+1
hgs
parents:
diff changeset
   369
        }
hgs
parents:
diff changeset
   370
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   371
    }
hgs
parents:
diff changeset
   372
hgs
parents:
diff changeset
   373
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   374
// CContactsGrpConverter::TrimAll
hgs
parents:
diff changeset
   375
// Trims all whitespaces from beginning and end of string
hgs
parents:
diff changeset
   376
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   377
void CContactsGrpConverter::TrimAll( TPtrC& aValue )
hgs
parents:
diff changeset
   378
    {
hgs
parents:
diff changeset
   379
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   380
    TInt valueStart(0);
hgs
parents:
diff changeset
   381
    while ( valueStart < aValue.Length() 
hgs
parents:
diff changeset
   382
            && (aValue[valueStart] == ' '
hgs
parents:
diff changeset
   383
            || aValue[valueStart] == '\r'
hgs
parents:
diff changeset
   384
            || aValue[valueStart] == '\n') )
hgs
parents:
diff changeset
   385
        {
hgs
parents:
diff changeset
   386
        valueStart++;
hgs
parents:
diff changeset
   387
        }
hgs
parents:
diff changeset
   388
    TInt valueEnd(aValue.Length()-1);
hgs
parents:
diff changeset
   389
    while ( valueEnd > 0 
hgs
parents:
diff changeset
   390
            && (aValue[valueEnd] == ' '
hgs
parents:
diff changeset
   391
            || aValue[valueEnd] == '\r'
hgs
parents:
diff changeset
   392
            || aValue[valueEnd] == '\n') )
hgs
parents:
diff changeset
   393
        {
hgs
parents:
diff changeset
   394
        valueEnd--;
hgs
parents:
diff changeset
   395
        }
hgs
parents:
diff changeset
   396
    valueEnd++;
hgs
parents:
diff changeset
   397
    aValue.Set( aValue.Mid(valueStart, valueEnd - valueStart));
hgs
parents:
diff changeset
   398
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   399
    }
hgs
parents:
diff changeset
   400