contentctrl_plat/adapter_customization_api/tsrc/ContactAdapter/cnsmladaptertestutilities.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:30:02 +0100
branchRCL_3
changeset 52 4f0867e42d62
parent 14 b922b9936679
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2009 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:  Source code file for contact adapter test utilities.
*
*/

#include "CNSmlAdapterTestUtilities.h"
#include <EUnitMacros.h>
#include <UTF.H> 
#include <cntitem.h>  // CContactCard
#include <cntfield.h> // CContactItemField
#include <cntfldst.h> // CContactTextField
#include <S32MEM.H>

namespace
    {
    // EUNIT_PRINT will truncate descriptors longer than 512 characters.
    const TInt KEunitPrintMaxLength = 512;
    }

CNSmlAdapterTestUtilities* CNSmlAdapterTestUtilities::NewL()
    {
    CNSmlAdapterTestUtilities* self = CNSmlAdapterTestUtilities::NewLC();
    CleanupStack::Pop();
    return self;
    }

CNSmlAdapterTestUtilities* CNSmlAdapterTestUtilities::NewLC()
    {
    CNSmlAdapterTestUtilities* self = new( ELeave ) CNSmlAdapterTestUtilities();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;    
    }

CNSmlAdapterTestUtilities::CNSmlAdapterTestUtilities()
    {
    }

CNSmlAdapterTestUtilities::~CNSmlAdapterTestUtilities()
    {
    iFs.Close();
    delete iIdArray;
    delete iContactDatabase;
    }

void CNSmlAdapterTestUtilities::ConstructL()
    {
    User::LeaveIfError( iFs.Connect() );
    }

void CNSmlAdapterTestUtilities::OpenVCardFromFileLC( const TDesC& aFileName, RFileReadStream& aReadStream )
    {
    TInt err = aReadStream.Open( iFs, aFileName, EFileRead );
    if (err != KErrNone)
        {
        if (err == KErrNotFound)
            {
            EUNIT_PRINT( _L("%S ,vCard file not found"), &aFileName );
            }
        else if ( err == KErrPathNotFound )
            {
            EUNIT_PRINT( _L("%S ,vCard path not found"), &aFileName );        
            }
        else 
            {
            EUNIT_PRINT( _L("%S , vCard file cannot be opened. Error code %d"), &aFileName, err );
            }
        User::Leave( err  );
        }
    EUNIT_PRINT( _L("VCard opened") );
    CleanupClosePushL( aReadStream );
    }

HBufC* CNSmlAdapterTestUtilities::ReadVCardFromFileLC( const TDesC& aFileName )
    {
    HBufC8* vCard8 = ReadVCard8FromFileLC( aFileName );
    HBufC* vCard = HBufC::NewL( vCard8->Length() ); 
    vCard8->Des().Copy( *vCard8 );
    CleanupStack::PopAndDestroy( vCard8 );
    
    CleanupStack::PushL( vCard );    
    return vCard;
    }

HBufC8* CNSmlAdapterTestUtilities::ReadVCard8FromFileLC( const TDesC& aFileName )
    {
    RFileReadStream readStream;
    OpenVCardFromFileLC(aFileName, readStream);
    
    const TInt fileSize = readStream.Source()->SizeL();
    CBufFlat* buffer = CBufFlat::NewL( fileSize );
    CleanupStack::PushL( buffer );

    RBufWriteStream writeStream( *buffer );
    CleanupClosePushL( writeStream );
    writeStream.WriteL( readStream );
    writeStream.CommitL();
    
    HBufC8* vCard8 = buffer->Ptr(0).AllocL();
    CleanupStack::PopAndDestroy( 3, &readStream );
    
    CleanupStack::PushL( vCard8 );
    return vCard8;
    }

