OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "printing/backend/print_backend.h" | 5 #include "printing/backend/print_backend.h" |
6 | 6 |
7 #include <objidl.h> | 7 #include <objidl.h> |
8 #include <winspool.h> | 8 #include <winspool.h> |
9 | 9 |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 if (!ret) | 190 if (!ret) |
191 return false; | 191 return false; |
192 | 192 |
193 std::string default_printer = GetDefaultPrinterName(); | 193 std::string default_printer = GetDefaultPrinterName(); |
194 PRINTER_INFO_4* printer_info = | 194 PRINTER_INFO_4* printer_info = |
195 reinterpret_cast<PRINTER_INFO_4*>(printer_info_buffer.get()); | 195 reinterpret_cast<PRINTER_INFO_4*>(printer_info_buffer.get()); |
196 for (DWORD index = 0; index < count_returned; index++) { | 196 for (DWORD index = 0; index < count_returned; index++) { |
197 ScopedPrinterHandle printer; | 197 ScopedPrinterHandle printer; |
198 PrinterBasicInfo info; | 198 PrinterBasicInfo info; |
199 if (printer.OpenPrinter(printer_info[index].pPrinterName) && | 199 if (printer.OpenPrinter(printer_info[index].pPrinterName) && |
200 InitBasicPrinterInfo(printer, &info)) { | 200 InitBasicPrinterInfo(printer.Get(), &info)) { |
201 info.is_default = (info.printer_name == default_printer); | 201 info.is_default = (info.printer_name == default_printer); |
202 printer_list->push_back(info); | 202 printer_list->push_back(info); |
203 } | 203 } |
204 } | 204 } |
205 return true; | 205 return true; |
206 } | 206 } |
207 | 207 |
208 std::string PrintBackendWin::GetDefaultPrinterName() { | 208 std::string PrintBackendWin::GetDefaultPrinterName() { |
209 DWORD size = MAX_PATH; | 209 DWORD size = MAX_PATH; |
210 TCHAR default_printer_name[MAX_PATH]; | 210 TCHAR default_printer_name[MAX_PATH]; |
211 if (!::GetDefaultPrinter(default_printer_name, &size)) | 211 if (!::GetDefaultPrinter(default_printer_name, &size)) |
212 return std::string(); | 212 return std::string(); |
213 return base::WideToUTF8(default_printer_name); | 213 return base::WideToUTF8(default_printer_name); |
214 } | 214 } |
215 | 215 |
216 bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( | 216 bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( |
217 const std::string& printer_name, | 217 const std::string& printer_name, |
218 PrinterSemanticCapsAndDefaults* printer_info) { | 218 PrinterSemanticCapsAndDefaults* printer_info) { |
219 ScopedPrinterHandle printer_handle; | 219 ScopedPrinterHandle printer_handle; |
220 if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { | 220 if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { |
221 LOG(WARNING) << "Failed to open printer, error = " << GetLastError(); | 221 LOG(WARNING) << "Failed to open printer, error = " << GetLastError(); |
222 return false; | 222 return false; |
223 } | 223 } |
224 | 224 |
225 PrinterInfo5 info_5; | 225 PrinterInfo5 info_5; |
226 if (!info_5.Init(printer_handle)) | 226 if (!info_5.Init(printer_handle.Get())) |
227 return false; | 227 return false; |
228 const wchar_t* name = info_5.get()->pPrinterName; | 228 const wchar_t* name = info_5.get()->pPrinterName; |
229 const wchar_t* port = info_5.get()->pPortName; | 229 const wchar_t* port = info_5.get()->pPortName; |
230 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); | 230 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); |
231 | 231 |
232 PrinterSemanticCapsAndDefaults caps; | 232 PrinterSemanticCapsAndDefaults caps; |
233 | 233 |
234 scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = | 234 scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = |
235 CreateDevMode(printer_handle, NULL); | 235 CreateDevMode(printer_handle.Get(), NULL); |
236 if (user_settings) { | 236 if (user_settings) { |
237 if (user_settings->dmFields & DM_COLOR) | 237 if (user_settings->dmFields & DM_COLOR) |
238 caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); | 238 caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); |
239 | 239 |
240 if (user_settings->dmFields & DM_DUPLEX) { | 240 if (user_settings->dmFields & DM_DUPLEX) { |
241 switch (user_settings->dmDuplex) { | 241 switch (user_settings->dmDuplex) { |
242 case DMDUP_SIMPLEX: | 242 case DMDUP_SIMPLEX: |
243 caps.duplex_default = SIMPLEX; | 243 caps.duplex_default = SIMPLEX; |
244 break; | 244 break; |
245 case DMDUP_VERTICAL: | 245 case DMDUP_VERTICAL: |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 return false; | 315 return false; |
316 } | 316 } |
317 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), | 317 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), |
318 &printer_info->printer_capabilities); | 318 &printer_info->printer_capabilities); |
319 DCHECK(SUCCEEDED(hr)); | 319 DCHECK(SUCCEEDED(hr)); |
320 printer_info->caps_mime_type = "text/xml"; | 320 printer_info->caps_mime_type = "text/xml"; |
321 } | 321 } |
322 ScopedPrinterHandle printer_handle; | 322 ScopedPrinterHandle printer_handle; |
323 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { | 323 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { |
324 scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( | 324 scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( |
325 CreateDevMode(printer_handle, NULL)); | 325 CreateDevMode(printer_handle.Get(), NULL)); |
326 if (!devmode_out) | 326 if (!devmode_out) |
327 return false; | 327 return false; |
328 base::win::ScopedComPtr<IStream> printer_defaults_stream; | 328 base::win::ScopedComPtr<IStream> printer_defaults_stream; |
329 hr = CreateStreamOnHGlobal(NULL, TRUE, | 329 hr = CreateStreamOnHGlobal(NULL, TRUE, |
330 printer_defaults_stream.Receive()); | 330 printer_defaults_stream.Receive()); |
331 DCHECK(SUCCEEDED(hr)); | 331 DCHECK(SUCCEEDED(hr)); |
332 if (printer_defaults_stream) { | 332 if (printer_defaults_stream) { |
333 DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; | 333 DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; |
334 hr = XPSModule::ConvertDevModeToPrintTicket(provider, dm_size, | 334 hr = XPSModule::ConvertDevModeToPrintTicket(provider, dm_size, |
335 devmode_out.get(), kPTJobScope, printer_defaults_stream); | 335 devmode_out.get(), kPTJobScope, printer_defaults_stream); |
(...skipping 11 matching lines...) Expand all Loading... |
347 return true; | 347 return true; |
348 } | 348 } |
349 | 349 |
350 // Gets the information about driver for a specific printer. | 350 // Gets the information about driver for a specific printer. |
351 std::string PrintBackendWin::GetPrinterDriverInfo( | 351 std::string PrintBackendWin::GetPrinterDriverInfo( |
352 const std::string& printer_name) { | 352 const std::string& printer_name) { |
353 ScopedPrinterHandle printer; | 353 ScopedPrinterHandle printer; |
354 if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { | 354 if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { |
355 return std::string(); | 355 return std::string(); |
356 } | 356 } |
357 return GetDriverInfo(printer); | 357 return GetDriverInfo(printer.Get()); |
358 } | 358 } |
359 | 359 |
360 bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { | 360 bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { |
361 ScopedPrinterHandle printer_handle; | 361 ScopedPrinterHandle printer_handle; |
362 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); | 362 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); |
363 } | 363 } |
364 | 364 |
365 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( | 365 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( |
366 const base::DictionaryValue* print_backend_settings) { | 366 const base::DictionaryValue* print_backend_settings) { |
367 return new PrintBackendWin; | 367 return new PrintBackendWin; |
368 } | 368 } |
369 | 369 |
370 } // namespace printing | 370 } // namespace printing |
OLD | NEW |