bluetoothengine/headsetsimulator/remotecontroller/src/hsremotecontroller.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 "hsremotecontroller.h"
       
    17 #include "hsrcbttools.h"
       
    18 #include "hsrccommand.h"
       
    19 #include "debug.h"
       
    20 
       
    21 EXPORT_C CHsRemoteController* CHsRemoteController::NewL(
       
    22         MHsRCObserver* aObserver )
       
    23     {
       
    24     CHsRemoteController* self = CHsRemoteController::NewLC( aObserver );
       
    25     CleanupStack::Pop( self );
       
    26     return self;
       
    27     }
       
    28 
       
    29 EXPORT_C CHsRemoteController* CHsRemoteController::NewLC(
       
    30         MHsRCObserver* aObserver )
       
    31     {
       
    32     CHsRemoteController* self = new ( ELeave ) CHsRemoteController( aObserver );
       
    33     CleanupStack::PushL( self );
       
    34     self->ConstructL();
       
    35     return self;
       
    36     }
       
    37 
       
    38 EXPORT_C CHsRemoteController::~CHsRemoteController()
       
    39     {
       
    40     TRACE_FUNC_ENTRY
       
    41     if ( iBTManager )
       
    42         {
       
    43         delete iBTManager;
       
    44         }
       
    45 
       
    46     if ( iSocket )
       
    47         {
       
    48         if ( iConnected )
       
    49             {
       
    50             iSocket->CancelAll();
       
    51             // Return value may be ignored
       
    52             iSocket->Shutdown( RSocket::EImmediate );
       
    53             }
       
    54         delete iSocket;
       
    55         }
       
    56 
       
    57     iSocketServ.Close();
       
    58 
       
    59     TRACE_FUNC_EXIT
       
    60     }
       
    61 
       
    62 EXPORT_C void CHsRemoteController::ConnectHsDevAddrL(
       
    63         const TBTDevAddr& aDevAddr, const TUUID& aService )
       
    64     {
       
    65     TRACE_FUNC_ENTRY
       
    66     if ( iConnected )
       
    67         {
       
    68         User::Leave( KErrInUse );
       
    69         }
       
    70     if ( iObserver )
       
    71         {
       
    72         iObserver->HandleConnectingToHs();
       
    73         }
       
    74     iBTManager->SetService( aService );
       
    75 
       
    76     iBTManager->ConnectDevAddrL( aDevAddr );
       
    77 
       
    78     TRACE_FUNC_EXIT
       
    79     }
       
    80 
       
    81 EXPORT_C void CHsRemoteController::ConnectHsDevNameL( const TDesC& aHsName,
       
    82         const TUUID& aService )
       
    83     {
       
    84     TRACE_FUNC_ENTRY
       
    85     if ( iConnected )
       
    86         {
       
    87         User::Leave( KErrInUse );
       
    88         }
       
    89     if ( iObserver )
       
    90         {
       
    91         iObserver->HandleConnectingToHs();
       
    92         }
       
    93     iBTManager->SetService( aService );
       
    94     iBTManager->ConnectDevNameL( aHsName );
       
    95 
       
    96     TRACE_FUNC_EXIT
       
    97 
       
    98     }
       
    99 
       
   100 EXPORT_C void CHsRemoteController::CancelConnectingToHs()
       
   101     {
       
   102     TRACE_FUNC_ENTRY
       
   103     if ( iBTManager )
       
   104         {
       
   105         iBTManager->CancelConnecting();
       
   106         }
       
   107     TRACE_FUNC_EXIT
       
   108     }
       
   109 
       
   110 EXPORT_C void CHsRemoteController::DisconnectFromHs()
       
   111     {
       
   112     TRACE_FUNC_ENTRY
       
   113     if ( iSocket )
       
   114         {
       
   115         if ( iConnected )
       
   116             {
       
   117             iSocket->CancelAll();
       
   118             // Return value may be ignored
       
   119             iSocket->Shutdown( RSocket::EImmediate );
       
   120             }
       
   121         delete iSocket;
       
   122         iSocket = NULL;
       
   123         iConnected = EFalse;
       
   124         if ( iObserver )
       
   125             {
       
   126             iObserver->HandleDisconnectedFromHs( KErrNone );
       
   127             }
       
   128 
       
   129         }
       
   130 
       
   131     TRACE_FUNC_EXIT
       
   132     }
       
   133 
       
   134 EXPORT_C void CHsRemoteController::ReqTurnOnHs( const TDesC& aPluginCod,
       
   135         const TDesC& aPluginSdp, const TDesC& aPluginProfile )
       
   136     {
       
   137     TRACE_FUNC_ENTRY
       
   138 
       
   139     __ASSERT_ALWAYS( iConnected,
       
   140             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   141 
       
   142     RBuf buf;
       
   143     TRAPD(err, buf.CreateL( aPluginCod.Length() + aPluginSdp.Length()
       
   144                     + aPluginProfile.Length() + 4 ) );
       
   145     if ( err == KErrNone )
       
   146         {
       
   147         TBuf <2> sep;
       
   148         CnvUtfConverter::ConvertToUnicodeFromUtf8( sep,
       
   149                 KHsRemoteRequestParamSeparator );
       
   150 
       
   151         buf.Copy( aPluginCod );
       
   152         buf.Append( sep );
       
   153         buf.Append( aPluginSdp );
       
   154         buf.Append( sep );
       
   155         buf.Append( aPluginProfile );
       
   156 
       
   157         SendRequest( EHsTurnOn, buf );
       
   158         }
       
   159 
       
   160     TRACE_FUNC_EXIT
       
   161     }
       
   162 
       
   163 EXPORT_C void CHsRemoteController::ReqTurnOffHs()
       
   164     {
       
   165     TRACE_FUNC_ENTRY
       
   166 
       
   167     __ASSERT_ALWAYS( iConnected,
       
   168             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   169 
       
   170     SendRequest( EHsTurnOff );
       
   171 
       
   172     TRACE_FUNC_EXIT
       
   173     }
       
   174 
       
   175 EXPORT_C void CHsRemoteController::ReqConnectWithDevAddr(
       
   176         const TBTDevAddr& aDevAddr )
       
   177     {
       
   178     TRACE_FUNC_ENTRY
       
   179 
       
   180     __ASSERT_ALWAYS( iConnected, 
       
   181             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   182 
       
   183     TBuf <KDevAddrLength> devAddrBuf;
       
   184     aDevAddr.GetReadable( devAddrBuf );
       
   185     SendRequest( EHsConnectDevAddress, devAddrBuf );
       
   186 
       
   187     TRACE_FUNC_EXIT
       
   188     }
       
   189 
       
   190 EXPORT_C void CHsRemoteController::ReqConnectWithDevName( 
       
   191         const TDesC& aDevName )
       
   192     {
       
   193     TRACE_FUNC_ENTRY
       
   194 
       
   195     __ASSERT_ALWAYS( iConnected, 
       
   196             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   197     SendRequest( EHsConnectName, aDevName );
       
   198 
       
   199     TRACE_FUNC_EXIT
       
   200     }
       
   201 
       
   202 EXPORT_C void CHsRemoteController::ReqConnectWithLastConnected()
       
   203     {
       
   204     TRACE_FUNC_ENTRY
       
   205 
       
   206     __ASSERT_ALWAYS( iConnected,
       
   207             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   208     
       
   209     SendRequest( EHsConnectLastconnected );
       
   210 
       
   211     TRACE_FUNC_EXIT
       
   212     }
       
   213 
       
   214 EXPORT_C void CHsRemoteController::ReqAcceptCall()
       
   215     {
       
   216     TRACE_FUNC_ENTRY
       
   217 
       
   218     __ASSERT_ALWAYS( iConnected, 
       
   219             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   220     SendRequest( EHsAcceptCall );
       
   221 
       
   222     TRACE_FUNC_EXIT
       
   223     }
       
   224 
       
   225 EXPORT_C void CHsRemoteController::ReqReleaseCall()
       
   226     {
       
   227     TRACE_FUNC_ENTRY
       
   228 
       
   229     __ASSERT_ALWAYS( iConnected, 
       
   230             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   231     SendRequest( EHsReleaseCall );
       
   232 
       
   233     TRACE_FUNC_EXIT
       
   234     }
       
   235 
       
   236 EXPORT_C void CHsRemoteController::ReqSetMicGain( const TDesC& aValue )
       
   237     {
       
   238     TRACE_FUNC_ENTRY
       
   239 
       
   240     __ASSERT_ALWAYS( iConnected, 
       
   241             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   242     SendRequest( EHsSetMicVolume, aValue );
       
   243 
       
   244     TRACE_FUNC_EXIT
       
   245     }
       
   246 
       
   247 EXPORT_C void CHsRemoteController::ReqSetSpeakerVolume( const TDesC& aValue )
       
   248     {
       
   249     TRACE_FUNC_ENTRY
       
   250 
       
   251     __ASSERT_ALWAYS( iConnected, 
       
   252             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   253     
       
   254     SendRequest( EHsSetSpeakerVolume, aValue );
       
   255 
       
   256     TRACE_FUNC_EXIT
       
   257     }
       
   258 
       
   259 EXPORT_C void CHsRemoteController::ReqSendAnyAt( const TDesC& aValue )
       
   260     {
       
   261     TRACE_FUNC_ENTRY
       
   262 
       
   263     __ASSERT_ALWAYS( iConnected, 
       
   264             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   265     SendRequest( EHsSendAnyAt, aValue );
       
   266 
       
   267     TRACE_FUNC_EXIT
       
   268     }
       
   269 
       
   270 EXPORT_C void CHsRemoteController::ReqDisconnectAG()
       
   271     {
       
   272     TRACE_FUNC_ENTRY
       
   273 
       
   274     __ASSERT_ALWAYS( iConnected, 
       
   275             User::Panic(KHSRemoteControllerNotConnectedPanicMsg, KErrNotReady));
       
   276     SendRequest( EHsDisconnectAGs );
       
   277 
       
   278     TRACE_FUNC_EXIT
       
   279     }
       
   280 
       
   281 CHsRemoteController::CHsRemoteController( MHsRCObserver* aObserver ) :
       
   282     iObserver( aObserver )
       
   283     {
       
   284 
       
   285     }
       
   286 
       
   287 void CHsRemoteController::ConstructL()
       
   288     {
       
   289     User::LeaveIfError( iSocketServ.Connect() );
       
   290     User::LeaveIfError( CreateBTManager() );
       
   291     }
       
   292 
       
   293 void CHsRemoteController::SendRequest(
       
   294         const THsRemoteControlCommandType aCommandType, const TDesC& aData )
       
   295     {
       
   296     TRACE_FUNC_ENTRY
       
   297 
       
   298     THsRCCommandData data( KNullDesC8 );
       
   299     TInt err = CnvUtfConverter::ConvertFromUnicodeToUtf8( data, aData );
       
   300     if ( err == KErrNone )
       
   301         {
       
   302         THsRCCommand cmd( data, aCommandType );
       
   303         cmd.ToDes8( iSendDataBuffer );
       
   304 
       
   305         err = Send( iSendDataBuffer );
       
   306         if ( ( err == KErrNone ) && iObserver )
       
   307             {
       
   308             iObserver->HandleRequestSent( aCommandType );
       
   309             }
       
   310         }
       
   311     TRACE_FUNC_EXIT
       
   312     }
       
   313 
       
   314 TInt CHsRemoteController::Send( const TDesC8& aData )
       
   315     {
       
   316     TRACE_FUNC_ENTRY
       
   317     TRACE_INFO( ( _L8("Data to be send: [%S]"), &aData) )
       
   318 
       
   319     if ( !iConnected )
       
   320         {
       
   321         TRACE_INFO( _L("Not connected to HS") )
       
   322         TRACE_FUNC_EXIT
       
   323         return KErrNotReady;
       
   324         }
       
   325 
       
   326     iSendDataBuffer.Copy( aData );
       
   327     if ( iSendDataBuffer.Length() > 0 )
       
   328         {
       
   329         TInt err = iSocket->Write( iSendDataBuffer );
       
   330         if ( err == KErrNone )
       
   331             {
       
   332             iSendDataBuffer.Zero();
       
   333             }
       
   334 
       
   335         TRACE_FUNC_EXIT
       
   336         return err;
       
   337         }
       
   338 
       
   339     TRACE_FUNC_EXIT
       
   340 
       
   341     return KErrNone;
       
   342     }
       
   343 
       
   344 void CHsRemoteController::Receive()
       
   345     {
       
   346     TRACE_FUNC_ENTRY
       
   347     // Return value may be ignored, 
       
   348     // error will be notified to HandleReceiveCompleteL
       
   349     iSocket->RecvOneOrMore( iReceiveDataBuffer, 0, iDataLength );
       
   350     TRACE_FUNC_EXIT
       
   351     }
       
   352 
       
   353 TInt CHsRemoteController::ConnectRemoteControlServer( const TBTDevAddr& aAddr,
       
   354         const TInt aPort )
       
   355     {
       
   356     TRACE_FUNC_ENTRY
       
   357     TInt error = KErrNone;
       
   358     if ( !iConnected )
       
   359         {
       
   360 
       
   361         TProtocolDesc protocolDesc;
       
   362         error = iSocketServ.FindProtocol( _L("RFCOMM"), protocolDesc );
       
   363         if ( error != KErrNone )
       
   364             {
       
   365             TRACE_INFO( ( _L("iSocketServ.FindProtocol error = %d"), error) )
       
   366             TRACE_FUNC_EXIT
       
   367             return error;
       
   368             }
       
   369 
       
   370         TRAP(error, iSocket = CBluetoothSocket::NewL(*this, iSocketServ,
       
   371                         protocolDesc.iSockType, protocolDesc.iProtocol));
       
   372         if ( error != KErrNone )
       
   373             {
       
   374             TRACE_INFO( ( _L("iSocket = CBluetoothSocket::NewL error = %d"), error))
       
   375             TRACE_FUNC_EXIT
       
   376             return error;
       
   377             }
       
   378 
       
   379         TBTSockAddr addr;
       
   380         addr.SetBTAddr( aAddr );
       
   381         addr.SetPort( aPort );
       
   382         error = iSocket->Connect( addr );
       
   383 
       
   384         if ( error != KErrNone )
       
   385             {
       
   386             TRACE_INFO( ( _L("iSocket->Connect error = %d"), error))
       
   387             TRACE_FUNC_EXIT
       
   388             return error;
       
   389             }
       
   390         }
       
   391     else
       
   392         {
       
   393         TRACE_INFO( _L("CHsRemoteController::Connect() - client is already connected") )
       
   394         TRACE_FUNC_EXIT
       
   395         return KErrInUse;
       
   396         }
       
   397 
       
   398     TRACE_FUNC_EXIT
       
   399     return KErrNone;
       
   400     }
       
   401 
       
   402 TInt CHsRemoteController::CreateBTManager()
       
   403     {
       
   404     TInt err = KErrNone;
       
   405 
       
   406     if ( !iBTManager )
       
   407         {
       
   408         TRAP(err, iBTManager = CHsRCBTManager::NewL(iSocketServ, this));
       
   409         if ( err != KErrNone )
       
   410             {
       
   411             iBTManager = NULL;
       
   412             }
       
   413         return err;
       
   414         }
       
   415     else
       
   416         {
       
   417         return KErrAlreadyExists;
       
   418         }
       
   419 
       
   420     }
       
   421 
       
   422 void CHsRemoteController::HandleConnectCompleteL( TInt aErr )
       
   423     {
       
   424     TRACE_FUNC_ENTRY
       
   425     TRACE_INFO( ( _L("aErr = %d"), aErr) )
       
   426 
       
   427     if ( aErr == KErrNone )
       
   428         {
       
   429         TRACE_INFO(_L("Connect completed"))
       
   430         iConnected = ETrue;
       
   431         Receive();
       
   432         }
       
   433     if ( iObserver )
       
   434         {
       
   435         iObserver->HandleConnectedToHs( aErr );
       
   436         }
       
   437     TRACE_FUNC_EXIT
       
   438     }
       
   439 
       
   440 void CHsRemoteController::HandleAcceptCompleteL( TInt /*aErr*/)
       
   441     {
       
   442     }
       
   443 
       
   444 void CHsRemoteController::HandleShutdownCompleteL( TInt /*aErr*/)
       
   445     {
       
   446     }
       
   447 
       
   448 void CHsRemoteController::HandleSendCompleteL( TInt aErr )
       
   449     {
       
   450     TRACE_FUNC_ENTRY
       
   451     TRACE_INFO( ( _L("aErr = %d"), aErr) )
       
   452 
       
   453     if ( aErr == KErrNone )
       
   454         {
       
   455         if ( ( iSendDataBuffer.Length() > 0 ) && ( ( iSocket->Write(
       
   456                 iSendDataBuffer ) ) == KErrNone ) )
       
   457             {
       
   458             iSendDataBuffer.Zero();
       
   459             }
       
   460         }
       
   461     Receive();
       
   462     TRACE_FUNC_EXIT
       
   463     }
       
   464 
       
   465 void CHsRemoteController::HandleReceiveCompleteL( TInt aErr )
       
   466     {
       
   467     TRACE_FUNC_ENTRY
       
   468     TRACE_INFO( ( _L("aErr = %d"), aErr) )
       
   469 
       
   470     if ( aErr == KErrNone )
       
   471         {
       
   472         if ( ( iSendDataBuffer.Length() > 0 ) && ( ( iSocket->Write(
       
   473                 iSendDataBuffer ) ) == KErrNone ) )
       
   474             {
       
   475             iSendDataBuffer.Zero();
       
   476             }
       
   477         Receive();
       
   478         }
       
   479     else
       
   480         {
       
   481         TRACE_INFO(_L("ControlServer cancelled listening"));
       
   482         DisconnectFromHs();
       
   483         }
       
   484     }
       
   485 
       
   486 void CHsRemoteController::HandleIoctlCompleteL( TInt /*aErr*/)
       
   487     {
       
   488     }
       
   489 
       
   490 void CHsRemoteController::HandleActivateBasebandEventNotifierCompleteL(
       
   491         TInt /*aErr*/, TBTBasebandEventNotification& /*aEventNotification*/)
       
   492     {
       
   493     }
       
   494 
       
   495 void CHsRemoteController::HandleDesiredDevFound( const TDesC& aDevName,
       
   496         const TBTDevAddr& aDevAddr, const TInt aPort )
       
   497     {
       
   498     TRACE_FUNC_ENTRY
       
   499     //value ignored
       
   500     TInt err = ConnectRemoteControlServer( aDevAddr, aPort );
       
   501 
       
   502     TRACE_INFO((_L("err = %d"), err))
       
   503 
       
   504     if ( iObserver && err != KErrNone )
       
   505         {
       
   506         iObserver->HandleConnectedToHs( err );
       
   507         }
       
   508     TRACE_FUNC_EXIT
       
   509     }
       
   510 
       
   511 void CHsRemoteController::HandleDesiredDevNotFound( TInt aErr )
       
   512     {
       
   513     TRACE_FUNC_ENTRY
       
   514 
       
   515     if ( iObserver )
       
   516         {
       
   517         iObserver->HandleConnectedToHs( aErr );
       
   518         }
       
   519 
       
   520     TRACE_FUNC_EXIT
       
   521     }
       
   522