Index: components/storage_monitor/storage_monitor_win.cc |
diff --git a/components/storage_monitor/storage_monitor_win.cc b/components/storage_monitor/storage_monitor_win.cc |
index fb721bb3284826999bde409d67109cff8699cb6b..958c8edb63eb1f9dbd435b733ddc9d596ba6291c 100644 |
--- a/components/storage_monitor/storage_monitor_win.cc |
+++ b/components/storage_monitor/storage_monitor_win.cc |
@@ -7,6 +7,7 @@ |
#include <windows.h> |
#include <dbt.h> |
#include <fileapi.h> |
+#include <shlobj.h> |
#include "base/win/wrapped_window_proc.h" |
#include "components/storage_monitor/portable_device_watcher_win.h" |
@@ -43,6 +44,24 @@ StorageMonitorWin::~StorageMonitorWin() { |
UnregisterClass(MAKEINTATOM(window_class_), instance_); |
} |
+#define WM_USER_MEDIACHANGED (WM_USER+1) |
vandebo (ex-Chrome)
2014/04/11 22:24:26
Put this on before line 18
Kevin Bailey
2014/04/22 15:43:03
Done.
|
+ |
+void StorageMonitorWin::ChangeNotifyRegister() { |
vandebo (ex-Chrome)
2014/04/11 22:24:26
Could also just put this code in the Init method,
Kevin Bailey
2014/04/22 15:43:03
It's a little messy, and would add entirely new ca
vandebo (ex-Chrome)
2014/04/22 18:07:42
I think inlining it would be fine, but leaving it
|
+ LPITEMIDLIST ppidl; |
+ if (SHGetSpecialFolderLocation(window_, CSIDL_DESKTOP, &ppidl) == NOERROR) { |
+ SHChangeNotifyEntry shCNE; |
+ shCNE.pidl = ppidl; |
+ shCNE.fRecursive = TRUE; |
+ ULONG result = SHChangeNotifyRegister(window_, SHCNE_DISKEVENTS, |
vandebo (ex-Chrome)
2014/04/11 22:24:26
result isn't used, inline the if
Kevin Bailey
2014/04/22 15:43:03
Done.
|
+ SHCNE_MEDIAINSERTED|SHCNE_MEDIAREMOVED, |
+ WM_USER_MEDIACHANGED, 1, &shCNE); |
+ if (!result) |
+ DVLOG(1) << "SHChangeNotifyRegister FAILED"; |
+ } else { |
+ DVLOG(1) << "SHGetSpecialFolderLocation FAILED"; |
+ } |
+} |
+ |
void StorageMonitorWin::Init() { |
WNDCLASSEX window_class; |
base::win::InitializeWindowClass( |
@@ -59,6 +78,7 @@ void StorageMonitorWin::Init() { |
SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); |
volume_mount_watcher_->Init(); |
portable_device_watcher_->Init(window_); |
+ ChangeNotifyRegister(); |
} |
bool StorageMonitorWin::GetStorageInfoForPath(const base::FilePath& path, |
@@ -132,12 +152,19 @@ LRESULT CALLBACK StorageMonitorWin::WndProcThunk(HWND hwnd, UINT message, |
return ::DefWindowProc(hwnd, message, wparam, lparam); |
} |
+void StorageMonitorWin::OnMediaChanged(WPARAM wparam, LPARAM lparam) { |
vandebo (ex-Chrome)
2014/04/11 22:24:26
Move to after line 183
Kevin Bailey
2014/04/22 15:43:03
Done.
|
+ volume_mount_watcher_->OnMediaChanged(wparam, lparam); |
+} |
+ |
LRESULT CALLBACK StorageMonitorWin::WndProc(HWND hwnd, UINT message, |
WPARAM wparam, LPARAM lparam) { |
switch (message) { |
case WM_DEVICECHANGE: |
OnDeviceChange(static_cast<UINT>(wparam), lparam); |
return TRUE; |
+ case WM_USER_MEDIACHANGED: |
+ OnMediaChanged(wparam, lparam); |
+ return TRUE; |
default: |
break; |
} |
@@ -156,6 +183,7 @@ bool StorageMonitorWin::GetDeviceInfo(const base::FilePath& device_path, |
} |
void StorageMonitorWin::OnDeviceChange(UINT event_type, LPARAM data) { |
+ DVLOG(1) << "OnDeviceChange " << event_type << " " << data; |
volume_mount_watcher_->OnWindowMessage(event_type, data); |
portable_device_watcher_->OnWindowMessage(event_type, data); |
} |