diff -r f5050f1da672 -r 04becd199f91 javaextensions/bluetooth/bluetoothplugins/btjavacaptainplugin/src.s60/btdeviceclassmanager.cpp --- /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 +#include +#include +#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 +