diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdnodesupplierproxy.cpp --- /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 ); + } + } + }