accessoryservices/accessoryserver/src/Server/AccSrvMainSession.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/Server/AccSrvMainSession.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,630 @@
+/*
+* Copyright (c) 2002-2009 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:  Server's side session class
+*
+*/
+
+
+// INCLUDE FILES
+#include "AccSrvMainSession.h"
+#include "AccClientServerMessages.h"
+#include "acc_debug.h"
+#include <e32svr.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+extern void PanicClient( const RMessage2& aMessage, TAccServerError aPanic );
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::CAccSrvMainSession
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccSrvMainSession::CAccSrvMainSession(
+      CAccSrvConnectionController* aConnectionController,
+      CAccSrvServerModel* aServerModel )
+      : iAccServer( NULL ),
+        iObjectIx( NULL ),
+        iObjectCon( NULL ),
+        iProxy( NULL ),
+        iConnectionController( aConnectionController ),
+        iServerModel( aServerModel )
+    {
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::CAccSrvMainSession(0x%x)", &aConnectionController );
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::CAccSrvMainSession()" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::ConstructL( CAccServer* aServer, CASYProxyAPI* aProxy )
+    {
+    COM_TRACE_2( "[AccFW:AccServer] CAccSrvMainSession::ConstructL(0x%x, 0x%x)", &aServer, &aProxy );
+
+    iAccServer = aServer;
+    iObjectCon = iAccServer->NewContainerL();
+    iObjectIx = CObjectIx::NewL();
+    iProxy = aProxy;
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::ConstructL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccSrvMainSession* CAccSrvMainSession::NewL(
+        RThread& aClient,
+        CAccServer& aServer,
+        CASYProxyAPI* aProxy,
+        CAccSrvConnectionController* aConnectionController,
+        CAccSrvServerModel* aServerModel )
+    {
+    COM_TRACE_4( "[AccFW:AccServer] CAccSrvMainSession::NewL(0x%x, 0x%x, 0x%x, 0x%x)", &aClient, &aServer, &aProxy, &aConnectionController );
+
+    CAccSrvMainSession* self = CAccSrvMainSession::NewLC( 
+                                            aClient,
+                                            aServer,
+                                            aProxy,
+                                            aConnectionController,
+                                            aServerModel );
+    CleanupStack::Pop( self );
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::NewL - return 0x%x", self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccSrvMainSession* CAccSrvMainSession::NewLC(
+        RThread& /*aClient*/,
+        CAccServer& aServer,
+        CASYProxyAPI* aProxy,
+        CAccSrvConnectionController* aConnectionController,
+        CAccSrvServerModel* aServerModel )
+    {
+    COM_TRACE_3( "[AccFW:AccServer] CAccSrvMainSession::NewLC( 0x%x, 0x%x, 0x%x)", &aServer, &aProxy, &aConnectionController );
+
+    CAccSrvMainSession* self =
+        new ( ELeave ) CAccSrvMainSession( aConnectionController, aServerModel );
+
+    CleanupStack::PushL( self ) ;
+    self->ConstructL( &aServer, aProxy );
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::NewLC - return 0x%x", self );
+    return self;
+    }
+
+// Destructor
+CAccSrvMainSession::~CAccSrvMainSession()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::~CAccSrvMainSession()" );
+
+    if ( iObjectIx )
+        {
+        delete iObjectIx;
+        }
+    if ( iAccServer && iObjectCon )
+        {
+        iAccServer->RemoveContainer( iObjectCon ); // Remove and delete the container
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::~CAccSrvMainSession - return()" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::ServiceL
+// Calls request handling functions.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::ServiceL( const RMessage2& aMessage )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::ServiceL()" );
+
+    TInt function = aMessage.Function();
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::ServiceL - function == 0x%x", function );
+
+    TInt err( KErrNone );
+
+    TRAP( err, DispatchMessageL( aMessage ) );
+
+    switch ( function )
+        {
+        case EAccSrvCreateSubSessionAccessoryMode:
+        case EAccSrvCreateSubSessionAccessorySettings:
+        case EAccSrvCreateSubSessionAccessoryConnection:
+        case EAccSrvCreateSubSessionAccessoryControl:
+        case EAccSrvCreateSubSessionAccessorySingleConnection:
+        case EAccSrvCreateSubSessionAccessoryBTControl:
+        case EAccSrvCreateSubSessionAccessoryAudioControl:
+        case EAccSrvCreateSubSessionAccessoryAsyComms:
+        case EAccSrvCloseSubSessionAccessoryMode:
+        case EAccSrvCloseSubSessionAccessorySettings:
+        case EAccSrvCloseSubSessionAccessoryConnection:
+        case EAccSrvCloseSubSessionAccessoryControl:
+        case EAccSrvCloseSubSessionAccessorySingleConnection:
+        case EAccSrvCloseSubSessionAccessoryBTControl:
+        case EAccSrvCloseSubSessionAccessoryAudioControl:
+        case EAccSrvCloseSubSessionAccessoryAsyComms:
+        case EAccSrvGetAccessoryConnectionStatus:
+        case EAccSrvCancelNotifyAccessoryConnectionStatusChanged:
+        case EAccSrvCancelNotifyNewAccessoryConnected:
+        case EAccSrvCancelNotifyAccessoryDisconnected:
+        case EAccSrvCancelNotifyAccessoryValueChanged:
+        case EAccSrvGetSubblockNameArray:        
+        case EAccSrvCancelNotifyAccessoryModeChanged:
+        case EAccSrvGetSupportedHWDevices:
+        case EAccSrvGetHWDeviceSettings:
+        case EAccSrvSetHWDeviceSettings:
+        case EAccSrvGetAccessoryModeSetting:
+        case EAccSrvSetAccessoryModeSetting:
+        case EAccSrvGetAccessoryModeSettings:
+        case EAccSrvSetAccessoryModeSettings:
+        case EAccSrvConnectAccessory2:
+        case EAccSrvDisconnectAccessory:
+        case EAccSrvAccessoryValueChangedTBoolNotify:
+        case EAccSrvBTAccessoryValueChangedTBoolNotify:
+        case EAccSrvBTAccessoryValueChangedTIntNotify:
+        case EAccSrvAccessoryValueChangedTIntNotify:
+        case EAccSrvAccessoryValueChangedObjectNotify:
+        case EAccSrvCancelConnectAccessory:
+        case EAccSrvCancelDisconnectAccessory:
+        case EAccSrvBluetoothDisconnectAccessory:
+        case EAccSrvBluetoothAudioLinkOpenResp:
+        case EAccSrvBluetoothAudioLinkCloseResp:
+        case EAccSrvBluetoothAudioLinkOpenedNotify:
+        case EAccSrvBluetoothAudioLinkClosedNotify:
+        case EAccSrvCancelNotifyBluetoothAudioLinkOpenReq:
+        case EAccSrvCancelNotifyBluetoothAudioLinkCloseReq:
+        case EAccSrvAudioRoutingStatusNotify:
+        case EAccSrvCancelAccessoryAudioLinkOpen:
+        case EAccSrvCancelAccessoryAudioLinkClose:
+        case EAccSrvCancelNotifyAccessoryAudioLinkOpened:
+        case EAccSrvCancelNotifyAccessoryAudioLinkClosed:
+        case EAccSrvCancelNotifyProcessCommand:
+        case EAccSrvProcessResponseTBool:
+        case EAccSrvProcessResponseTInt:
+        case EAccSrvProcessResponseTDes:        
+        case EAccSrvProcessResponseObject:
+        case EAccSrvCancelGetAccessoryMode:
+        case EAccSrvCancelGetAccessoryConnectionStatus:
+        case EAccSrvGetObjectBuffer:
+        case EAccSrvGetObjectValue:
+            {
+            
+            if( aMessage.Handle() )	
+                {
+                COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::ServiceL - message completed, reason=%d", err );
+                WriteL( aMessage, function, err );//Update iFlags parameter to client side
+                aMessage.Complete( err );
+                }
+            }
+            break;
+
+        case EAccSrvBluetoothConnectAccessory:
+        case EAccSrvNotifyAccessoryAudioLinkOpened:
+        case EAccSrvNotifyAccessoryAudioLinkClosed:
+        case EAccSrvNotifyBluetoothAudioLinkOpenReq:
+        case EAccSrvNotifyBluetoothAudioLinkCloseReq:
+        case EAccSrvNotifyNewAccessoryConnected:
+        case EAccSrvNotifyAccessoryDisconnected:
+        case EAccSrvNotifyAccessoryValueChangedTBool:
+        case EAccSrvNotifyAccessoryValueChangedTInt:
+        case EAccSrvNotifyAccessoryValueChangedObject:
+        case EAccSrvNotifyAccessoryConnectionStatusChanged:
+        case EAccSrvNotifyAccessoryModeChanged:
+        case EAccSrvAccessoryAudioLinkOpen:
+        case EAccSrvAccessoryAudioLinkClose:
+        case EAccSrvNotifyProcessCommand:
+        case EAccSrvGetAccessoryMode:
+        case EAccSrvGetAccessoryModeAsync:
+        case EAccSrvGetAccessoryConnectionStatusAsync:
+        case EAccSrvSetValueTBool:
+        case EAccSrvSetValueTInt:        
+        case EAccSrvSetValueObject:
+        case EAccSrvGetValueTBool:
+        case EAccSrvGetValueTInt:
+        case EAccSrvGetValueTDes8:        
+        case EAccSrvGetValueObjectBase:
+            {
+            if (err != KErrNone)
+                {
+                COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::ServiceL - message completed with error %d", err );
+                // These messages are completed in subsessions (on time).
+                // In case of error, completion is done here with
+                // appropriate error code.
+                WriteL( aMessage, function, err );//Update iFlags parameter to client side
+                aMessage.Complete( err );
+                }
+            }
+            break;
+
+        default:
+            {
+            TRACE_ASSERT_ALWAYS;
+            COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::ServiceL - unhandled function: 0x%x", function );
+            PanicClient( aMessage, EAccServerErrorNotSupported );
+            }
+            break;
+
+        } //switch
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::ServiceL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::DispatchMessageL
+// Handles messages
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::DispatchMessageL( const RMessage2& aMessage )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::DispatchMessageL()" );
+
+    TInt function = aMessage.Function();
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::DispatchMessageL - function = 0x%x", function );
+
+    CAccSrvSubBase* subSession = NULL;
+
+    switch ( function )
+        {
+        case EAccSrvCreateSubSessionAccessoryMode:
+        case EAccSrvCreateSubSessionAccessorySettings:
+        case EAccSrvCreateSubSessionAccessoryConnection:
+        case EAccSrvCreateSubSessionAccessoryControl:
+        case EAccSrvCreateSubSessionAccessorySingleConnection:
+        case EAccSrvCreateSubSessionAccessoryBTControl:
+        case EAccSrvCreateSubSessionAccessoryAudioControl:
+        case EAccSrvCreateSubSessionAccessoryAsyComms:
+
+            NewSubSessionL( aMessage);
+            return;
+
+        case EAccSrvCloseSubSessionAccessoryMode:
+        case EAccSrvCloseSubSessionAccessorySettings:
+        case EAccSrvCloseSubSessionAccessoryConnection:
+        case EAccSrvCloseSubSessionAccessoryControl:
+        case EAccSrvCloseSubSessionAccessorySingleConnection:
+        case EAccSrvCloseSubSessionAccessoryBTControl:
+        case EAccSrvCloseSubSessionAccessoryAudioControl:
+        case EAccSrvCloseSubSessionAccessoryAsyComms:
+
+            CloseSubSessionL( aMessage );
+            return;
+
+        default:
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::DispatchMessageL - subsession specific request" );
+            }
+            break;
+        }
+
+    // Request is subsession specific
+    subSession = REINTERPRET_CAST( CAccSrvSubBase*, iObjectIx->At( aMessage.Int3() ) );
+
+    if ( subSession )
+        {
+        subSession->DispatchMessageL( aMessage );
+        }
+    else
+        {
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::DispatchMessageL - subsession specific create/connect" );
+        aMessage.Panic( KAccServerPanicCategory, EAccServerErrorBadDescriptor );//Panics the client
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::DispatchMessageL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::NewSubSessionL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::NewSubSessionL( const RMessage2& aMessage )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::NewSubSessionL()" );
+
+    TInt handle( 0 );
+    TInt type ( aMessage.Function() );
+    CObject* session = NULL;
+
+    // No need to restrict number of Sub-Sessions
+    // Number of Sessions should be restricted instead (to 1/client thread)
+
+    switch ( type )
+        {
+        case EAccSrvCreateSubSessionAccessoryMode:
+            {
+            session = CAccSrvSubMode::NewL( iProxy, iConnectionController, iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessorySettings:
+            {
+            session = CAccSrvSubSettings::NewL( iProxy, iConnectionController, iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessorySingleConnection:
+            {
+            session = CAccSrvSubSingleConnection::NewL( 
+                                                    iProxy, 
+                                                    iConnectionController, 
+                                                    iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessoryConnection:
+            {
+            session = CAccSrvSubConnection::NewL( iProxy, iConnectionController, iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessoryControl:
+            {
+            session = CAccSrvSubControl::NewL( iProxy, iConnectionController, iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessoryBTControl:
+            {
+            session = CAccSrvSubBTControl::NewL( iProxy, iConnectionController, iServerModel );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessoryAudioControl:
+            {
+            //Get the thread ID of the caller
+            TUint callerThreadID( 0 );
+            TPckg<TUint> callerThreadIDPckg( callerThreadID );
+            aMessage.Read( 0, callerThreadIDPckg );
+
+            session = CAccSrvSubAudioControl::NewL( iProxy,
+                                                    iConnectionController,
+                                                    iServerModel,
+                                                    callerThreadID );
+            break;
+            }
+
+        case EAccSrvCreateSubSessionAccessoryAsyComms:
+            {
+            //Get the thread ID of the ASY
+            TUint ASYThreadID( 0 );
+            TPckg<TUint> ASYThreadIDPckg( ASYThreadID );
+            aMessage.Read( 0, ASYThreadIDPckg );
+
+            // Main service UID of the ASY
+            TUid mainServiceUid( TUid::Null() );
+            TPckg<TUid> mainServiceUidPckg( mainServiceUid );
+            aMessage.Read( 1, mainServiceUidPckg );
+
+            session = CAccSrvSubAsyComms::NewL( iProxy,
+                                                iConnectionController,
+                                                iServerModel,
+                                                ASYThreadID,
+                                                mainServiceUid );
+            break;
+            }
+
+        default:
+            TRACE_ASSERT_ALWAYS;
+            User::Leave( KErrGeneral );
+            break;
+        }
+
+    CleanupStack::PushL( session );
+    iObjectCon->AddL( session );
+    CleanupStack::Pop( session );
+
+    TRAPD( error, handle = iObjectIx->AddL( session ) );
+    if ( error )
+        {
+        // AddL didn't complete successfully.
+        // Remove object from container and delete object.
+        iObjectCon->Remove( session );
+        User::Leave( error );
+        }
+
+    // Package to pass information to the client
+    TPckgC<TInt> handlePckg( handle );
+
+    // Send handle to the client
+    TRAP( error, aMessage.WriteL( KAccServHandlePos, handlePckg ) );
+    if ( error )
+        {
+        // Destroy newly created subsession, nobody needs it now
+        iObjectIx->Remove( handle );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::NewSubSessionL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::CloseSubSessionL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::CloseSubSessionL( const RMessage2& aMessage )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::CloseSubSessionL()" );
+
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvMainSession::CloseSubSessionL - aMessage.Int3() = 0x%x", aMessage.Int3() );
+    iObjectIx->AtL( aMessage.Int3() );
+    iObjectIx->Remove( aMessage.Int3() );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::CloseSubSessionL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvMainSession::WriteL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvMainSession::WriteL( const RMessage2& aMessage, TInt aFunction, TInt aErr )
+    {
+    COM_TRACE_2( "[AccFW:AccServer] CAccSrvMainSession::WriteL(func=%d err=%d)", aFunction, aErr );
+    
+    TInt flag( 0 );
+    TInt flags( 0 );
+    TPckg<TInt> flagsPckg( flags );
+    
+    if ( KErrNone == aErr )
+        {
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::WriteL - no need to update flags - return void" );
+        return;//In succesfull case, iFlags parameter is updated in subsessions
+        }
+    
+    switch ( aFunction )
+        {
+        case EAccSrvAccessoryAudioLinkOpen:
+            {
+            flag = KAccSrvAccessoryAudioLinkOpenBit;
+            }
+            break;
+        case EAccSrvAccessoryAudioLinkClose:
+            {
+            flag = KAccSrvAccessoryAudioLinkCloseBit;
+            }
+            break;  
+        case EAccSrvNotifyAccessoryAudioLinkOpened:
+            {
+            flag = KAccSrvNotifyAccessoryAudioLinkOpenedBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryAudioLinkClosed:
+            {
+            flag = KAccSrvNotifyAccessoryAudioLinkClosedBit;
+            }
+            break;   
+        case EAccSrvBluetoothConnectAccessory:
+            {
+            flag = KAccSrvConnectBTAccessoryBit;
+            }
+            break;  
+        case EAccSrvBluetoothDisconnectAccessory:
+            {
+            flag = KAccSrvDisconnectBTAccessoryBit;
+            }
+            break;  
+        case EAccSrvNotifyBluetoothAudioLinkOpenReq:
+            {
+            flag = KAccSrvNotifyBluetoothAudioLinkOpenReqBit;
+            }
+            break; 
+        case EAccSrvNotifyBluetoothAudioLinkCloseReq:
+            {
+            flag = KAccSrvNotifyBluetoothAudioLinkCloseReqBit;
+            }
+            break;  
+        case EAccSrvGetAccessoryConnectionStatusAsync:
+            {
+            flag = KAccSrvGetAccessoryConnectionStatusBit;
+            }
+            break;   
+        case EAccSrvNotifyAccessoryConnectionStatusChanged:
+            {
+            flag = KAccSrvNotifyAccConnStatusChangedBit;
+            }
+            break;
+        case EAccSrvGetAccessoryModeAsync:
+            {
+            flag = KAccSrvGetAccessoryModeBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryModeChanged:
+            {
+            flag = KAccSrvNotifyAccessoryModeChangedBit;
+            }
+            break;
+        case EAccSrvNotifyNewAccessoryConnected:
+            {
+            flag = KAccSrvNotifyNewAccessoryConnectedBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryDisconnected:
+            {
+            flag = KAccSrvNotifyAccessoryDisconnectedBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryValueChangedTBool:
+            {
+            flag = KAccSrvNotifyAccessoryValueChangedTBoolBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryValueChangedTInt:
+            {
+            flag = KAccSrvNotifyAccessoryValueChangedTIntBit;
+            }
+            break;
+        case EAccSrvNotifyAccessoryValueChangedObject:
+            {
+            flag = KAccSrvNotifyAccessoryValueChangedObjectBit;
+            }
+            break;
+        case EAccSrvDisconnectAccessory:
+            {
+            flag = KAccSrvDisconnectAccessoryBit;
+            }
+            break;
+        case EAccSrvConnectAccessory2:
+            {
+            flag = KAccSrvDisconnectAccessoryBit;
+            }
+            break;
+        default:
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::WriteL - no need to update flags for this msg - return void" );
+            return;
+            }
+        }
+
+    aMessage.ReadL( KAccServParamPosThird, flagsPckg );//It's allways argument number 2 which is used in client side
+    flags = flags & (~flag);//Turn bit number flag to zero
+    aMessage.Write( KAccServParamPosThird, flagsPckg );
+    
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvMainSession::WriteL - flags updated - return void" );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File