accessoryservices/accessoryserver/src/Server/AccSrvConnectionController.cpp
changeset 0 4e1aa6a622a0
child 3 a811597961f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/Server/AccSrvConnectionController.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,976 @@
+/*
+* 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:  Connection Controller
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "AccSrvConnectionController.h"
+#include "AccPolAccessoryPolicy.h"
+#include "AccSrvServerModel.h"
+#include "AccSrvNotificationQueue.h"
+#include "AccSrvConnectionStatusHandler.h"
+#include "AccSrvModeHandler.h"
+#include "AccPolGenericIDArrayAccessor.h"
+#include "acc_debug.h"
+#include "AccSrvASYProxyHandler.h"
+#include "AccPolGenericIDAccessor.h"
+#include "AccSrvSettingsHandler.h"
+#include "AccPolSubblockNameArrayAccessor.h"
+#include "AccSrvChargingContextController.h"
+#include <AccConfigFileParser.h>
+#include <s32mem.h>
+#include "AccSrvWiredConnectionPublisher.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+const TUid KAccFwUiNoteNotifierUid = { 0x10205061 };
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::CAccSrvConnectionController
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccSrvConnectionController::CAccSrvConnectionController()
+    : CActive( EPriorityStandard ),
+      iPolicy( NULL ),
+      iServerModel( NULL ),
+      iNotificationQueue( NULL ),
+      iConnectionStatusHandler( NULL ),
+      iModeHandler( NULL ),
+      iASYProxyHandler( NULL ),
+      iShowNotes( EFalse ),
+      iWiredConnPublisher( NULL ),
+      iReplyPck( iReplyValue)
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController()" );
+
+    CActiveScheduler::Add( this );//Add the active object to the active scheduler
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController - return" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+
+void CAccSrvConnectionController::ConstructL( CAccSrvServerModel* aServerModel )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConstructL()" );
+
+    iServerModel             = aServerModel;
+    iPolicy                  = CAccPolAccessoryPolicy::NewL( &iServerModel->CapabilityStorage());
+    iNotificationQueue       = CAccSrvNotificationQueue::NewL();
+    iConnectionStatusHandler = CAccSrvConnectionStatusHandler::NewL( this );
+    iModeHandler             = CAccSrvModeHandler::NewL( this );
+    iASYProxyHandler         = CAccSrvASYProxyHandler::NewL( this );
+    iSettingsHandler         = CAccSrvSettingsHandler::NewL( this, *aServerModel );
+    iWiredConnPublisher      = CAccSrvWiredConnectionPublisher::NewL();
+    TRAPD( err, iChargingContextController = CAccSrvChargingContextController::NewL() );
+    if ( err != KErrNone ) // Server does not need to die on charging context fail.
+        {
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::ConstructL - CAccSrvChargingContextController err %d", err );
+        iChargingContextController = NULL;
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConstructL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CAccSrvConnectionController* CAccSrvConnectionController::NewL(
+    CAccSrvServerModel* aServerModel )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::NewL()" );
+
+    CAccSrvConnectionController* self = new( ELeave ) CAccSrvConnectionController;
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aServerModel );
+    CleanupStack::Pop( self );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::NewL - return self" );
+
+    return self;
+    }
+
+// Destructor
+CAccSrvConnectionController::~CAccSrvConnectionController()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::~CAccSrvConnectionController()" );
+
+    if( NULL != iPolicy )
+        {
+        delete iPolicy;
+        }
+
+    if( NULL != iNotificationQueue )
+        {
+        delete iNotificationQueue;
+        }
+
+    if( NULL != iConnectionStatusHandler )
+        {
+        delete iConnectionStatusHandler;
+        }
+
+    if( NULL != iModeHandler )
+        {
+        delete iModeHandler;
+        }
+
+    if( NULL != iASYProxyHandler )
+        {
+        delete iASYProxyHandler;
+        }
+
+    if( NULL != iSettingsHandler )
+        {
+        delete iSettingsHandler;
+        }
+    
+    if( NULL != iChargingContextController )
+        {
+        delete iChargingContextController;
+        }
+
+    delete iWiredConnPublisher;
+
+    // Handlers must be deleted after iPolicy and iASYProxyHandler
+    // (used from handlers).
+    iConnectionHandler.ResetAndDestroy();
+    
+    if ( iNotifier.Handle() )
+        {
+        iNotifier.Close();
+        }
+    Cancel();
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::~CAccSrvConnectionController - return" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::ServerModel
+// -----------------------------------------------------------------------------
+//
+CAccSrvServerModel& CAccSrvConnectionController::ServerModel() const
+    {
+    return *iServerModel;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::NotificationQueue
+// -----------------------------------------------------------------------------
+//
+CAccSrvNotificationQueue& CAccSrvConnectionController::NotificationQueue() const
+    {
+    return *iNotificationQueue;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::ASYProxyHandler
+// -----------------------------------------------------------------------------
+//
+CAccSrvASYProxyHandler& CAccSrvConnectionController::ASYProxyHandler() const
+    {
+    return *iASYProxyHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::SettingsHandler
+// -----------------------------------------------------------------------------
+//
+CAccSrvSettingsHandler& CAccSrvConnectionController::SettingsHandler() const
+    {
+    return *iSettingsHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::Policy
+// -----------------------------------------------------------------------------
+//
+CAccPolAccessoryPolicy& CAccSrvConnectionController::Policy() const
+    {
+    return *iPolicy;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleConnectL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleConnectL( TAccPolGenericID& aGenericID,
+                                                  TUint aCallerThreadID,
+                                                  TBool aEvaluateConnectionRules,
+                                                  TBool aUpdateConnection )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL()" );
+
+	if ( aUpdateConnection )
+	    {
+	    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL() Update connection" );
+		
+		//check is there connection handling ongoing for unique id
+		TInt index( KErrNotFound );
+		for ( TInt i(0); i < iConnectionHandler.Count(); i++ )
+	    	{
+			if ( aGenericID.UniqueID() == 
+                 iConnectionHandler.operator[]( i )->UniqueIDForConnectionHandler() )
+			    {
+				index = i;
+				break;
+			    }
+	    	}
+		
+		//cancel current connection handling and reset connection handler
+		if ( KErrNotFound == index)
+		    {
+            //Create a new connection handler for this connection and start the handling
+            CAccSrvConnectionHandler* connectionHandler = CAccSrvConnectionHandler::NewL( this, iServerModel, iPolicy );
+            CleanupStack::PushL( connectionHandler );
+            iConnectionHandler.InsertL( connectionHandler, 0 );
+            CleanupStack::Pop( connectionHandler );
+            index = 0;
+            }
+        else
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL() Connection handling ongoing - delete current connection handler" );
+			iConnectionHandler.operator[]( index )->CancelConnectionHandling();
+            iConnectionHandler.operator[]( index )->ResetHandler();
+   		    }
+   		
+	    // Restart connection handling
+    	iConnectionHandler.operator[]( index )->StartConnectionHandlingL( 
+                                                    aGenericID,
+                                                    aEvaluateConnectionRules, 
+                                                    iServerModel->IsConnectedOrDetected( 
+                                                        aGenericID ) );
+    	}
+	else
+    	{
+	    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL() New connection" );
+
+	    // Store ThreadId for ASY handling
+	    iServerModel->StoreASYThreadID( aCallerThreadID, aGenericID.UniqueID() );
+
+	    iServerModel->AddPhysicalConnectionL( aGenericID );		
+
+	    iWiredConnPublisher->HandleConnectL( aGenericID );
+
+        // Search for free connection handlers
+        TInt index( KErrNotFound);
+		for ( TInt i(0); i < iConnectionHandler.Count(); i++ )
+		    {
+			if ( iConnectionHandler.operator[]( i )->IsFree() )
+			    {
+				index = i;
+				break;
+			    }
+		    }
+
+        // Create new connection handler if available connection handler is not found
+        if ( KErrNotFound == index )
+            {
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL - Available handler not found, creating new" );
+            CAccSrvConnectionHandler* handler = CAccSrvConnectionHandler::NewL( 
+                this, iServerModel, iPolicy );
+            CleanupStack::PushL( handler );
+            handler->StartConnectionHandlingL( aGenericID, aEvaluateConnectionRules, EFalse );
+            iConnectionHandler.AppendL( handler );
+            CleanupStack::Pop( handler );
+            }
+        else
+            {
+            // Available hander found, using that
+            COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL - Available handler found at %i, using that", index );
+            iConnectionHandler.operator[]( index )->StartConnectionHandlingL( 
+                aGenericID, aEvaluateConnectionRules, EFalse );
+            }	
+    	}
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleConnectionUpdateValidationL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleConnectionUpdateValidationL( 
+    const TAccPolGenericID& aGenericID, 
+	TAccPolGenericID& aOldGenericId,
+	const CAccSrvConnectionHandler* aCaller,	
+	TInt aError )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL()" );
+    
+    TInt err ( KErrNone );
+    TAccSrvConnection isValidConnection(EAccSrvConnect);
+    TBool isConnected( iServerModel->IsConnected( aGenericID ) );
+
+    if( KErrNone == aError )
+        {   
+        isValidConnection = iPolicy->IsValidConnectionL( aGenericID, err );
+        }
+    else
+        {
+        err = aError;
+        isValidConnection = EAccSrvDeny;
+        }
+            
+    if( iServerModel->FindAndRemoveCancelledConnectAccessory( aGenericID.UniqueID() ) )
+        {
+        //Connection of this accessory is cancelled.
+        err = KErrCancel;
+        isValidConnection = EAccSrvDeny;
+        }
+
+    switch( isValidConnection )
+        {
+        case EAccSrvDetect:
+            {
+            if( isConnected )
+                {
+                //accessory was connected, but now it is detected
+ 			    iServerModel->AddPhysicalConnectionL( aGenericID ); //Move GID from physical connection array
+			    iServerModel->RemoveConnectionL( aGenericID, EFalse );            //to connection array
+ 		        
+  		        // Complete all possible connection status related requests
+        		iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
+                                                		     KErrNone,
+	                                                    	 aGenericID.UniqueID() );
+        		iNotificationQueue->CompleteControlMessageL( EAccessoryDisconnected,
+                		                                     KErrNone,
+                        		                             aOldGenericId.UniqueID() );
+                }
+            else
+                {
+                //Accessory remains in detected state.
+                }
+            }
+            break;
+
+        case EAccSrvConnect:
+            {
+            if( isConnected )
+                {
+                //update connection generic id array
+                iServerModel->UpdateConnectionL( aGenericID);
+                
+ 		        // Complete all possible connection status related requests
+        		iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
+                                                		     KErrNone,
+	                                                    	 aGenericID.UniqueID() );
+        		iNotificationQueue->CompleteControlMessageL( EAccessoryDisconnected,
+                		                                     KErrNone,
+                        		                             aOldGenericId.UniqueID() );
+    		    iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
+                                        		             KErrNone,
+                                		                     aGenericID.UniqueID() );
+                }
+            else
+                {
+                //accessory was detected, but now it is connected
+			    iServerModel->RemovePhysicalConnection( aGenericID ); //Move GID from physical connection array
+			    iServerModel->AddConnectionL( aGenericID );            //to connection array
+  
+ 		        // Complete all possible connection status related requests
+        		iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
+                                                		     KErrNone,
+	                                                    	 aGenericID.UniqueID() );
+    		    iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
+                                        		             KErrNone,
+                                		                     aGenericID.UniqueID() );
+                }
+            }
+            break;
+
+        case EAccSrvDeny:
+            {
+            iServerModel->RemovePhysicalConnection( aGenericID );
+            iServerModel->RemoveASYThreadID( aGenericID.UniqueID() );//Remove ThreadID GID mapping
+            iServerModel->CapabilityStorage().RemoveCapabilityList( aGenericID);
+            
+         
+            }
+            break;
+
+        default:
+            {
+            TRACE_ASSERT_ALWAYS;//unhandled enum
+            }
+            break;
+        }
+
+    iNotificationQueue->CompleteControlMessageL( EConnectAccessory,
+                                                 err,
+                                                 aGenericID.UniqueID() );
+
+    //"This" connection handler has done its job
+    TInt index( iConnectionHandler.Find( aCaller ) );
+    if( KErrNotFound != index )
+        {
+        delete iConnectionHandler.operator[]( index );
+        iConnectionHandler.Remove( index );
+        }
+    else
+        {
+        TRACE_ASSERT_ALWAYS; //iConnectionHandler array is not in sync
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::ConnectionHandlingCancel
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::ConnectionHandlingCancel(
+    const CAccSrvConnectionHandler* aCaller )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConnectionHandlingCancel - start" );
+    //"This" connection handler has done its job
+    TInt index( iConnectionHandler.Find( aCaller ) );
+    if( KErrNotFound != index )
+        {
+        COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::ConnectionHandlingCancel - Handler found at %i", index );
+        iConnectionHandler.operator[]( index )->CancelConnectionHandling();
+        iConnectionHandler.operator[]( index )->ResetHandler();
+        }
+    else
+        {
+        TRACE_ASSERT_ALWAYS; //iConnectionHandler array is not in sync
+        }
+	COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConnectionHandlingCancel - end" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleConnectValidationL.
+//
+// During AccessoryConnection this is the phase where all critical capabilities
+// are initialized and decision for connection acceptance can be done.
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleConnectValidationL(
+    const TAccPolGenericID& aGenericID,
+    const CAccSrvConnectionHandler* aCaller,
+    TInt aError )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectValidationL()" );
+    
+    TInt err ( KErrNone );
+    TAccSrvConnection isValidConnection( EAccSrvConnect );
+
+    if( KErrNone == aError )
+        {   
+        isValidConnection = iPolicy->IsValidConnectionL( aGenericID, err );
+        }
+    else
+        {
+        err = aError;
+        isValidConnection = EAccSrvDeny;
+        }
+            
+    if( iServerModel->FindAndRemoveCancelledConnectAccessory( aGenericID.UniqueID() ) )
+        {
+        //Connection of this accessory is cancelled.
+        err = KErrCancel;
+        isValidConnection = EAccSrvDeny;
+        }
+
+    iNotificationQueue->CompleteControlMessageL( EConnectAccessory,
+                                                 err,
+                                                 aGenericID.UniqueID() );
+    switch( isValidConnection )
+        {
+        case EAccSrvDetect:
+            {
+            // Accessory is detected but not connected.
+            // Further changes to capabilities may change this
+            // i.e. connection status changes from detected to connected.
+            // Detected accessory is allready in physical connection table
+            // (AddPhysicalConnectionL), so there is nothing to do here.
+            }
+            break;
+
+        case EAccSrvConnect:
+            {
+            PromoteToConnectedL( aGenericID );
+            }
+            break;
+
+        case EAccSrvDeny:
+            {
+            iServerModel->RemovePhysicalConnection( aGenericID );
+            iServerModel->RemoveASYThreadID( aGenericID.UniqueID() );//Remove ThreadID GID mapping
+            iServerModel->CapabilityStorage().RemoveCapabilityList( aGenericID );
+            
+         
+            }
+            break;
+
+        default:
+            {
+            TRACE_ASSERT_ALWAYS;//unhandled enum
+            }
+            break;
+        }
+
+    //"This" connection handler has done its job
+    TInt index( iConnectionHandler.Find( aCaller ) );
+    if( KErrNotFound != index )
+        {
+        delete iConnectionHandler.operator[]( index );
+        iConnectionHandler.Remove( index );
+        }
+    else
+        {
+        TRACE_ASSERT_ALWAYS; //iConnectionHandler array is not in sync
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectValidationL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleConnectionChangeValidationL
+//
+// Accessory is allready connected and a capability is changed.
+// This may change a single accessory connection
+// - from detected to connected
+// - from connected to detected
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleConnectionChangeValidationL(
+    const TAccPolGenericID& aGenericID )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionChangeValidationL()" );
+
+    TBool isConnected( iServerModel->IsConnected( aGenericID ) );
+    TInt err( KErrNone );
+
+    switch( iPolicy->IsValidConnectionL( aGenericID, err ) )
+        {
+        case EAccSrvConnect:
+            {
+            if( isConnected )
+                {
+                //accessory is allready connected -> no need to do anything
+                }
+            else
+                {
+                //accessory was detected, but now it is connected
+                PromoteToConnectedL( aGenericID );
+                }
+            }
+            break;
+
+        case EAccSrvDetect:
+            {
+            if( isConnected )
+                {
+                //accessory was connected, but now it is detected
+                LowerToDetectedL( aGenericID );
+                }
+            else
+                {
+                //Accessory remains in detected state.
+                }
+            }
+            break;
+
+        default:
+            {
+            TRACE_ASSERT_ALWAYS;//Logigal error in connection/detection handling
+            }
+            break;
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionChangeValidationL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::PromoteToConnectedL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::PromoteToConnectedL(
+    const TAccPolGenericID& aGenericID )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL()" );
+
+    iServerModel->RemovePhysicalConnection( aGenericID ); //Move GID from physical connection array
+    iServerModel->AddConnectionL( aGenericID );            //to connection array
+
+    iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
+                                                 KErrNone,
+                                                 aGenericID.UniqueID() );
+
+    iConnectionStatusHandler->IssueRequest();
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::LowerToDetectedL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::LowerToDetectedL(
+    const TAccPolGenericID& aGenericID )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::LowerToDetectedL()" );
+
+    iServerModel->RemoveConnectionL( aGenericID, EFalse );//Move GID from connection array to physical connection array
+    iServerModel->AddPhysicalConnectionL( aGenericID );
+
+    iNotificationQueue->CompleteControlMessageL( EAccessoryDisconnected,
+                                                 KErrNone,
+                                                 aGenericID.UniqueID() );
+                                                 
+    iConnectionStatusHandler->IssueRequest();
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::LowerToDetectedL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleDisconnectL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleDisconnectL(
+    const TAccPolGenericID& aGenericID )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleDisconnectL()" );
+
+	//check is there connection handling ongoing for unique id
+	TInt index( KErrNotFound);
+	for ( TInt i(0); i < iConnectionHandler.Count(); i++ )
+	    {
+		if ( aGenericID.UniqueID() == 
+             iConnectionHandler.operator[]( i )->UniqueIDForConnectionHandler() )
+		    {
+			index = i;
+			break;
+	    	}
+	    }
+
+	//cancel current connection handling and remove connection handler
+	if ( index >= 0 )
+	    {
+		iConnectionHandler.operator[]( index )->CancelConnectionHandling();
+        iConnectionHandler.operator[]( index )->ResetHandler();
+        }
+
+    iServerModel->RemoveASYThreadID( aGenericID.UniqueID() );//Remove ThreadID GID mapping
+
+    iServerModel->RemoveConnectionL( aGenericID, ETrue/*store last disconnect accessory*/ );
+    iServerModel->RemovePhysicalConnection( aGenericID );
+
+    iWiredConnPublisher->HandleDisconnectL( aGenericID );
+
+    iNotificationQueue->CompleteControlMessageL( EAccessoryDisconnected,
+                                                 KErrNone,
+                                                 aGenericID.UniqueID() );
+
+    //Remove names/values from capability storage
+	iServerModel->CapabilityStorage().RemoveCapabilityList( 
+        iServerModel->LastDisconnectedAccessory() );
+
+    iServerModel->ClearLastDisconnectedAccessory();
+
+    iConnectionStatusHandler->IssueRequest();
+
+#ifdef _DEBUG
+    //Check how many accessories are allready connected
+    TAccPolGenericIDArray genericIDArray;
+    iServerModel->CurrentConnectionStatusL( genericIDArray );
+    COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::HandleDisconnectL - Still connected accesories:%d", genericIDArray.Count() );
+#endif // _DEBUG
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleDisconnectL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleConnectionStatusChangedL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleConnectionStatusChangedL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionStatusChangedL()" );
+
+    TAccPolGenericIDArray genericIDArray;
+
+    iServerModel->CurrentConnectionStatusL( genericIDArray );
+    iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
+                                                 KErrNone,
+                                                 KErrNotFound );
+    iSettingsHandler->ConnectionStatusChangedL( genericIDArray );
+
+    // Able to show notes
+    iShowNotes = ETrue;
+    iModeHandler->IssueRequest();
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionStatusChangedL - return void" );
+    }
+    
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleAccessoryModeChangedL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::HandleAccessoryModeChangedL(
+    TInt aDbId,
+    TBool aAudioOutputStatus )
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL()" );
+
+    TAccPolGenericIDArray genericIDArray;
+    TAccPolAccessoryMode accMode;
+
+    iServerModel->CurrentConnectionStatusL( genericIDArray );
+
+    accMode = iPolicy->ResolveAccessoryModeL( genericIDArray, 
+                                              aDbId, 
+                                              aAudioOutputStatus, 
+                                              iServerModel->AccessoryMode(), 
+                                              iServerModel->UniqueID() );
+
+    if( iServerModel->SetAccessoryMode( accMode, aDbId ) ) //Store accessory mode
+        {
+        if( iModeHandler->IsActive() || iConnectionStatusHandler->IsActive() )
+            {
+            //Model will be updated after pending ModeHandler or ConnectionStatusHandler is executed.
+            //This Mode update can de filtered out for that reason.
+            COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Mode update filtered" );
+            }
+        else
+            {
+            iNotificationQueue->CompleteControlMessageL( EAccessoryModeChanged,
+                                                         KErrNone,
+                                                         KErrNotFound );
+            }
+	
+		    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Show information note!" );			
+
+		    TBool showNote( EFalse );
+		    TInt noteValue( 0 );
+			
+		    switch ( accMode.iAccessoryMode )
+		      {
+			    case EAccModeWiredHeadset:
+			    case EAccModeWiredCarKit:
+			    case EAccModeTextDevice:
+			    case EAccModeLoopset:
+			    case EAccModeMusicStand:
+			    case EAccModeTVOut:
+			    case EAccModeHDMI:
+			    case EAccModeHeadphones:
+			    {
+				  TAccPolGenericID genericID;
+				  iServerModel->GetLastConnectedAccessoryL( genericID );
+				  TUint32 num = genericID.SubblockCaps();
+				  if( num & KSBAudioSubblock )
+				      {
+					    CCapValue* capValue = iServerModel->CapabilityStorage().GetCapability( genericID, KAccIntegratedAudioInput );
+					    if( iInformationNoteDefault )
+						      {
+						      noteValue = iInformationNoteDefault;
+						      showNote = ETrue;
+						      }
+					    if( !capValue && !iInformationNoteDefault )
+						      {
+						      showNote = ETrue;
+						      }
+					    }
+				    else
+					    {
+					    if( iInformationNoteDefault )
+						      {
+						      noteValue = iInformationNoteDefault;
+						      showNote = ETrue;
+						      }
+					    }
+				  }
+			    break;			  
+			    default:
+			    {
+				  showNote = EFalse;				
+			    }
+			    break;
+		    }
+
+		    if ( showNote && iShowNotes )
+		        {		    	
+		        if( iServerModel->IdleDetected() )
+		            {
+                    if ( iNotifier.Handle() )
+                        {
+                        iNotifier.Close();
+                        }
+			        if( IsActive() )
+			            {
+    		            Cancel();
+    		            }
+
+			        //connect to notifier
+		            COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - notifier.Connect" );
+		            TInt err = iNotifier.Connect();
+		            if(err != KErrNone)
+		                {
+		                //ok if cannot show note, this is possible during boot
+		                COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Couldn't connect to notifier: err = %d", err);	
+		                }
+		            else
+		                {
+		                TPckg<TInt> valuePckg( noteValue );
+		                iStatus = KRequestPending;
+                        iNotifier.StartNotifierAndGetResponse( 
+                                        iStatus, 
+                                        KAccFwUiNoteNotifierUid, 
+                                        valuePckg, 
+                                        iReplyPck);
+                        SetActive();
+    		            }
+    		        }
+		        //reset values
+	            iShowNotes = EFalse;
+			    iInformationNoteUID = 0;
+			    iInformationNoteDefault = 0;			      
+    		    }
+        }        
+    else
+        {
+        // Accessory Mode was allready up-to-date,
+        // no need to complete Accessory Mode changed notification.
+        COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Mode allready up-to-date" );
+        }
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::SetDefaultAccessoryInformation
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::SetDefaultAccessoryInformation(
+    const TAccPolGenericID& aGenericID, 
+	const TUint32 aDefaultValue )
+    {
+	COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::SetDefaultAccessoryInformation()" );
+	iInformationNoteUID = aGenericID.UniqueID();
+	iInformationNoteDefault = aDefaultValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::RunL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::RunL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::RunL()" );
+    
+    iNotifier.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::DoCancel()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::DoCancel()" );
+
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::DoCancel - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::RegisterControlMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::RegisterControlMessageL( TMsgID aMsgID,
+                                                           MQueueObserver* aCallback )
+    {
+    iNotificationQueue->RegisterControlMessage( aMsgID, aCallback );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::CancelControlMessageL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::CancelControlMessage( TMsgID aMsgID,
+                                                        MQueueObserver* aCallback )
+    {
+    iNotificationQueue->CancelControlMessage( aMsgID, aCallback );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::HandleASYCommsL
+// -----------------------------------------------------------------------------
+//
+TInt CAccSrvConnectionController::HandleASYCommsL( 
+    TProcessCmdId aCmdId,
+    TASYCommandParamRecord& aASYCommandParamRecord,
+    TPtr8* aPtrBuf )
+    {
+    return iASYProxyHandler->HandleASYCommsL( aCmdId,
+                                              aASYCommandParamRecord,
+                                              aPtrBuf );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::ServerModelHandle
+// -----------------------------------------------------------------------------
+//
+CAccSrvServerModel& CAccSrvConnectionController::ServerModelHandle()
+    {
+    return CAccSrvConnectionController::ServerModel();
+    }
+
+// -----------------------------------------------------------------------------
+// CAccSrvConnectionController::InitializeConnectionStatusL
+// -----------------------------------------------------------------------------
+//
+void CAccSrvConnectionController::InitializeConnectionStatusL()
+    {
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::InitializeConnectionStatusL()" );
+    iNotificationQueue->CompleteControlMessageL( 
+        EAccessoryModeAsyncChanged, KErrNone, KErrNotFound );
+    iNotificationQueue->CompleteControlMessageL( 
+        EAccessoryConnectionStatusAsyncChanged, KErrNone, KErrNotFound );
+    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::InitializeConnectionStatusL - return void" );
+    }
+
+//  End of File