bluetoothapitest/bluetoothsvs/T_BTSockAddrAPI/src/T_BTDevAddrData.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothapitest/bluetoothsvs/T_BTSockAddrAPI/src/T_BTDevAddrData.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,442 @@
+/*
+* Copyright (c) 2005-2009 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:
+*
+*/
+
+
+#include "T_BTDevAddrData.h"
+#include "T_CBluetoothSocketData.h"
+
+
+//Constant Literals used.
+
+//Parameters
+_LIT(KDevAddress,										"btdevaddress");
+_LIT(KBTAddr,											"btaddr");
+_LIT(KHexBTAddrL,										"hex_btaddr_l");
+_LIT(KHexBTAddrR,										"hex_btaddr_r");
+_LIT(KDeviceName,										"devicename");
+_LIT(KBTSocket,											"btsocket");
+_LIT(KUseLocalName,										"uselocalname");
+
+//TBTDevAddr
+_LIT(KCmdConstruct, 									"Construct");
+_LIT(KCmdSetAddress, 									"SetBTAddr");
+
+_LIT(KCmdOpenHostResolver,								"OpenHostResolver");
+_LIT(KCmdSetHostNameL,									"SetHostNameL");
+_LIT(KCmdSetDiscoverable,								"SetDiscoverable");
+_LIT(KCmdGetDeviceAddress,								"GetDeviceAddress");
+_LIT(KCmdDistructor,									"~");
+
+/*@}*/
+
+CT_BTDevAddrData* CT_BTDevAddrData::NewL()
+	{
+	CT_BTDevAddrData*	ret=new (ELeave) CT_BTDevAddrData();
+	CleanupStack::PushL(ret);
+	ret->ConstructL();
+	CleanupStack::Pop(ret);
+	return ret;
+	}
+
+CT_BTDevAddrData::CT_BTDevAddrData()
+: iBTDevAddr(NULL),	iActive(NULL), iHostResolverOpen(EFalse)
+	{
+	}
+
+void CT_BTDevAddrData::ConstructL()
+	{
+	iActive = CActiveCallback::NewL(*this);
+	}
+
+CT_BTDevAddrData::~CT_BTDevAddrData()
+	{
+	if( iHostResolverOpen )
+		{
+		iHostResolver.Close();
+		}
+
+	Cleanup();
+
+	delete iActive;
+	iActive = NULL;
+	}
+
+void CT_BTDevAddrData::Cleanup()
+	{
+	delete iBTDevAddr;
+	iBTDevAddr=NULL;
+	}
+
+inline TCleanupOperation CT_BTDevAddrData::CleanupOperation()
+	{
+	return CleanupOperation;
+	}
+
+void CT_BTDevAddrData::CleanupOperation(TAny* aAny)
+	{
+	TBTDevAddr* arg=static_cast<TBTDevAddr*>(aAny);
+	delete arg;
+	}
+
+TBool CT_BTDevAddrData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
+	{
+	TBool								retVal=ETrue;
+
+	if ( aCommand==KCmdConstruct )
+		{
+		TBTDAConstruct(aSection);
+		}
+	else if ( aCommand==KCmdSetAddress )
+		{
+		TBTDASetAddress(aSection);
+		}
+	else if ( aCommand==KCmdSetHostNameL )
+		{
+		SetHostNameL(aSection);
+		}
+	else if ( aCommand==KCmdOpenHostResolver )
+		{
+		OpenHostResolver(aSection);
+		}
+	else if ( aCommand==KCmdSetDiscoverable )
+		{
+		SetDiscoverable(aSection);
+		}
+	else if ( aCommand==KCmdGetDeviceAddress )
+		{
+		GetDeviceAddress(aSection, aAsyncErrorIndex);
+		}
+	else if ( aCommand==KCmdDistructor )
+		{				
+		Cleanup();
+		}	
+	else
+		{
+		retVal=EFalse;
+		}
+	return retVal;
+	}
+
+void CT_BTDevAddrData::TBTDAConstruct(const TDesC& aSection)
+	{
+	INFO_PRINTF1(_L("TBTDevAddr Constructor Call"));
+	TPtrC myDevAddrName;
+	TBTDevAddr*	myDevAddr=NULL;
+	if ( !GetStringFromConfig(aSection, KDevAddress(), myDevAddrName) )
+		{
+		//Use default constructor
+		Cleanup();
+		iBTDevAddr = new (ELeave) TBTDevAddr();
+		}
+	else
+		{
+		TRAPD( err, myDevAddr=static_cast<TBTDevAddr*>(GetDataObjectL(myDevAddrName)) );
+
+		if ( (!err) && (myDevAddr!=NULL) )
+			{
+			Cleanup();
+			TRAPD( err, iBTDevAddr = new (ELeave) TBTDevAddr(*myDevAddr) );
+			SetError(err);
+			}
+		else
+			{
+			ERR_PRINTF2(_L("TBTDAConstructFromDevAddr TSockAddr is NULL and GetDataObjectL returned err = %d"), err);
+			SetBlockResult(EFail);
+			}
+		}
+	}
+
+
+void CT_BTDevAddrData::TBTDASetAddress(const TDesC& aSection)
+	{
+	TInt	devId;
+	if( GetIntFromConfig(aSection, KBTAddr(), devId))
+		{
+		INFO_PRINTF2(_L("Set TBTDevAddr (%d)"), devId);
+		*iBTDevAddr = devId;
+		}
+	else
+		{
+		TPtrC		bluetoothSocketName;
+		if( GetStringFromConfig(aSection, KBTSocket(), bluetoothSocketName))
+			{
+			CT_BluetoothSocketNotifier*	bluetoothSocketNotifier=static_cast<CT_BluetoothSocketNotifier*>(GetDataObjectL(bluetoothSocketName));
+			if ( bluetoothSocketNotifier!=NULL )
+				{
+				TBool				useLocalName = ETrue;
+				GetBoolFromConfig(aSection, KUseLocalName(), useLocalName);
+
+				T_TBTSockAddrChild	addr;
+				if( useLocalName )
+					{
+					bluetoothSocketNotifier->iBluetoothSocket->LocalName(addr);
+					}
+				else
+					{
+					bluetoothSocketNotifier->iBluetoothSocket->RemoteName(addr);
+					}
+
+				*iBTDevAddr = addr.BTAddr();
+				TBuf<KMaxSockAddrSize>	tmpBuf;
+				iBTDevAddr->GetReadable(tmpBuf);
+				INFO_PRINTF2(_L("Set TBTDevAddr (%S)"), &tmpBuf);
+				}
+			else
+				{
+				ERR_PRINTF1(_L("CT_BluetoothSocketNotifier is NULL"));
+				SetBlockResult(EFail);
+				}
+			}
+		else
+			{
+			TInt	lhs;
+			if ( !GetHexFromConfig(aSection, KHexBTAddrL(), lhs ))
+				{
+				ERR_PRINTF1(_L("TBTDevAddr GetHexFromConfig failed"));
+				SetBlockResult(EFail);
+				}
+
+			TInt	rhs;
+			if ( !GetHexFromConfig(aSection, KHexBTAddrR(), rhs ))
+				{
+				ERR_PRINTF1(_L("TBTDevAddr GetHexFromConfig failed"));
+				SetBlockResult(EFail);
+				}
+			*iBTDevAddr = (MAKE_TINT64(lhs, rhs));
+			}
+		}
+	}
+
+
+void CT_BTDevAddrData::OpenHostResolver(const TDesC& aSection)
+	{
+	RSocketServ	sockServ;
+	TPtrC		bluetoothSocketName;
+	if( GetStringFromConfig(aSection, KBTSocket(), bluetoothSocketName))
+		{
+		CT_BluetoothSocketNotifier*	bluetoothSocketData=static_cast<CT_BluetoothSocketNotifier*>(GetDataObjectL(bluetoothSocketName));
+		if ( bluetoothSocketData!=NULL )
+			{
+			sockServ = bluetoothSocketData->iSocketServer;
+			}
+		else
+			{
+			ERR_PRINTF1(_L("CT_CBluetoothSocketDataPersistentObject is NULL"));
+			SetBlockResult(EFail);
+			}
+		}
+
+	//	Find protocol from socket
+	TProtocolDesc	protocolDesc;
+	TInt			err=sockServ.FindProtocol(_L("BTLinkManager"), protocolDesc);
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("iSockServ.FindProtocol(aProtocolName, protocolDesc) = %d"), err);
+        SetError(err);
+		}
+	if ( protocolDesc.iAddrFamily != KBTAddrFamily )
+		{
+		ERR_PRINTF1(_L("Wrong iAddrFamily"));
+        SetBlockResult(EFail);
+		}
+
+	//	Open host resolver
+	err=iHostResolver.Open(sockServ, protocolDesc.iAddrFamily, protocolDesc.iProtocol);
+	if ( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("iHostResolver.Open(iSockServ, protocolDesc.iAddrFamily, protocolDesc.iProtocol) = %d"), err);
+        SetError(err);
+		}
+	else
+		{
+		iHostResolverOpen = ETrue;
+		}
+	}
+
+void CT_BTDevAddrData::SetHostNameL(const TDesC& aSection)
+	{
+	TPtrC deviceName;
+	if( GetStringFromConfig(aSection, KDeviceName(), deviceName) )
+		{
+		TInt err=iHostResolver.SetHostName(deviceName);
+
+		INFO_PRINTF2(_L("iHostResolver.SetHostName(%S)"), &deviceName);
+
+		if( err!=KErrNone )
+			{
+			ERR_PRINTF2(_L("iHostResolver.SetHostName() = %d"), err);
+			SetError(err);
+			}
+		}
+	else
+		{
+		ERR_PRINTF1(_L("No HostName given"));
+		SetBlockResult(EFail);
+		}
+	}
+
+void CT_BTDevAddrData::SetDiscoverable(const TDesC& /*aSection*/)
+	{
+	TInt err = RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetLimitedDiscoverableStatus, EFalse);
+	INFO_PRINTF1(_L("RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetLimitedDiscoverableStatus, EFalse) called"));
+	if( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetLimitedDiscoverableStatus, EFalse) = %d"), err);
+		SetError(err);
+		}
+
+	err = RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetScanningStatus, EInquiryAndPageScan);
+	INFO_PRINTF1(_L("RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetScanningStatus, EInquiryAndPageScan) called"));
+	if( err!=KErrNone )
+		{
+		ERR_PRINTF2(_L("RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothSetScanningStatus, EInquiryAndPageScan) = %d"), err);
+		SetError(err);
+		}
+	}
+
+void CT_BTDevAddrData::GetDeviceAddress(const TDesC& aSection, const TInt aIndex)
+	{
+	if( GetStringFromConfig(aSection, KDeviceName(), iDeviceName) )
+		{
+		// Set up the type of Bluetooth search we want to do
+		iAddr.SetIAC(KGIAC);
+		iAddr.SetAction(KHostResInquiry | KHostResName);
+
+		// Make the asynchronous call to look for all devices
+		iHostResolver.GetByAddress(iAddr, iBtNameEntry, iActive->iStatus);
+		INFO_PRINTF1(_L("GetByAddress() called"));
+
+		iActive->Activate(aIndex);
+		IncOutstanding();
+		}
+	else
+		{
+		ERR_PRINTF1(_L("No device name given"));
+		SetBlockResult(EFail);
+		}
+	}
+
+const TBTDevAddr* CT_BTDevAddrData::GetAddress()
+	{
+	return iBTDevAddr;
+	}
+
+TAny* CT_BTDevAddrData::GetObject()
+	{
+	return iBTDevAddr;
+	}
+
+void CT_BTDevAddrData::SetObjectL(TAny* aObject)
+	{
+	delete iBTDevAddr;
+	iBTDevAddr = static_cast<TBTDevAddr*>(aObject);
+	}
+
+void CT_BTDevAddrData::DisownObjectL()
+	{
+	iBTDevAddr=NULL;
+	}
+
+void CT_BTDevAddrData::CopyObjectL(TAny* aObjectPtr)
+	{
+	Cleanup();
+	TBTDevAddr* tmp = static_cast<TBTDevAddr*>(aObjectPtr);
+	iBTDevAddr =new (ELeave) TBTDevAddr(*tmp);
+	}
+
+/**
+ Virtual RunL - Called on completion of an a Synchronous command
+ @publishedInternal
+ @see MT_MMActiveCallback
+ @param aActive Active Object that RunL has been called on
+ @pre N/A
+ @post N/A
+ @leave system wide error code
+*/
+void CT_BTDevAddrData::RunL(CActive* aActive, const TInt aIndex)
+ 	{
+ 	if ( aActive==iActive )
+ 		{
+ 		RunGetDeviceAddress(aIndex);
+ 		}
+ 	else
+ 		{
+ 		ERR_PRINTF1(_L("Stray signal"));
+ 		SetBlockResult(EFail);
+ 		}
+ 	}
+
+/**
+  Virtual DoCancel - Request to cancel the asynchronous command
+  @publishedInternal
+  @see - MTPActiveCallback
+  @param aActive Active Object that DoCancel has been called on
+  @pre - N/A
+  @post - N/A
+  @leave system wide error code
+ */
+ void CT_BTDevAddrData::DoCancel(CActive* aActive, const TInt /*aIndex*/)
+ 	{
+ 	if ( aActive!=iActive )
+ 		{
+ 		ERR_PRINTF1(_L("Stray signal"));
+ 		SetBlockResult(EFail);
+ 		}
+ 	}
+
+/**
+  RunCustomCommand - Process RunL for iActive
+  @publishedInternal
+  @pre N/A
+  @post N/A
+  @leave system wide error code
+ */
+ void CT_BTDevAddrData::RunGetDeviceAddress(const TInt aIndex)
+	{
+	TInt	err = iActive->iStatus.Int();
+	if ( err == KErrNone )
+		{
+		THostName	deviceName = iBtNameEntry().iName;
+		INFO_PRINTF2(_L("Device %S Found"), &deviceName);
+
+		if( deviceName == iDeviceName )
+			{
+			INFO_PRINTF2(_L("Found required device %S"), &deviceName);
+
+			TBTSockAddr	sockAddr(iBtNameEntry().iAddr);
+			*iBTDevAddr = sockAddr.BTAddr();
+			TBuf<KMaxSockAddrSize> tmpBuf;
+			iBTDevAddr->GetReadable(tmpBuf);
+			INFO_PRINTF2(_L("Set TBTDevAddr (%S)"), &tmpBuf);
+
+         	DecOutstanding();
+			}
+		else
+			{
+			INFO_PRINTF1(_L("Still Searching..."));
+			//Grab the details of the next device
+			iHostResolver.Next(iBtNameEntry, iActive->iStatus);
+			iActive->Activate(aIndex);
+			}
+		}
+	else
+		{
+		ERR_PRINTF2(_L("RunL Error %d"), err);
+		SetAsyncError(aIndex, err);
+     	DecOutstanding();
+		}
+	}