diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdloadnodeoperationproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/client/src/ncdloadnodeoperationproxy.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,390 @@ +/* +* 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: CNcdLoadNodeOperationProxy class implementation +* +*/ + + +#include +#include + +#include "ncdloadnodeoperationproxy.h" +#include "ncdloadnodeoperationobserver.h" +#include "ncdoperationfunctionids.h" +#include "catalogsdebug.h" +#include "catalogsclientserver.h" +#include "ncdnodeidentifier.h" +#include "ncdnodeproxy.h" +#include "ncdnodemanagerproxy.h" +#include "ncdoperationproxyremovehandler.h" +#include "ncdqueryimpl.h" +#include "ncdproviderdefines.h" +#include "ncdnodefolderproxy.h" +#include "ncdsearchrootnodeproxy.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdLoadNodeOperationProxy* CNcdLoadNodeOperationProxy::NewL( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager, + TBool aSearch, + MNcdClientLocalizer* aLocalizer ) + { + CNcdLoadNodeOperationProxy* self = CNcdLoadNodeOperationProxy::NewLC( + aSession, + aHandle, + aRemoveHandler, + aNode, + aNodeManager, + aSearch, + aLocalizer ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdLoadNodeOperationProxy* CNcdLoadNodeOperationProxy::NewLC( + MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager, + TBool aSearch, + MNcdClientLocalizer* aLocalizer ) + { + CNcdLoadNodeOperationProxy* self = + new( ELeave ) CNcdLoadNodeOperationProxy( aSearch, aLocalizer ); + self->AddRef(); + CleanupReleasePushL( *self ); + self->ConstructL( aSession, aHandle, aRemoveHandler, aNode, aNodeManager ); + return self; + } + +// --------------------------------------------------------------------------- +// From MNcdLoadNodeOperation +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::AddObserverL( + MNcdLoadNodeOperationObserver* aObserver ) + { + DLTRACEIN(("adding observer: %d", aObserver )); + iObservers.AppendL( aObserver ); + } + +// --------------------------------------------------------------------------- +// From MNcdLoadNodeOperation +// ?implementation_description +// --------------------------------------------------------------------------- +// +TInt CNcdLoadNodeOperationProxy::RemoveObserver( + MNcdLoadNodeOperationObserver* aObserver ) + { + DLTRACEIN(("")); + TInt index = iObservers.Find( aObserver ); + if ( index != KErrNotFound ) + { + DLINFO(("removing observer: %d", iObservers[ index ] )); + iObservers.Remove( index ); + return KErrNone; + } + else + { + return KErrNotFound; + } + } + +// --------------------------------------------------------------------------- +// From MNcdConfigurationData +// ?implementation_description +// --------------------------------------------------------------------------- +// +HBufC8* CNcdLoadNodeOperationProxy::ProtocolResponseDataL() + { + HBufC8* buf(NULL); + // Get the configuration response data from server side operation. + User::LeaveIfError( ClientServerSession().SendSyncAlloc( ENCDOperationFunctionGetData, + SendBuf8L(), + buf, + Handle(), + 0 ) ); + + return buf; + } + +// --------------------------------------------------------------------------- +// From MCatalogsBase +// ?implementation_description +// --------------------------------------------------------------------------- +// +TNcdInterfaceId CNcdLoadNodeOperationProxy::OperationType() const + { + return static_cast(MNcdLoadNodeOperation::KInterfaceUid); + } + +MNcdNodeContainer* CNcdLoadNodeOperationProxy::SearchRootNodeL() + { + CNcdSearchRootNodeProxy* searchRoot = &iNodeManager->SearchRootNodeL(); + searchRoot->AddRef(); + return searchRoot; + } + +const TAny* CNcdLoadNodeOperationProxy::QueryInterfaceL( TInt aInterfaceId ) const + { + const TAny* result = NULL; + switch( aInterfaceId ) + { + case MNcdSearchOperation::KInterfaceUid: + { + if( iSearch ) + { + result = static_cast< const MNcdSearchOperation* >( this ); + } + break; + } + case MNcdLoadNodeOperation::KInterfaceUid: + { + result = static_cast< const MNcdLoadNodeOperation* >( this ); + break; + } + case MNcdOperation::KInterfaceUid: + { + result = static_cast< const MNcdOperation* >( this ); + break; + } + case MCatalogsBase::KInterfaceUid: + { + result = static_cast< const MCatalogsBase* >( this ); + break; + } + case MNcdConfigurationData::KInterfaceUid: + { + if ( NodeProxy()->NodeIdentifier().NodeNameSpace() == + NcdProviderDefines::KRootNodeNameSpace ) + { + result = static_cast< const MNcdConfigurationData* >( this ); + } + break; + } + default: + { + break; + } + } + + if( result != NULL ) + { + AddRef(); + } + + return result; + } + + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdLoadNodeOperationProxy::CNcdLoadNodeOperationProxy( + TBool aSearch, MNcdClientLocalizer* aLocalizer ) +: CNcdOperation< MNcdSearchOperation>( aLocalizer ), iSearch( aSearch ) + { + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +CNcdLoadNodeOperationProxy::~CNcdLoadNodeOperationProxy() + { + DLTRACEIN(("")); + iLoadedNodes.ResetAndDestroy(); + DASSERT( iRemoveHandler ); + if ( iRemoveHandler ) + { + DLTRACE(("Removing proxy from remove handler")); + iRemoveHandler->RemoveOperationProxy( *this ); + } + iObservers.Reset(); + + DLTRACEOUT(("")); + } + +// --------------------------------------------------------------------------- +// ?description_if_needed +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::ConstructL( MCatalogsClientServer& aSession, + TInt aHandle, + MNcdOperationProxyRemoveHandler* aRemoveHandler, + CNcdNodeProxy* aNode, + CNcdNodeManagerProxy* aNodeManager ) + { + // first call parent's ConstructL + CNcdBaseOperationProxy::ConstructL( aSession, + aHandle, + aRemoveHandler, + aNode, + aNodeManager ); + iNodeManager = aNodeManager; + } + +// --------------------------------------------------------------------------- +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::HandleCompletedMessage( + TNcdOperationMessageCompletionId aCompletionId, + RReadStream& aReadStream, + TInt aDataLength ) + { + DLTRACEIN((_L("aCompletionId =%d, aDataLength =%d"), aCompletionId, + aDataLength)); + switch ( aCompletionId ) + { + case ENCDOperationMessageCompletionNodesUpdated: + { + DLTRACE(("ENCDOperationMessageCompletionNodesUpdated")); + TRAPD(err, + { + TNcdSendableProgress progress; + progress.InternalizeL( aReadStream ); + TInt nodeIdCount = aReadStream.ReadInt32L(); + iLoadedNodes.ResetAndDestroy(); + for ( TInt i = 0 ; i < nodeIdCount ; i++ ) + { + CNcdNodeIdentifier* nodeId = CNcdNodeIdentifier::NewLC( + aReadStream ); + DLINFO( (_L("Updated node: %S"), &nodeId->NodeId() ) ); + iLoadedNodes.AppendL( nodeId ); + CleanupStack::Pop( nodeId ); + } + SendContinueMessageL(); + }); //TRAPD + aReadStream.Close(); + if ( err == KErrNone ) + { + ProgressCallback(); + } + else + { + CompleteCallback( err ); + } + DLTRACE(("ENCDOperationMessageCompletionNodesUpdated done")); + break; + } + default: + { + CNcdBaseOperationProxy::HandleCompletedMessage( aCompletionId, + aReadStream, + aDataLength ); + break; + } + } + DLTRACEOUT(("")); + } + +// --------------------------------------------------------------------------- +// From CNcdBaseOperationProxy +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::ProgressCallback() + { + DLTRACEIN(("")); + DPROFILING_BEGIN( x ); + RCatalogsArray< MNcdNode > array; + for ( TInt j = 0 ; j < iLoadedNodes.Count() ; j++ ) + { + DLINFO((_L("Trying to get loaded node: namespace=%S, id=%S"), + &iLoadedNodes[j]->NodeNameSpace(), &iLoadedNodes[j]->NodeId() )); + TRAPD( err, + { + CNcdNodeProxy& node = iNodeManager->NodeL( *iLoadedNodes[j] ); + node.OperationComplete( *this, KErrNone ); + array.AppendL( &node ); + node.InternalAddRef(); + }); // TRAPD + if ( err != KErrNone ) + { + DLINFO(( "error: %d", err )); + } + } + + if ( array.Count() < 1 ) + { + DLINFO(("error: couldn't get loaded nodes from nodemanager!")); + //return; + } + + for ( TInt i = 0 ; i < iObservers.Count() ; i++ ) + { + DASSERT( iObservers[i] ); + iObservers[i]->NodesUpdated( *this, array ); + } + for ( TInt i = 0 ; i < array.Count() ; i++ ) + { + static_cast( array[i] )->InternalRelease(); + } + array.Close(); + DPROFILING_END( x ); + DLTRACEOUT(("")); + } + +// --------------------------------------------------------------------------- +// From CNcdBaseOperationProxy +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::QueryReceivedCallback( CNcdQuery* aQuery ) + { + DLTRACEIN(("")); + for ( TInt i = 0 ; i < iObservers.Count() ; i++ ) + { + aQuery->AddRef(); + iObservers[i]->QueryReceived( *this, aQuery ); + } + DLTRACEOUT(("")); + } + +// --------------------------------------------------------------------------- +// From CNcdBaseOperationProxy +// ?implementation_description +// --------------------------------------------------------------------------- +// +void CNcdLoadNodeOperationProxy::CompleteCallback( TInt aError ) + { + DLTRACEIN(( "err: %d", aError )); + DPROFILING_BEGIN( x ); + AddRef(); + for ( TInt i = 0 ; i < iObservers.Count() ; i++ ) + { + DLINFO(("Calling observer: %x", iObservers[i] )); + iObservers[i]->OperationComplete( *this, aError ); + } + Release(); + DPROFILING_END( x ); + DLTRACEOUT(("")); + }