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..f663e88814aab8b488e128ebf935180280910d98 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" |
@@ -14,6 +15,8 @@ |
#include "components/storage_monitor/storage_info.h" |
#include "components/storage_monitor/volume_mount_watcher_win.h" |
+#define WM_USER_MEDIACHANGED (WM_USER+1) |
rvargas (doing something else)
2014/04/22 21:09:44
This is numerically the same as the wake up messag
Kevin Bailey
2014/04/23 16:02:23
I was under the impression that it is the intent o
rvargas (doing something else)
2014/04/23 18:45:15
There is no bug in using the same value, as long a
Kevin Bailey
2014/04/24 15:12:38
Agreed, but now I have little idea who it's collid
|
+ |
// StorageMonitorWin ------------------------------------------------------- |
namespace storage_monitor { |
@@ -43,6 +46,21 @@ StorageMonitorWin::~StorageMonitorWin() { |
UnregisterClass(MAKEINTATOM(window_class_), instance_); |
} |
+void StorageMonitorWin::MediaChangeNotificationRegister() { |
vandebo (ex-Chrome)
2014/04/22 18:07:42
Move to line 169
Kevin Bailey
2014/04/22 20:09:31
Done.
|
+ LPITEMIDLIST ppidl; |
rvargas (doing something else)
2014/04/22 21:09:44
nit: even for Windows code, variables should follo
Kevin Bailey
2014/04/23 16:02:23
Done.
|
+ if (SHGetSpecialFolderLocation(window_, CSIDL_DESKTOP, &ppidl) == NOERROR) { |
rvargas (doing something else)
2014/04/22 21:09:44
CSIDL_DRIVES ?
rvargas (doing something else)
2014/04/22 21:09:44
The first argument is reserved.
Kevin Bailey
2014/04/23 16:02:23
Done.
Kevin Bailey
2014/04/23 16:02:23
I assume this means, pass 0.
|
+ SHChangeNotifyEntry shCNE; |
+ shCNE.pidl = ppidl; |
+ shCNE.fRecursive = TRUE; |
+ if (!SHChangeNotifyRegister(window_, SHCNE_DISKEVENTS, |
rvargas (doing something else)
2014/04/22 21:09:44
The second argument (fSources) is one of SHCNRF_*
Kevin Bailey
2014/04/23 16:02:23
Ok, I hope ShellLevel is correct. It seems to work
|
+ SHCNE_MEDIAINSERTED|SHCNE_MEDIAREMOVED, |
rvargas (doing something else)
2014/04/22 21:09:44
nit: spaces around |
Kevin Bailey
2014/04/23 16:02:23
Done.
|
+ WM_USER_MEDIACHANGED, 1, &shCNE)) |
+ DVLOG(1) << "SHChangeNotifyRegister FAILED"; |
+ } else { |
+ DVLOG(1) << "SHGetSpecialFolderLocation FAILED"; |
+ } |
+} |
+ |
void StorageMonitorWin::Init() { |
WNDCLASSEX window_class; |
base::win::InitializeWindowClass( |
@@ -59,6 +77,7 @@ void StorageMonitorWin::Init() { |
SetWindowLongPtr(window_, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this)); |
volume_mount_watcher_->Init(); |
portable_device_watcher_->Init(window_); |
+ MediaChangeNotificationRegister(); |
} |
bool StorageMonitorWin::GetStorageInfoForPath(const base::FilePath& path, |
@@ -138,6 +157,9 @@ LRESULT CALLBACK StorageMonitorWin::WndProc(HWND hwnd, UINT message, |
case WM_DEVICECHANGE: |
OnDeviceChange(static_cast<UINT>(wparam), lparam); |
return TRUE; |
+ case WM_USER_MEDIACHANGED: |
+ OnMediaChange(wparam, lparam); |
+ return TRUE; |
default: |
break; |
} |
@@ -156,10 +178,15 @@ 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); |
} |
+void StorageMonitorWin::OnMediaChange(WPARAM wparam, LPARAM lparam) { |
+ volume_mount_watcher_->OnMediaChange(wparam, lparam); |
+} |
+ |
StorageMonitor* StorageMonitor::CreateInternal() { |
return new StorageMonitorWin(new VolumeMountWatcherWin(), |
new PortableDeviceWatcherWin()); |