contentcontrolsrv/ccsrv/src/ccsrvsession.cpp
changeset 0 79c6a41cd166
child 11 bd874ee5e5e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentcontrolsrv/ccsrv/src/ccsrvsession.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,563 @@
+/*
+ * Copyright (c) 2008 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:  
+ *
+ */
+
+// System include files
+#include <s32strm.h>
+#include <s32mem.h>
+
+// User include files
+#include "ccsrvsession.h"
+#include "ccsrv.h"
+#include "ccresource.h"
+#include "ccsrvapi.h"
+
+// Local constants
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::CCcSrvSession()
+// -----------------------------------------------------------------------
+//
+CCcSrvSession::CCcSrvSession():
+    iLastTrId( 0 )
+    {
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::~CCcSrvSession()
+// -----------------------------------------------------------------------
+//
+CCcSrvSession::~CCcSrvSession()
+    {
+    iRequests.ResetAndDestroy();
+    iObservers.Close();
+    Server().DropSession( this );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::CreateL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::CreateL()
+    {
+    Server().AddSessionL( this );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::Id()
+// -----------------------------------------------------------------------
+//
+TUint32 CCcSrvSession::Id()
+    {
+    return iId;
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::SetId()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::SetId(
+    TUint32 aId )
+    {
+    iId = aId;
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::ServiceL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::ServiceL(
+    const RMessage2& aMessage )
+    {
+    RMessage2 msg = aMessage;
+    TRAPD( err, DoServiceL( msg ) );
+    if ( err )
+        {
+        aMessage.Complete( err );
+        }
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::DoServiceL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::DoServiceL(
+    RMessage2& aMessage )
+    {
+    switch ( aMessage.Function() )
+        {
+        case ECcReqisterProvider:
+            HandleRegisterProviderL( aMessage );
+            break;
+        case ECcRegisterObserver:
+            HandleRegisterObserverL( aMessage );
+            break;
+        case ECcWaitForApiReq:
+            HandleWaitForApiReqL( aMessage );
+            break;
+        case ECcWaitForApiNtf:
+            HandleWaitForApiNtfL( aMessage );
+            break;
+        case ECcCancel:
+            HandleCancelReqL( aMessage );
+            break;
+        case ECcApiReq:
+            HandleApiReqL( aMessage );
+            break;
+        case ECcApiResp:
+            HandleApiRespL( aMessage );
+            break;
+        case ECcGetMsgData:
+            HandleGetMsgDataL( aMessage );
+            break;
+        case ECcApiNtf:
+            HandleApiNtfL( aMessage );
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleRegisterProviderL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleRegisterProviderL(
+    RMessage2& aMessage )
+    {
+    TUint32 provider;
+    TPckgBuf<TUint32> packagedProvider;    
+    aMessage.ReadL(0, packagedProvider);                        
+    provider = packagedProvider();
+    
+    Server().RegisterProviderL(
+        provider,
+        this );
+    
+    TPckgBuf<TUint32> packagedSessionId( iId );
+    aMessage.WriteL( 1, packagedSessionId );
+    aMessage.Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleRegisterObserverL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleRegisterObserverL(
+    RMessage2& aMessage )
+    {
+    TUint32 provider;
+    TPckgBuf<TUint32> packagedProvider;    
+    aMessage.ReadL(0, packagedProvider);                        
+    provider = packagedProvider();
+    
+    Server().RegisterObserverL(
+        provider,
+        this );
+    
+    TPckgBuf<TUint32> packagedSessionId( iId );
+    aMessage.WriteL( 1, packagedSessionId );
+    aMessage.Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::RegisterObserverSessionL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::RegisterObserverSessionL(
+    TUint32 aObserver )
+    {
+    // Notify provider of registered observer
+    SendObserverNtfL( aObserver, ECcRegisterObserverNtf );
+    iObservers.AppendL( aObserver );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::UnregisterObserverSessionL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::UnregisterObserverSessionL(
+    TUint32 aObserver )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        if ( iObservers[ i ] == aObserver )
+            {
+            // Notify provider of unregistered observer
+            SendObserverNtfL( aObserver, ECcUnregisterObserverNtf );
+            iObservers.Remove( i );
+            break;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleWaitForApiReqL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleWaitForApiReqL(
+    RMessage2& aMessage )
+    {
+    CCcSrvMsg* tr = CCcSrvMsg::NewL();
+    CleanupStack::PushL( tr );
+    tr->SetMessage( aMessage );
+    iRequests.AppendL( tr );
+    CleanupStack::Pop( tr );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleWaitForApiNtfL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleWaitForApiNtfL(
+    RMessage2& aMessage )
+    {
+    CCcSrvMsg* tr = CCcSrvMsg::NewL();
+    CleanupStack::PushL( tr );
+    tr->SetMessage( aMessage );
+    iRequests.AppendL( tr );
+    CleanupStack::Pop( tr );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleCancelReqL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleCancelReqL(
+    RMessage2& aMessage )
+    {
+    TInt function;
+    TPckgBuf<TInt> packagedFunction;    
+    aMessage.ReadL( 0, packagedFunction );                        
+    function = packagedFunction();
+    
+    for ( TInt i = 0; i < iRequests.Count(); i++ )
+        {
+        CCcSrvMsg* req = iRequests[ i ];
+        if ( req->Message().Function() == function &&
+             !req->Message().IsNull() )
+            {
+            // Complete canceled request
+            req->Message().Complete( KErrCancel );
+            iRequests.Remove( i );
+            delete req;
+            }
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleApiReqL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleApiReqL(
+    RMessage2& aMessage )
+    {
+    TUint32 provider;
+    TPckgBuf<TUint32> packagedProvider;    
+    aMessage.ReadL( 0, packagedProvider );                        
+    provider = packagedProvider();
+    TUint32 providerAddress;
+    Server().ResolveProviderAddressL( provider, providerAddress );
+
+    HBufC8* msgBuf = HBufC8::NewL( aMessage.GetDesLengthL( 3 ) );
+    CleanupStack::PushL( msgBuf );
+    TPtr8 msgBufPtr = msgBuf->Des();
+    aMessage.ReadL( 3, msgBufPtr, 0 );
+    
+    RDesReadStream stream( msgBufPtr );
+    
+    CCcSrvMsg* message = CCcSrvMsg::NewL();
+    CleanupStack::PushL( message );
+    message->InternalizeL( stream );
+    message->SetTrId( Server().GetTrId() );
+    message->SetMessage( aMessage );
+    
+    Server().SendMsgL( iId, providerAddress, *message );
+
+    iRequests.AppendL( message );
+    
+    CleanupStack::Pop( message );    
+    CleanupStack::PopAndDestroy( msgBuf );
+        
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleApiReqL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleApiRespL(
+    RMessage2& aMessage )
+    {
+    // Read sender and receiver of a response
+    TPckgBuf<TUint32> pckg;    
+    aMessage.ReadL( 1, pckg );                        
+    TUint32 sender = pckg();
+    aMessage.ReadL( 2, pckg );                        
+    TUint32 receiver = pckg();
+    
+    // Read message data
+    HBufC8* msgBuf = HBufC8::NewL( aMessage.GetDesLengthL( 3 ) );
+    CleanupStack::PushL( msgBuf );
+    TPtr8 msgBufPtr = msgBuf->Des();
+    aMessage.ReadL( 3, msgBufPtr, 0 );
+    
+    // Internalize message
+    RDesReadStream stream( msgBufPtr );
+    CCcSrvMsg* message = CCcSrvMsg::NewL();
+    CleanupStack::PushL( message );
+    message->InternalizeL( stream );
+    message->SetMessage( aMessage );
+    
+    // Forward message to receiver
+    Server().SendMsgL( sender, receiver, *message );
+
+    CleanupStack::PopAndDestroy( message );    
+    CleanupStack::PopAndDestroy( msgBuf );
+
+    aMessage.Complete( KErrNone );
+
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleGetMsgDataL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleGetMsgDataL(
+    RMessage2& aMessage )
+    {
+    // Read sender and receiver of a response
+    TPckgBuf<TUint32> pckg;    
+    aMessage.ReadL( 0, pckg );                        
+    TUint32 trId = pckg();
+    
+    CCcSrvMsg* req( NULL );
+    TInt index( 0 );
+    for( TInt i = 0; i < iRequests.Count() && !req; i++ )
+        {
+        if ( iRequests[ i ]->TrId() == trId )
+            {
+            req = iRequests[ i ];
+            index = i;
+            }
+        }
+    
+    TInt err( KErrNone );
+    if ( req )
+        {
+        // Write message data
+        aMessage.WriteL( 1, req->Data(), 0);
+        // Remove request
+        iRequests.Remove( index );
+        delete req;
+        }
+    else
+        {
+        err = KErrNotFound;
+        }
+    
+    aMessage.Complete( err );
+
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::HandleApiNtfL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::HandleApiNtfL(
+    RMessage2& aMessage )
+    {
+    // Read notification data
+    HBufC8* msgBuf = HBufC8::NewL( aMessage.GetDesLengthL( 3 ) );
+    CleanupStack::PushL( msgBuf );
+    TPtr8 msgBufPtr = msgBuf->Des();
+    aMessage.ReadL( 3, msgBufPtr, 0 );
+    
+    // Internalize notification
+    RDesReadStream stream( msgBufPtr );
+    CCcSrvMsg* message = CCcSrvMsg::NewL();
+    CleanupStack::PushL( message );
+    message->InternalizeL( stream );
+    message->SetMessage( aMessage );
+
+    // Forward notification to observers
+    for ( TInt i = 0; i < iObservers.Count(); i++ )
+        {
+        Server().SendMsgL( iId, iObservers[ i ], *message );
+        }
+    
+    message->Message().Complete( KErrNone );
+    
+    CleanupStack::PopAndDestroy( message );
+    CleanupStack::PopAndDestroy( msgBuf );
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::ReceiveMsgL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::ReceiveMsgL(
+    TUint32 aSender,
+    TUint32 aReceiver,
+    CCcSrvMsg& aMessage )
+    {
+    TBool found( EFalse );
+    CCcSrvMsg* req( NULL );
+    TInt index( 0 );
+    for ( TInt i = 0; i < iRequests.Count() && !found; i++ )
+        {
+        req = iRequests[ i ];
+        if ( aMessage.Message().Function() == ECcApiReq &&
+             req->Message().Function() == ECcWaitForApiReq &&  
+             !req->Message().IsNull() )
+            {
+            // Pending WaitForApiReq transaction found
+            index = i;
+            found = ETrue;
+            }
+        else if ( aMessage.Message().Function() == ECcApiResp &&
+                  req->TrId() == aMessage.TrId() )
+            {
+            // Pending ApiReq transaction found
+            index = i;
+            found = ETrue;
+            }
+        else if ( aMessage.Message().Function()  == ECcApiNtf &&
+                  req->Message().Function() == ECcWaitForApiNtf &&
+                  !req->Message().IsNull() )
+            {
+            // Pending WaitForApiNtf transaction found
+            index = i;
+            found = ETrue;
+            }
+        }
+    
+    if ( found )
+        {
+        // Write sender of message
+        TPckgBuf<TUint32> packagedSender( aSender );
+        req->Message().WriteL( 1, packagedSender, 0 );
+        
+        // Write receiver of message
+        TPckgBuf<TUint32> packagedReceiver( aReceiver );
+        req->Message().WriteL( 2, packagedReceiver, 0 );
+        
+        // Externalize message header
+        CBufFlat* buf = CBufFlat::NewL( KCcHeaderSize );
+        CleanupStack::PushL( buf );
+        RBufWriteStream stream( *buf );
+        CleanupClosePushL( stream );
+        aMessage.ExternalizeHeaderL( stream );
+        CleanupStack::PopAndDestroy( &stream );
+        
+        //Create a heap descriptor from the buffer
+        HBufC8* des = HBufC8::NewL( buf->Size() );
+        CleanupStack::PushL( des );
+        TPtr8 ptr( des->Des() );
+        buf->Read( 0, ptr, buf->Size() );
+        
+        // Write request header
+        req->Message().WriteL( 3, ptr, 0);
+        CleanupStack::PopAndDestroy( des );
+        CleanupStack::PopAndDestroy( buf );
+        
+        // Complete request
+        req->Message().Complete( KErrNone );
+        if (  aMessage.DataSize() )
+            {
+            // Store request data to be read later
+            // with GetMsgData()
+            req->SetTrId( aMessage.TrId() );
+            req->SetData( aMessage.Data() );
+            }
+        else
+            {
+            // Received request does not contain any data
+            // -> remove it from request array
+            iRequests.Remove( index );
+            delete req;
+            }
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }    
+    }
+
+// -----------------------------------------------------------------------
+// CCcSrvSession::SendObserverNtfL()
+// -----------------------------------------------------------------------
+//
+void CCcSrvSession::SendObserverNtfL(
+    TUint32 aSender,
+    TUint32 aNtf )
+    {
+    // Notify provider of registered observer
+    TBool found( EFalse );
+    CCcSrvMsg* req( NULL );
+    TInt index( 0 );
+    for ( TInt i = 0; i < iRequests.Count() && !found; i++ )
+        {
+        req = iRequests[ i ];
+        if ( req->Message().Function() == ECcWaitForApiReq &&
+             !req->Message().IsNull() )
+            {
+            // Pending WaitForApiReq transaction found
+            index = i;
+            found = ETrue;
+            }
+        }
+    if ( found )
+        {
+        // Write sender of message
+        TPckgBuf<TUint32> packagedSender( aSender );
+        req->Message().WriteL( 1, packagedSender, 0 );
+        
+        // Write receiver of message
+        TPckgBuf<TUint32> packagedReceiver( iId );
+        req->Message().WriteL( 2, packagedReceiver, 0 );
+        
+        // Externalize notification
+        CCcSrvMsg* ntf = CCcSrvMsg::NewL();
+        CleanupStack::PushL( ntf );
+        ntf->SetMsgId( aNtf );
+        HBufC8* ntfBuf = ntf->MarshalL();
+        CleanupStack::PushL( ntfBuf );
+        TPtr8 ntfPtr( NULL, 0);
+        ntfPtr.Set( ntfBuf->Des() );
+        
+        // Write request header
+        req->Message().WriteL( 3, ntfPtr, 0);
+        CleanupStack::PopAndDestroy( ntfBuf );
+        CleanupStack::PopAndDestroy( ntf );
+        
+        // Complete request
+        req->Message().Complete( KErrNone );
+        iRequests.Remove( index );
+        delete req;
+
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    }
+
+// End of file