coreapplicationuis/SysAp/Src/BtSap/SysApBtSapControllerImpl.cpp
changeset 0 2e3d3ce01487
child 46 eea20ed08f4b
child 57 5e7d68cc22e0
equal deleted inserted replaced
-1:000000000000 0:2e3d3ce01487
       
     1 /*
       
     2 * Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  CSysApBtSapController implementation
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDES
       
    20 
       
    21 #include "SysApBtSapControllerImpl.h"
       
    22 #include "SysApSubscriber.h"
       
    23 #include "SysApAppUi.h"
       
    24 #include <BTSapDomainPSKeys.h>
       
    25 #include <btengdevman.h>
       
    26 #include <btengconnman.h>
       
    27 #include <StringLoader.h>
       
    28 #include <coemain.h>
       
    29 #include <SysAp.rsg>
       
    30 
       
    31 
       
    32 MSysApBtSapController* CreateSysApBtSapControllerL( CSysApAppUi& aSysApAppUi )
       
    33     {
       
    34     return CSysApBtSapController::NewL( aSysApAppUi );
       
    35     }
       
    36 
       
    37 // ============================ LOCAL FUNCTIONS ==============================
       
    38 // -----------------------------------------------------------------------------
       
    39 // SysApCBTDeviceArrayCleanup
       
    40 // Cleanup operation for CBTDeviceArray
       
    41 // -----------------------------------------------------------------------------
       
    42 static void SysApCBTDeviceArrayCleanup( TAny* aItem )
       
    43     {
       
    44     CBTDeviceArray* devices = static_cast<CBTDeviceArray*>( aItem );
       
    45     devices->ResetAndDestroy();
       
    46     delete devices;
       
    47     }
       
    48 
       
    49 // ============================ MEMBER FUNCTIONS ==============================
       
    50 
       
    51 // ----------------------------------------------------------------------------
       
    52 // CSysApBtSapController::NewL() 
       
    53 // ----------------------------------------------------------------------------
       
    54 CSysApBtSapController* CSysApBtSapController::NewL( CSysApAppUi& aSysApAppUi )
       
    55     {
       
    56     TRACES( RDebug::Print( _L("CSysApBtSapController::NewL") ) );
       
    57     CSysApBtSapController* self = new(ELeave) CSysApBtSapController( aSysApAppUi );
       
    58     CleanupStack::PushL( self );
       
    59     self->ConstructL();
       
    60     CleanupStack::Pop();
       
    61     return self;
       
    62     }
       
    63 
       
    64 // ----------------------------------------------------------------------------
       
    65 // CSysApBtSapController::CSysApBtSapController() 
       
    66 // ----------------------------------------------------------------------------
       
    67 CSysApBtSapController::CSysApBtSapController( CSysApAppUi& aSysApAppUi ) :
       
    68     iSysApAppUi( aSysApAppUi ),
       
    69     iBtSapEnabled( EFalse ),
       
    70     iSwitchingToOffline( EFalse )
       
    71     {
       
    72     }
       
    73 
       
    74 // ----------------------------------------------------------------------------
       
    75 // CSysApBtSapController::ConstructL() 
       
    76 // ----------------------------------------------------------------------------
       
    77 void CSysApBtSapController::ConstructL()
       
    78     {
       
    79     TRACES( RDebug::Print( _L("CSysApBtSapController::ConstructL") ) );
       
    80     iBtSapSubscriber = CSysApSubscriber::NewL( *this, KPSUidBluetoothSapConnectionState, KBTSapConnectionState );
       
    81     iBtSapSubscriber->Subscribe();
       
    82     }
       
    83 
       
    84 // ----------------------------------------------------------------------------
       
    85 // CSysApBtSapController::~CSysApBtSapController() 
       
    86 // ----------------------------------------------------------------------------
       
    87 
       
    88 CSysApBtSapController::~CSysApBtSapController()
       
    89     {
       
    90     TRACES( RDebug::Print( _L("CSysApBtSapController::~CSysApBtSapController") ) );
       
    91     delete iBtSapSubscriber;
       
    92     }
       
    93 
       
    94 // ----------------------------------------------------------------------------
       
    95 // CSysApBtSapController::BtSapEnabled()
       
    96 // ----------------------------------------------------------------------------
       
    97 TBool CSysApBtSapController::BtSapEnabled()
       
    98     {
       
    99     return iBtSapEnabled;
       
   100     }
       
   101 
       
   102 // ----------------------------------------------------------------------------
       
   103 // CSysApBtSapController::Disconnect()
       
   104 // ----------------------------------------------------------------------------
       
   105 TInt CSysApBtSapController::Disconnect()
       
   106     {
       
   107     TRACES( RDebug::Print( _L("CSysApBtSapController::Disconnect: iBtSapEnabled=%d"), iBtSapEnabled ) );
       
   108 
       
   109     RBTDevAddrArray addrArray;
       
   110     CBTEngConnMan* btConnMan = NULL;
       
   111     TRAPD( err, btConnMan = CBTEngConnMan::NewL() );
       
   112     if ( err == KErrNone )
       
   113         {
       
   114         err = btConnMan->GetConnectedAddresses( addrArray, EBTProfileSAP );
       
   115         if ( (err == KErrNone) && addrArray.Count() )
       
   116             {
       
   117             err = btConnMan->Disconnect( addrArray[0], EBTDiscGraceful );
       
   118             }
       
   119         else
       
   120             {
       
   121             TRACES( RDebug::Print( _L("CSysApBtSapController::Disconnect CBTEngConnMan::GetConnectedAddresses failed, err=%d"), err ) );
       
   122             }            
       
   123         }
       
   124     else
       
   125         {
       
   126         TRACES( RDebug::Print( _L("CSysApBtSapController::Disconnect CBTEngConnMan::NewL failed, err=%d"), err ) );
       
   127         }        
       
   128     delete btConnMan;
       
   129     addrArray.Close();
       
   130     
       
   131     return err;
       
   132     }
       
   133 
       
   134 // ----------------------------------------------------------------------------
       
   135 // CSysApBtSapController::SwitchingToOffline()
       
   136 // ----------------------------------------------------------------------------
       
   137 void CSysApBtSapController::SwitchingToOffline()
       
   138     {
       
   139     TRACES( RDebug::Print( _L("CSysApBtSapController:SwitchingToOffline") ) );
       
   140     iSwitchingToOffline = ETrue;
       
   141     }
       
   142     
       
   143 // ----------------------------------------------------------------------------
       
   144 // CSysApBtSapController::SimApplicationsClosed()
       
   145 // ----------------------------------------------------------------------------
       
   146 void CSysApBtSapController::SimApplicationsClosed()
       
   147     {
       
   148     TRACES( RDebug::Print( _L("CSysApBtSapController::SimApplicationsClosed()" ) ) );
       
   149     TInt err ( 0 );
       
   150 
       
   151     err = iSysApAppUi.SetStarterState( RStarterSession::EBTSap );
       
   152 
       
   153     if ( err )
       
   154         {
       
   155         TRACES( RDebug::Print( _L("CSysApBtSapController::SimApplicationsClosed SetMtcState( ESysApMtcBtSapState ) returns %d"), err ) );
       
   156         // We should end up in this branch only in the early integration phase of a product, and the
       
   157         // device is most likely dysfunctional after this error.
       
   158         }
       
   159     else
       
   160         {
       
   161         iFinalizeDisconnectNeeded = ETrue;
       
   162         
       
   163         // No RF available so signal bars should be same as in offline mode.
       
   164         iSysApAppUi.IgnoreZeroNetworkBarNotifications(ETrue);
       
   165         TRAP( err, iSysApAppUi.UpdateSignalBarsL( KAknSignalOffLineMode ) );
       
   166 
       
   167         iSysApAppUi.SetNetworkConnectionAllowed( ECoreAppUIsNetworkConnectionNotAllowed );
       
   168 
       
   169         // The SAP connection is accepted via P&S key
       
   170         RProperty::Set( KPSUidBluetoothSapConnectionState, KBTSapConnectionState, EBTSapAccepted );
       
   171         }
       
   172         
       
   173     TRACES( RDebug::Print( _L("CSysApBtSapController::SimApplicationsClosed() - END" ) ) );
       
   174     }
       
   175 
       
   176 // ----------------------------------------------------------------------------
       
   177 // CSysApBtSapController::FinalizeDisconnect()
       
   178 // ----------------------------------------------------------------------------
       
   179 void CSysApBtSapController::FinalizeDisconnect()
       
   180     {
       
   181     TRACES( RDebug::Print( _L("CSysApBtSapController::FinalizeDisconnect(): iSwitchingToOffline=%d"), iSwitchingToOffline ) );
       
   182     TInt err ( 0 );
       
   183     iFinalizeDisconnectNeeded = EFalse;
       
   184     iSysApAppUi.IgnoreZeroNetworkBarNotifications(EFalse);
       
   185 
       
   186     if ( iSysApAppUi.ActiveProfileId() == KOfflineModeProfileId )
       
   187         {
       
   188         if ( iSwitchingToOffline )
       
   189             {
       
   190             TRAP( err, iSysApAppUi.SwitchFromOnlineToOfflineModeL() );
       
   191             TRACES( RDebug::Print( _L("SwitchFromOnlineToOfflineModeL() leaves with err=%d"), err ) );
       
   192             iSwitchingToOffline = EFalse;
       
   193             }
       
   194         else
       
   195             {
       
   196             err = iSysApAppUi.SetStarterState( RStarterSession::EOffline );
       
   197             TRACES( RDebug::Print( _L("CSysApBtSapController::FinalizeDisconnect SetMtcState( ESysApNormalState ) returns %d"), err ) );
       
   198             }
       
   199         }
       
   200     else
       
   201         {
       
   202         err = iSysApAppUi.SetStarterState( RStarterSession::ENormal );
       
   203         
       
   204         if ( err == KErrNone )
       
   205             {
       
   206             iSysApAppUi.SetNetworkConnectionAllowed(ECoreAppUIsNetworkConnectionAllowed);
       
   207             }
       
   208         
       
   209         TRACES( RDebug::Print( _L("CSysApBtSapController::FinalizeDisconnect SetMtcState( ESysApNormalState ) returns %d"), err ) );
       
   210         }
       
   211     }
       
   212 
       
   213 // ----------------------------------------------------------------------------
       
   214 // CSysApBtSapController::HandlePropertyChangedL()
       
   215 // ----------------------------------------------------------------------------
       
   216 void CSysApBtSapController::HandlePropertyChangedL( const TUid& aCategory, const TUint aKey )
       
   217     {
       
   218     if ( aCategory == KPSUidBluetoothSapConnectionState && aKey == KBTSapConnectionState )
       
   219         {
       
   220         TInt value( 0 );
       
   221         RProperty::Get( aCategory, aKey, value );
       
   222         switch ( value )
       
   223             {
       
   224             case EBTSapNotConnected:
       
   225                 TRACES( RDebug::Print( _L("CSysApBtSapController::HandlePropertyChangedL: EBTSapNotConnected, iFinalizeDisconnectNeeded=%d"), iFinalizeDisconnectNeeded ) );
       
   226                 if ( iFinalizeDisconnectNeeded )
       
   227                     {
       
   228                     FinalizeDisconnect();
       
   229                     }
       
   230                 iBtSapEnabled = EFalse;
       
   231                 break;
       
   232             case EBTSapConnecting:
       
   233                 TRACES( RDebug::Print( _L("CSysApBtSapController::HandlePropertyChangedL: EBTSapConnecting, iBtSapEnabled=%d"), iBtSapEnabled ) );
       
   234                 if ( !iBtSapEnabled )
       
   235                     {
       
   236                     iSysApAppUi.InitCloseSimApplicationsL();
       
   237                     }
       
   238                 break;
       
   239             case EBTSapConnected:
       
   240                 TRACES( RDebug::Print( _L("CSysApBtSapController::HandlePropertyChangedL: EBTSapConnected") ) );
       
   241                 iBtSapEnabled = ETrue;
       
   242                 break;
       
   243             default:
       
   244                 TRACES( RDebug::Print( _L("CSysApBtSapController::HandlePropertyChangedL: unhandled value: %d"), value ) );
       
   245                 break;
       
   246             }
       
   247         }
       
   248     }
       
   249 
       
   250 
       
   251 // ----------------------------------------------------------------------------
       
   252 // CSysApBtSapController::GetBtSapDeviceNameL()
       
   253 // ----------------------------------------------------------------------------
       
   254 HBufC* CSysApBtSapController::GetBtSapDeviceNameL()
       
   255     {
       
   256     TRACES( RDebug::Print( _L("CSysApBtSapController::GetBtSapDeviceNameL()") ) );
       
   257     
       
   258     TBTDevAddr address;
       
   259     RBTDevAddrArray addrArray;
       
   260     CBTEngConnMan* btConnMan = NULL;
       
   261     TRAPD( err, btConnMan = CBTEngConnMan::NewL() );
       
   262     CleanupStack::PushL( btConnMan );
       
   263     if ( err == KErrNone )
       
   264         {
       
   265         err = btConnMan->GetConnectedAddresses( addrArray, EBTProfileSAP );
       
   266         if ( ( err == KErrNone ) && addrArray.Count() )
       
   267             {
       
   268             address = addrArray[0];
       
   269             }
       
   270         else if ( ( err == KErrNone) && !addrArray.Count() ) // not known whether this will ever occur
       
   271             {
       
   272             TRACES( RDebug::Print( _L("CSysApBtSapController::GetBtSapDeviceNameL:  CBTEngConnMan::GetConnectedAddresses() devices not found") ) );
       
   273             err = KErrNotFound; // discontinue name fetching
       
   274             }
       
   275         else
       
   276             {
       
   277             TRACES( RDebug::Print( _L("CSysApBtSapController::GetBtSapDeviceNameL:  CBTEngConnMan::GetConnectedAddresses() failed, err=%d"), err ) );
       
   278             }            
       
   279         }
       
   280     else
       
   281         {
       
   282         TRACES( RDebug::Print( _L("CSysApBtSapController::GetBtSapDeviceNameL:  CBTEngConnMan::NewL() failed, err=%d"), err ) );
       
   283         }        
       
   284     CleanupStack::PopAndDestroy( btConnMan );
       
   285     addrArray.Close();
       
   286 
       
   287     HBufC* prompt = NULL;
       
   288 
       
   289     if ( err == KErrNone )            
       
   290         {
       
   291         CBTEngDevMan* devMan = CBTEngDevMan::NewLC( NULL );
       
   292             
       
   293         TBTRegistrySearch criteria;
       
   294         criteria.FindAddress( address );
       
   295             
       
   296         CBTDeviceArray* devices = new (ELeave) CBTDeviceArray( 1 );
       
   297         CleanupStack::PushL( TCleanupItem( SysApCBTDeviceArrayCleanup, devices ) );
       
   298             
       
   299         err = devMan->GetDevices( criteria, devices );
       
   300             
       
   301         if ( err != KErrNone )
       
   302             {
       
   303             TRACES( RDebug::Print( _L("CSysApBtSapController::GetBtSapDeviceNameL CBTEngDevMan::GetDevices() returns %d"), err ) );
       
   304             }
       
   305         else
       
   306             {
       
   307             if ( devices->At( 0 )->IsValidFriendlyName() )
       
   308                 {
       
   309                 prompt = devices->At( 0 )->FriendlyName().AllocL();
       
   310                 }
       
   311             else if ( devices->At( 0 )->IsValidDeviceName() )
       
   312                 {
       
   313                 prompt = (BTDeviceNameConverter::ToUnicodeL( devices->At( 0 )->DeviceName() ) ).AllocL();
       
   314                 }    
       
   315             }        
       
   316             
       
   317         CleanupStack::PopAndDestroy( devices );
       
   318         CleanupStack::PopAndDestroy( devMan );
       
   319         }
       
   320     return prompt;        
       
   321     }
       
   322 
       
   323 // End of File
       
   324 
       
   325 
       
   326