Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: printing/printing_context_win.cc

Issue 168003002: Use DocumentProperties to get default DEVMODE instead of PRINTER_INFO_*. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « printing/backend/printing_info_win.cc ('k') | printing/printing_context_win_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/printing_context_win.h" 5 #include "printing/printing_context_win.h"
6 6
7 #include <winspool.h> 7 #include <winspool.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 dialog_options.Flags = PD_RETURNDC | PD_RETURNDEFAULT; 262 dialog_options.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
263 if (PrintDlg(&dialog_options)) 263 if (PrintDlg(&dialog_options))
264 return ParseDialogResult(dialog_options); 264 return ParseDialogResult(dialog_options);
265 265
266 // No default printer configured, do we have any printers at all? 266 // No default printer configured, do we have any printers at all?
267 DWORD bytes_needed = 0; 267 DWORD bytes_needed = 0;
268 DWORD count_returned = 0; 268 DWORD count_returned = 0;
269 (void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, 269 (void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,
270 NULL, 2, NULL, 0, &bytes_needed, &count_returned); 270 NULL, 2, NULL, 0, &bytes_needed, &count_returned);
271 if (bytes_needed) { 271 if (bytes_needed) {
272 DCHECK(bytes_needed >= count_returned * sizeof(PRINTER_INFO_2)); 272 DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2));
273 scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); 273 scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]);
274 BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, 274 BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,
275 NULL, 2, printer_info_buffer.get(), 275 NULL, 2, printer_info_buffer.get(),
276 bytes_needed, &bytes_needed, 276 bytes_needed, &bytes_needed,
277 &count_returned); 277 &count_returned);
278 if (ret && count_returned) { // have printers 278 if (ret && count_returned) { // have printers
279 // Open the first successfully found printer. 279 // Open the first successfully found printer.
280 for (DWORD count = 0; count < count_returned; ++count) { 280 const PRINTER_INFO_2* info_2 =
281 PRINTER_INFO_2* info_2 = reinterpret_cast<PRINTER_INFO_2*>( 281 reinterpret_cast<PRINTER_INFO_2*>(printer_info_buffer.get());
282 printer_info_buffer.get() + count * sizeof(PRINTER_INFO_2)); 282 const PRINTER_INFO_2* info_2_end = info_2 + count_returned;
283 std::wstring printer_name = info_2->pPrinterName; 283 for (; info_2 < info_2_end; ++info_2) {
284 if (info_2->pDevMode == NULL || printer_name.length() == 0) 284 ScopedPrinterHandle printer;
285 if (!printer.OpenPrinter(info_2->pPrinterName))
285 continue; 286 continue;
286 if (!AllocateContext(printer_name, info_2->pDevMode, &context_)) 287 scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL);
287 break; 288 if (!dev_mode || !AllocateContext(info_2->pPrinterName, dev_mode.get(),
288 if (InitializeSettings(*info_2->pDevMode, printer_name, 289 &context_)) {
289 NULL, 0, false)) { 290 continue;
290 break; 291 }
292 if (InitializeSettings(*dev_mode.get(), info_2->pPrinterName, NULL, 0,
293 false)) {
294 return OK;
291 } 295 }
292 ReleaseContext(); 296 ReleaseContext();
293 } 297 }
294 if (context_) 298 if (context_)
295 return OK; 299 return OK;
296 } 300 }
297 } 301 }
298 302
299 ResetSettings(); 303 ResetSettings();
300 return FAILED; 304 return FAILED;
(...skipping 28 matching lines...) Expand all
329 paper_size.width() * settings_.device_units_per_inch(), 333 paper_size.width() * settings_.device_units_per_inch(),
330 paper_size.height() * settings_.device_units_per_inch()); 334 paper_size.height() * settings_.device_units_per_inch());
331 } 335 }
332 336
333 PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( 337 PrintingContext::Result PrintingContextWin::UpdatePrinterSettings(
334 bool external_preview) { 338 bool external_preview) {
335 DCHECK(!in_print_job_); 339 DCHECK(!in_print_job_);
336 DCHECK(!external_preview) << "Not implemented"; 340 DCHECK(!external_preview) << "Not implemented";
337 341
338 ScopedPrinterHandle printer; 342 ScopedPrinterHandle printer;
339 LPWSTR device_name_wide = 343 if (!printer.OpenPrinter(settings_.device_name().c_str()))
340 const_cast<wchar_t*>(settings_.device_name().c_str());
341 if (!printer.OpenPrinter(device_name_wide))
342 return OnError(); 344 return OnError();
343 345
344 // Make printer changes local to Chrome. 346 // Make printer changes local to Chrome.
345 // See MSDN documentation regarding DocumentProperties. 347 // See MSDN documentation regarding DocumentProperties.
346 scoped_ptr<DEVMODE[]> scoped_dev_mode = 348 scoped_ptr<DEVMODE[]> scoped_dev_mode =
347 CreateDevModeWithColor(printer, device_name_wide, 349 CreateDevModeWithColor(printer, settings_.device_name(),
348 settings_.color() != GRAY); 350 settings_.color() != GRAY);
349 if (!scoped_dev_mode) 351 if (!scoped_dev_mode)
350 return OnError(); 352 return OnError();
351 353
352 { 354 {
353 DEVMODE* dev_mode = scoped_dev_mode.get(); 355 DEVMODE* dev_mode = scoped_dev_mode.get();
354 dev_mode->dmCopies = std::max(settings_.copies(), 1); 356 dev_mode->dmCopies = std::max(settings_.copies(), 1);
355 if (dev_mode->dmCopies > 1) { // do not change unless multiple copies 357 if (dev_mode->dmCopies > 1) { // do not change unless multiple copies
356 dev_mode->dmFields |= DM_COPIES; 358 dev_mode->dmFields |= DM_COPIES;
357 dev_mode->dmCollate = settings_.collate() ? DMCOLLATE_TRUE : 359 dev_mode->dmCollate = settings_.collate() ? DMCOLLATE_TRUE :
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 PrintSettingsInitializerWin::InitPrintSettings(context_, dev_mode, 583 PrintSettingsInitializerWin::InitPrintSettings(context_, dev_mode,
582 &settings_); 584 &settings_);
583 585
584 return true; 586 return true;
585 } 587 }
586 588
587 bool PrintingContextWin::GetPrinterSettings(HANDLE printer, 589 bool PrintingContextWin::GetPrinterSettings(HANDLE printer,
588 const std::wstring& device_name) { 590 const std::wstring& device_name) {
589 DCHECK(!in_print_job_); 591 DCHECK(!in_print_job_);
590 592
591 UserDefaultDevMode user_settings; 593 scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL);
592 594
593 if (!user_settings.Init(printer) || 595 if (!dev_mode || !AllocateContext(device_name, dev_mode.get(), &context_)) {
594 !AllocateContext(device_name, user_settings.get(), &context_)) {
595 ResetSettings(); 596 ResetSettings();
596 return false; 597 return false;
597 } 598 }
598 599
599 return InitializeSettings(*user_settings.get(), device_name, NULL, 0, false); 600 return InitializeSettings(*dev_mode.get(), device_name, NULL, 0, false);
600 } 601 }
601 602
602 // static 603 // static
603 bool PrintingContextWin::AllocateContext(const std::wstring& device_name, 604 bool PrintingContextWin::AllocateContext(const std::wstring& device_name,
604 const DEVMODE* dev_mode, 605 const DEVMODE* dev_mode,
605 gfx::NativeDrawingContext* context) { 606 gfx::NativeDrawingContext* context) {
606 *context = CreateDC(L"WINSPOOL", device_name.c_str(), NULL, dev_mode); 607 *context = CreateDC(L"WINSPOOL", device_name.c_str(), NULL, dev_mode);
607 DCHECK(*context); 608 DCHECK(*context);
608 return *context != NULL; 609 return *context != NULL;
609 } 610 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 730
730 if (dialog_options.hDevMode != NULL) 731 if (dialog_options.hDevMode != NULL)
731 GlobalFree(dialog_options.hDevMode); 732 GlobalFree(dialog_options.hDevMode);
732 if (dialog_options.hDevNames != NULL) 733 if (dialog_options.hDevNames != NULL)
733 GlobalFree(dialog_options.hDevNames); 734 GlobalFree(dialog_options.hDevNames);
734 735
735 return context_ ? OK : FAILED; 736 return context_ ? OK : FAILED;
736 } 737 }
737 738
738 } // namespace printing 739 } // namespace printing
OLDNEW
« no previous file with comments | « printing/backend/printing_info_win.cc ('k') | printing/printing_context_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698