CBufFlat* CNSmlAdapterTestUtilities::ReadBufFromFileLC( const TDesC& aFileName )
    {
    RFileReadStream readStream;
    OpenVCardFromFileLC(aFileName, readStream);
    
    const TInt fileSize = readStream.Source()->SizeL();
    CBufFlat* buffer = CBufFlat::NewL( fileSize );
    CleanupStack::PushL( buffer );

    RBufWriteStream writeStream( *buffer );
    CleanupClosePushL( writeStream );
    writeStream.WriteL( readStream );
    writeStream.CommitL();
    CleanupStack::PopAndDestroy( &writeStream );
    CleanupStack::Pop( buffer );
    CleanupStack::PopAndDestroy( &readStream );
    CleanupStack::PushL( buffer );
    return buffer;
    }

void CNSmlAdapterTestUtilities::SetupEmptyContactDbL( const TDesC& aDbName )
    {
    if( aDbName.Length() > 0 )
        {
        iContactDatabase = CContactDatabase::ReplaceL( aDbName );
        }
    else
        {
        iContactDatabase = CContactDatabase::OpenL();  // Use default contact DB.
        }
    
    CContactIdArray* array = iContactDatabase->ContactsChangedSinceL( Time::NullTTime() );
    CleanupStack::PushL( array );
    iContactDatabase->DeleteContactsL(*array);        
    CleanupStack::PopAndDestroy( array );
    }

/**
 * Setup contact DB with the following contacts
 *   + Tim Tester (id index 0)
 *   + Teddy McTest (id index 1)
 *   + Tod TestHill (id index 2)
 *   + Simon Software (id index 3)
 *   + Cyd Effect (id index 4)
 *   + Nick Name (id index 5)
 * 
 */
void CNSmlAdapterTestUtilities::SetupAndPopulateContactDbL( const TDesC& aDbName )
    {
    if( aDbName.Length() > 0 )
        {
        iContactDatabase = CContactDatabase::ReplaceL( aDbName );
        }
    else
        {
        iContactDatabase = CContactDatabase::OpenL();  // Use default contact DB.
        }
    
    iIdArray = CContactIdArray::NewL();

    // Create test contacts
    iIdArray->AddL( AddContactL( _L( "Tim" ), _L( "Tester" ), _L( "+358501234567" ) ) );
    iIdArray->AddL( AddContactL( _L( "Teddy" ), _L("McTest" ), _L( "+358501112222" ) ) );
    iIdArray->AddL( AddContactL( _L( "Tod" ), _L( "TestHill" ), _L( "+358506666666" ) ) );
    iIdArray->AddL( AddContactL( _L( "Simon" ), _L( "Software" ), _L( "+3585011223333" ) ) );
    iIdArray->AddL( AddContactL( _L( "Cyd" ), _L( "Effect" ), _L( "+358503334444" ) ) );
    iIdArray->AddL( AddContactL( _L( "Nick" ), _L( "Name" ), _L( "+358402223333" ) ) );
    }

// Helper method to add a simple contact to test contact DB
TContactItemId CNSmlAdapterTestUtilities::AddContactL(
        const TDesC& aFirstName,
        const TDesC& aLastName,
        const TDesC& aPhoneNumber )
    {
    _LIT( KLabelFamilyName, "Last name");
    _LIT( KLabelGivenName, "First name");
    _LIT( KLabelPhone, "Phone");
    //_LIT( KLabelNickname, "X-EPOCSECONDNAME");

    CContactCard* card = CContactCard::NewLC();
    
    // Family name field
    CContactItemField* familyNameField =
        CContactItemField::NewLC( KStorageTypeText, KUidContactFieldFamilyName );
    familyNameField->SetLabelL( KLabelFamilyName );
    familyNameField->SetMapping( KUidContactFieldVCardMapUnusedN );
    familyNameField->TextStorage()->SetTextL( aLastName );
    card->AddFieldL( *familyNameField ); // Takes ownership
    CleanupStack::Pop( familyNameField );
    
    // First name field
    CContactItemField* nameField =
    CContactItemField::NewLC( KStorageTypeText, KUidContactFieldGivenName );
    nameField->SetLabelL( KLabelGivenName );
    nameField->SetMapping( KUidContactFieldVCardMapUnusedN );
    nameField->TextStorage()->SetTextL( aFirstName );
    card->AddFieldL( *nameField );
    CleanupStack::Pop(nameField);
    
    // Phone number field
    CContactItemField* phoneField =
        CContactItemField::NewLC( KStorageTypeText, KUidContactFieldPhoneNumber );
    phoneField->SetLabelL( KLabelPhone );
    phoneField->SetMapping( KUidContactFieldVCardMapTEL );
    phoneField->TextStorage()->SetTextL( aPhoneNumber );
    card->AddFieldL( *phoneField );
    CleanupStack::Pop( phoneField );
    
    // Nickname field
    /*if( aNickname.Length() > 0 )
    	{
        CContactItemField* NicknameField =
            CContactItemField::NewLC( KStorageTypeText, KUidContactFieldSecondName );
        NicknameField->SetLabelL( KLabelNickname );
        NicknameField->SetMapping( KUidContactFieldVCardMapSECONDNAME );
        NicknameField->TextStorage()->SetTextL( aNickname );
        card->AddFieldL( *NicknameField );
        CleanupStack::Pop( NicknameField );
    	}*/

    
    TContactItemId cardId = iContactDatabase->AddNewContactL( *card );        
    CleanupStack::PopAndDestroy( card );
    
    return cardId;
    }

