ncdengine/provider/client/src/ncdloadnodeoperationproxy.cpp
changeset 0 ba25891c3a9e
--- /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((""));    
+    }