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 [StructLayout(LayoutKind.Sequential)]
139 internal struct BluetoothDeviceSdpStruct
141 [MarshalAsAttribute(UnmanagedType.LPStr)]
142 internal string DeviceAddress;
143 internal IntPtr ServiceUuid;
144 internal int ServiceCount;
147 [StructLayout(LayoutKind.Sequential)]
148 internal struct BluetoothDeviceConnectionStruct
150 internal string Address;
151 internal BluetoothConnectionLinkType LinkType;
152 internal BluetoothDisconnectReason DisconnectReason;
155 [StructLayout(LayoutKind.Sequential)]
156 internal struct SocketDataStruct
158 internal int SocketFd;
159 internal int DataSize;
160 internal IntPtr Data;
163 [StructLayout(LayoutKind.Sequential)]
164 internal struct SocketConnectionStruct
166 internal int SocketFd;
167 internal int ServerFd;
168 internal BluetoothSocketRole LocalRole;
169 internal string Address;
170 internal string ServiceUuid;
173 [StructLayout(LayoutKind.Sequential)]
174 internal struct BluetoothLeScanDataStruct
176 [MarshalAsAttribute(UnmanagedType.LPStr)]
177 internal string RemoteAddress;
179 internal BluetoothLeDeviceAddressType AddressType;
183 internal int AdvDataLength;
185 internal IntPtr AdvData;
187 internal int ScanDataLength;
189 internal IntPtr ScanData;
192 [StructLayout(LayoutKind.Sequential)]
193 internal struct BluetoothLeServiceDataStruct
196 /// The Bluetooth LE service UUID.
198 [MarshalAs(UnmanagedType.LPStr)]
199 internal string ServiceUuid;
201 /// The Bluetooth LE service data.
203 internal IntPtr ServiceData;
205 internal int ServiceDataLength;
208 internal static class BluetoothUtils
210 internal static BluetoothDevice ConvertStructToDeviceClass(BluetoothDeviceStruct device)
212 BluetoothDevice resultDevice = new BluetoothDevice();
213 Collection<string> uuidList = null;
215 if (device.ServiceCount > 0)
217 IntPtr[] extensionList = new IntPtr[device.ServiceCount];
218 Marshal.Copy (device.ServiceUuidList, extensionList, 0, device.ServiceCount);
219 uuidList = new Collection<string> ();
220 foreach (IntPtr extension in extensionList) {
221 string uuid = Marshal.PtrToStringAnsi (extension);
226 resultDevice.RemoteDeviceAddress = device.Address;
227 resultDevice.RemoteDeviceName = device.Name;
228 resultDevice.RemoteDeviceClass = new BluetoothClass();
229 resultDevice.Class.MajorType = device.Class.MajorDeviceClassType;
230 resultDevice.Class.MinorType = device.Class.MinorDeviceClassType;
231 resultDevice.Class.Mask = device.Class.MajorServiceClassMask;
232 resultDevice.RemotePaired = device.IsPaired;
233 resultDevice.RemoteConnected = device.IsConnected;
234 resultDevice.RemoteAuthorized = device.IsAuthorized;
235 resultDevice.RemoteDeviceService = uuidList;
236 resultDevice.RemoteDeviceCount = device.ServiceCount;
237 resultDevice.RemoteManufLength = device.ManufacturerDataLength;
238 resultDevice.RemoteManufData = device.ManufacturerData;
243 internal static BluetoothDevice ConvertStructToDiscoveredDevice(BluetoothDiscoveredDeviceStruct structDevice)
245 BluetoothDevice resultDevice = new BluetoothDevice();
246 Collection<string> uuidList = null;
248 if (structDevice.ServiceCount > 0) {
249 IntPtr[] extensionList = new IntPtr[structDevice.ServiceCount];
250 Marshal.Copy (structDevice.ServiceUuidList, extensionList, 0, structDevice.ServiceCount);
251 uuidList = new Collection<string> ();
252 foreach (IntPtr extension in extensionList) {
253 string uuid = Marshal.PtrToStringAnsi (extension);
258 resultDevice.RemoteDeviceAddress = structDevice.Address;
259 resultDevice.RemoteDeviceName = structDevice.Name;
261 resultDevice.RemoteDeviceClass = new BluetoothClass();
262 resultDevice.Class.MajorType = structDevice.Class.MajorDeviceClassType;
263 resultDevice.Class.MinorType = structDevice.Class.MinorDeviceClassType;
264 resultDevice.Class.Mask = structDevice.Class.MajorServiceClassMask;
266 resultDevice.RemoteDeviceRssi = structDevice.Rssi;
267 resultDevice.RemoteAppearance = structDevice.AppearanceType;
269 if (structDevice.ServiceCount > 0) {
270 resultDevice.RemoteDeviceService = uuidList;
271 resultDevice.RemoteDeviceCount = structDevice.ServiceCount;
274 resultDevice.RemotePaired = structDevice.IsPaired;
275 resultDevice.RemoteManufData = structDevice.ManufacturerData;
276 resultDevice.RemoteManufLength = structDevice.ManufacturerDataLength;
280 internal static BluetoothDeviceSdpData ConvertStructToSdpData(BluetoothDeviceSdpStruct structData)
282 BluetoothDeviceSdpData resultData = new BluetoothDeviceSdpData();
283 Collection<string> uuidList = null;
285 if (structData.ServiceCount > 0) {
286 IntPtr[] extensionList = new IntPtr[structData.ServiceCount];
287 Marshal.Copy (structData.ServiceUuid, extensionList, 0, structData.ServiceCount);
288 uuidList = new Collection<string> ();
289 foreach (IntPtr extension in extensionList) {
290 string uuid = Marshal.PtrToStringAnsi (extension);
295 resultData.Uuid = uuidList;
296 resultData.Address = structData.DeviceAddress;
301 internal static BluetoothDeviceConnectionData ConvertStructToConnectionData(BluetoothDeviceConnectionStruct structInfo)
303 BluetoothDeviceConnectionData resultData = new BluetoothDeviceConnectionData();
304 resultData.RemoteAddress = structInfo.Address;
305 resultData.Link = structInfo.LinkType;
306 resultData.Reason = structInfo.DisconnectReason;
310 internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData)
312 BluetoothLeScanData scanData = new BluetoothLeScanData();
314 scanData.RemoteAddress = structScanData.RemoteAddress;
315 scanData.AddressType = structScanData.AddressType;
316 scanData.Rssi = structScanData.Rssi;
318 if (structScanData.AdvDataLength > 0)
320 scanData.AdvDataLength = structScanData.AdvDataLength;
321 scanData.AdvData = new byte[scanData.AdvDataLength];
322 Marshal.Copy (structScanData.AdvData, scanData.AdvData, 0, scanData.AdvDataLength);
325 if (structScanData.ScanDataLength > 0)
327 scanData.ScanDataLength = structScanData.ScanDataLength;
328 scanData.ScanData = new byte[scanData.ScanDataLength];
329 Marshal.Copy (structScanData.ScanData, scanData.ScanData, 0, scanData.ScanDataLength);
334 internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData)
336 BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
338 scanDataStruct.RemoteAddress = scanData.RemoteAddress;
339 scanDataStruct.AddressType = scanData.AddressType;
340 scanDataStruct.Rssi = scanData.Rssi;
342 if (scanData.AdvDataLength > 0)
344 scanDataStruct.AdvDataLength = scanData.AdvDataLength;
345 scanDataStruct.AdvData = Marshal.AllocHGlobal(scanData.AdvDataLength);
346 Marshal.Copy (scanData.AdvData, 0, scanDataStruct.AdvData, scanData.AdvDataLength);
349 if (scanData.ScanDataLength > 0)
351 scanDataStruct.ScanDataLength = scanData.ScanDataLength;
352 scanDataStruct.ScanData = Marshal.AllocHGlobal(scanData.ScanDataLength);
353 Marshal.Copy (scanData.ScanData, 0, scanDataStruct.ScanData, scanData.ScanDataLength);
356 return scanDataStruct;
359 internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData)
361 BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
362 Log.Info(Globals.LogTag, "ServiceDataLength" + structServiceData.ServiceDataLength);
364 if (structServiceData.ServiceDataLength > 0)
366 serviceData.Uuid = structServiceData.ServiceUuid;
367 serviceData.Length = structServiceData.ServiceDataLength;
368 serviceData.Data = new byte[serviceData.Length];
369 Marshal.Copy(structServiceData.ServiceData, serviceData.Data, 0, serviceData.Length);
374 internal static SocketData ConvertStructToSocketData(SocketDataStruct structInfo)
376 SocketData data = new SocketData();
377 data.Fd = structInfo.SocketFd;
378 data.Size = structInfo.DataSize;
379 data.RecvData = Marshal.PtrToStringAnsi(structInfo.Data);
383 internal static SocketConnection ConvertStructToSocketConnection(SocketConnectionStruct structInfo)
385 SocketConnection connectionInfo = new SocketConnection();
386 connectionInfo.Fd = structInfo.SocketFd;
387 connectionInfo.RemoteAddress = structInfo.Address;
388 connectionInfo.Uuid = structInfo.ServiceUuid;
389 return connectionInfo;