[BT C#] Added fixes in LE Adapter/Device Frwk code 82/112182/4 submit/tizen/20170201.214246
authorSudha Bheemanna <b.sudha@samsung.com>
Fri, 27 Jan 2017 09:37:22 +0000 (15:07 +0530)
committerPyun DoHyun <dh79.pyun@samsung.com>
Wed, 1 Feb 2017 21:39:59 +0000 (13:39 -0800)
Added checks and other conditions to fix the failing LE TCTs
Code clean-up

Change-Id: Iff6f46e9e20a9749e2aaec95a3f8fa6f96f70b76
Signed-off-by: Sudha Bheemanna <b.sudha@samsung.com>
Tizen.Network.Bluetooth/Tizen.Network.Bluetooth/BluetoothLeAdapter.cs
Tizen.Network.Bluetooth/Tizen.Network.Bluetooth/BluetoothLeAdapterImpl.cs
Tizen.Network.Bluetooth/Tizen.Network.Bluetooth/BluetoothStructs.cs

index 92c3355..380fccf 100644 (file)
@@ -137,19 +137,28 @@ namespace Tizen.Network.Bluetooth {
             _scanData = new BluetoothLeScanData ();
             _scanData = scanData;
 
-            Log.Info (Globals.LogTag, "scanData.Rssi" + _scanData.Rssi);
+            Log.Info (Globals.LogTag, "Rssi" + _scanData.Rssi);
             _rssi = scanData.Rssi;
-            Log.Info (Globals.LogTag, "scanData.RemoteAddress" + _scanData.RemoteAddress);
+            Log.Info (Globals.LogTag, "RemoteAddress" + _scanData.RemoteAddress);
             if (scanData.RemoteAddress != null)
                 _remoteAddress = scanData.RemoteAddress;
-            Log.Info (Globals.LogTag, "scanData.AddressType" + _scanData.AddressType);
+            Log.Info (Globals.LogTag, "AddressType" + _scanData.AddressType);
             _addressType = scanData.AddressType;
-            Log.Info (Globals.LogTag, "scanData.AdvData" + _scanData.AdvData);
-            _advDataValue = new byte[_scanData.AdvDataLength];
-            scanData.AdvData.CopyTo(_advDataValue, 0);
-            Log.Info (Globals.LogTag, "scanData.ScanData" + _scanData.ScanData);
-            _scanDataValue = new byte[_scanData.ScanDataLength];
-            scanData.ScanData.CopyTo(_scanDataValue, 0);
+
+            Log.Info (Globals.LogTag, "AdvDataLength" + _scanData.AdvDataLength);
+            if (_scanData.AdvDataLength > 0)
+            {
+                _advDataValue = new byte[_scanData.AdvDataLength];
+                scanData.AdvData.CopyTo(_advDataValue, 0);
+            }
+
+            Log.Info(Globals.LogTag, "ScanDataLength" + _scanData.ScanDataLength);
+            //  Check length before copying
+            if (_scanData.ScanDataLength > 0)
+            {
+                _scanDataValue = new byte[_scanData.ScanDataLength];
+                scanData.ScanData.CopyTo(_scanDataValue, 0);
+            }
         }
 
         ~BluetoothLeDevice()
index a7134af..c25b360 100755 (executable)
@@ -165,8 +165,7 @@ namespace Tizen.Network.Bluetooth
             _adapterLeScanResultChangedCallback = (int result, ref BluetoothLeScanDataStruct scanData, IntPtr userData) =>
             {
                 Log.Info(Globals.LogTag, "Inside Le scan callback " );
-                BluetoothLeScanData scanDataInfo = new BluetoothLeScanData();
-                scanDataInfo = BluetoothUtils.ConvertStructToLeScanData(scanData, scanDataInfo);
+                BluetoothLeScanData scanDataInfo = BluetoothUtils.ConvertStructToLeScanData(scanData);
 
                 BluetoothLeDevice device = new BluetoothLeDevice(scanDataInfo);
 
@@ -206,30 +205,14 @@ namespace Tizen.Network.Bluetooth
             IntPtr uuidListArray = IntPtr.Zero;
             int count = -1;
 
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct.RemoteAddress = scanData.RemoteAddress;
-            scanDataStruct.AddressType = scanData.AddressType;
-            scanDataStruct.Rssi = scanData.Rssi;
-
-            if (scanData.AdvDataLength > 0)
-            {
-                scanDataStruct.AdvDataLength = scanData.AdvDataLength;
-                scanDataStruct.AdvData = Marshal.AllocHGlobal(scanData.AdvDataLength);
-                Marshal.Copy(scanData.AdvData, 0, scanDataStruct.AdvData, scanData.AdvDataLength);
-            }
-
-            if (scanData.ScanDataLength > 0)
-            {
-                scanDataStruct.ScanDataLength = scanData.ScanDataLength;
-                scanDataStruct.ScanData = Marshal.AllocHGlobal(scanData.ScanDataLength);
-                Marshal.Copy(scanData.ScanData, 0, scanDataStruct.ScanData, scanData.ScanDataLength);
-            }
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct(scanData);
 
             int ret = Interop.Bluetooth.GetScanResultServiceUuid(ref scanDataStruct, packetType,
                                                 ref uuidListArray, ref count);
             if (ret != (int)BluetoothError.None)
             {
                 Log.Info(Globals.LogTag, "Failed to service uuids list- " + (BluetoothError)ret);
+                return null;
             }
 
             Log.Info(Globals.LogTag, "count of uuids :  " + count);
@@ -251,12 +234,12 @@ namespace Tizen.Network.Bluetooth
         {
             string deviceName;
 
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData);
 
             int ret = Interop.Bluetooth.GetLeScanResultDeviceName(ref scanDataStruct, packetType, out deviceName);
             if (ret != (int)BluetoothError.None) {
                 Log.Error(Globals.LogTag, "Failed to get Device name- " + (BluetoothError)ret);
+                return null;
             }
             Log.Info (Globals.LogTag, "Device name " + deviceName);
             return deviceName;
@@ -264,9 +247,8 @@ namespace Tizen.Network.Bluetooth
 
         internal int GetScanResultTxPowerLevel(BluetoothLeScanData scanData, BluetoothLePacketType packetType)
         {
-            int powerLevel;
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
+            int powerLevel = -1;
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData);
 
             int ret = Interop.Bluetooth.GetScanResultTxPowerLevel(ref scanDataStruct, packetType, out powerLevel);
             if (ret != (int)BluetoothError.None) {
@@ -281,12 +263,12 @@ namespace Tizen.Network.Bluetooth
             IntPtr uuidListArray;
             int count;
 
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct(scanData);
 
             int ret = Interop.Bluetooth.GetScaResultSvcSolicitationUuids(ref scanDataStruct, packetType, out uuidListArray, out count);
             if (ret != (int)BluetoothError.None) {
                 Log.Error(Globals.LogTag, "Failed to get service solicitation uuids " + (BluetoothError)ret);
+                return null;
             }
 
             IntPtr[] uuidList = new IntPtr[count];
@@ -307,56 +289,56 @@ namespace Tizen.Network.Bluetooth
         {
             int ret = 0;
             IntPtr serviceListArray;
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
+            _serviceListCount = 0;
+
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData);
 
             ret = Interop.Bluetooth.GetScanResultServiceDataList(ref scanDataStruct, packetType, out serviceListArray, out _serviceListCount);
-            if(ret != (int)BluetoothError.None)
+            Log.Info(Globals.LogTag, "ServiceListCount :  " + _serviceListCount + " PacketType : " + packetType + " Error: " + (BluetoothError)ret);
+            if (ret != (int)BluetoothError.None)
             {
-                Log.Error(Globals.LogTag, "Failed to get Service Data List, Error - " + (BluetoothError)ret);
+                Log.Info(Globals.LogTag, "Failed to get Service Data List, Error - " + (BluetoothError)ret);
+                serviceCount = 0;
+                Marshal.FreeHGlobal(serviceListArray);
+                Marshal.FreeHGlobal(scanDataStruct.AdvData);
+                Marshal.FreeHGlobal(scanDataStruct.ScanData);
+                return null;
             }
 
-            BluetoothLeServiceDataStruct[] serviceArray = new BluetoothLeServiceDataStruct[_serviceListCount];
-            IntPtr current = serviceListArray;
-            for (int i = 0; i < _serviceListCount; i++)
+            IntPtr[] svcList = new IntPtr[_serviceListCount];
+            Marshal.Copy(serviceListArray, svcList, 0, _serviceListCount);
+            foreach (IntPtr svcs in svcList)
             {
-                //serviceArray[i] = new BluetoothLeServiceDataStruct();// check
-                Marshal.PtrToStructure(current, serviceArray[i]);
-                BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
-                BluetoothUtils.ConvertStructToLeServiceData(serviceArray[i], serviceData);
-
-                _list.Add(serviceData);
-
-                Marshal.DestroyStructure(current, typeof(BluetoothLeServiceDataStruct));
-
-                current = (IntPtr)((long)current + Marshal.SizeOf(serviceArray[i]));
-                Log.Info (Globals.LogTag, "Service Data " + i + serviceArray[i].ServiceData
-                    +serviceArray[i].ServiceDataLength);
+                BluetoothLeServiceDataStruct svcstruct = (BluetoothLeServiceDataStruct)Marshal.PtrToStructure(svcs, typeof(BluetoothLeServiceDataStruct));
+                _list.Add(BluetoothUtils.ConvertStructToLeServiceData(svcstruct));
+                Interop.Libc.Free(svcs);
             }
 
             serviceCount = _serviceListCount;
-            Log.Info (Globals.LogTag, "serviceCount "+serviceCount);
 
-            Marshal.FreeHGlobal (scanDataStruct.AdvData);
-            Marshal.FreeHGlobal (scanDataStruct.ScanData);
+            Interop.Libc.Free(serviceListArray);
+            Marshal.FreeHGlobal(scanDataStruct.AdvData);
+            Marshal.FreeHGlobal(scanDataStruct.ScanData);
             return _list;
         }
 
         internal int FreeServiceDataList()
         {
-            int iServiceDataSize = Marshal.SizeOf(typeof(BluetoothLeServiceData));
-            IntPtr structServiceData = Marshal.AllocHGlobal(iServiceDataSize);
-            Marshal.StructureToPtr(_list, structServiceData, false);
-
-            int ret = Interop.Bluetooth.FreeServiceDataList(structServiceData, _serviceListCount);
-            if(ret != (int)BluetoothError.None)
+            if (_list.Count > 0)
             {
-                Log.Error(Globals.LogTag, "Failed to free Service Data List, Error - " + (BluetoothError)ret);
-                BluetoothErrorFactory.ThrowBluetoothException(ret);
-            }
+                int iServiceDataSize = Marshal.SizeOf(typeof(BluetoothLeServiceData));
+                IntPtr structServiceData = Marshal.AllocHGlobal(iServiceDataSize);
+                Marshal.StructureToPtr(_list, structServiceData, false);
 
-            Marshal.FreeHGlobal(structServiceData);
+                int ret = Interop.Bluetooth.FreeServiceDataList(structServiceData, _serviceListCount);
+                if (ret != (int)BluetoothError.None)
+                {
+                    Log.Error(Globals.LogTag, "Failed to free Service Data List, Error - " + (BluetoothError)ret);
+                    BluetoothErrorFactory.ThrowBluetoothException(ret);
+                }
 
+                Marshal.FreeHGlobal(structServiceData);
+            }
             return 0;
         }
 
@@ -364,8 +346,7 @@ namespace Tizen.Network.Bluetooth
         {
             int appearance;
 
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData);
 
             int ret = Interop.Bluetooth.GetScanResultAppearance(ref scanDataStruct, packetType, out appearance);
             if (ret != (int)BluetoothError.None) {
@@ -376,25 +357,24 @@ namespace Tizen.Network.Bluetooth
 
         internal ManufacturerData GetScanResultManufacturerData(BluetoothLeScanData scanData, BluetoothLePacketType packetType)
         {
-            ManufacturerData data = new ManufacturerData();
-
-            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
-            scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData, scanDataStruct);
-
             int dataId;
             int dataLength;
             IntPtr manufData;
 
+            BluetoothLeScanDataStruct scanDataStruct = BluetoothUtils.ConvertLeScanDataToStruct (scanData);
+            ManufacturerData data = new ManufacturerData();
+
             int ret = Interop.Bluetooth.GetScanResultManufacturerData(ref scanDataStruct, packetType, out dataId,
                 out manufData, out dataLength);
             if (ret != (int)BluetoothError.None)
             {
                 Log.Error(Globals.LogTag, "Failed to get Manufacturer data - " + (BluetoothError)ret);
+                return null;
             }
 
-            Marshal.Copy (manufData, data.Data, 0, data.DataLength);
             data.Id = dataId;
             data.DataLength = dataLength;
+            Marshal.Copy(manufData, data.Data, 0, data.DataLength);
 
             return data;
         }
@@ -442,7 +422,7 @@ namespace Tizen.Network.Bluetooth
                             BluetoothLeAdvertisingState state, IntPtr userData) =>
             {
                 Log.Info(Globals.LogTag, "Setting advertising state changed callback !! " );
-                // TODO: Convert the advertiserHandle to leAdvertiser later
+                // TODO: check if this conversion is required
                 //BluetoothLeAdvertiser leAdvertiser = (BluetoothLeAdvertiser)Marshal.PtrToStructure(advertiserHandle, typeof(BluetoothLeAdvertiser));
                 AdvertisingStateChangedEventArgs e = new AdvertisingStateChangedEventArgs(result, advertiserHandle, state);
                 _advertisingStateChanged(null, e);
index 476e1d8..afdf4f3 100755 (executable)
@@ -268,8 +268,10 @@ namespace Tizen.Network.Bluetooth
             return resultData;
         }
 
