ncdengine/provider/client/src/ncdsubscriptionproxy.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/client/src/ncdsubscriptionproxy.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,442 @@
+/*
+* 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:   Contains CNcdSubscriptionProxy class implementation
+*
+*/
+
+
+#include "ncdsubscriptionproxy.h"
+#include "ncdoperationimpl.h"
+#include "ncddownloadoperationproxy.h"
+#include "ncdoperationmanagerproxy.h"
+#include "ncdoperationdatatypes.h"
+#include "catalogsclientserver.h"
+#include "ncdnodeidentifier.h"
+#include "ncdnodefunctionids.h"
+#include "ncdnodeclassids.h"
+#include "catalogsinterfaceidentifier.h"
+#include "catalogsutils.h"
+#include "ncdsubscriptionoperationproxy.h"
+#include "ncdsubscriptiongroupproxy.h"
+#include "ncdnodemanagerproxy.h"
+#include "ncdnodeproxy.h"
+#include "ncderrors.h"
+
+#include "catalogsdebug.h"
+
+// ======== PUBLIC MEMBER FUNCTIONS ========
+
+CNcdSubscriptionProxy::CNcdSubscriptionProxy(
+    MCatalogsClientServer& aSession,
+    TInt aHandle,
+    CNcdOperationManagerProxy& aOperationManager,
+    CNcdNodeManagerProxy& aNodeManager,
+    CNcdSubscriptionGroupProxy& aParentGroup )
+    : CNcdInterfaceBaseProxy( aSession, aHandle, NULL ),
+      iOperationManager( aOperationManager ),
+      iNodeManager( aNodeManager ),
+      iObsolete( EFalse ),
+      iParentGroup( aParentGroup )
+    {
+    }
+
+
+void CNcdSubscriptionProxy::ConstructL()
+    {
+    // Register the interface
+    MNcdSubscription* interface( this );
+    AddInterfaceL( 
+        CCatalogsInterfaceIdentifier::NewL( interface, this,
+                                            MNcdSubscription::KInterfaceUid ) );
+    
+    // Is it ok if internalization fails here?
+    // Earlier comment: Do not let the internalization leave here.
+    //                  This object may be reinternalized later.
+    InternalizeL();
+    }
+
+
+CNcdSubscriptionProxy* CNcdSubscriptionProxy::NewL(
+    MCatalogsClientServer& aSession,
+    TInt aHandle,
+    CNcdOperationManagerProxy& aOperationManager,
+    CNcdNodeManagerProxy& aNodeManager,
+    CNcdSubscriptionGroupProxy& aParentGroup )
+    {
+    CNcdSubscriptionProxy* self = 
+        CNcdSubscriptionProxy::NewLC( aSession,
+                                      aHandle,
+                                      aOperationManager,
+                                      aNodeManager,
+                                      aParentGroup );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+CNcdSubscriptionProxy* CNcdSubscriptionProxy::NewLC(
+    MCatalogsClientServer& aSession,
+    TInt aHandle,
+    CNcdOperationManagerProxy& aOperationManager,
+    CNcdNodeManagerProxy& aNodeManager,
+    CNcdSubscriptionGroupProxy& aParentGroup )
+    {
+    CNcdSubscriptionProxy* self = 
+        new( ELeave ) CNcdSubscriptionProxy( aSession,
+                                             aHandle,
+                                             aOperationManager,
+                                             aNodeManager,
+                                             aParentGroup );
+    // Using PushL because the object does not have any references yet
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+CNcdSubscriptionProxy::~CNcdSubscriptionProxy()
+    {
+    // Remove interfaces implemented by this class from the interface list.
+    // So, the interface list is up to date when this class object is deleted.
+    RemoveInterface( MNcdSubscription::KInterfaceUid );
+    
+    ResetSubscriptionVariables();
+    }
+
+
+void CNcdSubscriptionProxy::InternalizeL()
+    {
+    DLTRACEIN((""));
+
+    HBufC8* data( NULL );
+        
+    // Because we do not know the exact size of the data, use
+    // the alloc method, which creates the buffer of the right size
+    // and sets the pointer to point to the created buffer.
+    // Get all the data that is necessary to internalize this object
+    // from the server side.
+    User::LeaveIfError(
+        ClientServerSession().
+        SendSyncAlloc( NcdNodeFunctionIds::ENcdInternalize,
+                       KNullDesC8,
+                       data,
+                       Handle(),
+                       0 ) );
+
+    if ( data == NULL )
+        {
+        DLERROR((""));
+        User::Leave(  KErrNotFound );
+        }
+
+     CleanupStack::PushL( data );
+
+     // Read the data from the stream and insert it to the memeber variables
+     RDesReadStream stream( *data );
+     CleanupClosePushL( stream );
+    
+     InternalizeDataL( stream );
+    
+     // Closes the stream
+     CleanupStack::PopAndDestroy( &stream ); 
+     CleanupStack::PopAndDestroy( data );
+     
+    DLTRACEOUT((""));    
+    }
+
+
+void CNcdSubscriptionProxy::SetObsolete()
+    {
+    iObsolete = ETrue;
+    }
+
+TDesC& CNcdSubscriptionProxy::PurchaseOptionId() const
+    {
+    return *iPurchaseOptionId;
+    }
+
+
+// MNcdSubscription functions
+    
+
+const TDesC& CNcdSubscriptionProxy::Name() const
+    {
+    if ( iName == NULL )
+        {
+        return KNullDesC;
+        }
+    
+    return *iName;
+    }
+
+HBufC8* CNcdSubscriptionProxy::IconL() const
+    {
+    DLTRACEIN((""));
+    if ( IsObsolete() )
+        {
+        User::Leave( KNcdErrorObsolete );
+        }
+        
+    return iParentGroup.IconL();
+    }
+
+MNcdSubscription::TStatus CNcdSubscriptionProxy::SubscriptionStatus() const
+    {
+    DLTRACEIN(( _L("Subscription name: %S, subscription poId: %S"),
+                &(Name()),
+                &(PurchaseOptionId()) ));
+
+    if ( iExpiredOn && *iExpiredOn != KNullDesC )
+        {
+        DLINFO(( _L("ExpiredOn: %S"), iExpiredOn ));
+        DLTRACEOUT(("Subscription expired."));
+        return MNcdSubscription::ESubscriptionExpired;
+        }
+
+    if ( iSubscriptionType == MNcdSubscription::EPeriodic ||         
+         ( iSubscriptionType == MNcdSubscription::EAutomaticContinous
+           && iCancelled ) )
+        {
+        if ( iValidityTimeSet )
+            {
+            TTime now;
+            now.HomeTime();
+
+            if ( now > iValidUntil )
+                {
+                DLTRACEOUT(("Subscription expired."));
+                return MNcdSubscription::ESubscriptionExpired;
+                }
+            }
+            
+        if ( iCreditLimitSet )
+            {
+            // This simple compare is deemed to be enough as no
+            // complicated operations are done on the TReal numbers
+            if ( iCreditsLeft <= 0 )
+                {
+                DLTRACEOUT(("Subscription expired."));
+                return MNcdSubscription::ESubscriptionExpired;
+                }
+            }
+            
+        if ( iDownloadLimitSet )
+            {
+            if ( iDownloadsLeft <= 0 )
+                {
+                DLTRACEOUT(("Subscription expired."));
+                return MNcdSubscription::ESubscriptionExpired;
+                }
+            }
+        }
+    
+
+    // If we get here the subscription is not expired. Because
+    // subscription like this is created when it is bought,
+    // it cannot be in ENotSubscribed state. So the only alternative
+    // left is ESubscriptionActive.
+    DLTRACEOUT(("Subscription active."));
+    return MNcdSubscription::ESubscriptionActive;
+    }
+
+TBool CNcdSubscriptionProxy::IsObsolete() const
+    {
+    return iObsolete;
+    }
+
+TBool CNcdSubscriptionProxy::Unsubscribed() const
+    {
+    return iCancelled;
+    }
+
+MNcdSubscriptionOperation* CNcdSubscriptionProxy::UnsubscribeL( 
+        MNcdSubscriptionOperationObserver& aObserver )
+    {
+    DLTRACEIN((""));
+
+    if ( IsObsolete() )
+        {
+        User::Leave( KNcdErrorObsolete );
+        }
+        
+    CNcdSubscriptionOperationProxy* operation( NULL );
+
+    operation =
+        iOperationManager.CreateSubscriptionUnsubscribeOperationL(
+            PurchaseOptionId(),
+            iParentGroup.EntityId(),
+            iParentGroup.Namespace(),
+            iParentGroup.ServerUri(),
+            aObserver );
+
+    DLTRACEOUT((""));
+
+    return operation;
+    }
+
+MNcdSubscription::TType CNcdSubscriptionProxy::SubscriptionType() const
+    {
+    return iSubscriptionType;
+    }
+
+TBool CNcdSubscriptionProxy::ValidityTime( TTime& aValidUntil ) const
+    {
+    if ( !iValidityTimeSet )
+        {
+        return EFalse;
+        }        
+    aValidUntil = iValidUntil;
+
+    return ETrue;
+    }
+
+TBool CNcdSubscriptionProxy::CreditLimit( TReal& aCreditsLeft,
+                                          TReal& aTotalCredits ) const
+    {
+    if ( !iCreditLimitSet )
+        {
+        return EFalse;
+        }
+    aCreditsLeft = iCreditsLeft;
+    aTotalCredits = iTotalCredits;
+       
+    return ETrue;
+    }
+
+TBool CNcdSubscriptionProxy::DownloadLimit( TInt& aDownloadsLeft,
+                                            TInt& aTotalDownloads) const
+    {
+    if ( !iDownloadLimitSet )
+        {
+        return EFalse;
+        }
+    aDownloadsLeft = iDownloadsLeft;
+    aTotalDownloads = iTotalDownloads;
+       
+    return ETrue;
+    }
+
+MNcdNode* CNcdSubscriptionProxy::OriginNodeL() const
+    {
+    DLTRACEIN((""));
+
+    if ( IsObsolete() )
+        {
+        User::Leave( KNcdErrorObsolete );
+        }
+
+    const CNcdNodeIdentifier& groupIdentifier = iParentGroup.Identifier();
+
+    // Notice that this function takes the metadataidentifier as a parameter.    
+    MNcdNode* subscriptionNode = 
+        &iNodeManager.CreateTemporaryOrSupplierNodeL( groupIdentifier );
+    
+    // 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& CNcdSubscriptionProxy::OriginPurchaseOptionId() const
+    {
+    return PurchaseOptionId();
+    }
+
+
+
+// Other functions
+
+CNcdOperationManagerProxy& CNcdSubscriptionProxy::OperationManager() const
+    {
+    return iOperationManager;
+    }
+
+
+
+void CNcdSubscriptionProxy::InternalizeDataL( RReadStream& aStream )
+    {
+    DLTRACEIN(("Internalizing subscription proxy"));
+
+    ResetSubscriptionVariables();
+
+    InternalizeDesL( iName, aStream );
+    DLINFO(( _L("Subscription proxy, name: %S"), iName ));
+    InternalizeDesL( iExpiredOn, aStream );
+    
+    iCancelled = aStream.ReadInt32L();
+
+    iSubscriptionType = 
+        static_cast<MNcdSubscription::TType>(aStream.ReadInt32L());
+
+    iValidityTimeSet = aStream.ReadInt32L();
+    DLINFO(( "Subscription proxy, validitytimeset: %d", iValidityTimeSet ));
+    TInt64 intValidUntil( -1 );
+    aStream >> intValidUntil;
+    iValidUntil = intValidUntil;
+    TInt totalValidityDelta = aStream.ReadInt32L(); // Not needed here
+    DLINFO(( "Subscription proxy, validitydelta: %d", totalValidityDelta ));
+    
+    iCreditLimitSet = aStream.ReadInt32L();
+    iCreditsLeft = aStream.ReadReal32L();
+    DLINFO(( "Subscription proxy, credits left: %f", iCreditsLeft ));
+    iTotalCredits = aStream.ReadReal32L();
+    DLINFO(( "Subscription proxy, total credits: %f", iTotalCredits ));
+
+    iDownloadLimitSet = aStream.ReadInt32L();
+    iDownloadsLeft = aStream.ReadInt32L();
+    DLINFO(( "Subscription proxy, downloads left: %d", iDownloadsLeft ));
+    iTotalDownloads = aStream.ReadInt32L();
+    DLINFO(( "Subscription proxy, total downloads: %d", iTotalDownloads ));
+
+    InternalizeDesL( iPurchaseOptionId, aStream );
+    
+    DLINFO(( _L("Subscription proxy, purchaseoptionid: %S"),
+              iPurchaseOptionId ));
+              
+    DLTRACEOUT((""));
+    }
+
+
+void CNcdSubscriptionProxy::ResetSubscriptionVariables()
+    {
+    delete iName;
+    iName = NULL;
+    
+    delete iExpiredOn;
+    iExpiredOn = NULL;
+    
+    iCancelled = EFalse;
+    
+    iSubscriptionType = MNcdSubscription::EPeriodic;
+    
+    iValidityTimeSet = EFalse;
+    iValidUntil = -1;
+    
+    iCreditLimitSet = EFalse;
+    iCreditsLeft = -1;
+    iTotalCredits = -1;
+    
+    iDownloadLimitSet = EFalse;
+    iDownloadsLeft = -1;
+    iTotalDownloads = -1;
+    
+    delete iPurchaseOptionId;
+    iPurchaseOptionId = NULL;
+    
+    }