accessoryservices/accessoryserver/src/Server/AccSrvConnectionController.cpp
branchRCL_3
changeset 22 8cb079868133
parent 21 ccb4f6b3db21
child 23 c26be94c8889
equal deleted inserted replaced
21:ccb4f6b3db21 22:8cb079868133
    38 
    38 
    39 // EXTERNAL FUNCTION PROTOTYPES
    39 // EXTERNAL FUNCTION PROTOTYPES
    40 
    40 
    41 // CONSTANTS
    41 // CONSTANTS
    42 
    42 
       
    43 const TUid KAccFwUiNoteNotifierUid = { 0x10205061 };
       
    44 
    43 // MACROS
    45 // MACROS
    44 
    46 
    45 // LOCAL CONSTANTS AND MACROS
    47 // LOCAL CONSTANTS AND MACROS
    46 
    48 
    47 // MODULE DATA STRUCTURES
    49 // MODULE DATA STRUCTURES
    59 // C++ default constructor can NOT contain any code, that
    61 // C++ default constructor can NOT contain any code, that
    60 // might leave.
    62 // might leave.
    61 // -----------------------------------------------------------------------------
    63 // -----------------------------------------------------------------------------
    62 //
    64 //
    63 CAccSrvConnectionController::CAccSrvConnectionController()
    65 CAccSrvConnectionController::CAccSrvConnectionController()
    64     : iPolicy( NULL ),
    66     : CActive( EPriorityStandard ),
       
    67       iPolicy( NULL ),
    65       iServerModel( NULL ),
    68       iServerModel( NULL ),
    66       iNotificationQueue( NULL ),
    69       iNotificationQueue( NULL ),
    67       iConnectionStatusHandler( NULL ),
    70       iConnectionStatusHandler( NULL ),
    68       iModeHandler( NULL ),
    71       iModeHandler( NULL ),
    69       iASYProxyHandler( NULL ),
    72       iASYProxyHandler( NULL ),
    70       iWiredConnPublisher( NULL )
    73       iShowNotes( EFalse ),
       
    74       iWiredConnPublisher( NULL ),
       
    75       iReplyPck( iReplyValue)
    71     {
    76     {
    72     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController()" );
    77     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController()" );
       
    78 
       
    79     CActiveScheduler::Add( this );//Add the active object to the active scheduler
    73 
    80 
    74     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController - return" );
    81     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::CAccSrvConnectionController - return" );
    75     }
    82     }
    76 
    83 
    77 
    84 
    89     iPolicy                  = CAccPolAccessoryPolicy::NewL( &iServerModel->CapabilityStorage());
    96     iPolicy                  = CAccPolAccessoryPolicy::NewL( &iServerModel->CapabilityStorage());
    90     iNotificationQueue       = CAccSrvNotificationQueue::NewL();
    97     iNotificationQueue       = CAccSrvNotificationQueue::NewL();
    91     iConnectionStatusHandler = CAccSrvConnectionStatusHandler::NewL( this );
    98     iConnectionStatusHandler = CAccSrvConnectionStatusHandler::NewL( this );
    92     iModeHandler             = CAccSrvModeHandler::NewL( this );
    99     iModeHandler             = CAccSrvModeHandler::NewL( this );
    93     iASYProxyHandler         = CAccSrvASYProxyHandler::NewL( this );
   100     iASYProxyHandler         = CAccSrvASYProxyHandler::NewL( this );
    94     iSettingsHandler         = CAccSrvSettingsHandler::NewL( this, *aServerModel, iPolicy );
   101     iSettingsHandler         = CAccSrvSettingsHandler::NewL( this, *aServerModel );
    95     iWiredConnPublisher      = CAccSrvWiredConnectionPublisher::NewL();
   102     iWiredConnPublisher      = CAccSrvWiredConnectionPublisher::NewL();
    96 
   103 
    97     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConstructL - return void" );
   104     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::ConstructL - return void" );
    98     }
   105     }
    99 
   106 
   157 
   164 
   158     // Handlers must be deleted after iPolicy and iASYProxyHandler
   165     // Handlers must be deleted after iPolicy and iASYProxyHandler
   159     // (used from handlers).
   166     // (used from handlers).
   160     iConnectionHandler.ResetAndDestroy();
   167     iConnectionHandler.ResetAndDestroy();
   161     
   168     
       
   169     if ( iNotifier.Handle() )
       
   170         {
       
   171         iNotifier.Close();
       
   172         }
       
   173     Cancel();
       
   174 
   162     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::~CAccSrvConnectionController - return" );
   175     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::~CAccSrvConnectionController - return" );
   163     }
   176     }
   164 
   177 
   165 
   178 
   166 // -----------------------------------------------------------------------------
   179 // -----------------------------------------------------------------------------
   432 
   445 
   433     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL - return void" );
   446     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL - return void" );
   434     }
   447     }
   435 
   448 
   436 // -----------------------------------------------------------------------------
   449 // -----------------------------------------------------------------------------
   437 // CAccSrvConnectionController::HandleConnectionUpdateValidationL
       
   438 // -----------------------------------------------------------------------------
       
   439 //
       
   440 void CAccSrvConnectionController::HandleConnectionUpdateValidationL( 
       
   441     const TAccPolGenericID& aGenericID, 
       
   442     TAccPolGenericID& aOldGenericId,
       
   443     const CAccSrvSettingsHandler* /*aCaller*/,    
       
   444     TInt aError )
       
   445     {
       
   446     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL()" );
       
   447     
       
   448     TInt err ( KErrNone );
       
   449     TAccSrvConnection isValidConnection(EAccSrvConnect);
       
   450     TBool isConnected( iServerModel->IsConnected( aGenericID ) );
       
   451 
       
   452     if( KErrNone == aError )
       
   453         {   
       
   454         isValidConnection = iPolicy->IsValidConnectionL( aGenericID, err );
       
   455         }
       
   456     else
       
   457         {
       
   458         err = aError;
       
   459         isValidConnection = EAccSrvDeny;
       
   460         }
       
   461 
       
   462     if( iServerModel->FindAndRemoveCancelledConnectAccessory( aGenericID.UniqueID() ) )
       
   463         {
       
   464         //Connection of this accessory is cancelled.
       
   465         err = KErrCancel;
       
   466         isValidConnection = EAccSrvDeny;
       
   467         }
       
   468     
       
   469     switch( isValidConnection )
       
   470         {
       
   471         case EAccSrvDetect:
       
   472             {
       
   473             }
       
   474             break;
       
   475 
       
   476         case EAccSrvConnect:
       
   477             {
       
   478             if( isConnected )
       
   479                 {
       
   480                 //update connection generic id array
       
   481                 iServerModel->UpdateConnectionL( aGenericID);
       
   482                 
       
   483                 // Complete all possible connection status related requests
       
   484                 iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
       
   485                                                              KErrNone,
       
   486                                                              aGenericID.UniqueID() );
       
   487                 iNotificationQueue->CompleteControlMessageL( EAccessoryDisconnected,
       
   488                                                              KErrNone,
       
   489                                                              aOldGenericId.UniqueID() );
       
   490                 iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
       
   491                                                              KErrNone,
       
   492                                                              aGenericID.UniqueID() );
       
   493                 }
       
   494 
       
   495             }
       
   496             break;
       
   497 
       
   498         case EAccSrvDeny:
       
   499             {
       
   500             iServerModel->RemovePhysicalConnection( aGenericID );
       
   501             iServerModel->RemoveASYThreadID( aGenericID.UniqueID() );//Remove ThreadID GID mapping
       
   502             iServerModel->CapabilityStorage().RemoveCapabilityList( aGenericID);
       
   503             
       
   504          
       
   505             }
       
   506             break;
       
   507 
       
   508         default:
       
   509             {
       
   510             TRACE_ASSERT_ALWAYS;//unhandled enum
       
   511             }
       
   512             break;
       
   513         }
       
   514 
       
   515     iNotificationQueue->CompleteControlMessageL( EConnectAccessory,
       
   516                                                  err,
       
   517                                                  aGenericID.UniqueID() );
       
   518     
       
   519 
       
   520     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionUpdateValidationL - return void" );
       
   521     }
       
   522 
       
   523 
       
   524 
       
   525 // -----------------------------------------------------------------------------
       
   526 // CAccSrvConnectionController::ConnectionHandlingCancel
   450 // CAccSrvConnectionController::ConnectionHandlingCancel
   527 // -----------------------------------------------------------------------------
   451 // -----------------------------------------------------------------------------
   528 //
   452 //
   529 void CAccSrvConnectionController::ConnectionHandlingCancel(
   453 void CAccSrvConnectionController::ConnectionHandlingCancel(
   530     const CAccSrvConnectionHandler* aCaller )
   454     const CAccSrvConnectionHandler* aCaller )
   696 void CAccSrvConnectionController::PromoteToConnectedL(
   620 void CAccSrvConnectionController::PromoteToConnectedL(
   697     const TAccPolGenericID& aGenericID )
   621     const TAccPolGenericID& aGenericID )
   698     {
   622     {
   699     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL()" );
   623     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL()" );
   700 
   624 
   701     if( KErrNotFound != iServerModel->RemovePhysicalConnection( aGenericID )) //Move GID from physical connection array
   625     iServerModel->RemovePhysicalConnection( aGenericID ); //Move GID from physical connection array
   702       {
   626     iServerModel->AddConnectionL( aGenericID );            //to connection array
   703 	    iServerModel->AddConnectionL( aGenericID );            //to connection array
   627 
   704 
   628     iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
   705 	    iNotificationQueue->CompleteControlMessageL( ENewAccessoryConnected,
   629                                                  KErrNone,
   706 	                                                 KErrNone,
   630                                                  aGenericID.UniqueID() );
   707 	                                                 aGenericID.UniqueID() );
   631 
   708 
   632     iConnectionStatusHandler->IssueRequest();
   709 	    iConnectionStatusHandler->IssueRequest();
       
   710 	  }
       
   711 
   633 
   712     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL - return void" );
   634     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::PromoteToConnectedL - return void" );
   713     }
   635     }
   714 
   636 
   715 // -----------------------------------------------------------------------------
   637 // -----------------------------------------------------------------------------
   804     iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
   726     iNotificationQueue->CompleteControlMessageL( EAccessoryConnectionStatusChanged,
   805                                                  KErrNone,
   727                                                  KErrNone,
   806                                                  KErrNotFound );
   728                                                  KErrNotFound );
   807     iSettingsHandler->ConnectionStatusChangedL( genericIDArray );
   729     iSettingsHandler->ConnectionStatusChangedL( genericIDArray );
   808 
   730 
       
   731     // Able to show notes
       
   732     iShowNotes = ETrue;
   809     iModeHandler->IssueRequest();
   733     iModeHandler->IssueRequest();
   810 
   734 
   811     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionStatusChangedL - return void" );
   735     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleConnectionStatusChangedL - return void" );
   812     }
   736     }
   813     
   737     
   853                                                   aAudioOutputStatus, 
   777                                                   aAudioOutputStatus, 
   854                                                   iServerModel->AccessoryMode(), 
   778                                                   iServerModel->AccessoryMode(), 
   855                                                   iServerModel->UniqueID() );
   779                                                   iServerModel->UniqueID() );
   856         }
   780         }
   857 
   781 
       
   782 
   858     
   783     
   859 
   784 
   860     if( iServerModel->SetAccessoryMode( accMode, aDbId ) ) //Store accessory mode
   785     if( iServerModel->SetAccessoryMode( accMode, aDbId ) ) //Store accessory mode
   861         {
   786         {
   862         if( iModeHandler->IsActive() || iConnectionStatusHandler->IsActive() )
   787         if( iModeHandler->IsActive() || iConnectionStatusHandler->IsActive() )
   869             {
   794             {
   870             iNotificationQueue->CompleteControlMessageL( EAccessoryModeChanged,
   795             iNotificationQueue->CompleteControlMessageL( EAccessoryModeChanged,
   871                                                          KErrNone,
   796                                                          KErrNone,
   872                                                          KErrNotFound );
   797                                                          KErrNotFound );
   873             }
   798             }
       
   799 	
       
   800 		    COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Show information note!" );			
       
   801 
       
   802 		    TBool showNote( EFalse );
       
   803 		    TInt noteValue( 0 );
       
   804 			
       
   805 		    switch ( accMode.iAccessoryMode )
       
   806 		      {
       
   807 			    case EAccModeWiredHeadset:
       
   808 			    case EAccModeWiredCarKit:
       
   809 			    case EAccModeTextDevice:
       
   810 			    case EAccModeLoopset:
       
   811 			    case EAccModeMusicStand:
       
   812 			    case EAccModeTVOut:
       
   813 			    case EAccModeHeadphones:
       
   814 			    {
       
   815 				  TAccPolGenericID genericID;
       
   816 				  iServerModel->GetLastConnectedAccessoryL( genericID );
       
   817 				  TUint32 num = genericID.SubblockCaps();
       
   818 				  if ( genericID.PhysicalConnectionCaps() != KPCHDMI ) // No info note for HDMI
       
   819 				      {
       
   820                       if( num & KSBAudioSubblock )
       
   821                           {
       
   822                             CCapValue* capValue = iServerModel->CapabilityStorage().GetCapability( genericID, KAccIntegratedAudioInput );
       
   823                             if( iInformationNoteDefault )
       
   824                                   {
       
   825                                   noteValue = iInformationNoteDefault;
       
   826                                   showNote = ETrue;
       
   827                                   }
       
   828                             if( !capValue && !iInformationNoteDefault )
       
   829                                   {
       
   830                                   showNote = ETrue;
       
   831                                   }
       
   832                             }
       
   833                         else
       
   834                             {
       
   835                             if( iInformationNoteDefault )
       
   836                                   {
       
   837                                   noteValue = iInformationNoteDefault;
       
   838                                   showNote = ETrue;
       
   839                                   }
       
   840                             }
       
   841 				      }
       
   842 				  }
       
   843 			    break;			  
       
   844 			    default:
       
   845 			    {
       
   846 				  showNote = EFalse;				
       
   847 			    }
       
   848 			    break;
       
   849 		    }
       
   850 
       
   851 		    if ( showNote && iShowNotes )
       
   852 		        {		    	
       
   853 		        if( iServerModel->IdleDetected() )
       
   854 		            {
       
   855                     if ( iNotifier.Handle() )
       
   856                         {
       
   857                         iNotifier.Close();
       
   858                         }
       
   859 			        if( IsActive() )
       
   860 			            {
       
   861     		            Cancel();
       
   862     		            }
       
   863 
       
   864 			        //connect to notifier
       
   865 		            COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - notifier.Connect" );
       
   866 		            TInt err = iNotifier.Connect();
       
   867 		            if(err != KErrNone)
       
   868 		                {
       
   869 		                //ok if cannot show note, this is possible during boot
       
   870 		                COM_TRACE_1( "[AccFW:AccServer] CAccSrvConnectionController::HandleAccessoryModeChangedL - Couldn't connect to notifier: err = %d", err);	
       
   871 		                }
       
   872 		            else
       
   873 		                {
       
   874 		                TPckg<TInt> valuePckg( noteValue );
       
   875 		                iStatus = KRequestPending;
       
   876                         iNotifier.StartNotifierAndGetResponse( 
       
   877                                         iStatus, 
       
   878                                         KAccFwUiNoteNotifierUid, 
       
   879                                         valuePckg, 
       
   880                                         iReplyPck);
       
   881                         SetActive();
       
   882     		            }
       
   883     		        }
       
   884 		        //reset values
       
   885 	            iShowNotes = EFalse;
       
   886 			    iInformationNoteUID = 0;
       
   887 			    iInformationNoteDefault = 0;			      
       
   888     		    }
   874         }        
   889         }        
   875     else
   890     else
   876         {
   891         {
   877         // Accessory Mode was allready up-to-date,
   892         // Accessory Mode was allready up-to-date,
   878         // no need to complete Accessory Mode changed notification.
   893         // no need to complete Accessory Mode changed notification.
   891 	const TUint32 aDefaultValue )
   906 	const TUint32 aDefaultValue )
   892     {
   907     {
   893 	COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::SetDefaultAccessoryInformation()" );
   908 	COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::SetDefaultAccessoryInformation()" );
   894 	iInformationNoteUID = aGenericID.UniqueID();
   909 	iInformationNoteUID = aGenericID.UniqueID();
   895 	iInformationNoteDefault = aDefaultValue;
   910 	iInformationNoteDefault = aDefaultValue;
       
   911     }
       
   912 
       
   913 // -----------------------------------------------------------------------------
       
   914 // CAccSrvConnectionController::RunL
       
   915 // -----------------------------------------------------------------------------
       
   916 //
       
   917 void CAccSrvConnectionController::RunL()
       
   918     {
       
   919     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::RunL()" );
       
   920     
       
   921     iNotifier.Close();
       
   922     }
       
   923 
       
   924 // -----------------------------------------------------------------------------
       
   925 // CAccSrvConnectionController::DoCancel
       
   926 // -----------------------------------------------------------------------------
       
   927 //
       
   928 void CAccSrvConnectionController::DoCancel()
       
   929     {
       
   930     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::DoCancel()" );
       
   931 
       
   932     COM_TRACE_( "[AccFW:AccServer] CAccSrvConnectionController::DoCancel - return void" );
   896     }
   933     }
   897 
   934 
   898 // -----------------------------------------------------------------------------
   935 // -----------------------------------------------------------------------------
   899 // CAccSrvConnectionController::RegisterControlMessageL
   936 // CAccSrvConnectionController::RegisterControlMessageL
   900 // -----------------------------------------------------------------------------
   937 // -----------------------------------------------------------------------------