javaextensions/bluetooth/bluetoothcommons/src.s60/bluetoothnamelookup.cpp
branchRCL_3
changeset 14 04becd199f91
child 24 6c158198356e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/bluetooth/bluetoothcommons/src.s60/bluetoothnamelookup.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,130 @@
+/*
+* 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 "bluetoothnamelookup.h"
+#include "fs_methodcall.h"
+#include "javajniutils.h"
+#include "logger.h"
+
+namespace java
+{
+namespace bluetooth
+{
+
+_LIT(KBTLinkManagerTxt, "BTLinkManager");
+
+OS_EXPORT BluetoothNameLookup* BluetoothNameLookup::NewL()
+{
+    JELOG2(EJavaBluetooth);
+    BluetoothNameLookup* btNameLookup = new BluetoothNameLookup();
+    CleanupStack::PushL(btNameLookup);
+    btNameLookup->constructL();
+    CleanupStack::Pop(btNameLookup);
+    return btNameLookup;
+}
+
+void BluetoothNameLookup::constructL()
+{
+    JELOG2(EJavaBluetooth);
+    User::LeaveIfError(mSocketServ.Connect());
+}
+
+OS_EXPORT BluetoothNameLookup::~BluetoothNameLookup()
+{
+    JELOG2(EJavaBluetooth);
+    mHostResolver.Close();
+    mSocketServ.Close();
+    delete mLookupMonitor;
+}
+
+OS_EXPORT std::wstring * BluetoothNameLookup::doDeviceNameLookupL(
+    TInt64 aDevAddr)
+{
+    JELOG2(EJavaBluetooth);
+    mLookupName = NULL;
+
+    if (0 == mLookupMonitor)
+    {
+        mLookupMonitor = new CActiveSchedulerWait();
+    }
+    LOG1(EJavaBluetooth, EInfo,
+         "+ BluetoothNameLookup::doDeviceNameLookupL DeviceAddress:%x",
+         aDevAddr);
+
+    TProtocolDesc pdesc;
+    User::LeaveIfError(mSocketServ.FindProtocol(KBTLinkManagerTxt(), pdesc));
+
+    // Initialize host resolver
+    mHostResolver.Close();
+    User::LeaveIfError(mHostResolver.Open(mSocketServ, pdesc.iAddrFamily,
+                                          pdesc.iProtocol));
+
+    TBTDevAddr deviceAddr(aDevAddr);
+
+    mSockAddr.SetBTAddr(deviceAddr);
+    mSockAddr.SetAction(KHostResName | KHostResIgnoreCache);
+    mHostResolver.GetByAddress(mSockAddr, mNameEntry, iStatus);
+
+    SetActive();
+    mLookupMonitor->Start();
+    if (KErrNone != mLookupStatus && KErrCancel != mLookupStatus
+            && KErrCompletion != mLookupStatus)
+    {
+        //if there is any error, then we send null. need to throw IOException
+        //at the java side if null is returned
+        ELOG1(EJavaBluetooth,
+              "- BluetoothNameLookup::doDeviceNameLookupL Error %d",
+              mLookupStatus);
+        User::Leave(mLookupStatus);
+    }
+
+    return mLookupName;
+}
+
+void BluetoothNameLookup::RunL()
+{
+    JELOG2(EJavaBluetooth);
+    std::wstring *deviceName = NULL;
+    if (KErrNone == iStatus.Int() && NULL != mNameEntry().iName.Ptr())
+    {
+        deviceName = new std::wstring((wchar_t*) mNameEntry().iName.Ptr());
+        deviceName->resize(mNameEntry().iName.Length());
+    }
+
+    nameLookupCompleted(iStatus.Int(), deviceName);
+    //We do not set this to active again as we just need to lookup once
+}
+
+/**
+ * Notify the monitor, which waits for the name lookup to complete
+ */
+void BluetoothNameLookup::nameLookupCompleted(int aStatus,
+        std::wstring* deviceName)
+{
+    JELOG2(EJavaBluetooth);
+    mLookupStatus = aStatus;
+    mLookupName = deviceName;
+    mLookupMonitor->AsyncStop();
+}
+
+void BluetoothNameLookup::DoCancel()
+{
+}
+
+} //end namespace java
+} //end namespace bluetooth