bluetoothengine/headsetsimulator/core/src/Tools/hsbtmanager.cpp
branchheadsetsimulator
changeset 60 90dbfc0435e3
equal deleted inserted replaced
59:02103bf20ee5 60:90dbfc0435e3
       
     1 /*
       
     2  * Component Name: Headset Simulator
       
     3  * Author: Comarch S.A.
       
     4  * Version: 1.0
       
     5  * Copyright (c) 2010 Comarch S.A.
       
     6  *  
       
     7  * This Software is submitted by Comarch S.A. to Symbian Foundation Limited on 
       
     8  * the basis of the Member Contribution Agreement entered between Comarch S.A. 
       
     9  * and Symbian Foundation Limited on 5th June 2009 (“Agreement”) and may be 
       
    10  * used only in accordance with the terms and conditions of the Agreement. 
       
    11  * Any other usage, duplication or redistribution of this Software is not 
       
    12  * allowed without written permission of Comarch S.A.
       
    13  * 
       
    14  */
       
    15 
       
    16 #include "debug.h"
       
    17 #include "hstools.h"
       
    18 
       
    19 CHsBTManager* CHsBTManager::NewL( RSocketServ& aSocketServ,
       
    20         MHsBTManagerObserver* aBTManagerObserver )
       
    21     {
       
    22     CHsBTManager* self = CHsBTManager::NewLC( aSocketServ, aBTManagerObserver );
       
    23     CleanupStack::Pop( self ); // self;
       
    24     return self;
       
    25     }
       
    26 
       
    27 CHsBTManager* CHsBTManager::NewLC( RSocketServ& aSocketServ,
       
    28         MHsBTManagerObserver* aBTManagerObserver )
       
    29     {
       
    30     CHsBTManager* self = new ( ELeave ) CHsBTManager( aSocketServ,
       
    31             aBTManagerObserver );
       
    32     CleanupStack::PushL( self );
       
    33     self->ConstructL();
       
    34     return self;
       
    35     }
       
    36 
       
    37 CHsBTManager::CHsBTManager( RSocketServ& aSocketServ,
       
    38         MHsBTManagerObserver* aBTManagerObserver ) :
       
    39     iSocketServ( aSocketServ ), iBTManagerObserver( aBTManagerObserver )
       
    40     {
       
    41 
       
    42     }
       
    43 
       
    44 CHsBTManager::~CHsBTManager()
       
    45     {
       
    46     TRACE_FUNC_ENTRY
       
    47     RestoreInitialSettings();
       
    48 
       
    49     if ( iBTSettings )
       
    50         {
       
    51         delete iBTSettings;
       
    52         }
       
    53     if ( iBTConnection )
       
    54         {
       
    55         delete iBTConnection;
       
    56         }
       
    57 
       
    58     if ( iDiscoverer )
       
    59         {
       
    60         delete iDiscoverer;
       
    61         }
       
    62     if ( iBTDiscovery )
       
    63         {
       
    64         delete iBTDiscovery;
       
    65         }
       
    66 
       
    67     iDesiredDevAdrress.Close();
       
    68     iDesiredName.Close();
       
    69 
       
    70     iBTInitialName.Close();
       
    71     iBTName.Close();
       
    72 
       
    73     TRACE_FUNC_EXIT
       
    74     }
       
    75 
       
    76 void CHsBTManager::ConstructL()
       
    77     {
       
    78     TRACE_FUNC_ENTRY
       
    79     iBTSettings = CBTEngSettings::NewL( this );
       
    80     iBTConnection = CBTEngConnMan::NewL( this );
       
    81     iDiscoverer = CHsDeviceDiscoverer::NewL( this, iSocketServ );
       
    82     iBTDiscovery = CBTEngDiscovery::NewL( this );
       
    83 
       
    84     iDesiredName.CreateL( KMaxBluetoothNameLen );
       
    85     iDesiredDevAdrress.CreateL( KMaxBluetoothNameLen );
       
    86     iBTInitialName.CreateL( KMaxBluetoothNameLen );
       
    87     iBTName.CreateL( KMaxBluetoothNameLen );
       
    88 
       
    89     User::LeaveIfError( iBTSettings->GetLocalName( iBTInitialName ) );
       
    90     iBTName.Copy( iBTInitialName );
       
    91 
       
    92     User::LeaveIfError( iBTSettings->GetVisibilityMode(
       
    93             iBTInitialVisibilityMode ) );
       
    94     iServiceSet = EFalse;
       
    95 
       
    96     User::LeaveIfError( iBTSettings->GetPowerState( iBTInitialPowerState ) );
       
    97     TRACE_FUNC_EXIT
       
    98     }
       
    99 
       
   100 void CHsBTManager::SetBTNameL( const TDesC& aBTName )
       
   101     {
       
   102     TRACE_FUNC_ENTRY
       
   103     iBTName.Copy( aBTName );
       
   104     User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) );
       
   105     TRACE_FUNC_EXIT
       
   106     }
       
   107 
       
   108 void CHsBTManager::TurnBtOnL( const TDesC& aName )
       
   109     {
       
   110     TRACE_FUNC_ENTRY
       
   111     User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) );
       
   112     SetBTNameL( aName );
       
   113     TRACE_FUNC_EXIT
       
   114     }
       
   115 
       
   116 void CHsBTManager::TurnBtOffL()
       
   117     {
       
   118     TRACE_FUNC_ENTRY
       
   119     User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) );
       
   120     TRACE_FUNC_EXIT
       
   121     }
       
   122 
       
   123 void CHsBTManager::FindDevL( const TDesC& aDevAddress )
       
   124     {
       
   125     TRACE_FUNC_ENTRY
       
   126     iDesiredDevAdrress.Zero();
       
   127     iDesiredName.Zero();
       
   128 
       
   129     iLookingFor = EDevAddress;
       
   130     iDesiredDevAdrress.Copy( aDevAddress );
       
   131 
       
   132     TBTPowerStateValue powerState;
       
   133     User::LeaveIfError( iBTSettings->GetPowerState( powerState ) );
       
   134     if ( powerState == EBTPowerOff )
       
   135         {
       
   136         TurnBtOnL();
       
   137         }
       
   138     iDiscoverer->DeviceSearchL();
       
   139 
       
   140     TRACE_FUNC_EXIT
       
   141     }
       
   142 
       
   143 void CHsBTManager::FindNameL( const TDesC& aDeviceName )
       
   144     {
       
   145     TRACE_FUNC_ENTRY
       
   146     iDesiredDevAdrress.Zero();
       
   147     iDesiredName.Zero();
       
   148 
       
   149     iLookingFor = EName;
       
   150     iDesiredName.Copy( aDeviceName );
       
   151 
       
   152     TBTPowerStateValue powerState;
       
   153     User::LeaveIfError( iBTSettings->GetPowerState( powerState ) );
       
   154     if ( powerState == EBTPowerOff )
       
   155         {
       
   156         TurnBtOnL();
       
   157         }
       
   158     iDiscoverer->DeviceSearchL();
       
   159 
       
   160     TRACE_FUNC_EXIT
       
   161     }
       
   162 
       
   163 void CHsBTManager::SetService( const TUUID& aService )
       
   164     {
       
   165     TRACE_FUNC_ENTRY
       
   166     iServiceSet = ETrue;
       
   167     iService = aService;
       
   168     TRACE_FUNC_EXIT
       
   169     }
       
   170 
       
   171 void CHsBTManager::CancelConnecting()
       
   172     {
       
   173     TRACE_FUNC_ENTRY
       
   174     if ( iDiscoverer )
       
   175         iDiscoverer->Cancel();
       
   176     TRACE_FUNC_EXIT
       
   177     }
       
   178 
       
   179 TInt CHsBTManager::SetVisible( TBTVisibilityMode aVisibilityMode )
       
   180     {
       
   181     TRACE_FUNC
       
   182     return iBTSettings->SetVisibilityMode( aVisibilityMode );
       
   183     }
       
   184 
       
   185 void CHsBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddress,
       
   186         TDesC8& aDevName, TUint16 /*aMajServClass*/, TUint /*aMajDeviceClass*/,
       
   187         TUint8 /*aMinDeviceClass*/)
       
   188     {
       
   189 
       
   190     TRACE_FUNC_ENTRY
       
   191 
       
   192     RBuf bufDevAddr;
       
   193     RBuf bufDevName;
       
   194 
       
   195     bufDevAddr.CleanupClosePushL();
       
   196     bufDevName.CleanupClosePushL();
       
   197 
       
   198     bufDevAddr.CreateL( aDevAddress.Length() );
       
   199     bufDevName.CreateL( aDevName.Length() );
       
   200 
       
   201     bufDevAddr.Copy( aDevAddress );
       
   202     bufDevName.Copy( aDevName );
       
   203 
       
   204     TRACE_INFO( (_L("DevName: %S :: DevAddr: %S") , &bufDevName, &bufDevAddr) )
       
   205 
       
   206     if ( ( iLookingFor == EDevAddress )
       
   207           && ( aDevAddress == iDesiredDevAdrress ) )
       
   208         {
       
   209         TRACE_INFO( (_L("Desired DevAddr [%S] found"), &bufDevAddr) )
       
   210         iDiscoverer->Cancel();
       
   211 
       
   212         if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) )
       
   213             {
       
   214             iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound );
       
   215             }
       
   216         iDesiredName.Copy( bufDevName );
       
   217         TRAPD(err,FindServiceL(iDevAddr, iService));
       
   218 
       
   219         if ( err != KErrNone )
       
   220             {
       
   221             TRACE_INFO( (_L("FindService error: %d"), err) )
       
   222             iBTManagerObserver->HandleServiceNotFound( err );
       
   223             }
       
   224         }
       
   225     else if ( ( iLookingFor == EName ) && ( bufDevName == iDesiredName ) )
       
   226         {
       
   227         TRACE_INFO( (_L("Desired DevName [%S] found"), &bufDevName) )
       
   228         iDiscoverer->Cancel();
       
   229 
       
   230         if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) )
       
   231             {
       
   232             iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound );
       
   233             }
       
   234         TRAPD(err,FindServiceL(iDevAddr, iService));
       
   235 
       
   236         if ( err != KErrNone )
       
   237             {
       
   238             TRACE_INFO( (_L("FindService error: %d"), err) )
       
   239             iBTManagerObserver->HandleServiceNotFound( err );
       
   240             }
       
   241         }
       
   242 
       
   243     CleanupStack::PopAndDestroy( 2 );
       
   244 
       
   245     TRACE_FUNC_EXIT
       
   246     }
       
   247 
       
   248 void CHsBTManager::HandleDeviceFindFailed( TInt aErr )
       
   249     {
       
   250 
       
   251     TRACE_FUNC_ENTRY
       
   252     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   253     iDiscoverer->Cancel();
       
   254 
       
   255     iBTManagerObserver->HandleDesiredDeviceNotFound( aErr );
       
   256     TRACE_FUNC_EXIT
       
   257     }
       
   258 
       
   259 void CHsBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/)
       
   260     {
       
   261     TRACE_FUNC_ENTRY
       
   262 
       
   263     TRACE_FUNC_EXIT
       
   264     }
       
   265 
       
   266 void CHsBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/)
       
   267     {
       
   268     TRACE_FUNC_ENTRY
       
   269 
       
   270     TRACE_FUNC_EXIT
       
   271     }
       
   272 
       
   273 void CHsBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr,
       
   274         RBTDevAddrArray* /*aConflicts*/)
       
   275     {
       
   276     TRACE_FUNC_ENTRY
       
   277     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   278 
       
   279     TRACE_FUNC_EXIT
       
   280     }
       
   281 
       
   282 void CHsBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr )
       
   283     {
       
   284     TRACE_FUNC_ENTRY
       
   285     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   286 
       
   287     TRACE_FUNC_EXIT
       
   288     }
       
   289 
       
   290 void CHsBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt aErr )
       
   291     {
       
   292     TRACE_FUNC_ENTRY
       
   293     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   294 
       
   295     TRACE_FUNC_EXIT
       
   296     }
       
   297 
       
   298 void CHsBTManager::ServiceSearchComplete(
       
   299         const RSdpRecHandleArray& /*aResult*/, TUint /*aTotalRecordsCount*/,
       
   300         TInt /*aErr*/)
       
   301     {
       
   302     TRACE_FUNC_ENTRY
       
   303 
       
   304     TRACE_FUNC_EXIT
       
   305     }
       
   306 
       
   307 void CHsBTManager::AttributeSearchComplete( TSdpServRecordHandle /*aHandle*/,
       
   308         const RSdpResultArray& /*aAttr*/, TInt /*aErr*/)
       
   309     {
       
   310     TRACE_FUNC_ENTRY
       
   311 
       
   312     TRACE_FUNC_EXIT
       
   313     }
       
   314 
       
   315 void CHsBTManager::ServiceAttributeSearchComplete(
       
   316         TSdpServRecordHandle /*aHandle*/, const RSdpResultArray& aAttr,
       
   317         TInt aErr )
       
   318     {
       
   319     TRACE_FUNC_ENTRY
       
   320     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   321 
       
   322     TInt port;
       
   323 
       
   324     TInt err = FindPort( aAttr, port );
       
   325     iDiscoverer->Cancel();
       
   326 
       
   327     if ( err == KErrNone )
       
   328         {
       
   329         iBTManagerObserver->HandleDesiredDeviceFound( iDesiredName, iDevAddr,
       
   330                 port );
       
   331         }
       
   332     else
       
   333         {
       
   334         iBTManagerObserver->HandlePortNotFound( err );
       
   335         }
       
   336 
       
   337     TRACE_FUNC_EXIT
       
   338     }
       
   339 
       
   340 void CHsBTManager::DeviceSearchComplete( CBTDevice* /*aDevice*/, TInt /*aErr*/)
       
   341     {
       
   342     TRACE_FUNC_ENTRY
       
   343 
       
   344     TRACE_FUNC_EXIT
       
   345     }
       
   346 
       
   347 void CHsBTManager::RestoreInitialSettings()
       
   348     {
       
   349     TRACE_FUNC_ENTRY
       
   350     // Return values may be ignored, no influence on Headset functionality
       
   351     iBTSettings->SetLocalName( iBTInitialName );
       
   352     iBTSettings->SetPowerState( iBTInitialPowerState );
       
   353     iBTSettings->SetVisibilityMode( iBTInitialVisibilityMode );
       
   354     TRACE_FUNC_EXIT
       
   355     }
       
   356 
       
   357 void CHsBTManager::FindServiceL( const TBTDevAddr& aDevAddr,
       
   358         const TUUID& aService )
       
   359     {
       
   360     TRACE_FUNC_ENTRY
       
   361 
       
   362     if ( !iServiceSet )
       
   363         {
       
   364         User::Leave( KErrNotReady );
       
   365         }
       
   366     TInt err = iBTDiscovery->RemoteSdpQuery( aDevAddr, aService,
       
   367             KSdpAttrIdProtocolDescriptorList );
       
   368 
       
   369     if ( err != KErrNone )
       
   370         {
       
   371         iBTManagerObserver->HandleSdpQueryError( err );
       
   372         }
       
   373     TRACE_FUNC_EXIT
       
   374     }
       
   375 
       
   376 TInt CHsBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort )
       
   377     {
       
   378     TRACE_FUNC_ENTRY
       
   379 
       
   380     TInt err = KErrNotFound;
       
   381 
       
   382     for ( TInt i = 0; i < aAttr.Count(); i++ )
       
   383         {
       
   384         TBTEngSdpAttrValue attr = aAttr[i];
       
   385 
       
   386         if ( attr.iAttrType == ETypeUint )
       
   387             {
       
   388             aPort = attr.iAttrValue.iValNumeric;
       
   389             err = KErrNone;
       
   390             TRACE_INFO( (_L("Found port: %d"), aPort) )
       
   391             break;
       
   392             }
       
   393         }
       
   394 
       
   395     TRACE_INFO( ( _L("Returned value = %d"), err) );
       
   396     TRACE_FUNC_EXIT
       
   397     return err;
       
   398     }