/**
 * Empties the test contact DB to its initial state.
 */ 
void CNSmlAdapterTestUtilities::TeardownAndEmptyContactDbL( const TDesC& aDbName )
    {
    iContactDatabase->DeleteContactsL( *iIdArray );
    
    delete iIdArray;
    iIdArray = NULL;

    delete iContactDatabase;
    iContactDatabase = NULL;
    if( aDbName.Length() > 0 )
        {
        TRAP_IGNORE( CContactDatabase::DeleteDatabaseL( aDbName ) );
        }
    }

CContactDatabase* CNSmlAdapterTestUtilities::GetDb()
    {
    EUNIT_ASSERT( iContactDatabase );
    return iContactDatabase;
    }

CContactIdArray* CNSmlAdapterTestUtilities::GetContactArray()
    {
    return iIdArray;
    }

RFs& CNSmlAdapterTestUtilities::FileSession()
    {
    return iFs;
    }

CBufBase* CNSmlAdapterTestUtilities::ExportContactLC( TContactItemId aId )
    {
    CContactDatabase* db = CContactDatabase::OpenL();  // Use default contact DB.
    CleanupStack::PushL( db );
    CContactIdArray* idArr = CContactIdArray::NewLC();
    idArr->AddL( aId );
    CBufFlat* buffer = CBufFlat::NewL( 1024 );
    CleanupStack::PushL( buffer );
    RBufWriteStream writeStream( *buffer );
    CleanupClosePushL( writeStream );
    
    TRAPD( err, iContactDatabase->ExportSelectedContactsL( TUid::Uid(KVersitEntityUidVCard), *idArr, 
        writeStream, CContactDatabase::EExcludeUid, Versit::EUTF8CharSet ) );

    EUNIT_ASSERT_EQUALS_DESC( err, KErrNone, "ExportSelectedContactsL leave" );
    
    CleanupStack::PopAndDestroy( &writeStream );
    CleanupStack::Pop( buffer );
    CleanupStack::PopAndDestroy( idArr );
    CleanupStack::PopAndDestroy( db );
    CleanupStack::PushL( buffer );
    return buffer;
    }

void CNSmlAdapterTestUtilities::PrintData( const TDesC& aTitle, CBufBase& aBuf )
    {

    EUNIT_PRINT( aTitle );

    for (TInt i = 0; i < aBuf.Ptr(0).Length(); i += KEunitPrintMaxLength )
        {
        EUNIT_PRINT( aBuf.Ptr(i) );
        }

    }

void CNSmlAdapterTestUtilities::PrintData( const TDesC8& aTitle, CBufBase& aBuf )
    {

    EUNIT_PRINT( aTitle );

    for (TInt i = 0; i < aBuf.Ptr(0).Length(); i += KEunitPrintMaxLength )
        {
        EUNIT_PRINT( aBuf.Ptr(i) );
        }

    }