Skip to content

Commit a15e090

Browse files
committed
Fix build error. Implement draft MelbourneDeveloper#228
1 parent 75ddd43 commit a15e090

File tree

5 files changed

+65
-21
lines changed

5 files changed

+65
-21
lines changed

src/Device.Net.UnitTests/GetFactoryExtensions.cs

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ namespace Device.Net.UnitTests
1010
{
1111
public static class GetFactoryExtensions
1212
{
13+
private const uint FILE_FLAG_OVERLAPPED = 0x40000000;
14+
1315
public static IDeviceFactory GetUsbDeviceFactory(
1416
this FilterDeviceDefinition filterDeviceDefinition,
1517
ILoggerFactory loggerFactory,

src/Device.Net/Windows/ApiService.cs

+45-10
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,52 @@ internal class ApiService : IApiService
2828
#endregion
2929

3030
#region Implementation
31-
public SafeFileHandle CreateWriteConnection(string deviceId) => CreateConnection(deviceId, FileAccessRights.GenericRead | FileAccessRights.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, APICalls.OpenExisting);
31+
public SafeFileHandle CreateFile(string lpFileName, FileAccessRights dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile)
32+
{
33+
const string LOG_FORMAT =
34+
"Calling {call} Area: {area} for DeviceId: {lpFileName}. " +
35+
"Desired Access: {dwDesiredAccess}. " +
36+
"Share mode: {dwShareMode}. " +
37+
"Creation Disposition: {dwCreationDisposition}. " +
38+
"File Flag: {dwFlagsAndAttributes}";
39+
Logger.LogInformation(
40+
LOG_FORMAT,
41+
nameof(APICalls.CreateFile),
42+
nameof(ApiService),
43+
lpFileName,
44+
dwDesiredAccess,
45+
dwShareMode,
46+
dwCreationDisposition,
47+
dwFlagsAndAttributes);
48+
return APICalls.CreateFile(
49+
lpFileName,
50+
dwDesiredAccess,
51+
dwShareMode,
52+
lpSecurityAttributes,
53+
dwCreationDisposition,
54+
dwFlagsAndAttributes,
55+
hTemplateFile);
56+
}
3257

33-
public SafeFileHandle CreateReadConnection(string deviceId, FileAccessRights desiredAccess) => CreateConnection(deviceId, desiredAccess, APICalls.FileShareRead | APICalls.FileShareWrite, APICalls.OpenExisting);
58+
public SafeFileHandle CreateWriteConnection(string deviceId) =>
59+
CreateFile(
60+
deviceId,
61+
FileAccessRights.GenericRead | FileAccessRights.GenericWrite,
62+
APICalls.FileShareRead | APICalls.FileShareWrite,
63+
IntPtr.Zero,
64+
APICalls.OpenExisting,
65+
FILE_FLAG_OVERLAPPED,
66+
IntPtr.Zero);
67+
68+
public SafeFileHandle CreateReadConnection(string deviceId, FileAccessRights desiredAccess) =>
69+
CreateFile(
70+
deviceId,
71+
desiredAccess,
72+
APICalls.FileShareRead | APICalls.FileShareWrite,
73+
IntPtr.Zero,
74+
APICalls.OpenExisting,
75+
FILE_FLAG_OVERLAPPED,
76+
IntPtr.Zero);
3477

3578
public bool AGetCommState(SafeFileHandle hFile, ref Dcb lpDCB) => GetCommState(hFile, ref lpDCB);
3679
public bool APurgeComm(SafeFileHandle hFile, int dwFlags) => PurgeComm(hFile, dwFlags);
@@ -40,14 +83,6 @@ internal class ApiService : IApiService
4083
public bool ASetCommState(SafeFileHandle hFile, [In] ref Dcb lpDCB) => SetCommState(hFile, ref lpDCB);
4184
#endregion
4285

43-
#region Private Methods
44-
private SafeFileHandle CreateConnection(string deviceId, FileAccessRights desiredAccess, uint shareMode, uint creationDisposition)
45-
{
46-
Logger.LogInformation("Calling {call} Area: {area} for DeviceId: {deviceId}. Desired Access: {desiredAccess}. Share mode: {shareMode}. Creation Disposition: {creationDisposition}", nameof(APICalls.CreateFile), nameof(ApiService), deviceId, desiredAccess, shareMode, creationDisposition);
47-
return APICalls.CreateFile(deviceId, desiredAccess, shareMode, IntPtr.Zero, creationDisposition, FILE_FLAG_OVERLAPPED, IntPtr.Zero);
48-
}
49-
#endregion
50-
5186
#region DLL Imports
5287
[DllImport("kernel32.dll", SetLastError = true)]
5388
private static extern bool PurgeComm(SafeFileHandle hFile, int dwFlags);

src/Device.Net/Windows/IApiService.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Device.Net.Windows
88
{
99
public interface IApiService
1010
{
11-
SafeFileHandle CreateFile(string lpFileName, FileAccessRights dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile)
11+
SafeFileHandle CreateFile(string lpFileName, FileAccessRights dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
1212
SafeFileHandle CreateWriteConnection(string deviceId);
1313
SafeFileHandle CreateReadConnection(string deviceId, FileAccessRights desiredAccess);
1414
//TODO: Get rid of read/write. They can be done with file streams...

src/Hid.Net/Windows/WindowsHidApiService.cs

+3-8
Original file line numberDiff line numberDiff line change
@@ -137,14 +137,9 @@ public Guid GetHidGuid()
137137
//TODO: These are not opening as async. If we do, we get an error. This is probably why cancellation tokens don't work.
138138
//https://github.com/MelbourneDeveloper/Device.Net/issues/188
139139

140-
#if NETFRAMEWORK
141-
private const bool _isAsync = false;
142-
#else
143-
private const bool _isAsync = true;
144-
#endif
145-
public Stream OpenRead(SafeFileHandle readSafeFileHandle, ushort readBufferSize) => new FileStream(readSafeFileHandle, FileAccess.Read, readBufferSize, _isAsync);
146-
147-
public Stream OpenWrite(SafeFileHandle writeSafeFileHandle, ushort writeBufferSize) => new FileStream(writeSafeFileHandle, FileAccess.ReadWrite, writeBufferSize, _isAsync);
140+
public Stream OpenRead(SafeFileHandle readSafeFileHandle, ushort readBufferSize) => new FileStream(readSafeFileHandle, FileAccess.Read, readBufferSize);
141+
142+
public Stream OpenWrite(SafeFileHandle writeSafeFileHandle, ushort writeBufferSize) => new FileStream(writeSafeFileHandle, FileAccess.ReadWrite, writeBufferSize);
148143
#endregion
149144

150145
#region Private Methods

src/Hid.Net/Windows/WindowsHidHandler.cs

+14-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,20 @@ public Task InitializeAsync(CancellationToken cancellationToken = default)
117117
$"{nameof(DeviceId)} must be specified before {nameof(InitializeAsync)} can be called.");
118118
}
119119

120-
_readSafeFileHandle = _hidService.CreateReadConnection(DeviceId, FileAccessRights.GenericRead);
121-
_writeSafeFileHandle = _hidService.CreateWriteConnection(DeviceId);
120+
_readSafeFileHandle =
121+
_createReadConnection?.Invoke(
122+
_hidService,
123+
DeviceId,
124+
FileAccessRights.GenericRead,
125+
APICalls.FileShareRead | APICalls.FileShareWrite,
126+
APICalls.OpenExisting) ?? _hidService.CreateReadConnection(DeviceId, FileAccessRights.GenericRead);
127+
_writeSafeFileHandle =
128+
_createWriteConnection?.Invoke(
129+
_hidService,
130+
DeviceId,
131+
FileAccessRights.GenericRead | FileAccessRights.GenericWrite,
132+
APICalls.FileShareRead | APICalls.FileShareWrite,
133+
APICalls.OpenExisting) ?? _hidService.CreateWriteConnection(DeviceId);
122134

123135
if (_readSafeFileHandle.IsInvalid)
124136
{

0 commit comments

Comments
 (0)