ncdengine/provider/client/src/ncdqueryselectionitemimpl.cpp
changeset 0 ba25891c3a9e
--- /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 <s32strm.h>
+#include <badesca.h>
+
+#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<CNcdString>& aPaymentMethodNames,
+    const MDesC8Array& aPaymentMethodTypes,
+    CNcdQuery& aParent )
+    {
+    CNcdQuerySelectionItem* self = 
+        CNcdQuerySelectionItem::NewLC( aPaymentMethodNames, aPaymentMethodTypes, aParent );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CNcdQuerySelectionItem* CNcdQuerySelectionItem::NewLC(
+    const RPointerArray<CNcdString>& 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<TNcdInterfaceId>(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<CNcdString>& 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 );
+            }
+        }
+    }