ncdengine/provider/client/src/ncdnodesupplierproxy.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/client/src/ncdnodesupplierproxy.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,173 @@
+/*
+* 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 CNcdNodeSupplierProxy class
+*
+*/
+
+
+#include "ncdnodesupplierproxy.h"
+#include "ncdnodemanagerproxy.h"
+#include "catalogsdebug.h"
+#include "ncderrors.h"
+
+CNcdNodeSupplierProxy* CNcdNodeSupplierProxy::NewLC(
+    MCatalogsClientServer& aSession,
+    TInt aHandle, 
+    CNcdNodeManagerProxy& aNodeManager,
+    CNcdOperationManagerProxy& aOperationManager,
+    CNcdFavoriteManagerProxy& aFavoriteManager ) 
+    {
+    DLTRACEIN((""));
+    CNcdNodeSupplierProxy* self = new ( ELeave ) CNcdNodeSupplierProxy(
+        aSession, aHandle, aNodeManager, aOperationManager, aFavoriteManager );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+    
+
+CNcdNodeSupplierProxy::CNcdNodeSupplierProxy(
+    MCatalogsClientServer& aSession,
+    TInt aHandle, 
+    CNcdNodeManagerProxy& aNodeManager,
+    CNcdOperationManagerProxy& aOperationManager,
+    CNcdFavoriteManagerProxy& aFavoriteManager ) :
+    CNcdNodeProxy( aSession, aHandle, aNodeManager, aOperationManager, aFavoriteManager ) 
+    {
+    }
+
+
+CNcdNodeSupplierProxy::~CNcdNodeSupplierProxy()
+    {
+    if ( iActualNode != NULL )
+        {
+        // No need to call Release here. We, can just directly delete the actual node.
+        // This is because, this class was set as a parent for the actual node. So,
+        // when this class is deleted, also reference counts of its children are zero.
+        // And, so they can also be deleted. The destructor, of the CNcdNodeProxy parent class 
+        // will automatically inform the nodemanager that these nodes can be removed from 
+        // the cache.
+        delete iActualNode;
+        iActualNode = NULL;
+        }
+    }
+
+
+MNcdNode::TState CNcdNodeSupplierProxy::State() const
+    {
+    DLTRACEIN((""));
+    if ( iActualNode ) 
+        {
+        return iActualNode->State();
+        }
+    else 
+        {
+        return MNcdNode::EStateNotInitialized;
+        }
+    }
+
+const TDesC& CNcdNodeSupplierProxy::CatalogSourceName() const 
+    {
+    DLTRACEIN((""));
+    if ( iActualNode ) 
+        {
+        return iActualNode->CatalogSourceName();
+        }
+    else 
+        {
+        return CNcdNodeProxy::CatalogSourceName();
+        }
+    }
+    
+MNcdNodeContainer* CNcdNodeSupplierProxy::ParentL() const 
+    {
+    DLTRACEIN((""));
+    if ( iActualNode ) 
+        {
+        return iActualNode->ParentL();
+        }
+    else 
+        {
+        return CNcdNodeProxy::ParentL();
+        }
+    }
+    
+
+MNcdLoadNodeOperation* CNcdNodeSupplierProxy::LoadL(
+    MNcdLoadNodeOperationObserver& aObserver ) 
+    {
+    DLTRACEIN((""));
+    if ( iActualNode ) 
+        {
+        return iActualNode->LoadL( aObserver );
+        }
+    else 
+        {
+        return CNcdNodeProxy::LoadL( aObserver );
+        }
+    }
+    
+
+RCatalogsArray< MNcdOperation > CNcdNodeSupplierProxy::OperationsL() const 
+    {
+    DLTRACEIN((""));
+    if ( iActualNode ) 
+        {
+        return iActualNode->OperationsL();
+        }
+    else 
+        {
+        return CNcdNodeProxy::OperationsL();
+        }
+    }
+    
+void CNcdNodeSupplierProxy::OperationComplete(
+    MNcdLoadNodeOperation& /*aOperation*/, TInt aError ) 
+    {
+    DLTRACEIN((""));
+
+    if ( iActualNode != NULL )
+        {
+        DLINFO(("iActualNode has already been created. Nothing to do here."))
+        return;
+        }
+        
+    if ( aError == KErrNone || aError == KNcdErrorSomeCatalogsFailedToLoad )
+        {
+        DLINFO(("Set iActualNode"))
+
+        // The actual node is loaded and can be requested from nodemanager.
+        // This will replace the supplier node with the temporary node in nodemanager cache.
+        // After that, if nodemanager is asked for the node, the temporary node is directly
+        // given. But, if this node is used then this will forward, the requests to that temporary
+        // node
+        TRAPD( err, iActualNode = &NodeManager().ReplaceCacheNodeL( NodeIdentifier() ) );
+        (void) &err; // prevents compiler warning of unreferenced variable
+
+        // The actual node should always be created in server side if we come here.
+        // So, above should have found it.
+        DASSERT( err == KErrNone );
+        
+        if ( iActualNode != NULL )
+            {
+            // SetParentL is a safe call here because nodes are top level parents
+            // as the default value. So, we can safely set a new parent for the
+            // actual node. Notice, that this setting will insert the interfaces from
+            // the actual node to this node. So, for example MNcdNode-interface pointer
+            // will be replaced by the interface pointer of the actual node gotten above.
+            TRAP(err, iActualNode->SetParentL( this ) );
+            DASSERT( err == KErrNone );
+            }
+        }
+    }