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;
174 [StructLayout(LayoutKind.Sequential)]
175 internal struct BluetoothLeScanDataStruct
177 [MarshalAsAttribute(UnmanagedType.LPStr)]
178 internal string RemoteAddress;
180 internal BluetoothLeDeviceAddressType AddressType;
184 internal int AdvDataLength;
186 internal IntPtr AdvData;
188 internal int ScanDataLength;
190 internal IntPtr ScanData;
193 [StructLayout(LayoutKind.Sequential)]
194 internal struct BluetoothLeServiceDataStruct
197 /// The Bluetooth LE service UUID.
199 [MarshalAs(UnmanagedType.LPStr)]
200 internal string ServiceUuid;
202 /// The Bluetooth LE service data.
204 internal IntPtr ServiceData;
206 internal int ServiceDataLength;
209 internal static class BluetoothUtils
211 internal static BluetoothDevice ConvertStructToDeviceClass(BluetoothDeviceStruct device)
213 BluetoothDevice resultDevice = new BluetoothDevice();
214 Collection<string> uuidList = null;
216 if (device.ServiceCount > 0)
218 IntPtr[] extensionList = new IntPtr[device.ServiceCount];
219 Marshal.Copy (device.ServiceUuidList, extensionList, 0, device.ServiceCount);
220 uuidList = new Collection<string> ();
221 foreach (IntPtr extension in extensionList) {
222 string uuid = Marshal.PtrToStringAnsi (extension);
227 resultDevice.RemoteDeviceAddress = device.Address;
228 resultDevice.RemoteDeviceName = device.Name;
229 resultDevice.RemoteDeviceClass = new BluetoothClass();
230 resultDevice.Class.MajorType = device.Class.MajorDeviceClassType;
231 resultDevice.Class.MinorType = device.Class.MinorDeviceClassType;
232 resultDevice.Class.Mask = device.Class.MajorServiceClassMask;
233 resultDevice.RemotePaired = device.IsPaired;
234 resultDevice.RemoteConnected = device.IsConnected;
235 resultDevice.RemoteAuthorized = device.IsAuthorized;
236 resultDevice.RemoteDeviceService = uuidList;
237 resultDevice.RemoteDeviceCount = device.ServiceCount;
238 resultDevice.RemoteManufLength = device.ManufacturerDataLength;
239 resultDevice.RemoteManufData = device.ManufacturerData;
244 internal static BluetoothDevice ConvertStructToDiscoveredDevice(BluetoothDiscoveredDeviceStruct structDevice)
246 BluetoothDevice resultDevice = new BluetoothDevice();
247 Collection<string> uuidList = null;
249 if (structDevice.ServiceCount > 0) {
250 IntPtr[] extensionList = new IntPtr[structDevice.ServiceCount];
251 Marshal.Copy (structDevice.ServiceUuidList, extensionList, 0, structDevice.ServiceCount);
252 uuidList = new Collection<string> ();
253 foreach (IntPtr extension in extensionList) {
254 string uuid = Marshal.PtrToStringAnsi (extension);
259 resultDevice.RemoteDeviceAddress = structDevice.Address;
260 resultDevice.RemoteDeviceName = structDevice.Name;
262 resultDevice.RemoteDeviceClass = new BluetoothClass();
263 resultDevice.Class.MajorType = structDevice.Class.MajorDeviceClassType;
264 resultDevice.Class.MinorType = structDevice.Class.MinorDeviceClassType;
265 resultDevice.Class.Mask = structDevice.Class.MajorServiceClassMask;
267 resultDevice.RemoteDeviceRssi = structDevice.Rssi;
268 resultDevice.RemoteAppearance = structDevice.AppearanceType;
270 if (structDevice.ServiceCount > 0) {
271 resultDevice.RemoteDeviceService = uuidList;
272 resultDevice.RemoteDeviceCount = structDevice.ServiceCount;
275 resultDevice.RemotePaired = structDevice.IsPaired;
276 resultDevice.RemoteManufData = structDevice.ManufacturerData;
277 resultDevice.RemoteManufLength = structDevice.ManufacturerDataLength;
281 internal static BluetoothDeviceSdpData ConvertStructToSdpData(BluetoothDeviceSdpStruct structData)
283 BluetoothDeviceSdpData resultData = new BluetoothDeviceSdpData();
284 Collection<string> uuidList = null;
286 if (structData.ServiceCount > 0) {
287 IntPtr[] extensionList = new IntPtr[structData.ServiceCount];
288 Marshal.Copy (structData.ServiceUuid, extensionList, 0, structData.ServiceCount);
289 uuidList = new Collection<string> ();
290 foreach (IntPtr extension in extensionList) {
291 string uuid = Marshal.PtrToStringAnsi (extension);
296 resultData.Uuid = uuidList;
297 resultData.Address = structData.DeviceAddress;
302 internal static BluetoothDeviceConnectionData ConvertStructToConnectionData(BluetoothDeviceConnectionStruct structInfo)
304 BluetoothDeviceConnectionData resultData = new BluetoothDeviceConnectionData();
305 resultData.RemoteAddress = structInfo.Address;
306 resultData.Link = structInfo.LinkType;
307 resultData.Reason = structInfo.DisconnectReason;
311 internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData)
313 BluetoothLeScanData scanData = new BluetoothLeScanData();
315 scanData.RemoteAddress = structScanData.RemoteAddress;
316 scanData.AddressType = structScanData.AddressType;
317 scanData.Rssi = structScanData.Rssi;
319 if (structScanData.AdvDataLength > 0)
321 scanData.AdvDataLength = structScanData.AdvDataLength;
322 scanData.AdvData = new byte[scanData.AdvDataLength];
323 Marshal.Copy (structScanData.AdvData, scanData.AdvData, 0, scanData.AdvDataLength);
326 if (structScanData.ScanDataLength > 0)
328 scanData.ScanDataLength = structScanData.ScanDataLength;
329 scanData.ScanData = new byte[scanData.ScanDataLength];
330 Marshal.Copy (structScanData.ScanData, scanData.ScanData, 0, scanData.ScanDataLength);
335 internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData)
337 BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
339 scanDataStruct.RemoteAddress = scanData.RemoteAddress;
340 scanDataStruct.AddressType = scanData.AddressType;
341 scanDataStruct.Rssi = scanData.Rssi;
343 if (scanData.AdvDataLength > 0)
345 scanDataStruct.AdvDataLength = scanData.AdvDataLength;
346 scanDataStruct.AdvData = Marshal.AllocHGlobal(scanData.AdvDataLength);
347 Marshal.Copy (scanData.AdvData, 0, scanDataStruct.AdvData, scanData.AdvDataLength);
350 if (scanData.ScanDataLength > 0)
352 scanDataStruct.ScanDataLength = scanData.ScanDataLength;
353 scanDataStruct.ScanData = Marshal.AllocHGlobal(scanData.ScanDataLength);
354 Marshal.Copy (scanData.ScanData, 0, scanDataStruct.ScanData, scanData.ScanDataLength);
357 return scanDataStruct;
360 internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData)
362 BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
363 Log.Info(Globals.LogTag, "ServiceDataLength" + structServiceData.ServiceDataLength);
365 if (structServiceData.ServiceDataLength > 0)
367 serviceData.Uuid = structServiceData.ServiceUuid;
368 serviceData.Length = structServiceData.ServiceDataLength;
369 serviceData.Data = new byte[serviceData.Length];
370 Marshal.Copy(structServiceData.ServiceData, serviceData.Data, 0, serviceData.Length);
375 internal static SocketData ConvertStructToSocketData(SocketDataStruct structInfo)
377 SocketData data = new SocketData();
378 data.Fd = structInfo.SocketFd;
379 data.Size = structInfo.DataSize;
380 data.RecvData = Marshal.PtrToStringAnsi(structInfo.Data);
384 internal static SocketConnection ConvertStructToSocketConnection(SocketConnectionStruct structInfo)
386 SocketConnection connectionInfo = new SocketConnection();
387 connectionInfo.Fd = structInfo.SocketFd;
388 connectionInfo.RemoteAddress = structInfo.Address;
389 connectionInfo.Uuid = structInfo.ServiceUuid;
390 return connectionInfo;