bluetooth/btstack/linkmgr/Subscribers.cpp
changeset 0 29b1cd4cb562
child 11 20fda83a6398
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/Subscribers.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,331 @@
+// Copyright (c) 2003-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:
+// Implements stack-side objects that subscribe to properties
+// 
+//
+
+#include <bt_subscribe.h>
+#include <bt_sock.h>
+#include <utf.h>
+#include "Subscribers.h"
+#include "linkmgr.h"
+#include "physicallinksmanager.h"
+
+CSubscriber::CSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CActive(CActive::EPriorityStandard), iParent(aLinkMgrProtocol)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CSubscriber::DoCancel()
+	{
+	iProperty.Cancel();
+	}
+
+CSubscriber::~CSubscriber()
+	{
+	Cancel();
+	iProperty.Close();
+	}
+
+TInt CSubscriber::RunError(TInt /*aError*/)
+	{
+	return KErrNone;
+	}
+
+void CSubscriber::ConstructL(const TUint aKey)
+	{
+	User::LeaveIfError(iProperty.Attach(KPropertyUidBluetoothCategory,
+										aKey));
+	Subscribe();
+	}
+
+void CSubscriber::Subscribe()
+   	{
+   	iProperty.Subscribe(iStatus);
+   	SetActive();
+   	}
+
+CDiscoverabilitySubscriber* CDiscoverabilitySubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CDiscoverabilitySubscriber* s = new(ELeave) CDiscoverabilitySubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetScanningStatus);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CDiscoverabilitySubscriber::CDiscoverabilitySubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CDiscoverabilitySubscriber::RunL()
+	{
+	Subscribe();
+	iParent.SetInquiryAndPageScanningL();
+	}
+
+
+CLimitedSubscriber* CLimitedSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CLimitedSubscriber* s = new(ELeave) CLimitedSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetLimitedDiscoverableStatus);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CLimitedSubscriber::CLimitedSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CLimitedSubscriber::RunL()
+	{
+	Subscribe();
+	TBool limited;
+	iProperty.Get(limited);
+	iParent.SetLimitedDiscoverableIfChangedL(limited);
+	}
+
+//-----------------
+
+CDeviceClassSubscriber* CDeviceClassSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CDeviceClassSubscriber* s = new(ELeave) CDeviceClassSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetDeviceClass);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CDeviceClassSubscriber::CDeviceClassSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CDeviceClassSubscriber::RunL()
+	{
+	Subscribe();
+	TInt cod;
+	iProperty.Get(cod);
+	iParent.SetDeviceClassL(static_cast<TUint32>(cod));
+	}
+
+//-----------------
+
+CDeviceNameSubscriber* CDeviceNameSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CDeviceNameSubscriber* s = new(ELeave) CDeviceNameSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetDeviceName);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CDeviceNameSubscriber::CDeviceNameSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CDeviceNameSubscriber::RunL()
+	{
+	Subscribe();
+	
+	// The P&S value is in Unicode for the convenience of clients ...
+	TBuf16<KHCILocalDeviceNameMaxLength> unicodeName;
+	iProperty.Get(unicodeName);
+	
+	// ... but the BT spec requires the device name in UTF-8 so do the conversion here:
+	TBuf8<KHCILocalDeviceNameMaxLength> utf8Name;
+	TInt ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(utf8Name, unicodeName);
+
+	// ret should never be > 0 since unicodeName is the same size as utf8Name hence we 
+	// shouldn't have any unconverted chars left over.
+	if (ret == KErrNone)
+		{
+		iParent.SetLocalDeviceName(utf8Name);
+		}
+	else
+		{
+		// Set the P&S key with the old value so that clients can figure out their set failed.
+		TBuf16<KHCILocalDeviceNameMaxLength> oldUnicodeName;
+		RProperty::Get(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetDeviceName, oldUnicodeName);
+		RProperty::Set(KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetDeviceName, oldUnicodeName);
+		}
+	}
+
+//-----------------
+
+CAFHChannelAssessmentModeSubscriber* CAFHChannelAssessmentModeSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CAFHChannelAssessmentModeSubscriber* s = new(ELeave) CAFHChannelAssessmentModeSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetAFHChannelAssessmentMode);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CAFHChannelAssessmentModeSubscriber::CAFHChannelAssessmentModeSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CAFHChannelAssessmentModeSubscriber::RunL()
+	{
+	//Get this value first before we subscribe again
+	TInt ret = iStatus.Int();
+	Subscribe();
+	if(ret==KErrNone)
+		{
+		TInt mode;
+		ret = iProperty.Get(mode);
+		if(ret==KErrNone)
+			{
+			iParent.SetAFHChannelAssessmentModeL(static_cast<TBool>(mode));
+			}
+		}
+	}
+
+
+//-----------------
+
+CAFHHostChannelClassificationSubscriber* CAFHHostChannelClassificationSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CAFHHostChannelClassificationSubscriber* s = new(ELeave) CAFHHostChannelClassificationSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetAFHHostChannelClassification);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CAFHHostChannelClassificationSubscriber::CAFHHostChannelClassificationSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CAFHHostChannelClassificationSubscriber::RunL()
+	{
+	//Get this value first before we subscribe again
+	TInt ret = iStatus.Int();
+	Subscribe();
+	if(ret==KErrNone)
+		{
+		TBTAFHHostChannelClassification classification;
+		ret = iProperty.Get(classification);
+		if(ret==KErrNone)
+			{
+			iParent.SetAFHHostChannelClassificationL(classification);
+			}
+		}
+	}
+
+//-----------------
+
+CRegistryRemoteTableSubscriber* CRegistryRemoteTableSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CRegistryRemoteTableSubscriber* s = new(ELeave) CRegistryRemoteTableSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothGetRegistryTableChange);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CRegistryRemoteTableSubscriber::CRegistryRemoteTableSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CRegistryRemoteTableSubscriber::RunL()
+	{
+	//Get this value first before we subscribe again
+	TInt ret = iStatus.Int();
+	Subscribe();
+	
+	if(ret==KErrNone)
+		{
+		// To accommodate race conditions, do this whichever table has been updated.
+		iParent.PhysicalLinksMgr().UpdateRemoteDevicesDetails();
+		}
+	}
+
+//-----------------
+
+CAcceptPairedOnlySubscriber* CAcceptPairedOnlySubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CAcceptPairedOnlySubscriber* s = new(ELeave) CAcceptPairedOnlySubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetAcceptPairedOnlyMode);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CAcceptPairedOnlySubscriber::CAcceptPairedOnlySubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CAcceptPairedOnlySubscriber::RunL()
+	{
+	//Get this value first before we subscribe again
+	TInt ret = iStatus.Int();
+	Subscribe();
+	
+	if(ret==KErrNone)
+		{
+		TInt acceptPairedOnlyMode;
+		ret = iProperty.Get(acceptPairedOnlyMode);
+		if(ret==KErrNone)
+			{
+			iParent.PhysicalLinksMgr().SetAcceptPairedOnlyMode(static_cast<TBool>(acceptPairedOnlyMode));
+			}
+		}
+	}
+
+
+//-----------------
+
+CDebugModeSubscriber* CDebugModeSubscriber::NewL(CLinkMgrProtocol& aLinkMgrProtocol)
+	{
+	CDebugModeSubscriber* s = new(ELeave) CDebugModeSubscriber(aLinkMgrProtocol);
+	CleanupStack::PushL(s);
+	s->ConstructL(KPropertyKeyBluetoothSetSimplePairingDebugMode);
+	CleanupStack::Pop(s);
+	return s;
+	}
+
+CDebugModeSubscriber::CDebugModeSubscriber(CLinkMgrProtocol& aLinkMgrProtocol)
+	: CSubscriber(aLinkMgrProtocol)
+	{
+	}
+
+void CDebugModeSubscriber::RunL()
+	{
+	//Get this value first before we subscribe again
+	TInt ret = iStatus.Int();
+	Subscribe();
+	
+	if(ret==KErrNone)
+		{
+		TInt debugMode;
+		ret = iProperty.Get(debugMode);
+		if(ret==KErrNone)
+			{
+			iParent.PhysicalLinksMgr().SetSimplePairingDebugMode(static_cast<TBool>(debugMode));
+			}
+		}
+	}
+
+