--- /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));
+ }
+ }
+ }
+
+