accessoryservices/accessorymonitor/tsrc/public/basic/accmonconnectionemulator/src/AccMonConnectionEmulator.cpp
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessorymonitor/tsrc/public/basic/accmonconnectionemulator/src/AccMonConnectionEmulator.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,519 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Main functionality of AccMonitor. Constructs the Accessory
+*          Monitor implementation class
+*
+*/
+
+
+#include <accessoryserver.h>
+#include <AccessoryBTControl.h>
+#include <e32uid.h>
+#include <btsdp.h>
+#include <AccMonitorCapabilities.h>
+#include <AccMonitor.h>
+#include <AccMonitorInfo.h>
+#include <e32property.h>
+#include "acc_debug.h"
+#include "accmonconnectionemulator.h"
+#include "AccMonConnetionConsts.h"
+#include "AsyConst.h"
+
+#define TEST_BT
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+EXPORT_C CConnectionEmulator* CConnectionEmulator::NewL()
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::NewL()" );
+    
+    CConnectionEmulator* impl = CConnectionEmulator::NewLC();
+    CleanupStack::Pop( impl );
+    
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::NewL() - return" );
+    return impl;
+    }
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::NewLC
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+EXPORT_C CConnectionEmulator* CConnectionEmulator::NewLC()
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::NewLC()" );
+    
+    CConnectionEmulator* self = new (ELeave) CConnectionEmulator();
+    CleanupStack::PushL( self );
+    
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::NewLC() - return" );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ default constructor.
+// ---------------------------------------------------------------------------
+CConnectionEmulator::CConnectionEmulator()
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::CConnectionEmulator()" );
+    
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::CConnectionEmulator() - return" );
+    }
+
+// ---------------------------------------------------------------------------
+// C++ default destructor.
+// ---------------------------------------------------------------------------
+CConnectionEmulator::~CConnectionEmulator()
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::~CConnectionEmulator()" );
+    iSubscribe.Delete( KTFConnectionEmulatorTestProperty, KTFConnectionEmulatorMethod );
+    iSubscribe.Close();
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::~CConnectionEmulator() - return" );
+    }
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::ConnectAccessory
+// 
+// Connects an accessory of some type.
+// ---------------------------------------------------------------------------
+EXPORT_C TInt CConnectionEmulator::ConnectAccessoryL(
+    TEnumAccConnectType aAccDefintion,
+    TBool aSync )
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::ConnectAccessory()" );
+    
+    TInt err( KErrNone );
+    TPckgBuf< TTFAccessoryPublishAndSubscribe > buf;
+    
+    // Reset the values and then order the connect
+    TTFASYReference method;
+    TInt64 param1( 0 );
+    TBool wired( EFalse );
+    TUint64 btaddress;
+    RArray< TUint32 > capabilityArray;
+    TUint8 deviceType;
+    
+    switch( aAccDefintion )
+        {
+          case EWiredHeadSetCon:
+              {
+              method = ETFAsyConnectHeadset;
+              wired = ETrue;
+              break;
+              }
+          case EWirelessHeadSetCon:
+              {
+#ifdef TEST_BT
+              method = ETFBTConnectHeadset;
+              btaddress = KBTAddrHeadsetHSP;
+              deviceType = 0x1;
+#else
+              err = KErrHardwareNotAvailable;
+#endif
+              break;
+              }
+          case EWiredCarKitCon:
+              {
+              method = ETFAsyConnectECICarKit;
+              wired = ETrue;
+              break;
+              }
+          case EWirelessCarKitCon:
+              {
+#ifdef TEST_BT
+              method = ETFBTConnectCarKit;
+              btaddress = KBTAddrCarkit;
+              deviceType = 0x2;
+#else
+              err = KErrHardwareNotAvailable;
+#endif
+              break;
+              }
+          case EMusicStandCon:
+              {
+              method = ETFAsyConnectECIMusicStand;
+              wired = ETrue;
+              break;
+              }
+          case ETVOutCon:
+              {
+              method = ETFAsyConnectECITVOut;
+              wired = ETrue;
+              break;
+              }
+          case E3PoleOpenCable:
+              {
+              method = ETFAsyConnectOpenCable3Poles;
+              wired = ETrue;
+              break;
+              }
+          default:
+              {
+              User::Leave( KErrGeneral );
+              break;
+              }
+        }
+  
+    // Set the struct to the right order
+    buf().iMethod     = method;
+    buf().iParam1     = param1;
+    buf().iCapsArray  = capabilityArray;
+    if( wired )
+        {
+        if( aSync )
+            {
+            TInt some = SetPubSubL();
+            //RProperty subscribe;        
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            //iStatus = KRequestPending;
+            //User::WaitForRequest( iStatus );
+            //iSubscribe.Cancel();            
+            //iSubscribe.Close();
+            }
+        else
+            {            
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            }
+        }
+    // A BT connect
+    else
+        {
+#ifdef TEST_BT
+        TBTDevAddr btaddr( btaddress );
+        TBool oldTest( EFalse );
+        TRequestStatus status;
+        RAccessoryServer server;
+        server.Connect();
+        RAccessoryBTControl accessoryBTControl;
+        accessoryBTControl.CreateSubSession( server );
+        accessoryBTControl.ConnectAccessory( iStatus, btaddr );
+        iStatus = KRequestPending;
+        User::WaitForRequest( status );
+        accessoryBTControl.CloseSubSession();
+        server.Disconnect();
+#endif
+        }
+    
+    User::After( 1000000 );
+    
+    COM_TRACE_1( "[AccFW:AccMonitor] CConnectionEmulator::ConnectAccessory() - return err %d", err );
+    
+    capabilityArray.Close();
+    
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::ConnectAccessory
+// 
+// Connects an accessory with some defined capabilities.
+// ---------------------------------------------------------------------------
+EXPORT_C TInt CConnectionEmulator::ConnectAccessoryL(
+     RAccMonCapabilityArray& aCapabilityArray,
+     TBool aSync )
+    {
+    COM_TRACE_( "[CConnectionEmulator] CConnectionEmulator::ConnectAccessory() - with array" );
+    
+    TInt err( KErrNone );
+    TPckgBuf< TTFAccessoryPublishAndSubscribe > buf;
+    
+    // Reset the values and then order the connect
+    TTFASYReference method;
+    TInt64 param1( 0 );
+    TBool wired( EFalse );
+    TUint64 btaddress;
+    method = ETFAsyConnectArrayOfCapabilities;
+  
+    aCapabilityArray.SortUnsigned();
+    for( TInt i = 0; i != aCapabilityArray.Count(); i++ )
+        {
+        COM_TRACE_1( "[CConnectionEmulator] CConnectionEmulator::ConnectAccessory() - In array capability: %d", aCapabilityArray[ i ] );
+        }
+    if( aCapabilityArray.Find( KAccMonWired ) >= 0 )
+        {
+        wired = ETrue;
+        }
+    
+    // Set the struct to the right order
+    buf().iMethod = method;
+    buf().iParam1 = param1;
+    buf().iCapsArray = aCapabilityArray;
+    if( wired )
+        {
+        if( aSync )
+            {
+            TInt some = SetPubSubL();
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            }
+        else
+            {            
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            }
+        }
+    else
+        {
+#ifdef TEST_BT
+        switch( aCapabilityArray[ 0 ] )
+            {
+            case KAccMonHeadset:
+                {
+                btaddress = KBTAddrHeadsetHSP;
+                break;
+                }
+            case KAccMonCarKit:
+                {
+                btaddress = KBTAddrHeadsetHSP;
+                break;
+                }
+            default:
+                {
+                err = KErrNotFound;
+                break;
+                }
+            }
+        if( err == KErrNone )
+            {
+            TRequestStatus status;
+            RAccessoryServer server;
+            server.Connect();
+            RAccessoryBTControl accessoryBTControl;
+            accessoryBTControl.CreateSubSession( server );
+            TBTDevAddr btaddr( btaddress );
+            accessoryBTControl.ConnectAccessory( iStatus, btaddr );
+            iStatus = KRequestPending;
+            User::WaitForRequest( status );
+            accessoryBTControl.CloseSubSession();
+            server.Disconnect();
+            }
+#else
+         err = KErrHardwareNotAvailable;
+#endif
+         }
+    User::After( 1000000 ); 
+    
+    COM_TRACE_1( "[AccFW:AccMonitor] CConnectionEmulator::ConnectAccessory() - return err %d", err );
+    
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::DisconnectAccessory
+// 
+// Disconnects an accessory of some type.
+// ---------------------------------------------------------------------------
+EXPORT_C TInt CConnectionEmulator::DisconnectAccessoryL( 
+    TEnumAccConnectType aAccDefintion,
+    TBool aSync )
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::DisconnectAccessory()" );
+    TInt err( KErrNone );
+    TPckgBuf< TTFAccessoryPublishAndSubscribe > buf;
+    
+    // Reset the values and then order the connect
+    TTFASYReference method;
+    TInt64 param1( 0 );
+    TBool wired( EFalse );
+    TUint64 btaddress;
+    RArray< TUint32 > capabilityArray;
+    
+    switch( aAccDefintion )
+        {
+            case EWiredHeadSetCon:
+                {
+                method = ETFAsyDisc;
+                wired = ETrue;
+                break;
+                }
+            case EWirelessHeadSetCon:
+            {
+#ifdef TEST_BT
+                method = ETFBTConnectHeadset;
+                btaddress = KBTAddrHeadsetHSP;
+#else
+                err = KErrHardwareNotAvailable;
+#endif
+                break;
+            }
+            case EWiredCarKitCon:
+                {
+                method = ETFAsyDisc;
+                wired = ETrue;
+                break;
+                }
+          case EWirelessCarKitCon:
+            {
+#ifdef TEST_BT
+                method = ETFBTConnectCarKit;
+                btaddress = KBTAddrCarkit;
+#else
+                err = KErrHardwareNotAvailable;
+#endif
+                break;
+            }
+          case EMusicStandCon:
+                {
+                wired = ETrue;
+                method = ETFAsyDisc;
+                break;
+                }
+          case ETVOutCon:
+                {
+                wired = ETrue;
+                method = ETFAsyDisc;
+                break;
+                }
+          default:
+                {
+                User::Leave( KErrGeneral );
+                break;
+                }
+        }
+  
+    // Set the struct to the right order
+    buf().iMethod = method;
+    buf().iParam1 = param1;
+    buf().iCapsArray = capabilityArray;
+    
+    if( wired )
+        {  
+        if( aSync )
+            {
+            TInt some = SetPubSubL();            
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            //iStatus = KRequestPending;
+            //User::WaitForRequest( iStatus );
+            //iSubscribe.Cancel();
+            //iSubscribe.Delete( KTFConnectionEmulatorTestProperty, KTFConnectionEmulatorMethod );
+            //iSubscribe.Close();
+            }
+        else
+            {            
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            }
+        }
+    
+    // A BT disconnect
+    else
+        {
+#ifdef TEST_BT
+        TRequestStatus status;
+        RAccessoryServer server;
+        server.Connect();
+        RAccessoryBTControl accessoryBTControl;
+        accessoryBTControl.CreateSubSession( server );
+        TBTDevAddr btaddr( btaddress );
+        accessoryBTControl.DisconnectAccessory( iStatus, btaddr );
+        iStatus = KRequestPending;
+        User::WaitForRequest( iStatus );
+        accessoryBTControl.CloseSubSession();
+        server.Disconnect();
+#endif
+        }
+    User::After( 1000000 );
+    COM_TRACE_1( "[AccFW:AccMonitor] CConnectionEmulator::DisconnectAccessory() - return err %d", err );
+    
+    capabilityArray.Close();
+    
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CConnectionEmulator::DisconnectAccessory
+// 
+// Connects an accessory of some accessory that is connected.
+// ---------------------------------------------------------------------------
+EXPORT_C TInt CConnectionEmulator::DisconnectAccessoryL( 
+        CAccMonitorInfo* aAccInfo,
+        TBool aSync )
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::DisconnectAccessory() - return err " );
+    
+    TInt err( KErrNone );
+    
+    if( aAccInfo->AccPhysicalConnection() == KAccMonWired )
+        {
+        TInt err( KErrNone );
+        TPckgBuf< TTFAccessoryPublishAndSubscribe > buf;
+        
+        // Reset the values and then order the connect
+        TTFASYReference method;
+        TInt64 param1( 0 );
+        TBool wired( EFalse );
+        RArray< TUint32 > capabilityArray;
+        
+        method = ETFAsyDisc;
+        
+        // Set the struct to the right order
+        buf().iMethod     = method;
+        buf().iParam1     = param1;
+        buf().iCapsArray  = capabilityArray;
+        if( aSync )
+            {
+            TInt some = SetPubSubL();            
+            User::LeaveIfError( iSubscribe.Set( KTFAccessoryTestProperty, KTFAccessoryMethod, buf ) );
+            /*iStatus = KRequestPending;
+            User::WaitForRequest( iStatus );
+            iSubscribe.Cancel();
+            iSubscribe.Delete( KTFConnectionEmulatorTestProperty, KTFConnectionEmulatorMethod );
+            iSubscribe.Close();
+            */
+            }
+        }
+    // A BT disconnect
+    else
+        {
+#ifdef TEST_BT
+        TUint64 btaddress = aAccInfo->AccDeviceAddress();
+        TRequestStatus status;
+        RAccessoryServer server;
+        server.Connect();
+        RAccessoryBTControl accessoryBTControl;
+        accessoryBTControl.CreateSubSession( server );
+        TBTDevAddr btaddr( btaddress );
+        accessoryBTControl.DisconnectAccessory( iStatus, btaddr );
+        iStatus = KRequestPending;
+        User::WaitForRequest( iStatus );
+        accessoryBTControl.CloseSubSession();
+        server.Disconnect();
+#else 
+        err = KErrHardwareNotAvailable;
+#endif
+        }
+    
+    User::After( 1000000 );
+    
+    COM_TRACE_1( "[AccFW:AccMonitor] CConnectionEmulator::DisconnectAccessory() - return err %d", err );
+    
+    return err;
+    }
+  
+  
+TInt CConnectionEmulator::SetPubSubL()
+    {
+    COM_TRACE_( "[AccFW:AccMonitor] CConnectionEmulator::SetPubSubL()" );
+    TInt retval(KErrNone);
+    retval = iSubscribe.Define( KTFConnectionEmulatorTestProperty, KTFConnectionEmulatorMethod, RProperty::EByteArray );
+    if(retval != KErrAlreadyExists)
+        {
+        User::LeaveIfError( retval );
+        }    
+    //retval =  iSubscribe.Attach( KTFConnectionEmulatorTestProperty, KTFConnectionEmulatorMethod, EOwnerThread );
+    //iSubscribe.Subscribe( iStatus );
+    COM_TRACE_1( "[AccFW:AccMonitor] CConnectionEmulator::SetPubSubL() - return retval %d", retval );
+  
+    return retval;
+    }
+  
+// End of file
\ No newline at end of file