diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdqueryselectionitemimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/client/src/ncdqueryselectionitemimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,270 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + +#include +#include + +#include "ncdqueryselectionitemimpl.h" +#include "ncd_cp_queryelement.h" +#include "ncdqueryoptionimpl.h" +#include "catalogsinterfaceidentifier.h" +#include "catalogsconstants.h" +#include "catalogsdebug.h" +#include "ncdqueryimpl.h" +#include "ncdlocalizerutils.h" + + +// ======== MEMBER FUNCTIONS ======== + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewL( + RReadStream& aReadStream, CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = CNcdQuerySelectionItem::NewLC( aReadStream, aParent ); + CleanupStack::Pop( self ); + return self; + } + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewLC( + RReadStream& aReadStream, CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = new ( ELeave ) CNcdQuerySelectionItem( aParent ); + // Using PushL because the object does not have any references yet + CleanupStack::PushL( self ); + + self->ConstructL(); + self->InternalizeL( aReadStream ); + self->CreateSelectionTextsL(); + return self; + } + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewL( + const MNcdConfigurationProtocolQueryElement& aQueryElement, + CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = CNcdQuerySelectionItem::NewLC( aQueryElement, aParent ); + CleanupStack::Pop( self ); + return self; + } + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewLC( + const MNcdConfigurationProtocolQueryElement& aQueryElement, + CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = new ( ELeave ) CNcdQuerySelectionItem( aParent ); + // Using PushL because the object does not have any references yet + CleanupStack::PushL( self ); + + self->ConstructL(); + self->InternalizeL( aQueryElement ); + self->CreateSelectionTextsL(); + return self; + } + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewL( + const RPointerArray& aPaymentMethodNames, + const MDesC8Array& aPaymentMethodTypes, + CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = + CNcdQuerySelectionItem::NewLC( aPaymentMethodNames, aPaymentMethodTypes, aParent ); + CleanupStack::Pop( self ); + return self; + } + +CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewLC( + const RPointerArray& aPaymentMethodNames, + const MDesC8Array& aPaymentMethodTypes, + CNcdQuery& aParent ) + { + CNcdQuerySelectionItem* self = new ( ELeave ) CNcdQuerySelectionItem( aParent ); + // Using PushL because the object does not have any references yet + CleanupStack::PushL( self ); + + self->ConstructL( aPaymentMethodNames, aPaymentMethodTypes ); + self->CreateSelectionTextsL(); + return self; + } + +void CNcdQuerySelectionItem::InternalizeL( RReadStream& aReadStream ) + { + CNcdQueryItem::InternalizeL( aReadStream ); + iSelection = aReadStream.ReadInt32L(); + TInt selectionCount = aReadStream.ReadInt32L(); + + for ( TInt i = 0 ; i < selectionCount ; i++ ) + { + CNcdQueryOption* option = CNcdQueryOption::NewLC( aReadStream ); + iOptions.AppendL( option ); + CleanupStack::Pop( option ); + } + + delete iSelectionTexts; + iSelectionTexts = NULL; + + delete iSelectionData; + iSelectionData = NULL; + iSelectionData = new (ELeave) CDesC8ArrayFlat( KListGranularity ); + + for ( TInt i = 0 ; i < iOptions.Count() ; i++ ) + { + iSelectionData->AppendL( iOptions[i]->Data() ); + } + } + +void CNcdQuerySelectionItem::InternalizeL( + const MNcdConfigurationProtocolQueryElement& aQueryElement ) + { + CNcdQueryItem::InternalizeL( aQueryElement ); + for ( TInt i = 0 ; i < aQueryElement.OptionCount() ; i++ ) + { + CNcdQueryOption* option = CNcdQueryOption::NewLC( + aQueryElement.Option( i ) ); + iOptions.AppendL( option ); + CleanupStack::Pop( option ); + } + + delete iSelectionTexts; + iSelectionTexts = NULL; + delete iSelectionData; + iSelectionData = NULL; + iSelectionData = new (ELeave) CDesC8ArrayFlat( KListGranularity ); + + for ( TInt i = 0 ; i < iOptions.Count() ; i++ ) + { + iSelectionData->AppendL( iOptions[i]->Data() ); + } + + } + +void CNcdQuerySelectionItem::ExternalizeL( RWriteStream& aWriteStream ) const + { + CNcdQueryItem::ExternalizeL( aWriteStream ); + aWriteStream.WriteInt32L( iSelection ); + aWriteStream.WriteInt32L( iOptions.Count() ); + for ( TInt i = 0 ; i < iOptions.Count() ; i++ ) + { + iOptions[i]->ExternalizeL( aWriteStream ); + } + } + + +TInt CNcdQuerySelectionItem::Selection() const + { + return iSelection; + } + +const MDesCArray& CNcdQuerySelectionItem::SelectionTexts() const + { + DLTRACEIN(("")); + return *iSelectionTexts; + } + +const MDesC8Array& CNcdQuerySelectionItem::SelectionData() const + { + return *iSelectionData; + } + +void CNcdQuerySelectionItem::SetSelectionL( TInt aIndex ) + { + if ( aIndex < 0 || aIndex > iOptions.Count() ) + { + User::Leave( KErrArgument ); + } + iSelection = aIndex; + iIsSet = ETrue; + } + +TNcdInterfaceId CNcdQuerySelectionItem::Type() const + { + return static_cast(MNcdQuerySelectionItem::KInterfaceUid); + } + +const TDesC& CNcdQuerySelectionItem::ValueL() + { + if ( iSelection < 0 || iSelection > iOptions.Count() || ! iIsSet ) + { + User::Leave( KErrArgument ); + } + return iOptions[iSelection]->Value(); + } + +CNcdQuerySelectionItem::~CNcdQuerySelectionItem() + { + DLTRACEIN(("")); + delete iSelectionTexts; + delete iSelectionData; + iOptions.ResetAndDestroy(); + } + +CNcdQuerySelectionItem::CNcdQuerySelectionItem( CNcdQuery& aParent ) + : CNcdQueryItem( aParent ) + { + } + +void CNcdQuerySelectionItem::ConstructL() + { + CNcdQueryItem::ConstructL(); + // Register the interfaces of this object + MNcdQuerySelectionItem* queryItem( this ); + AddInterfaceL( + CCatalogsInterfaceIdentifier::NewL( + queryItem, this, MNcdQuerySelectionItem::KInterfaceUid ) ); + } + +void CNcdQuerySelectionItem::ConstructL( const RPointerArray& aPaymentMethodNames, + const MDesC8Array& aPaymentMethodTypes ) + { + ConstructL(); + + DASSERT( aPaymentMethodNames.Count() == aPaymentMethodTypes.MdcaCount() ); + + TInt count = aPaymentMethodNames.Count(); + CNcdQueryOption* option; + for( TInt i = 0; i < count; i++ ) + { + option = CNcdQueryOption::NewLC( *aPaymentMethodNames[ i ], aPaymentMethodTypes.MdcaPoint( i ) ); + iOptions.AppendL( option ); + CleanupStack::Pop( option ); + } + } + +void CNcdQuerySelectionItem::CreateSelectionTextsL() + { + delete iSelectionTexts; + iSelectionTexts = NULL; + iSelectionTexts = new (ELeave) CDesC16ArrayFlat( KListGranularity ); + // Use the string localizer to create selection texts. + for ( TInt i = 0; i < iOptions.Count(); i++ ) + { + const CNcdString& string = iOptions[i]->Name(); + HBufC* stringBuf( NULL ); + // returns KNullDesC if localizer not available + const TDesC& localizedString = CNcdLocalizerUtils::LocalizedString( + string, iParentQuery.ClientLocalizer(), stringBuf ); + if ( stringBuf ) + { + CleanupStack::PushL( stringBuf ); + iSelectionTexts->AppendL( *stringBuf ); + CleanupStack::PopAndDestroy( stringBuf ); + } + else + { + iSelectionTexts->AppendL( localizedString ); + } + } + }