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 [StructLayout(LayoutKind.Sequential)]
209 internal struct BluetoothHidDeviceReceivedDataStruct
211 [MarshalAsAttribute(UnmanagedType.LPStr)]
212 internal string RemoteAddress;
213 internal BluetoothHidHeaderType headerType;
214 internal BluetoothHidParamType paramType;
215 internal int dataSize;
216 internal IntPtr data;
219 internal static class BluetoothUtils
221 internal static BluetoothDevice ConvertStructToDeviceClass(BluetoothDeviceStruct device)
223 BluetoothDevice resultDevice = new BluetoothDevice();
224 Collection<string> uuidList = null;
226 if (device.ServiceCount > 0)
228 IntPtr[] extensionList = new IntPtr[device.ServiceCount];
229 Marshal.Copy (device.ServiceUuidList, extensionList, 0, device.ServiceCount);
230 uuidList = new Collection<string> ();
231 foreach (IntPtr extension in extensionList) {
232 string uuid = Marshal.PtrToStringAnsi (extension);
237 resultDevice.RemoteDeviceAddress = device.Address;
238 resultDevice.RemoteDeviceName = device.Name;
239 resultDevice.RemoteDeviceClass = new BluetoothClass();
240 resultDevice.Class.MajorType = device.Class.MajorDeviceClassType;
241 resultDevice.Class.MinorType = device.Class.MinorDeviceClassType;
242 resultDevice.Class.Mask = device.Class.MajorServiceClassMask;
243 resultDevice.RemotePaired = device.IsPaired;
244 resultDevice.RemoteConnected = device.IsConnected;
245 resultDevice.RemoteAuthorized = device.IsAuthorized;
246 resultDevice.RemoteDeviceService = uuidList;
247 resultDevice.RemoteDeviceCount = device.ServiceCount;
248 resultDevice.RemoteManufLength = device.ManufacturerDataLength;
249 resultDevice.RemoteManufData = device.ManufacturerData;
254 internal static BluetoothDevice ConvertStructToDiscoveredDevice(BluetoothDiscoveredDeviceStruct structDevice)
256 BluetoothDevice resultDevice = new BluetoothDevice();
257 Collection<string> uuidList = null;
259 if (structDevice.ServiceCount > 0) {
260 IntPtr[] extensionList = new IntPtr[structDevice.ServiceCount];
261 Marshal.Copy (structDevice.ServiceUuidList, extensionList, 0, structDevice.ServiceCount);
262 uuidList = new Collection<string> ();
263 foreach (IntPtr extension in extensionList) {
264 string uuid = Marshal.PtrToStringAnsi (extension);
269 resultDevice.RemoteDeviceAddress = structDevice.Address;
270 resultDevice.RemoteDeviceName = structDevice.Name;
272 resultDevice.RemoteDeviceClass = new BluetoothClass();
273 resultDevice.Class.MajorType = structDevice.Class.MajorDeviceClassType;
274 resultDevice.Class.MinorType = structDevice.Class.MinorDeviceClassType;
275 resultDevice.Class.Mask = structDevice.Class.MajorServiceClassMask;
277 resultDevice.RemoteDeviceRssi = structDevice.Rssi;
278 resultDevice.RemoteAppearance = structDevice.AppearanceType;
280 if (structDevice.ServiceCount > 0) {
281 resultDevice.RemoteDeviceService = uuidList;
282 resultDevice.RemoteDeviceCount = structDevice.ServiceCount;
285 resultDevice.RemotePaired = structDevice.IsPaired;
286 resultDevice.RemoteManufData = structDevice.ManufacturerData;
287 resultDevice.RemoteManufLength = structDevice.ManufacturerDataLength;
291 internal static BluetoothDeviceSdpData ConvertStructToSdpData(BluetoothDeviceSdpStruct structData)
293 BluetoothDeviceSdpData resultData = new BluetoothDeviceSdpData();
294 Collection<string> uuidList = null;
296 if (structData.ServiceCount > 0) {
297 IntPtr[] extensionList = new IntPtr[structData.ServiceCount];
298 Marshal.Copy (structData.ServiceUuid, extensionList, 0, structData.ServiceCount);
299 uuidList = new Collection<string> ();
300 foreach (IntPtr extension in extensionList) {
301 string uuid = Marshal.PtrToStringAnsi (extension);
306 resultData.Uuid = uuidList;
307 resultData.Address = structData.DeviceAddress;
312 internal static BluetoothDeviceConnectionData ConvertStructToConnectionData(BluetoothDeviceConnectionStruct structInfo)
314 BluetoothDeviceConnectionData resultData = new BluetoothDeviceConnectionData();
315 resultData.RemoteAddress = structInfo.Address;
316 resultData.Link = structInfo.LinkType;
317 resultData.Reason = structInfo.DisconnectReason;
321 internal static BluetoothLeScanData ConvertStructToLeScanData(BluetoothLeScanDataStruct structScanData)
323 BluetoothLeScanData scanData = new BluetoothLeScanData();
325 scanData.RemoteAddress = structScanData.RemoteAddress;
326 scanData.AddressType = structScanData.AddressType;
327 scanData.Rssi = structScanData.Rssi;
329 if (structScanData.AdvDataLength > 0)
331 scanData.AdvDataLength = structScanData.AdvDataLength;
332 scanData.AdvData = new byte[scanData.AdvDataLength];
333 Marshal.Copy (structScanData.AdvData, scanData.AdvData, 0, scanData.AdvDataLength);
336 if (structScanData.ScanDataLength > 0)
338 scanData.ScanDataLength = structScanData.ScanDataLength;
339 scanData.ScanData = new byte[scanData.ScanDataLength];
340 Marshal.Copy (structScanData.ScanData, scanData.ScanData, 0, scanData.ScanDataLength);
345 internal static BluetoothLeScanDataStruct ConvertLeScanDataToStruct(BluetoothLeScanData scanData)
347 BluetoothLeScanDataStruct scanDataStruct = new BluetoothLeScanDataStruct();
349 scanDataStruct.RemoteAddress = scanData.RemoteAddress;
350 scanDataStruct.AddressType = scanData.AddressType;
351 scanDataStruct.Rssi = scanData.Rssi;
353 if (scanData.AdvDataLength > 0)
355 scanDataStruct.AdvDataLength = scanData.AdvDataLength;
356 scanDataStruct.AdvData = Marshal.AllocHGlobal(scanData.AdvDataLength);
357 Marshal.Copy (scanData.AdvData, 0, scanDataStruct.AdvData, scanData.AdvDataLength);
360 if (scanData.ScanDataLength > 0)
362 scanDataStruct.ScanDataLength = scanData.ScanDataLength;
363 scanDataStruct.ScanData = Marshal.AllocHGlobal(scanData.ScanDataLength);
364 Marshal.Copy (scanData.ScanData, 0, scanDataStruct.ScanData, scanData.ScanDataLength);
367 return scanDataStruct;
370 internal static BluetoothLeServiceData ConvertStructToLeServiceData(BluetoothLeServiceDataStruct structServiceData)
372 BluetoothLeServiceData serviceData = new BluetoothLeServiceData();
373 Log.Info(Globals.LogTag, "ServiceDataLength" + structServiceData.ServiceDataLength);
375 if (structServiceData.ServiceDataLength > 0)
377 serviceData.Uuid = structServiceData.ServiceUuid;
378 serviceData.Length = structServiceData.ServiceDataLength;
379 serviceData.Data = new byte[serviceData.Length];
380 Marshal.Copy(structServiceData.ServiceData, serviceData.Data, 0, serviceData.Length);
385 internal static SocketData ConvertStructToSocketData(SocketDataStruct structInfo)
387 SocketData data = new SocketData();
388 Log.Info(Globals.LogTag, "SocketDataLength" + structInfo.DataSize);
390 data._fd = structInfo.SocketFd;
391 if (structInfo.DataSize > 0)
393 data._dataSize = structInfo.DataSize;
394 data._data = new byte[data._dataSize];
395 Marshal.Copy(structInfo.Data, data._data, 0, data._dataSize);
396 data._recvData = Marshal.PtrToStringAnsi(structInfo.Data, structInfo.DataSize);
401 internal static SocketConnection ConvertStructToSocketConnection(SocketConnectionStruct structInfo)
403 SocketConnection connectionInfo = new SocketConnection();
404 connectionInfo.Fd = structInfo.SocketFd;
405 connectionInfo.RemoteAddress = structInfo.Address;
406 connectionInfo.Uuid = structInfo.ServiceUuid;
407 connectionInfo.ServerFd = structInfo.ServerFd;
409 BluetoothSocket clientSocket = new BluetoothSocket();
410 clientSocket.connectedSocket = structInfo.SocketFd;
411 clientSocket.remoteAddress = structInfo.Address;
412 clientSocket.serviceUuid = structInfo.ServiceUuid;
413 connectionInfo.ClientSocket = (IBluetoothServerSocket)clientSocket;
415 return connectionInfo;