bluetoothmgmt/bluetoothclientlib/btlib/rfcommsock.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothmgmt/bluetoothclientlib/btlib/rfcommsock.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,353 @@
+// Copyright (c) 2000-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 <bt_sock.h>
+
+#define FLOG(a) (a)
+
+// Remote Port Params class
+EXPORT_C void TRfcommRemotePortParams::UpdateFlowCtrlBit(TUint8 aFlowCtrl, 
+												TRPNFlowCtrlMask aFCMask)
+/**	Constructor
+Set the flow control bit specified by aFCMask to 
+the same value it has in aFlowCtrl
+@param aFlowCtrl Flow control specifier.
+@param aFCMask Flow control mask.
+*/
+	{
+	// Set flow control to all zeros if it's not valid already
+	if(!(IsValid() & EVMFlowCtrl))
+		{
+		const TUint8 KDefaultFlowControl = 0;
+		SetFlowCtrl(KDefaultFlowControl);
+		}
+
+	// bitMask is guaranteed to have one and only one bit set as long as
+	// the enums in TRPNFlowCtrlMask only have one bit set each
+	TUint8 bitMask = TUint8(aFCMask);
+	if(aFlowCtrl & bitMask) 
+		{
+		// Bit is set in aFlowCtrl so set it here too
+		SetFlowCtrl(iFlowCtrl |= bitMask);
+		}
+	else
+		{
+		// Bit is clear in aFlowCtrl so clear it here too
+		SetFlowCtrl(iFlowCtrl &= ~bitMask);	
+		}
+	}	
+
+EXPORT_C void TRfcommRemotePortParams::UpdateWholeFlowCtrl(TUint16 aParamMask, 
+												  TUint8 aFlowCtrl)
+/** Used to update flow control with relevant bits from aFlowCtrl 
+(as specified by aParamsMask)
+@param aParamMask The parameter mask specifing what to change.
+@param aFlowCtrl Flow control information specifing new values.
+*/
+	{
+	if(aParamMask & EPMXOnOffInput) 
+		{
+		// XON/off on input
+		UpdateFlowCtrlBit(aFlowCtrl, EFCXOnOffInput);
+		}
+		
+	if(aParamMask & EPMXOnOffOutput)
+		{
+		// XON/off on output
+		UpdateFlowCtrlBit(aFlowCtrl, EFCXOnOffOutput);
+		}
+
+	if(aParamMask & EPMRTRInput)
+		{
+		// RTR on input
+		UpdateFlowCtrlBit(aFlowCtrl, EFCRTRInput);
+		}
+	
+	if(aParamMask & EPMRTROutput)
+		{
+		// RTR on output
+		UpdateFlowCtrlBit(aFlowCtrl, EFCRTROutput);
+		}
+
+	if(aParamMask & EPMRTCInput)
+		{
+		// RTC on input
+		UpdateFlowCtrlBit(aFlowCtrl, EFCRTCInput);
+		}
+			
+	if(aParamMask & EPMRTCOutput)
+		{
+		// RTC on output
+		UpdateFlowCtrlBit(aFlowCtrl, EFCRTCOutput);
+		}
+	}
+
+EXPORT_C void TRfcommRemotePortParams::UpdateFromRPNTransaction(
+							const TRfcommRPNTransaction& aRPNTransaction)
+/**	Update using a TRfcommRPNTransaction class.
+Update all parameters according to parameters and mask in aRPNTransaction
+@param aRPNTransaction The internal values are updated according to the values held in this attribute.
+@see TRfcommRPNTransaction
+*/
+	{
+	TUint16 paramMask					= aRPNTransaction.iParamMask;
+	TRfcommRemotePortParams portParams	= aRPNTransaction.iPortParams;
+
+	// Copy everything that is marked in the parameter mask if it is valid in the
+	// source 'remote port params' structure
+	if(paramMask & EPMBitRate)
+		{
+		TBps bitRate = EBps9600; // To stop compiler warnings
+		if(portParams.GetBitRate(bitRate)) // Guarantees 'bitRate' set if returns True
+			SetBitRate(bitRate);
+		}
+	
+	if(paramMask & EPMDataBits)
+		{
+		TDataBits dataBits = EData5; // To stop compiler warnings
+		if(portParams.GetDataBits(dataBits)) // Guarantees 'dataBits' set if returns True
+			SetDataBits(dataBits);
+		}
+
+	if(paramMask & EPMStopBit)
+		{
+		TStopBits stopBit = EStop1; // To stop compiler warnings
+		if(portParams.GetStopBit(stopBit)) // Guarantees 'stopBit' set if returns True
+			SetStopBit(stopBit);
+		}
+
+	// Both indicate a change in the same thing in TRfcommRemotePortparams
+	if(paramMask & EPMParity || paramMask & EPMParityType)
+		{
+		TParity parity = EParityNone; // To stop compiler warnings
+		if(portParams.GetParity(parity)) // Guarantees 'parity' set if returns True
+			SetParity(parity);
+		}
+	
+	if(paramMask & EPMXOnChar)
+		{
+		TUint8 xOnChar = 0; // To stop compiler warnings
+		if(portParams.GetXOnChar(xOnChar)) // Guarantees 'xOnChar' set if returns True
+			SetXOnChar(xOnChar);
+		}
+
+	if(paramMask & EPMXOffChar)
+		{
+		TUint8 xOffChar = 0; // To stop compiler warnings
+		if(portParams.GetXOffChar(xOffChar)) // Guarantees 'xOffChar' set if returns True
+			SetXOffChar(xOffChar);
+		}
+
+	// Flow control is compound - do it separately
+	TUint8 flowCtrl = 0; // To stop compiler warnings
+	if(portParams.GetFlowCtrl(flowCtrl))
+		UpdateWholeFlowCtrl(paramMask, flowCtrl);
+	}
+
+EXPORT_C TRfcommRemotePortParams::TRfcommRemotePortParams()
+	: iFlowCtrl(0),
+	  iXOnChar(0),
+	  iXOffChar(0),
+  	  iValidMask(0)	  
+	{
+	}
+
+EXPORT_C TUint8 TRfcommRemotePortParams::IsValid() const
+	{
+	return iValidMask;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetBitRate(TBps& aBitRate) const
+	{
+	if(IsValid() & EVMBitRate)
+		{
+		aBitRate = iBitRate;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetBitRate(TBps aBitRate)
+	{
+	switch(aBitRate)
+		{
+	case EBps2400:
+	case EBps4800:
+	case EBps7200:
+	case EBps9600:
+	case EBps19200:
+	case EBps38400:
+	case EBps57600:
+	case EBps115200:
+	case EBps230400:
+		iValidMask|=EVMBitRate;
+		iBitRate=aBitRate;
+		return KErrNone;
+		//break;
+	default:
+		return KErrArgument;
+		//break;
+		}
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetDataBits(TDataBits& aDataBits) const
+// If Data Bits are valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMDataBits)	
+		{
+		aDataBits = iDataBits;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetDataBits(TDataBits aDataBits)
+	{
+	iValidMask|=EVMDataBits;
+	iDataBits=aDataBits;
+	return KErrNone;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetStopBit(TStopBits& aStopBit) const
+// If Stop Bit is valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMStopBit)
+		{
+		aStopBit = iStopBit;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetStopBit(TStopBits aStopBit)
+	{
+	iValidMask|=EVMStopBit;
+	iStopBit=aStopBit;
+	return KErrNone;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetParity(TParity& aParity) const
+// If Parity is valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMParity)
+		{
+		aParity = iParity;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetParity(TParity aParity)
+	{
+	iValidMask|=EVMParity;
+	iParity=aParity;
+	return KErrNone;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetFlowCtrl(TUint8& aFlowCtrl) const
+// If Flow Control is valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMFlowCtrl)
+		{
+		aFlowCtrl = iFlowCtrl;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetFlowCtrl(TUint8 aFlowCtrl)
+	{
+	iValidMask|=EVMFlowCtrl;
+	iFlowCtrl=aFlowCtrl;
+	return KErrNone;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetXOnChar(TUint8& aXOnChar) const
+// If XOn Char is valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMXOnChar)
+		{
+		aXOnChar = iXOnChar;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetXOnChar(TUint8 aXOnChar)
+	{
+	iValidMask|=EVMXOnChar;
+	iXOnChar=aXOnChar;
+	return KErrNone;
+	}
+
+EXPORT_C TBool TRfcommRemotePortParams::GetXOffChar(TUint8& aXOffChar) const
+// If XOff Char is valid, sets reference and returns True, 
+// otherwise, returns False
+	{
+	if(IsValid() & EVMXOffChar)
+		{
+		aXOffChar = iXOffChar;
+		return ETrue;
+		}
+	else
+		return EFalse;
+	}
+
+EXPORT_C TInt TRfcommRemotePortParams::SetXOffChar(TUint8 aXOffChar)
+	{
+	iValidMask|=EVMXOffChar;
+	iXOffChar=aXOffChar;
+	return KErrNone;
+	}
+
+// RPN Transaction class
+
+EXPORT_C TRfcommRPNTransaction::TRfcommRPNTransaction():iParamMask(0)
+	{
+	}
+
+// Socket Address class
+
+EXPORT_C TRfcommSockAddr::TRfcommSockAddr()
+/** Constructor
+*/
+	{
+	}
+
+EXPORT_C TRfcommSockAddr::TRfcommSockAddr(const TSockAddr &aAddr)
+	: TBTSockAddr(aAddr)
+/** Constructor that takes a BT socket address.
+@param aAddr The BT socket address from which this instance is initialised. 
+*/
+	{
+	}
+
+EXPORT_C TRfcommSockAddr& TRfcommSockAddr::Cast(const TSockAddr &aAddr)
+	{
+	return *((TRfcommSockAddr *)&aAddr);
+	}
+	
+// EOF