Index: chrome/service/cloud_print/print_system_win.cc |
diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc |
index d9d7dbfec21cf5f5493af734c0d7a29b9b4649cd..229f2794803684c0716edb9e477e5e8d3aaf6039 100644 |
--- a/chrome/service/cloud_print/print_system_win.cc |
+++ b/chrome/service/cloud_print/print_system_win.cc |
@@ -33,6 +33,16 @@ |
namespace { |
+class PrinterChangeHandleTraits { |
+ public: |
+ static bool CloseHandle(HANDLE handle) { |
+ return ::FindClosePrinterChangeNotification(handle) != FALSE; |
+ } |
+}; |
+ |
+typedef base::win::GenericScopedHandle<PrinterChangeHandleTraits> |
+ ScopedPrinterChangeHandle; |
+ |
class DevMode { |
public: |
DevMode() : dm_(NULL) {} |
@@ -122,9 +132,7 @@ namespace cloud_print { |
class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
public: |
PrintSystemWatcherWin() |
- : printer_(NULL), |
- printer_change_(NULL), |
- delegate_(NULL), |
+ : delegate_(NULL), |
did_signal_(false) { |
} |
~PrintSystemWatcherWin() { |
@@ -151,11 +159,11 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
printer_name_to_use = const_cast<LPTSTR>(printer_name_wide.c_str()); |
} |
bool ret = false; |
- OpenPrinter(printer_name_to_use, &printer_, NULL); |
- if (printer_) { |
- printer_change_ = FindFirstPrinterChangeNotification( |
- printer_, PRINTER_CHANGE_PRINTER|PRINTER_CHANGE_JOB, 0, NULL); |
- if (printer_change_) { |
+ OpenPrinter(printer_name_to_use, printer_.Receive(), NULL); |
+ if (printer_.IsValid()) { |
+ printer_change_.Set(FindFirstPrinterChangeNotification( |
+ printer_, PRINTER_CHANGE_PRINTER|PRINTER_CHANGE_JOB, 0, NULL)); |
+ if (printer_change_.IsValid()) { |
ret = watcher_.StartWatching(printer_change_, this); |
} |
} |
@@ -166,14 +174,8 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
} |
bool Stop() { |
watcher_.StopWatching(); |
- if (printer_) { |
- ClosePrinter(printer_); |
- printer_ = NULL; |
- } |
- if (printer_change_) { |
- FindClosePrinterChangeNotification(printer_change_); |
- printer_change_ = NULL; |
- } |
+ printer_.Close(); |
+ printer_change_.Close(); |
return true; |
} |
@@ -203,7 +205,7 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
bool GetCurrentPrinterInfo(printing::PrinterBasicInfo* printer_info) { |
DCHECK(printer_info); |
- if (!printer_) |
+ if (!printer_.IsValid()) |
return false; |
DWORD bytes_needed = 0; |
@@ -234,10 +236,11 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
private: |
base::win::ObjectWatcher watcher_; |
- HANDLE printer_; // The printer being watched |
- HANDLE printer_change_; // Returned by FindFirstPrinterChangeNotifier |
- Delegate* delegate_; // Delegate to notify |
- bool did_signal_; // DoneWaiting was called |
+ printing::ScopedPrinterHandle printer_; // The printer being watched |
+ // Returned by FindFirstPrinterChangeNotifier. |
+ ScopedPrinterChangeHandle printer_change_; |
+ Delegate* delegate_; // Delegate to notify |
+ bool did_signal_; // DoneWaiting was called |
}; |
// This typedef is to workaround the issue with certain versions of |
@@ -804,13 +807,13 @@ bool PrintSystemWin::GetJobDetails(const std::string& printer_name, |
PlatformJobId job_id, |
PrintJobDetails *job_details) { |
DCHECK(job_details); |
- HANDLE printer_handle = NULL; |
+ printing::ScopedPrinterHandle printer_handle; |
std::wstring printer_name_wide = UTF8ToWide(printer_name); |
- OpenPrinter(const_cast<LPTSTR>(printer_name_wide.c_str()), &printer_handle, |
- NULL); |
- DCHECK(printer_handle); |
+ OpenPrinter(const_cast<LPTSTR>(printer_name_wide.c_str()), |
+ printer_handle.Receive(), NULL); |
+ DCHECK(printer_handle.IsValid()); |
bool ret = false; |
- if (printer_handle) { |
+ if (printer_handle.IsValid()) { |
DWORD bytes_needed = 0; |
GetJob(printer_handle, job_id, 1, NULL, 0, &bytes_needed); |
DWORD last_error = GetLastError(); |
@@ -840,7 +843,6 @@ bool PrintSystemWin::GetJobDetails(const std::string& printer_name, |
ret = true; |
} |
} |
- ClosePrinter(printer_handle); |
} |
return ret; |
} |