javaextensions/bluetooth/bluetoothplugins/btjavacaptainplugin/src.s60/btdeviceclassmanager.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/bluetooth/bluetoothplugins/btjavacaptainplugin/src.s60/btdeviceclassmanager.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,209 @@
+/*
+* Copyright (c) 2008 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_subscribe.h>
+#include <btmanclient.h>
+#include <e32property.h>
+#include "comms.h"
+#include "commsendpoint.h"
+#include "commsmessage.h"
+#include "logger.h"
+
+#include "coreinterface.h"
+#include "rtcinterface.h"
+
+#include "btdeviceclassmanager.h"
+
+#ifdef __SYMBIAN32__
+java::captain::ExtensionPluginInterface* getExtensionPlugin()
+{
+#else
+extern "C" java::captain::ExtensionPluginInterface* getExtensionPlugin()
+{
+#endif
+    return new java::bluetooth::BtDeviceClassManager();
+}
+
+using namespace java::comms;
+using namespace java::captain;
+
+namespace java
+{
+namespace bluetooth
+{
+
+BtDeviceClassManager:: BtDeviceClassManager() : mCore(0)
+{
+    JELOG2(EJavaBluetooth);
+    mInitialServiceClassBits = 0;
+    LOG(EJavaBluetooth, EInfo, "Loaded BT service plugin");
+}
+
+BtDeviceClassManager::~BtDeviceClassManager()
+{
+    JELOG2(EJavaBluetooth);
+}
+
+void BtDeviceClassManager::startPlugin(CoreInterface* aCore)
+{
+    JELOG2(EJavaBluetooth);
+    mCore = aCore;
+    mCore->getComms()->registerListener(PLUGIN_ID_BT_DEVICE_CLASS_MANAGER_C,
+                                        this);
+}
+
+void BtDeviceClassManager::stopPlugin()
+{
+    JELOG2(EJavaBluetooth);
+    mCore->getComms()->unregisterListener(PLUGIN_ID_BT_DEVICE_CLASS_MANAGER_C,
+                                          this);
+    mCore = 0;
+}
+
+java::comms::CommsListener* BtDeviceClassManager::getCommsListener()
+{
+    JELOG2(EJavaBluetooth);
+    return this;
+}
+
+// CommsListener methods
+void BtDeviceClassManager::processMessage(CommsMessage& aMessage)
+{
+    JELOG2(EJavaBluetooth);
+    switch (aMessage.getMessageId())
+    {
+    case JSR_82_MESSAGE_ID_RANGE_START_C:
+        int isServiceBitsPersistent;
+        std::wstring midletId;
+        int srvClassVal;
+
+        aMessage >> isServiceBitsPersistent;
+        aMessage >> midletId;
+        aMessage >> srvClassVal;
+
+        LOG1(EJavaBluetooth, EInfo,
+             "  BtDeviceClassManager::processMessage Persistent:%d",
+             isServiceBitsPersistent);
+        LOG1(EJavaBluetooth, EInfo,
+             "  BtDeviceClassManager::processMessage midletId:%S",
+             midletId.c_str());
+        LOG1(EJavaBluetooth, EInfo,
+             "  BtDeviceClassManager::processMessage srvClassVal:0x%X",
+             srvClassVal);
+
+        if (!srvClassVal)
+        {
+            LOG(EJavaBluetooth, EInfo,
+                "   BtDeviceClassManager::processMessage Removing");
+            mServiceListHandler.remove(midletId);
+        }
+        else
+        {
+            if (true == isServiceBitsPersistent)
+            {
+                srvClassVal |= mServiceListHandler.get(midletId);
+            }
+
+            LOG(EJavaBluetooth, EInfo,
+                "   BtDeviceClassManager::processMessage Adding");
+            mServiceListHandler.add(midletId, srvClassVal);
+        }
+
+        int retVal = setServiceClassBits(mServiceListHandler.getCollectiveData());
+
+        CommsMessage replyMsg;
+        replyMsg.replyTo(aMessage);
+        replyMsg << retVal;
+        mCore->getComms()->send(replyMsg);
+        break;
+    }
+}
+
+unsigned int BtDeviceClassManager::getServiceClassBits()
+{
+    JELOG2(EJavaBluetooth);
+    TInt currentCODVal = 0;
+
+    TInt error = RProperty::Get(KPropertyUidBluetoothCategory,
+                                KPropertyKeyBluetoothGetDeviceClass, currentCODVal);
+
+    if (KErrNone != error)
+    {
+        ELOG1(EJavaBluetooth, "- BtDeviceClassManager::getServiceClass Err:%d",
+              error);
+        return 0;
+    }
+
+    LOG1(EJavaBluetooth, EInfo,
+         "  BtDeviceClassManager::getServiceClass COD:0x%x", currentCODVal);
+
+    TBTDeviceClass currentCOD(currentCODVal);
+    return currentCOD.MajorServiceClass();
+}
+
+int BtDeviceClassManager::setServiceClassBits(unsigned int aDeviceServiceClass)
+{
+    JELOG2(EJavaBluetooth);
+
+    if (0 == mInitialServiceClassBits)
+    {
+        mInitialServiceClassBits = getServiceClassBits();
+        LOG1(EJavaBluetooth, EInfo, "mInitialServiceClassBits : %d",
+             mInitialServiceClassBits);
+    }
+
+    TInt currentCODVal = 0;
+
+    TInt error = RProperty::Get(KPropertyUidBluetoothCategory,
+                                KPropertyKeyBluetoothGetDeviceClass, currentCODVal);
+
+    if (KErrNone != error)
+    {
+        ELOG1(EJavaBluetooth,
+              "   BtDeviceClassManager::setServiceClass Err:%d", error);
+        return error;
+    }
+
+    TBTDeviceClass currentCOD(currentCODVal);
+
+    // Extracting the service class bits only.
+    TBTDeviceClass requestedCOD(aDeviceServiceClass);
+
+    TBTDeviceClass newCOD(mInitialServiceClassBits
+                          | requestedCOD.MajorServiceClass(), currentCOD.MajorDeviceClass(),
+                          currentCOD.MinorDeviceClass());
+
+    LOG1(EJavaBluetooth, EInfo,
+         "   BtDeviceClassManager::setServiceClass new service bits:0x%x",
+         ((mInitialServiceClassBits | aDeviceServiceClass) << 13));
+
+    error = RProperty::Set(KPropertyUidBluetoothCategory,
+                           KPropertyKeyBluetoothSetDeviceClass, newCOD.DeviceClass());
+
+    LOG3(
+        EJavaBluetooth,
+        EInfo,
+        "   BtDeviceClassManager::setServiceClass 0x%X  Err:%d NewServCOD:0x%x",
+        aDeviceServiceClass, error, getServiceClassBits());
+
+    return error;
+}
+
+} // namespace bluetooth
+} // namespace java
+