-        internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData, BluetoothLeScanData scanData)
+        internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData)
         {
+            BluetoothLeScanData scanData = new BluetoothLeScanData();
+
             scanData.RemoteAddress = structScanData.RemoteAddress;
             scanData.AddressType = structScanData.AddressType;
             scanData.Rssi = structScanData.Rssi;
@@ -290,8 +292,10 @@ namespace Tizen.Network.Bluetooth
             return scanData;
         }
 
-        internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData, BluetoothLeScanDataStruct scanDataStruct)
+        internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData)
         {
+            BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
+
             scanDataStruct.RemoteAddress = scanData.RemoteAddress;
             scanDataStruct.AddressType = scanData.AddressType;
             scanDataStruct.Rssi = scanData.Rssi;
@@ -313,12 +317,15 @@ namespace Tizen.Network.Bluetooth
             return scanDataStruct;
         }
 
-        internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData, BluetoothLeServiceData serviceData)
+        internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData)
         {
-            serviceData.Data = structServiceData.ServiceData;
-            serviceData.Uuid = structServiceData.ServiceUuid;
-            serviceData.Length = structServiceData.ServiceDataLength;
-
+            BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
+            if (structServiceData.ServiceDataLength > 0)
+            {
+                serviceData.Uuid = structServiceData.ServiceUuid;
+                serviceData.Length = structServiceData.ServiceDataLength;
+                serviceData.Data = structServiceData.ServiceData;
+            }
             return serviceData;
         }