ncdengine/provider/server/src/ncdsubscriptiondatacompleter.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/src/ncdsubscriptiondatacompleter.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,251 @@
+/*
+* Copyright (c) 2007 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:   Implements CNcdSubscriptionDataCompleterDataCompleter class
+*
+*/
+
+
+#include "ncdsubscriptiondatacompleter.h"
+
+#include "ncdsubscriptionmanagerimpl.h"
+#include "ncdnodeidentifier.h"
+#include "ncdsubscriptionmanagerobserver.h"
+#include "catalogsdebug.h"
+#include "ncdnodemanager.h"
+#include "ncdsubscriptionimpl.h"
+#include "ncdsubscriptiongroup.h"
+#include "ncdnodemetadataimpl.h"
+#include "ncdnodeiconimpl.h"
+#include "ncdpurchaseoptionimpl.h"
+#include "ncdnodeimpl.h"
+
+
+CNcdSubscriptionDataCompleter::CNcdSubscriptionDataCompleter(
+    CNcdSubscriptionManager& aSubscriptionManager,
+    CNcdNodeManager& aNodeManager,
+    CNcdOperationManager& aOperationManager ) :
+    iSubscriptionManager( aSubscriptionManager ),
+    iNodeManager( aNodeManager ),
+    iOperationManager( aOperationManager )
+    {
+    }
+
+void CNcdSubscriptionDataCompleter::ConstructL()
+    {
+    }
+
+
+CNcdSubscriptionDataCompleter* CNcdSubscriptionDataCompleter::NewL(
+    CNcdSubscriptionManager& aSubscriptionManager,
+    CNcdNodeManager& aNodeManager,
+    CNcdOperationManager& aOperationManager )
+    {
+    CNcdSubscriptionDataCompleter* self =   
+        CNcdSubscriptionDataCompleter::NewLC( aSubscriptionManager,
+                                              aNodeManager,
+                                              aOperationManager );
+    CleanupStack::Pop( self );
+    return self;        
+    }
+
+CNcdSubscriptionDataCompleter* CNcdSubscriptionDataCompleter::NewLC(
+    CNcdSubscriptionManager& aSubscriptionManager,
+    CNcdNodeManager& aNodeManager,
+    CNcdOperationManager& aOperationManager )
+    {
+    CNcdSubscriptionDataCompleter* self = 
+        new( ELeave ) CNcdSubscriptionDataCompleter( aSubscriptionManager,
+                                                     aNodeManager,
+                                                     aOperationManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;        
+    }
+
+CNcdSubscriptionDataCompleter::~CNcdSubscriptionDataCompleter()
+    {
+    DLTRACEIN((""));
+
+    iNodeIds.ResetAndDestroy();
+    delete iPurchaseOptionIds;
+    iPurchaseOptionIds = NULL;
+    
+    iContext = NULL;
+    iInternalizationObserver = NULL;
+
+    DLTRACEOUT((""));
+    }
+
+TInt CNcdSubscriptionDataCompleter::CompleteSubscriptions(
+    TUid aClientUid,
+    RPointerArray<CNcdNodeIdentifier> aNodeIds,
+    MDesCArray* aPurchaseOptionIds,
+    MCatalogsContext* aContext,
+    MNcdSubscriptionManagerObserver* aObserver )
+    {
+    DLTRACEIN((""));
+    iClientUid = aClientUid;    
+    iNodeIds = aNodeIds;
+    iPurchaseOptionIds = aPurchaseOptionIds;
+    iContext = aContext;
+    iInternalizationObserver = aObserver;
+
+    if ( aNodeIds.Count() != iPurchaseOptionIds->MdcaCount() )
+        {
+        return KErrArgument;
+        }
+
+    iIndexer = 0;
+
+
+    ProceedCompletion();
+    
+        
+    DLTRACEOUT((""));
+    return KErrNone;
+    }
+
+void CNcdSubscriptionDataCompleter::ProceedCompletion()
+    {
+    DLTRACEIN((""));
+    const TInt KSubscriptionAmount( iNodeIds.Count() );
+    while ( iIndexer < KSubscriptionAmount )
+        {
+        
+        CNcdNodeIdentifier& currentNodeIdentifier = *iNodeIds[iIndexer];
+        const TDesC& currentPurchaseOptionId =
+            iPurchaseOptionIds->MdcaPoint( iIndexer );
+        
+        TRAPD( error, 
+            {
+            // pointer to current subscription should not be
+            // stored to prevent errors if the subscription is for
+            // some reason deleted
+            CNcdSubscription& currentSubscription =
+                SubscriptionL( currentNodeIdentifier,
+                               currentPurchaseOptionId );
+        
+            if ( SubscriptionIncomplete( currentSubscription ) )
+                {                
+                CNcdNodeMetaData& meta =
+                    iNodeManager.NodeMetaDataL( currentNodeIdentifier );
+
+                CompleteSubscriptionL( currentSubscription,
+                                       meta,
+                                       currentPurchaseOptionId,
+                                       iClientUid );
+                }
+            } );
+        if ( error != KErrNone )
+            {
+            // Nothing to be done, meta data was not found
+            // or some other error situation and could not
+            // complete the subscription info
+            }
+        
+        ++iIndexer;
+        }
+    
+    // All subscriptions completed. Notify and delete this.
+    iSubscriptionManager.NotifyListeners( iClientUid );
+    if ( iInternalizationObserver )
+        {
+        iInternalizationObserver->SubscriptionsInternalizeComplete(
+            KErrNone );
+        }        
+    iSubscriptionManager.SubscriptionCompleted( this );
+    }
+
+void CNcdSubscriptionDataCompleter::CompleteSubscriptionL(
+    CNcdSubscription& aCurrentSubscription,
+    const CNcdNodeMetaData& aCurrentNodeMetaData,
+    const TDesC& aPurchaseOptionId,
+    TUid aClientUid ) const
+    {
+    DLTRACEIN((""));
+    
+    CompleteSubscriptionNameL( aCurrentSubscription, 
+                               aCurrentNodeMetaData,
+                               aPurchaseOptionId );
+
+    TRAPD( error, CompleteSubscriptionIconL(
+                      aCurrentSubscription,
+                      aCurrentNodeMetaData ) );
+    // Leave on error situations. If the meta data does not
+    // have an icon then this is not an error situation.
+    if ( error != KErrNone && error != KErrNotFound )
+        {
+        User::Leave( error );
+        }
+
+    TRAP_IGNORE( iSubscriptionManager.SaveGroupIntoDatabaseL( 
+                     aClientUid,
+                     aCurrentSubscription.ParentGroup() ) );    
+
+    DLTRACEOUT((""));
+    }
+
+
+CNcdSubscription& CNcdSubscriptionDataCompleter::SubscriptionL(
+    const CNcdNodeIdentifier& aNodeIdentifier,
+    const TDesC& aPurchaseOptionId ) const
+    {
+    DLTRACEIN((""));
+    return iSubscriptionManager.SubscriptionL(
+            aNodeIdentifier.NodeId(),
+            aNodeIdentifier.NodeNameSpace(),
+            aPurchaseOptionId,
+            aNodeIdentifier.ClientUid() );
+    }
+
+TBool CNcdSubscriptionDataCompleter::SubscriptionIncomplete(
+    const CNcdSubscription& aSubscription ) const
+    {
+    DLTRACEIN((""));
+    if ( aSubscription.SubscriptionName() == KNullDesC )
+        {
+        return ETrue;
+        }
+    if ( aSubscription.ParentGroup().Icon() == KNullDesC8 )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+void CNcdSubscriptionDataCompleter::CompleteSubscriptionNameL(
+    CNcdSubscription& aSubscription,
+    const CNcdNodeMetaData& aMetaData,
+    const TDesC& aPurchaseOptionId ) const
+    {
+    DLTRACEIN((""));
+    CNcdPurchaseOptionImpl& subscriptionPo =
+        aMetaData.PurchaseOptionByIdL( aPurchaseOptionId );
+    const TDesC& subscriptionName = subscriptionPo.PurchaseOptionName();        
+    aSubscription.SetSubscriptionNameL( subscriptionName );
+    DLTRACEOUT((""));
+    }
+
+void CNcdSubscriptionDataCompleter::CompleteSubscriptionIconL(
+    CNcdSubscription& aSubscription,
+    const CNcdNodeMetaData& aMetaData ) const
+    {
+    DLTRACEIN((""));
+    CNcdNodeIcon& nodeIcon = aMetaData.IconL();
+    HBufC8* icon = nodeIcon.IconDataL();
+    CleanupStack::PushL( icon );
+    aSubscription.ParentGroup().SetIconL( *icon );
+    CleanupStack::PopAndDestroy( icon );
+    DLTRACEOUT((""));
+    }