ncdengine/provider/client/src/ncdpurchaseoptionproxy.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/client/src/ncdpurchaseoptionproxy.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,506 @@
+/*
+* 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:   ?Description
+*
+*/
+
+
+#include <e32base.h>
+
+#include "ncdpurchaseoptionproxy.h"
+#include "ncdnodemetadataproxy.h"
+#include "catalogsinterfaceidentifier.h"
+#include "ncdclientsubscription.h"
+#include "ncdclientpartofsubscription.h"
+#include "ncdclientupgrade.h"
+#include "catalogsclientserver.h"
+#include "ncdnodefunctionids.h"
+#include "catalogsutils.h"
+#include "catalogsdebug.h"
+#include "ncdsubscriptionmanagerproxy.h"
+#include "ncdnodeidentifier.h"
+#include "ncdnodemanagerproxy.h"
+#include "ncdnodepurchaseproxy.h"
+#include "ncdnodeproxy.h"
+#include "ncdsubscriptionproxy.h"
+#include "ncderrors.h"
+
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+CNcdPurchaseOptionProxy::CNcdPurchaseOptionProxy(
+    MCatalogsClientServer& aSession, 
+    TInt aHandle,
+    CNcdNodePurchaseProxy& aParentNodePurchase ) :
+    CNcdInterfaceBaseProxy( aSession, aHandle, &aParentNodePurchase ),
+    iParentNodePurchase( &aParentNodePurchase ),
+    iIsFree( EFalse ),
+    iObsolete( EFalse )
+    {
+    }
+
+void CNcdPurchaseOptionProxy::ConstructL()
+    {
+    DLTRACEIN(("this-ptr: %x", this));
+    // Purchaseoption interfaces are not registered
+    // to the parent as there can be several purchaseoptions
+    }
+
+
+CNcdPurchaseOptionProxy* CNcdPurchaseOptionProxy::NewL( 
+    MCatalogsClientServer& aSession,
+    TInt aHandle,
+    CNcdNodePurchaseProxy& aParentNodePurchase )
+    {
+    CNcdPurchaseOptionProxy* self = 
+        CNcdPurchaseOptionProxy::NewLC( aSession,
+                                        aHandle,
+                                        aParentNodePurchase );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+CNcdPurchaseOptionProxy* CNcdPurchaseOptionProxy::NewLC( 
+    MCatalogsClientServer& aSession,
+    TInt aHandle,
+    CNcdNodePurchaseProxy& aParentNodePurchase )
+    {
+    CNcdPurchaseOptionProxy* self =
+        new( ELeave ) CNcdPurchaseOptionProxy( aSession,
+                                               aHandle,
+                                               aParentNodePurchase );
+    // Using PushL because the object does not have any references yet
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+CNcdPurchaseOptionProxy::~CNcdPurchaseOptionProxy()
+    {
+    DLTRACEIN(("this-ptr: %x", this));
+    delete iSubscriptionComponent;
+    delete iPartOfSubscriptionComponent;
+    delete iUpgradeComponent;
+    
+    delete iName;
+    delete iPriceText;
+    
+    delete iPriceCurrency;
+    
+    delete iPurchaseOptionId;
+    DLTRACEOUT(("this-ptr: %x", this));
+    }
+    
+void CNcdPurchaseOptionProxy::InternalizeL()
+    {
+    DLTRACEIN(("this-ptr: %x", this));
+
+    HBufC8* data( NULL );
+        
+    // Because we do not know the exact size of the data id, use
+    // the alloc method, which creates the buffer of the right size
+    // and sets the pointer to point to the created buffer.
+    User::LeaveIfError(
+            ClientServerSession().
+                SendSyncAlloc( NcdNodeFunctionIds::ENcdInternalize,
+                               KNullDesC8,
+                               data,
+                               Handle(),
+                               0 ) );
+
+    if ( data == NULL )
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    CleanupStack::PushL( data );
+
+
+    // Read the data from the stream
+    RDesReadStream stream( *data );
+    CleanupClosePushL( stream );
+    
+    InternalizeDataL( stream );
+
+    // Closes the stream
+    CleanupStack::PopAndDestroy( &stream ); 
+    CleanupStack::PopAndDestroy( data );
+    
+    DLTRACEOUT((""));    
+    }
+
+const TDesC& CNcdPurchaseOptionProxy::Id() const
+    {
+    return *iPurchaseOptionId;
+    }
+
+CNcdNodePurchaseProxy* CNcdPurchaseOptionProxy::ParentNodePurchase() const
+    {
+    return iParentNodePurchase;
+    }
+
+const CNcdClientPartOfSubscription*
+    CNcdPurchaseOptionProxy::PartOfSubscription() const
+    {
+    return iPartOfSubscriptionComponent;
+    }
+
+void CNcdPurchaseOptionProxy::SetObsolete()
+    {
+    DLTRACEIN((""));
+    iObsolete = ETrue;
+    iParentNodePurchase = NULL;
+    DLTRACEOUT(( _L("PO name: %S now set as obsolete"),iName ));   
+    }
+
+const TDesC& CNcdPurchaseOptionProxy::Name() const
+    {
+    return *iName;
+    }
+
+const TDesC& CNcdPurchaseOptionProxy::Price() const
+    {
+    return *iPriceText;
+    }
+
+TBool CNcdPurchaseOptionProxy::IsFree() const
+    {
+    return iIsFree;
+    }
+
+MNcdPurchaseOption::TType CNcdPurchaseOptionProxy::PurchaseOptionType() const
+    {
+    return iType;
+    }
+
+TBool CNcdPurchaseOptionProxy::IsObsolete() const
+    {
+    DLTRACEIN((""));
+    DLTRACEOUT(( _L("PO name: %S IsObsolete: %d"),iName, iObsolete ));
+    return iObsolete;
+    }
+
+TBool CNcdPurchaseOptionProxy::IsUsableL() const
+    {
+    DLTRACEIN((""));
+    
+    // If purchase option is not valid anymore it should not be used.
+    // This is because we cannot be sure that the parent node for example
+    // still exists.
+    if ( IsObsolete() )
+        {
+        User::Leave( KNcdErrorObsolete );
+        }
+    
+    if ( iType == MNcdPurchaseOption::ESubscriptionPurchase )
+        {
+        // If parent subscription is not bought, return false.
+        // (Parent subscription cannot be used.)
+
+        DASSERT( iPartOfSubscriptionComponent != NULL );
+                
+        const TDesC& parentSubscriptionEntityId =
+            iPartOfSubscriptionComponent->ParentEntityId();
+        const TDesC& parentSubscriptionPoId =
+            iPartOfSubscriptionComponent->ParentPurchaseOptionId();
+        
+        // NOTICE: Namespace is assumed to be the same as of
+        //         the metadata that owns this purchase option.
+            
+        TBool isBought = 
+            ParentNodePurchase()->Metadata().Node().NodeManager().
+            SubscriptionManager().
+            ActiveSubscriptionExists( 
+                parentSubscriptionEntityId,
+                ParentNodePurchase()->Metadata().Namespace(),
+                parentSubscriptionPoId );
+         
+        if ( !isBought )
+            {
+            DLTRACEOUT(("False"));
+            return EFalse;
+            }
+        }
+    else if ( iType == MNcdPurchaseOption::ESubscriptionUpgrade )
+        {
+        // If target subscription is not bought, return false
+        // If the subscription is not bought, it cannot be upgraded.)
+        
+        DASSERT( iUpgradeComponent != NULL );
+        
+        const TDesC& targetPurchaseOptionId =
+            iUpgradeComponent->DependencyId();
+
+        // Subscription that DependencyId references is from the
+        // same dataentity as this purchaseoption so use other
+        // info than purchaseoption id from the metadata that
+        // owns this purchaseoption
+        TBool isBought = 
+        ParentNodePurchase()->Metadata().Node().NodeManager().
+        SubscriptionManager().ActiveSubscriptionExists(
+                 ParentNodePurchase()->Metadata().Id(),
+                 ParentNodePurchase()->Metadata().Namespace(),
+                 targetPurchaseOptionId );        
+        
+        if ( !isBought )
+            {
+            DLTRACEOUT(("False"));
+            return EFalse;
+            }
+        }
+    DLTRACEOUT(("True"));
+    return ETrue;
+    }
+
+MNcdSubscription* CNcdPurchaseOptionProxy::ParentSubscriptionL() const
+    {
+    DLTRACEIN((""));
+
+    // If purchase option is not valid anymore it should not be used.
+    // This is because we cannot be sure that the parent node for example
+    // still exists.
+    if ( IsObsolete() )
+        {
+        User::Leave( KNcdErrorObsolete );
+        }
+    // Also if we are not handling a purchase option of type
+    // MNcdPurchaseOption::ESubscriptionPurchase this function should
+    // not be used.
+    if ( iType != MNcdPurchaseOption::ESubscriptionPurchase ||
+         iPartOfSubscriptionComponent == NULL )
+        {
+        // Should change to leave with own error code
+        DLERROR(("PO not part of subscription or part of subscription component not found."));
+        User::Leave( KNcdErrorPurchaseOptionNotValidSubscriptionPurchase );
+        }
+
+
+    DASSERT( iPartOfSubscriptionComponent != NULL );
+            
+    const TDesC& parentSubscriptionEntityId =
+        iPartOfSubscriptionComponent->ParentEntityId();
+    const TDesC& parentSubscriptionPoId =
+        iPartOfSubscriptionComponent->ParentPurchaseOptionId();
+    
+    // NOTICE: Namespace is assumed to be the same as of
+    //         the metadata that owns this purchase option.
+
+    CNcdSubscriptionProxy* searchedSubscription( NULL );        
+    searchedSubscription =
+        ParentNodePurchase()->Metadata().Node().NodeManager().
+        SubscriptionManager().
+        Subscription( parentSubscriptionEntityId,
+                      ParentNodePurchase()->Metadata().Namespace(),
+                      parentSubscriptionPoId );
+
+    // Increase also the reference counter by one here.
+    // So, the root ref count is at least one when the user
+    // gets it.
+    if ( searchedSubscription != NULL )
+        {
+        searchedSubscription->AddRef();
+        }
+        
+    DLTRACEOUT((""));
+    return searchedSubscription;
+    }
+
+MNcdNode* CNcdPurchaseOptionProxy::ParentSubscriptionNodeL() const
+    {
+    DLTRACEIN((""));
+
+    // If purchase option is not valid anymore it should not be used.
+    // This is because we cannot be sure that the parent node for example
+    // still exists.
+    if ( IsObsolete() )
+        {
+        DLERROR(("Using obsolete purchaseoption"));
+        User::Leave( KNcdErrorObsolete );
+        }
+    
+    if ( iPartOfSubscriptionComponent == NULL )
+        {
+        DLERROR(("Asking parent subscription node from non part of subscription"));
+        DLTRACEOUT((""));
+        User::Leave( KNcdErrorPurchaseOptionNotValidSubscriptionPurchase );
+        }
+
+
+    const TDesC& parentSubscriptionEntityId =
+        iPartOfSubscriptionComponent->ParentEntityId();
+
+    CNcdNodeIdentifier& subscriptionOriginIdentifier =
+        ParentNodePurchase()->Metadata().Node().NodeIdentifier();
+
+
+    // Dataentity of the parent subscription is assumed to
+    // be in the same namespace as the node that owns this
+    // purchaseoption
+ 
+    CNcdNodeIdentifier* subscriptionNodeIdentifier =
+        CNcdNodeIdentifier::NewLC(
+            subscriptionOriginIdentifier.NodeNameSpace(),
+            parentSubscriptionEntityId,
+            subscriptionOriginIdentifier.ServerUri(),
+            subscriptionOriginIdentifier.ClientUid() );
+
+
+    // Node manager will handle the creation of the node.
+    CNcdNodeManagerProxy& nodeManager(
+        ParentNodePurchase()->Metadata().Node().NodeManager() );
+    
+    // Notice that this function takes the metadataidentifier as a parameter.    
+    MNcdNode* subscriptionNode = 
+        &nodeManager.CreateTemporaryOrSupplierNodeL( *subscriptionNodeIdentifier );
+
+    CleanupStack::PopAndDestroy( subscriptionNodeIdentifier );
+    
+    // Increase also the reference counter by one here.
+    // So, the root ref count is at least one when the user
+    // gets it.
+    if ( subscriptionNode != NULL )
+        {
+        subscriptionNode->AddRef();
+        }
+    
+    DLTRACEOUT((""));
+    
+    return subscriptionNode;
+    }
+
+     
+const TDesC&
+    CNcdPurchaseOptionProxy::ParentSubscriptionPurchaseOptionIdL() const
+    {
+    DLTRACEIN((""));
+    
+    if ( iPartOfSubscriptionComponent == NULL )
+        {
+        User::Leave( KNcdErrorPurchaseOptionNotValidSubscriptionPurchase );
+        }
+
+    DLTRACEOUT((""));
+    return iPartOfSubscriptionComponent->ParentPurchaseOptionId();
+    }
+
+ 
+void CNcdPurchaseOptionProxy::InternalizeDataL( RReadStream& aStream )
+    {
+    DLTRACEIN((""));
+
+    // First read the class id. Because, it is the first thing in the stream.
+    // Actually we do not need that information here.
+    aStream.ReadInt32L();
+
+    InternalizeDesL( iName, aStream );
+    
+    DLTRACE(( _L("Purchaseoption-proxy, name: %S"), iName ));
+    
+    InternalizeDesL( iPriceText, aStream );
+    
+    DLTRACE(( _L("Purchaseoption-proxy, price: %S"), iPriceText ));
+
+    iPrice = aStream.ReadReal32L();
+    InternalizeDesL( iPriceCurrency, aStream );
+    
+    iIsFree = aStream.ReadInt32L();
+    
+    DLTRACE(( "Purchaseoption-proxy, isFree: %d", iIsFree ));
+    
+    InternalizeDesL( iPurchaseOptionId, aStream );
+    
+    DLTRACE(( _L("Purchaseoption-proxy, po-id: %S"), iPurchaseOptionId ));
+
+    iType = static_cast<MNcdPurchaseOption::TType>( aStream.ReadInt32L() );
+    
+    DLTRACE(( _L("Purchaseoption-proxy, type: %d"), iType ));
+    
+    iRequirePurchaseProcess = aStream.ReadInt32L();
+    
+    DLTRACE(( "Purchaseoption-proxy, requirePurchaseProcess: %d",
+              iRequirePurchaseProcess ));
+    
+ 
+    DLTRACE(( "Other data not listed yet." ));
+ 
+
+    // Let's internalize aggregate classes
+
+    TBool subscriptionExists( aStream.ReadInt32L() );
+    if ( subscriptionExists )
+        {
+        delete iSubscriptionComponent;
+        iSubscriptionComponent = NULL;
+        iSubscriptionComponent = CNcdClientSubscription::NewL();
+        
+        iSubscriptionComponent->SetValidityDelta( aStream.ReadInt32L() );
+        iSubscriptionComponent->SetValidityAutoUpdate( aStream.ReadInt32L() );
+        
+        iSubscriptionComponent->SetAmountOfCredits( aStream.ReadReal32L() );
+        
+        HBufC* tmpAmountOfCreditsCurrency( NULL );
+        InternalizeDesL( tmpAmountOfCreditsCurrency, aStream );
+        iSubscriptionComponent->SetAmountOfCreditsCurrency(
+            tmpAmountOfCreditsCurrency );
+                
+        iSubscriptionComponent->SetNumberOfDownloads( aStream.ReadInt32L() );
+
+        }
+    
+    TBool partOfSubscriptionExists( aStream.ReadInt32L() );
+    if ( partOfSubscriptionExists )
+        {
+
+        delete iPartOfSubscriptionComponent;
+        iPartOfSubscriptionComponent = 0;
+        iPartOfSubscriptionComponent = CNcdClientPartOfSubscription::NewL();
+        
+        HBufC* tmpParentEntityId( NULL );
+        InternalizeDesL( tmpParentEntityId, aStream );
+        iPartOfSubscriptionComponent->SetParentEntityId( tmpParentEntityId );
+        
+        HBufC* tmpParentPurchaseOptionId( NULL );
+        InternalizeDesL( tmpParentPurchaseOptionId, aStream );
+        iPartOfSubscriptionComponent->SetParentPurchaseOptionId(
+            tmpParentPurchaseOptionId );
+            
+        iPartOfSubscriptionComponent->SetCreditPrice(
+            aStream.ReadReal32L() );
+
+        }
+        
+    TBool upgradeExists( aStream.ReadInt32L() );
+    if ( upgradeExists )
+        {
+
+        delete iUpgradeComponent;
+        iUpgradeComponent = NULL;
+        iUpgradeComponent = CNcdClientUpgrade::NewL();
+
+        HBufC* tmpDependencyId( NULL );
+        InternalizeDesL( tmpDependencyId, aStream );
+        iUpgradeComponent->SetDependencyId( tmpDependencyId );
+
+        iUpgradeComponent->SetValidityDelta( aStream.ReadInt32L() );
+        iUpgradeComponent->SetAmountOfCredits( aStream.ReadReal32L() );
+        iUpgradeComponent->SetNumberOfDownloads( aStream.ReadInt32L() );
+
+        }
+
+    DLTRACEOUT((""));    
+    }