Skip to content

Commit a04ade7

Browse files
committed
Update
1 parent 5d3d06a commit a04ade7

File tree

2 files changed

+168
-32
lines changed

2 files changed

+168
-32
lines changed

src/Files.App.Storage/Storables/WindowsStorage/WindowsFolderWatcher.cs

Lines changed: 145 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
2020
{
2121
// Fields
2222

23-
private const uint WM_FOLDERWATCHER = PInvoke.WM_APP | 0x0001U;
23+
private const uint WM_NOTIFYFOLDERCHANGE = PInvoke.WM_APP | 0x0001U;
2424
private readonly WNDPROC _wndProc;
2525

2626
private uint _watcherRegID = 0U;
@@ -34,42 +34,38 @@ public unsafe partial class WindowsFolderWatcher : IFolderWatcher
3434

3535
public event NotifyCollectionChangedEventHandler? CollectionChanged;
3636

37-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? ItemAssocChanged; // SHCNE_ASSOCCHANGED
38-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? ItemAttributesChanged; // SHCNE_ATTRIBUTES
39-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? ItemImageUpdated; // SHCNE_UPDATEIMAGE
37+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? ItemAssocChanged; // SHCNE_ASSOCCHANGED
38+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? ItemAttributesChanged; // SHCNE_ATTRIBUTES
39+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? ItemImageUpdated; // SHCNE_UPDATEIMAGE
4040

41-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FileRenamed; // SHCNE_RENAMEITEM
42-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FileCreated; // SHCNE_CREATE
43-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FileDeleted; // SHCNE_DELETE
44-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FileUpdated; // SHCNE_UPDATEITEM
41+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FileRenamed; // SHCNE_RENAMEITEM
42+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FileCreated; // SHCNE_CREATE
43+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FileDeleted; // SHCNE_DELETE
44+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FileUpdated; // SHCNE_UPDATEITEM
4545

46-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FolderRenamed; // SHCNE_RENAMEFOLDER
47-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FolderCreated; // SHCNE_MKDIR
48-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FolderDeleted; // SHCNE_RMDIR
49-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FolderUpdated; // SHCNE_UPDATEDIR
46+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FolderRenamed; // SHCNE_RENAMEFOLDER
47+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FolderCreated; // SHCNE_MKDIR
48+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FolderDeleted; // SHCNE_RMDIR
49+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FolderUpdated; // SHCNE_UPDATEDIR
5050

51-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? MediaInserted; // SHCNE_MEDIAINSERTED
52-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? MediaRemoved; // SHCNE_MEDIAREMOVED
53-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? DriveRemoved; // SHCNE_DRIVEREMOVED
54-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? DriveAdded; // SHCNE_DRIVEADD
55-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? DriveAddedViaGUI; // SHCNE_DRIVEADDGUI
56-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? DiskEventOccurred; // SHCNE_DISKEVENTS
57-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? FreeSpaceUpdated; // SHCNE_FREESPACE
51+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? MediaInserted; // SHCNE_MEDIAINSERTED
52+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? MediaRemoved; // SHCNE_MEDIAREMOVED
53+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? DriveRemoved; // SHCNE_DRIVEREMOVED
54+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? DriveAdded; // SHCNE_DRIVEADD
55+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? DriveAddedViaGUI; // SHCNE_DRIVEADDGUI
56+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? FreeSpaceUpdated; // SHCNE_FREESPACE
5857

59-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? SharingStarted; // SHCNE_NETSHARE
60-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? SharingStopped; // SHCNE_NETUNSHARE
58+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? SharingStarted; // SHCNE_NETSHARE
59+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? SharingStopped; // SHCNE_NETUNSHARE
6160

62-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? DisconnectedFromServer; // SHCNE_SERVERDISCONNECT
61+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? DisconnectedFromServer; // SHCNE_SERVERDISCONNECT
6362

64-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? ExtendedEventOccurred; // SHCNE_EXTENDED_EVENT
65-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? GlobalEventOccurred; // SHCNE_GLOBALEVENTS
66-
public event TypedEventHandler<WindowsFolderWatcher, IWindowsStorable>? SystemInterruptOccurred; // SHCNE_INTERRUPT
63+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? ExtendedEventOccurred; // SHCNE_EXTENDED_EVENT
64+
public event TypedEventHandler<WindowsFolderWatcher, WindowsFolderWatcherEventArgs>? SystemInterruptOccurred; // SHCNE_INTERRUPT
6765

6866
// Constructor
6967

70-
/// <summary>
71-
/// Initializes a new instance of the <see cref="WindowsFolderWatcher"/> class.
72-
/// </summary>
68+
/// <summary>Initializes a new instance of the <see cref="WindowsFolderWatcher"/> class.</summary>
7369
/// <param name="folder">Specifies the folder to be monitored for changes.</param>
7470
public WindowsFolderWatcher(WindowsFolder folder)
7571
{
@@ -110,19 +106,19 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
110106
hWnd,
111107
SHCNRF_SOURCE.SHCNRF_ShellLevel | SHCNRF_SOURCE.SHCNRF_NewDelivery,
112108
(int)SHCNE_ID.SHCNE_ALLEVENTS,
113-
WM_FOLDERWATCHER,
109+
WM_NOTIFYFOLDERCHANGE,
114110
1,
115111
&changeNotifyEntry);
116112

117113
if (_watcherRegID is 0U)
118114
break;
119115
}
120116
break;
121-
case WM_FOLDERWATCHER:
117+
case WM_NOTIFYFOLDERCHANGE:
122118
{
123119
ITEMIDLIST** ppidl;
124-
int lEvent = 0;
125-
HANDLE hLock = PInvoke.SHChangeNotification_Lock((HANDLE)(nint)wParam.Value, (uint)lParam.Value, &ppidl, &lEvent);
120+
uint lEvent = 0;
121+
HANDLE hLock = PInvoke.SHChangeNotification_Lock((HANDLE)(nint)wParam.Value, (uint)lParam.Value, &ppidl, (int*)&lEvent);
126122

127123
if (hLock.IsNull)
128124
break;
@@ -142,6 +138,123 @@ private unsafe LRESULT WndProc(HWND hWnd, uint uMessage, WPARAM wParam, LPARAM l
142138
return PInvoke.DefWindowProc(hWnd, uMessage, wParam, lParam);
143139
}
144140

141+
private void FireEvent(SHCNE_ID eventType, ITEMIDLIST** ppidl)
142+
{
143+
switch (eventType)
144+
{
145+
case SHCNE_ID.SHCNE_ASSOCCHANGED:
146+
{
147+
ItemAssocChanged?.Invoke(this, new(eventType));
148+
}
149+
break;
150+
case SHCNE_ID.SHCNE_ATTRIBUTES:
151+
{
152+
ItemAttributesChanged?.Invoke(this, new(eventType));
153+
}
154+
break;
155+
case SHCNE_ID.SHCNE_UPDATEIMAGE:
156+
{
157+
ItemImageUpdated?.Invoke(this, new(eventType));
158+
}
159+
break;
160+
case SHCNE_ID.SHCNE_RENAMEITEM:
161+
{
162+
FileRenamed?.Invoke(this, new(eventType));
163+
}
164+
break;
165+
case SHCNE_ID.SHCNE_CREATE:
166+
{
167+
FileCreated?.Invoke(this, new(eventType));
168+
}
169+
break;
170+
case SHCNE_ID.SHCNE_DELETE:
171+
{
172+
FileDeleted?.Invoke(this, new(eventType));
173+
}
174+
break;
175+
case SHCNE_ID.SHCNE_UPDATEITEM:
176+
{
177+
FileUpdated?.Invoke(this, new(eventType));
178+
}
179+
break;
180+
case SHCNE_ID.SHCNE_RENAMEFOLDER:
181+
{
182+
FolderRenamed?.Invoke(this, new(eventType));
183+
}
184+
break;
185+
case SHCNE_ID.SHCNE_MKDIR:
186+
{
187+
FolderCreated?.Invoke(this, new(eventType));
188+
}
189+
break;
190+
case SHCNE_ID.SHCNE_RMDIR:
191+
{
192+
FolderDeleted?.Invoke(this, new(eventType));
193+
}
194+
break;
195+
case SHCNE_ID.SHCNE_UPDATEDIR:
196+
{
197+
FolderUpdated?.Invoke(this, new(eventType));
198+
}
199+
break;
200+
case SHCNE_ID.SHCNE_MEDIAINSERTED:
201+
{
202+
MediaInserted?.Invoke(this, new(eventType));
203+
}
204+
break;
205+
case SHCNE_ID.SHCNE_MEDIAREMOVED:
206+
{
207+
MediaRemoved?.Invoke(this, new(eventType));
208+
}
209+
break;
210+
case SHCNE_ID.SHCNE_DRIVEREMOVED:
211+
{
212+
DriveRemoved?.Invoke(this, new(eventType));
213+
}
214+
break;
215+
case SHCNE_ID.SHCNE_DRIVEADD:
216+
{
217+
DriveAdded?.Invoke(this, new(eventType));
218+
}
219+
break;
220+
case SHCNE_ID.SHCNE_DRIVEADDGUI:
221+
{
222+
DriveAddedViaGUI?.Invoke(this, new(eventType));
223+
}
224+
break;
225+
case SHCNE_ID.SHCNE_FREESPACE:
226+
{
227+
FreeSpaceUpdated?.Invoke(this, new(eventType));
228+
}
229+
break;
230+
case SHCNE_ID.SHCNE_NETSHARE:
231+
{
232+
SharingStarted?.Invoke(this, new(eventType));
233+
}
234+
break;
235+
case SHCNE_ID.SHCNE_NETUNSHARE:
236+
{
237+
SharingStopped?.Invoke(this, new(eventType));
238+
}
239+
break;
240+
case SHCNE_ID.SHCNE_SERVERDISCONNECT:
241+
{
242+
DisconnectedFromServer?.Invoke(this, new(eventType));
243+
}
244+
break;
245+
case SHCNE_ID.SHCNE_EXTENDED_EVENT:
246+
{
247+
ExtendedEventOccurred?.Invoke(this, new(eventType));
248+
}
249+
break;
250+
case SHCNE_ID.SHCNE_INTERRUPT:
251+
{
252+
SystemInterruptOccurred?.Invoke(this, new(eventType));
253+
}
254+
break;
255+
}
256+
}
257+
145258
public void Dispose()
146259
{
147260
PInvoke.SHChangeNotifyDeregister(_watcherRegID);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using Windows.Win32.UI.Shell;
5+
6+
namespace Files.App.Storage
7+
{
8+
public class WindowsFolderWatcherEventArgs : EventArgs
9+
{
10+
public SHCNE_ID EventType { get; init; }
11+
12+
public IWindowsStorable? OldItem { get; init; }
13+
14+
public IWindowsStorable? NewItem { get; init; }
15+
16+
public WindowsFolderWatcherEventArgs(SHCNE_ID eventType, IWindowsStorable? _oldItem = null, IWindowsStorable? _newItem = null)
17+
{
18+
EventType = eventType;
19+
OldItem = _oldItem;
20+
NewItem = _newItem;
21+
}
22+
}
23+
}

0 commit comments

Comments
 (0)