2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Reflection;
20 using System.Collections.Generic;
21 using System.Collections.ObjectModel;
22 using System.Collections.Specialized;
23 using System.Runtime.InteropServices;
25 namespace Tizen.Network.Bluetooth
28 /// The structure of the device class type and service.
30 [StructLayout(LayoutKind.Sequential)]
31 internal struct BluetoothClassStruct
34 /// The type of the major device class.
36 internal BluetoothMajorDeviceClassType MajorDeviceClassType;
38 /// The type of the minor device class.
40 internal BluetoothMinorDeviceClassType MinorDeviceClassType;
42 /// The major service class mask.
44 internal int MajorServiceClassMask;
48 /// This structure contains the information of the Bluetooth device.
50 [StructLayout(LayoutKind.Sequential)]
51 internal struct BluetoothDeviceStruct
54 /// The address of the device.
56 [MarshalAsAttribute(UnmanagedType.LPStr)]
57 internal string Address;
60 /// The name of the device.
62 [MarshalAsAttribute(UnmanagedType.LPStr)]
66 /// The class of the device.
68 internal BluetoothClassStruct Class;
71 /// The service UUID list of the device.
73 internal IntPtr ServiceUuidList;
76 /// The service count of the device.
78 internal int ServiceCount;
81 /// The paired state of the device.
83 [MarshalAsAttribute(UnmanagedType.I1)]
84 internal bool IsPaired;
87 /// The connection state of the device.
89 [MarshalAsAttribute(UnmanagedType.I1)]
90 internal bool IsConnected;
93 /// The authorization state of the device.
95 [MarshalAsAttribute(UnmanagedType.I1)]
96 internal bool IsAuthorized;
99 /// The length of the manufacturer the data.
101 internal int ManufacturerDataLength;
104 /// The manufacturer data.
106 [MarshalAsAttribute(UnmanagedType.LPStr)]
107 internal string ManufacturerData;
110 [StructLayout(LayoutKind.Sequential)]
111 internal struct BluetoothDiscoveredDeviceStruct
113 [MarshalAsAttribute(UnmanagedType.LPStr)]
114 internal string Address;
116 [MarshalAsAttribute(UnmanagedType.LPStr)]
117 internal string Name;
119 internal BluetoothClassStruct Class;
123 [MarshalAsAttribute(UnmanagedType.I1)]
124 internal bool IsPaired;
126 internal IntPtr ServiceUuidList;
128 internal int ServiceCount;
130 internal BluetoothAppearanceType AppearanceType;
132 internal int ManufacturerDataLength;
134 [MarshalAsAttribute(UnmanagedType.LPStr)]
135 internal string ManufacturerData;
138 internal struct BluetoothDeviceSdpStruct
140 [MarshalAsAttribute(UnmanagedType.LPStr)]
141 internal string DeviceAddress;
142 internal IntPtr ServiceUuid;
143 internal int ServiceCount;
146 internal struct BluetoothDeviceConnectionStruct
148 internal string Address;
149 internal BluetoothConnectionLinkType LinkType;
150 internal BluetoothDisconnectReason DisconnectReason;
153 internal struct SocketDataStruct
155 internal int SocketFd;
156 internal int DataSize;
157 internal IntPtr Data;
160 internal struct SocketConnectionStruct
162 internal int SocketFd;
163 internal int ServerFd;
164 internal BluetoothSocketRole LocalRole;
165 internal string Address;
166 internal string ServiceUuid;
170 [StructLayout(LayoutKind.Sequential)]
171 internal struct BluetoothLeScanDataStruct
173 [MarshalAsAttribute(UnmanagedType.LPStr)]
174 internal string RemoteAddress;
176 internal BluetoothLeDeviceAddressType AddressType;
180 internal int AdvDataLength;
182 internal IntPtr AdvData;
184 internal int ScanDataLength;
186 internal IntPtr ScanData;
189 [StructLayout(LayoutKind.Sequential)]
190 internal struct BluetoothLeServiceDataStruct
193 /// The Bluetooth LE service UUID.
195 [MarshalAs(UnmanagedType.LPStr)]
196 internal string ServiceUuid;
198 /// The Bluetooth LE service data.
200 internal IntPtr ServiceData;
202 internal int ServiceDataLength;
205 internal static class BluetoothUtils
207 internal static BluetoothDevice ConvertStructToDeviceClass(BluetoothDeviceStruct device)
209 BluetoothDevice resultDevice = new BluetoothDevice();
210 Collection<string> uuidList = null;
212 if (device.ServiceCount > 0)
214 IntPtr[] extensionList = new IntPtr[device.ServiceCount];
215 Marshal.Copy (device.ServiceUuidList, extensionList, 0, device.ServiceCount);
216 uuidList = new Collection<string> ();
217 foreach (IntPtr extension in extensionList) {
218 string uuid = Marshal.PtrToStringAnsi (extension);
223 resultDevice.RemoteDeviceAddress = device.Address;
224 resultDevice.RemoteDeviceName = device.Name;
225 resultDevice.RemoteDeviceClass = new BluetoothClass();
226 resultDevice.Class.MajorType = device.Class.MajorDeviceClassType;
227 resultDevice.Class.MinorType = device.Class.MinorDeviceClassType;
228 resultDevice.Class.Mask = device.Class.MajorServiceClassMask;
229 resultDevice.RemotePaired = device.IsPaired;
230 resultDevice.RemoteConnected = device.IsConnected;
231 resultDevice.RemoteAuthorized = device.IsAuthorized;
232 resultDevice.RemoteDeviceService = uuidList;
233 resultDevice.RemoteDeviceCount = device.ServiceCount;
234 resultDevice.RemoteManufLength = device.ManufacturerDataLength;
235 resultDevice.RemoteManufData = device.ManufacturerData;
240 internal static BluetoothDevice ConvertStructToDiscoveredDevice(BluetoothDiscoveredDeviceStruct structDevice)
242 BluetoothDevice resultDevice = new BluetoothDevice();
243 Collection<string> uuidList = null;
245 if (structDevice.ServiceCount > 0) {
246 IntPtr[] extensionList = new IntPtr[structDevice.ServiceCount];
247 Marshal.Copy (structDevice.ServiceUuidList, extensionList, 0, structDevice.ServiceCount);
248 uuidList = new Collection<string> ();
249 foreach (IntPtr extension in extensionList) {
250 string uuid = Marshal.PtrToStringAnsi (extension);
255 resultDevice.RemoteDeviceAddress = structDevice.Address;
256 resultDevice.RemoteDeviceName = structDevice.Name;
258 resultDevice.RemoteDeviceClass = new BluetoothClass();
259 resultDevice.Class.MajorType = structDevice.Class.MajorDeviceClassType;
260 resultDevice.Class.MinorType = structDevice.Class.MinorDeviceClassType;
261 resultDevice.Class.Mask = structDevice.Class.MajorServiceClassMask;
263 resultDevice.RemoteDeviceRssi = structDevice.Rssi;
264 resultDevice.RemoteAppearance = structDevice.AppearanceType;
266 if (structDevice.ServiceCount > 0) {
267 resultDevice.RemoteDeviceService = uuidList;
268 resultDevice.RemoteDeviceCount = structDevice.ServiceCount;
271 resultDevice.RemotePaired = structDevice.IsPaired;
272 resultDevice.RemoteManufData = structDevice.ManufacturerData;
273 resultDevice.RemoteManufLength = structDevice.ManufacturerDataLength;
277 internal static BluetoothDeviceSdpData ConvertStructToSdpData(BluetoothDeviceSdpStruct structData)
279 BluetoothDeviceSdpData resultData = new BluetoothDeviceSdpData();
280 Collection<string> uuidList = null;
282 if (structData.ServiceCount > 0) {
283 IntPtr[] extensionList = new IntPtr[structData.ServiceCount];
284 Marshal.Copy (structData.ServiceUuid, extensionList, 0, structData.ServiceCount);
285 uuidList = new Collection<string> ();
286 foreach (IntPtr extension in extensionList) {
287 string uuid = Marshal.PtrToStringAnsi (extension);
292 resultData.Uuid = uuidList;
293 resultData.Address = structData.DeviceAddress;
298 internal static BluetoothDeviceConnectionData ConvertStructToConnectionData(BluetoothDeviceConnectionStruct structInfo)
300 BluetoothDeviceConnectionData resultData = new BluetoothDeviceConnectionData();
301 resultData.RemoteAddress = structInfo.Address;
302 resultData.Link = structInfo.LinkType;
303 resultData.Reason = structInfo.DisconnectReason;
307 internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData)
309 BluetoothLeScanData scanData = new BluetoothLeScanData();
311 scanData.RemoteAddress = structScanData.RemoteAddress;
312 scanData.AddressType = structScanData.AddressType;
313 scanData.Rssi = structScanData.Rssi;
315 if (structScanData.AdvDataLength > 0)
317 scanData.AdvDataLength = structScanData.AdvDataLength;
318 scanData.AdvData = new byte[scanData.AdvDataLength];
319 Marshal.Copy (structScanData.AdvData, scanData.AdvData, 0, scanData.AdvDataLength);
322 if (structScanData.ScanDataLength > 0)
324 scanData.ScanDataLength = structScanData.ScanDataLength;
325 scanData.ScanData = new byte[scanData.ScanDataLength];
326 Marshal.Copy (structScanData.ScanData, scanData.ScanData, 0, scanData.ScanDataLength);
331 internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData)
333 BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
335 scanDataStruct.RemoteAddress = scanData.RemoteAddress;
336 scanDataStruct.AddressType = scanData.AddressType;
337 scanDataStruct.Rssi = scanData.Rssi;
339 if (scanData.AdvDataLength > 0)
341 scanDataStruct.AdvDataLength = scanData.AdvDataLength;
342 scanDataStruct.AdvData = Marshal.AllocHGlobal(scanData.AdvDataLength);
343 Marshal.Copy (scanData.AdvData, 0, scanDataStruct.AdvData, scanData.AdvDataLength);
346 if (scanData.ScanDataLength > 0)
348 scanDataStruct.ScanDataLength = scanData.ScanDataLength;
349 scanDataStruct.ScanData = Marshal.AllocHGlobal(scanData.ScanDataLength);
350 Marshal.Copy (scanData.ScanData, 0, scanDataStruct.ScanData, scanData.ScanDataLength);
353 return scanDataStruct;
356 internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData)
358 BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
359 Log.Info(Globals.LogTag, "ServiceDataLength" + structServiceData.ServiceDataLength);
361 if (structServiceData.ServiceDataLength > 0)
363 serviceData.Uuid = structServiceData.ServiceUuid;
364 serviceData.Length = structServiceData.ServiceDataLength;
365 serviceData.Data = new byte[serviceData.Length];
366 Marshal.Copy(structServiceData.ServiceData, serviceData.Data, 0, serviceData.Length);
371 internal static SocketData ConvertStructToSocketData(SocketDataStruct structInfo)
373 SocketData data = new SocketData();
374 data.Fd = structInfo.SocketFd;
375 data.Size = structInfo.DataSize;
376 data.RecvData = Marshal.PtrToStringAnsi(structInfo.Data);
380 internal static SocketConnection ConvertStructToSocketConnection(SocketConnectionStruct structInfo)
382 SocketConnection connectionInfo = new SocketConnection();
383 connectionInfo.Fd = structInfo.SocketFd;
384 connectionInfo.RemoteAddress = structInfo.Address;
385 connectionInfo.Uuid = structInfo.ServiceUuid;
386 return connectionInfo;