bluetoothengine/headsetsimulator/remotecontroller/src/bttools/hsrcbtmanager.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 "hsrcbttools.h"
       
    17 #include "hsrcbttoolsobserver.h"
       
    18 #include "debug.h"
       
    19 
       
    20 CHsRCBTManager* CHsRCBTManager::NewL( RSocketServ& aSServ,
       
    21         MHsRCBTManagerObserver* aBTManagerObserver )
       
    22     {
       
    23     CHsRCBTManager* self = CHsRCBTManager::NewLC( aSServ, aBTManagerObserver );
       
    24     CleanupStack::Pop( self ); // self;
       
    25     return self;
       
    26     }
       
    27 
       
    28 CHsRCBTManager* CHsRCBTManager::NewLC( RSocketServ& aSServ,
       
    29         MHsRCBTManagerObserver* aBTManagerObserver )
       
    30     {
       
    31     CHsRCBTManager* self = new ( ELeave ) CHsRCBTManager( aSServ,
       
    32             aBTManagerObserver );
       
    33     CleanupStack::PushL( self );
       
    34     self->ConstructL();
       
    35     return self;
       
    36     }
       
    37 
       
    38 CHsRCBTManager::~CHsRCBTManager()
       
    39     {
       
    40     TRACE_FUNC_ENTRY
       
    41     TRAP_IGNORE(RestoreInitialSettingsL());
       
    42 
       
    43     if ( iBTSettings )
       
    44         {
       
    45         delete iBTSettings;
       
    46         }
       
    47 
       
    48     if ( iBTConnection )
       
    49         {
       
    50         delete iBTConnection;
       
    51         }
       
    52 
       
    53     if ( iDiscoverer )
       
    54         {
       
    55         delete iDiscoverer;
       
    56         }
       
    57 
       
    58     if ( iBTDiscovery )
       
    59         {
       
    60         delete iBTDiscovery;
       
    61         }
       
    62 
       
    63     iDesiredMAC.Close();
       
    64     iDesiredName.Close();
       
    65 
       
    66     iBTInitialName.Close();
       
    67     iBTName.Close();
       
    68 
       
    69     TRACE_FUNC_EXIT
       
    70     }
       
    71 
       
    72 void CHsRCBTManager::ConnectDevAddrL( const TBTDevAddr& aDevAddr )
       
    73     {
       
    74     TRACE_FUNC_ENTRY
       
    75     iDesiredMAC.Zero();
       
    76     iDesiredName.Zero();
       
    77 
       
    78     iSearchType = EDevAddr;
       
    79     aDevAddr.GetReadable( iDesiredMAC );
       
    80 
       
    81     TBTPowerStateValue powerState;
       
    82     TInt err = iBTSettings->GetPowerState( powerState );
       
    83     if ( KErrNone == err && powerState == EBTPowerOff )
       
    84         {
       
    85         TurnOnBTL();
       
    86         }
       
    87     iDiscoverer->DeviceSearchL();
       
    88 
       
    89     TRACE_FUNC_EXIT
       
    90     }
       
    91 
       
    92 void CHsRCBTManager::ConnectDevNameL( const TDesC& aDeviceName )
       
    93     {
       
    94     TRACE_FUNC_ENTRY
       
    95     iDesiredMAC.Zero();
       
    96     iDesiredName.Zero();
       
    97 
       
    98     iSearchType = EDevName;
       
    99     iDesiredName.Copy( aDeviceName );
       
   100 
       
   101     TBTPowerStateValue powerState;
       
   102     iBTSettings->GetPowerState( powerState );
       
   103     TInt err = iBTSettings->GetPowerState( powerState );
       
   104     if ( KErrNone == err && powerState == EBTPowerOff )
       
   105         {
       
   106         TurnOnBTL();
       
   107         }
       
   108 
       
   109     iDiscoverer->DeviceSearchL();
       
   110     TRACE_FUNC_EXIT
       
   111     }
       
   112 
       
   113 void CHsRCBTManager::CancelConnecting()
       
   114     {
       
   115     TRACE_FUNC_ENTRY
       
   116     if ( iDiscoverer )
       
   117         iDiscoverer->Cancel();
       
   118     TRACE_FUNC_EXIT
       
   119     }
       
   120 
       
   121 void CHsRCBTManager::SetService( const TUUID &aService )
       
   122     {
       
   123     iServiceSet = ETrue;
       
   124     iService = aService;
       
   125     }
       
   126 
       
   127 CHsRCBTManager::CHsRCBTManager( RSocketServ& aSServ,
       
   128         MHsRCBTManagerObserver* aBTManagerObserver ) :
       
   129     iSServ( aSServ ), iBTManagerObserver( aBTManagerObserver )
       
   130     {
       
   131 
       
   132     }
       
   133 
       
   134 void CHsRCBTManager::ConstructL()
       
   135     {
       
   136     TRACE_FUNC_ENTRY
       
   137     iBTSettings = CBTEngSettings::NewL( this );
       
   138     iBTConnection = CBTEngConnMan::NewL( this );
       
   139     iDiscoverer = CHsRCDeviceDiscoverer::NewL( this, iSServ );
       
   140     iBTDiscovery = CBTEngDiscovery::NewL( this );
       
   141 
       
   142     User::LeaveIfError( iDesiredName.Create( KMaxBCBluetoothNameLen ) );
       
   143     User::LeaveIfError( iDesiredMAC.Create( KMaxBCBluetoothNameLen ) );
       
   144     User::LeaveIfError( iBTInitialName.Create( KMaxBluetoothNameLen ) );
       
   145     User::LeaveIfError( iBTName.Create( KMaxBluetoothNameLen ) );
       
   146 
       
   147     User::LeaveIfError( iBTSettings->GetLocalName( iBTInitialName ) );
       
   148     iBTName.Copy( iBTInitialName );
       
   149 
       
   150     User::LeaveIfError( iBTSettings->GetVisibilityMode(
       
   151             iBTInitialVisibilityMode ) );
       
   152     iServiceSet = EFalse;
       
   153 
       
   154     User::LeaveIfError( iBTSettings->GetPowerState( iBTInitialPowerState ) );
       
   155     TRACE_FUNC_EXIT
       
   156     }
       
   157 
       
   158 void CHsRCBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/)
       
   159     {
       
   160     }
       
   161 
       
   162 void CHsRCBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/)
       
   163     {
       
   164     }
       
   165 
       
   166 void CHsRCBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr,
       
   167         RBTDevAddrArray* /*aConflicts*/)
       
   168     {
       
   169     TRACE_FUNC_ENTRY
       
   170     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   171 
       
   172     if ( ( aErr != KErrNone ) && iBTManagerObserver )
       
   173         {
       
   174         iBTManagerObserver->HandleDesiredDevNotFound( aErr );
       
   175         }
       
   176 
       
   177     TRACE_FUNC_EXIT
       
   178     }
       
   179 
       
   180 void CHsRCBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/)
       
   181     {
       
   182     }
       
   183 
       
   184 void CHsRCBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/)
       
   185     {
       
   186     }
       
   187 
       
   188 void CHsRCBTManager::ServiceSearchComplete(
       
   189         const RSdpRecHandleArray& /* aResult */,
       
   190         TUint /* aTotalRecordsCount */, TInt /* aErr */)
       
   191     {
       
   192     }
       
   193 
       
   194 void CHsRCBTManager::AttributeSearchComplete(
       
   195         TSdpServRecordHandle /* aHandle */, const RSdpResultArray& /* aAttr */,
       
   196         TInt /* aErr */)
       
   197     {
       
   198     }
       
   199 
       
   200 void CHsRCBTManager::ServiceAttributeSearchComplete(
       
   201         TSdpServRecordHandle /* aHandle */, const RSdpResultArray& aAttr, 
       
   202         TInt /* aErr */)
       
   203     {
       
   204     TRACE_FUNC_ENTRY
       
   205 
       
   206     TInt port;
       
   207 
       
   208     TInt err = FindPort( aAttr, port );
       
   209     iDiscoverer->Cancel();
       
   210 
       
   211     if ( ( err == KErrNone ) && ( iBTManagerObserver ) )
       
   212         {
       
   213         iBTManagerObserver->HandleDesiredDevFound( iDesiredName, iDevAddr, 
       
   214                 port );
       
   215         }
       
   216     else
       
   217         {
       
   218 
       
   219         if ( iBTManagerObserver )
       
   220             {
       
   221             iBTManagerObserver->HandleDesiredDevNotFound( err );
       
   222             }
       
   223 
       
   224         }
       
   225     TRACE_FUNC_EXIT
       
   226     }
       
   227 
       
   228 void CHsRCBTManager::DeviceSearchComplete( CBTDevice* /* aDevice */, 
       
   229         TInt /* aErr */)
       
   230     {
       
   231     }
       
   232 
       
   233 void CHsRCBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddr,
       
   234         TDesC8& aDevName, TUint16 /* aMajServClass */,
       
   235         TUint /* aMajDeviceClass */, TUint8 /* aMinDeviceClass */)
       
   236     {
       
   237     TRACE_FUNC_ENTRY
       
   238 
       
   239     RBuf bufAddr;
       
   240     RBuf bufName;
       
   241 
       
   242     bufAddr.CleanupClosePushL();
       
   243     bufName.CleanupClosePushL();
       
   244 
       
   245     bufAddr.CreateL( aDevAddr.Length() );
       
   246     bufName.CreateL( aDevName.Length() );
       
   247 
       
   248     bufAddr.Copy( aDevAddr );
       
   249     bufName.Copy( aDevName );
       
   250 
       
   251     TRACE_INFO( (_L8("DevNAME: %S :: DevADDR: %S") , &aDevName, &aDevAddr) )
       
   252 
       
   253     if ( ( iSearchType == EDevAddr ) && ( bufAddr == iDesiredMAC ) )
       
   254         {
       
   255         iDiscoverer->Cancel();
       
   256         TBTDevAddr addr;
       
   257 
       
   258         User::LeaveIfError( addr.SetReadable( bufAddr ) );
       
   259 
       
   260         iDevAddr = addr;
       
   261         iDesiredName.Copy( aDevName );
       
   262         TRAPD(err,FindServiceL(iDevAddr, iService));
       
   263 
       
   264         if ( ( err != KErrNone ) && ( iBTManagerObserver ) )
       
   265             {
       
   266             iBTManagerObserver->HandleDesiredDevNotFound( err );
       
   267             }
       
   268         iDesiredMAC.Zero();
       
   269         }
       
   270 
       
   271     else if ( ( iSearchType == EDevName ) && ( bufName == iDesiredName ) )
       
   272         {
       
   273 
       
   274         iDiscoverer->Cancel();
       
   275         User::LeaveIfError( iDevAddr.SetReadable( bufAddr ) );
       
   276         TRAPD(err, FindServiceL(iDevAddr, iService));
       
   277 
       
   278         if ( ( err != KErrNone ) && ( iBTManagerObserver ) )
       
   279             {
       
   280             iBTManagerObserver->HandleDesiredDevNotFound( err );
       
   281             }
       
   282 
       
   283         iDesiredName.Zero();
       
   284         }
       
   285 
       
   286     CleanupStack::PopAndDestroy( 2 );
       
   287 
       
   288     TRACE_FUNC_EXIT
       
   289     }
       
   290 
       
   291 void CHsRCBTManager::HandleDeviceFindFailed( TInt aErr )
       
   292     {
       
   293 
       
   294     TRACE_FUNC_ENTRY
       
   295     TRACE_INFO( ( _L("aErr = %d"), aErr) );
       
   296 
       
   297     if ( iBTManagerObserver )
       
   298         {
       
   299         iBTManagerObserver->HandleDesiredDevNotFound( aErr );
       
   300         }
       
   301 
       
   302     TRACE_FUNC_EXIT
       
   303     }
       
   304 
       
   305 TInt CHsRCBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort )
       
   306     {
       
   307     TRACE_FUNC_ENTRY
       
   308 
       
   309     TInt res = KErrNotFound;
       
   310 
       
   311     for ( TInt i = 0; i < aAttr.Count(); i++ )
       
   312         {
       
   313         TBTEngSdpAttrValue attr = aAttr[i];
       
   314 
       
   315         if ( attr.iAttrType == ETypeUint )
       
   316             {
       
   317             aPort = attr.iAttrValue.iValNumeric;
       
   318             res = KErrNone;
       
   319             TRACE_INFO( (_L("Found port: %d"), aPort) );
       
   320 
       
   321             }
       
   322 
       
   323         }
       
   324 
       
   325     TRACE_FUNC_EXIT
       
   326     return res;
       
   327     }
       
   328 
       
   329 void CHsRCBTManager::RestoreInitialSettingsL()
       
   330     {
       
   331     TRACE_FUNC_ENTRY
       
   332     User::LeaveIfError( iBTSettings->SetLocalName( iBTInitialName ) );
       
   333 
       
   334     User::LeaveIfError( iBTSettings->SetPowerState( iBTInitialPowerState ) );
       
   335 
       
   336     User::LeaveIfError( iBTSettings->SetVisibilityMode(
       
   337             iBTInitialVisibilityMode ) );
       
   338 
       
   339     TRACE_FUNC_EXIT
       
   340     }
       
   341 
       
   342 void CHsRCBTManager::SetBTNameL( const TDesC& aBTName )
       
   343     {
       
   344 
       
   345     iBTName.Copy( aBTName );
       
   346     User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) );
       
   347 
       
   348     }
       
   349 
       
   350 void CHsRCBTManager::TurnOnBTL( const TDesC& aName )
       
   351     {
       
   352     User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) );
       
   353     SetBTNameL( aName );
       
   354     }
       
   355 
       
   356 void CHsRCBTManager::TurnOffBTL()
       
   357     {
       
   358     User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) );
       
   359     }
       
   360 
       
   361 void CHsRCBTManager::FindServiceL( const TBTDevAddr &aDevAddr,
       
   362         const TUUID& aService )
       
   363     {
       
   364     TRACE_FUNC_ENTRY
       
   365     if ( !iServiceSet )
       
   366         {
       
   367         User::Leave( KErrNotReady );
       
   368         }
       
   369     TInt err = iBTDiscovery->RemoteSdpQuery( aDevAddr, aService,
       
   370             KSdpAttrIdProtocolDescriptorList );
       
   371     if ( err != KErrNone )
       
   372         {
       
   373         iDiscoverer->DeviceSearchL();
       
   374         }
       
   375 
       
   376     TRACE_FUNC_EXIT
       
   377     }
       
   378