ncdengine/provider/client/src/ncdqueryimpl.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/client/src/ncdqueryimpl.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,399 @@
+/*
+* 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 <bamdesca.h>
+
+#include "ncdqueryimpl.h"
+#include "ncdqueryitemimpl.h"
+#include "ncdquerytextitemimpl.h"
+#include "ncdquerynumericitemimpl.h"
+#include "ncdquerypincodeitemimpl.h"
+#include "ncdqueryselectionitemimpl.h"
+#include "ncd_cp_query.h"
+#include "ncd_cp_queryelement.h"
+#include "catalogsarray.h"
+#include "catalogsinterfaceidentifier.h"
+#include "catalogsconstants.h"
+#include "catalogsutils.h"
+#include "catalogsdebug.h"
+#include "ncdstring.h"
+#include "ncdclientlocalizer.h"
+#include "ncdlocalizerutils.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+CNcdQuery* CNcdQuery::NewL( RReadStream& aReadStream )
+    {
+    CNcdQuery* self = CNcdQuery::NewLC( aReadStream );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CNcdQuery* CNcdQuery::NewLC( RReadStream& aReadStream )
+    {
+    CNcdQuery* self = new ( ELeave ) CNcdQuery( EFalse );
+    // Using PushL because the object does not have any references yet
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+    self->InternalizeL( aReadStream );
+    self->InternalAddRef();
+    return self;
+    }
+    
+CNcdQuery* CNcdQuery::NewL( const MNcdConfigurationProtocolQuery& aQuery,
+    TBool aIsSecureConnection )
+    {
+    CNcdQuery* self = CNcdQuery::NewLC( aQuery, aIsSecureConnection );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CNcdQuery* CNcdQuery::NewLC( const MNcdConfigurationProtocolQuery& aQuery,
+    TBool aIsSecureConnection )
+    {
+    CNcdQuery* self = new ( ELeave ) CNcdQuery( aIsSecureConnection );
+    // Using PushL because the object does not have any references yet
+    CleanupStack::PushL( self );
+
+    self->ConstructL();
+    self->InternalizeL( aQuery );
+    self->InternalAddRef();
+    return self;
+    }
+
+CNcdQuery* CNcdQuery::NewL( const RPointerArray<CNcdString>& aPaymentMethodNames,
+                            const MDesC8Array& aPaymentMethodTypes )
+    {
+    CNcdQuery* self = CNcdQuery::NewLC( aPaymentMethodNames,
+                                        aPaymentMethodTypes );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CNcdQuery* CNcdQuery::NewLC( const RPointerArray<CNcdString>& aPaymentMethodNames,
+                             const MDesC8Array& aPaymentMethodTypes )
+    {
+    CNcdQuery* self = new ( ELeave ) CNcdQuery( EFalse );
+    // Using PushL because the object does not have any references yet
+    CleanupStack::PushL( self );
+    self->ConstructL( aPaymentMethodNames, aPaymentMethodTypes );
+    self->InternalAddRef();
+    return self;
+    }
+
+void CNcdQuery::SetClientLocalizer( MNcdClientLocalizer* aLocalizer ) 
+    {
+    iClientLocalizer = aLocalizer;
+    }
+    
+MNcdClientLocalizer* CNcdQuery::ClientLocalizer() const 
+    {
+    return iClientLocalizer;
+    }
+
+    
+void CNcdQuery::InternalizeL( RReadStream& aReadStream )
+    {
+    delete iId;
+    iId = NULL;
+    iId = HBufC::NewL( aReadStream, KMaxTInt );
+    iIsOptional = aReadStream.ReadInt32L();
+    iSemantics = static_cast<MNcdQuery::TSemantics>(
+        aReadStream.ReadInt32L());
+    delete iTitle;
+    iTitle = NULL;
+    iTitle = CNcdString::NewL( aReadStream );
+    delete iBody;
+    iBody = NULL;
+    iBody = CNcdString::NewL( aReadStream );
+    iResponse = static_cast<TResponse>( aReadStream.ReadInt32L() );
+    iIsSecureConnection = aReadStream.ReadInt32L();
+    TInt itemCount( aReadStream.ReadInt32L() );
+    iItems.ResetAndRelease();
+    for ( TInt i = 0 ; i < itemCount ; i++ )
+        {
+        TNcdInterfaceId interfaceId = static_cast<TNcdInterfaceId>(aReadStream.ReadInt32L());
+        CNcdQueryItem* item = NULL;
+        switch ( interfaceId )
+            {
+            case ENcdQueryTextItemUid:
+                {
+                item = CNcdQueryTextItem::NewL( aReadStream, *this );
+                break;
+                }
+            case ENcdQueryNumericItemUid:
+                {
+                item = CNcdQueryNumericItem::NewL( aReadStream, *this );
+                break;
+                }
+            case ENcdQueryPinCodeItemUid:
+                {
+                item = CNcdQueryPinCodeItem::NewL( aReadStream, *this );
+                break;
+                }
+            case ENcdQuerySelectionItemUid:
+                {
+                item = CNcdQuerySelectionItem::NewL( aReadStream, *this );
+                break;
+                }
+            default:
+                {
+                User::Leave( KErrCorrupt );
+                break;
+                }
+            }
+
+        // Object's refcount must be at least 1 for Release() to work correctly
+        item->AddRef();
+        CleanupReleasePushL( *item );
+        iItems.AppendL( item );        
+        CleanupStack::Pop( item );
+        }
+    }
+    
+void CNcdQuery::InternalizeL( const MNcdConfigurationProtocolQuery& aQuery )
+    {
+    delete iId;
+    iId = NULL;
+    iId = aQuery.Id().AllocL();
+    iIsOptional = aQuery.Optional();
+    iSemantics = aQuery.Semantics();
+    delete iTitle;
+    iTitle = NULL;
+    iTitle = CNcdString::NewL( aQuery.Title().Key(), aQuery.Title().Data() );
+    delete iBody;
+    iBody = NULL;
+    iBody = CNcdString::NewL( aQuery.BodyText().Key(), aQuery.BodyText().Data() );
+        
+    iItems.ResetAndRelease();    
+    for ( TInt i = 0 ; i < aQuery.QueryElementCount() ; i++ )
+        {
+        const MNcdConfigurationProtocolQueryElement& queryElement =
+            aQuery.QueryElementL( i );
+        CNcdQueryItem* item = NULL;
+        switch ( queryElement.Type() )
+            {
+            case MNcdConfigurationProtocolQueryElement::EFreeText:
+            case MNcdConfigurationProtocolQueryElement::EFile:
+            case MNcdConfigurationProtocolQueryElement::EGpsLocation:
+            case MNcdConfigurationProtocolQueryElement::EConfiguration:
+                {
+                item = CNcdQueryTextItem::NewL( queryElement, *this );                
+                break;
+                }
+            case MNcdConfigurationProtocolQueryElement::ENumeric:
+                {
+                if ( queryElement.Semantics() ==
+                    MNcdQueryItem::ESemanticsPinCode )
+                    {
+                    item = CNcdQueryPinCodeItem::NewL( queryElement, *this );
+                    }
+                else
+                    {
+                    item = CNcdQueryNumericItem::NewL( queryElement, *this );
+                    }
+                break;
+                }            
+            case MNcdConfigurationProtocolQueryElement::ESingleSelect:
+            case MNcdConfigurationProtocolQueryElement::EMultiSelect:
+                {
+                item = CNcdQuerySelectionItem::NewL( queryElement, *this );                
+                break;
+                }
+            default:
+                {
+                User::Leave( KErrCorrupt );
+                break;
+                }
+            }
+        
+        // Object's refcount must be at least 1 for Release() to work correctly
+        item->AddRef();
+        CleanupReleasePushL( *item );		
+        iItems.AppendL( item );
+        CleanupStack::Pop( item );        
+        }
+    }
+    
+void CNcdQuery::ExternalizeL( RWriteStream& aWriteStream ) const
+    {
+    aWriteStream << *iId;
+    aWriteStream.WriteInt32L( iIsOptional );
+    aWriteStream.WriteInt32L( iSemantics );
+    iTitle->ExternalizeL( aWriteStream );
+    iBody->ExternalizeL( aWriteStream );
+    aWriteStream.WriteInt32L( iResponse );
+    aWriteStream.WriteInt32L( iIsSecureConnection );
+    aWriteStream.WriteInt32L( iItems.Count() );
+    for ( TInt i = 0 ; i < iItems.Count() ; i++ )
+        {
+        aWriteStream.WriteInt32L( iItems[i]->Type() );
+        iItems[i]->ExternalizeL( aWriteStream );
+        }
+    }
+    
+    
+TInt CNcdQuery::ItemCount() const
+    {
+    return iItems.Count();
+    }
+
+CNcdQueryItem& CNcdQuery::QueryItemL( TInt aIndex )
+    {
+    DLTRACEIN((""));
+    if ( aIndex < 0 || aIndex >= iItems.Count() )
+        {
+        User::Leave( KErrArgument );
+        }
+    DLTRACEOUT((""));
+    return *iItems[aIndex];
+    }
+
+const TDesC& CNcdQuery::Id() const
+    {
+    return *iId;
+    }
+
+TBool CNcdQuery::AllItemsSet() const
+    {
+    DLTRACEIN((""));
+    for ( TInt i = 0 ; i < iItems.Count() ; i++ )
+        {
+        if( !iItems[i]->IsSet() )
+            {
+            DLTRACEOUT(("EFalse"));
+            return EFalse;
+            }
+        }
+    DLTRACEOUT(("ETrue"));
+    return ETrue;
+    }
+
+TBool CNcdQuery::IsOptional() const
+    {
+    return iIsOptional;
+    }
+    
+MNcdQuery::TSemantics CNcdQuery::Semantics() const
+    {
+    return iSemantics;
+    }
+    
+const TDesC& CNcdQuery::MessageTitle() const
+    {
+    DLTRACEIN((""));
+    return CNcdLocalizerUtils::LocalizedString(
+        *iTitle, iClientLocalizer, iLocalizedTitle );
+    }
+    
+const TDesC& CNcdQuery::MessageBody() const
+    {
+    DLTRACEIN((""))
+    return CNcdLocalizerUtils::LocalizedString(
+        *iBody, iClientLocalizer, iLocalizedBody );
+    }
+    
+RCatalogsArray< MNcdQueryItem > CNcdQuery::QueryItemsL()
+    {
+    DLTRACEIN((""));
+    RCatalogsArray< MNcdQueryItem > array;
+    TRAPD( err,
+        {
+        for ( TInt i = 0 ; i < iItems.Count() ; i++ )
+            {
+            // don't show invisible items
+            if( ! iItems[i]->IsInvisible() )
+                {
+                DLTRACE((_L("Adding item: id=%S description=%S message=%S semantics=%d"),
+                     &iItems[i]->Id(), &iItems[i]->Description(),
+                     &iItems[i]->Message(), iItems[i]->Semantics() ));
+                array.AppendL( iItems[i] );
+                iItems[i]->AddRef();
+                }
+            }
+        });
+    if ( err != KErrNone )
+        {        
+        array.ResetAndRelease();
+        User::Leave( err );
+        }   
+    return array;
+    }
+
+void CNcdQuery::SetResponseL( TResponse aResponse )
+    {
+    iResponse = aResponse;
+    }
+
+MNcdQuery::TResponse CNcdQuery::Response()
+    {
+    return iResponse;
+    }
+    
+TBool CNcdQuery::IsSecureConnection() const
+    {
+    return iIsSecureConnection;
+    }
+    
+CNcdQuery::~CNcdQuery()
+    {
+    DLTRACEIN((""));
+    delete iId;
+    delete iTitle;
+    delete iBody;
+    delete iLocalizedTitle;
+    delete iLocalizedBody;
+    iItems.ResetAndRelease();
+    }
+    
+CNcdQuery::CNcdQuery( TBool aIsSecureConnection )
+    : CCatalogsInterfaceBase( NULL ),
+      iIsSecureConnection( aIsSecureConnection )
+    {    
+    }
+    
+void CNcdQuery::ConstructL()
+    {
+    
+    iTitle = CNcdString::NewL( KNullDesC, KNullDesC );
+    iBody = CNcdString::NewL( KNullDesC, KNullDesC );
+    AssignDesL( iId, KNullDesC );
+        
+    // Register the interfaces of this object
+    MNcdQuery* query( this );
+    AddInterfaceL( 
+        CCatalogsInterfaceIdentifier::NewL( query, this, MNcdQuery::KInterfaceUid ) );
+    }
+
+void CNcdQuery::ConstructL( const RPointerArray<CNcdString>& aPaymentMethodNames,
+                            const MDesC8Array& aPaymentMethodTypes )
+    {
+    ConstructL();
+
+    AssignDesL( iId, KQueryIdPaymentMethod() );
+    iSemantics = MNcdQuery::ESemanticsPaymentMethodSelectionQuery;
+    
+    CNcdQuerySelectionItem* item = 
+        CNcdQuerySelectionItem::NewLC( aPaymentMethodNames, aPaymentMethodTypes, *this );
+	item->AddRef();
+    iItems.AppendL( item );
+    CleanupStack::Pop( item );
+
+    }