--- /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 <badesca.h>
+#include <s32strm.h>
+
+#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<TNcdInterfaceId>(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<CNcdNodeProxy*>( 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((""));
+ }