--- /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 );
+ }
+ }
+ }