| Index: printing/printed_document.cc
|
| diff --git a/printing/printed_document.cc b/printing/printed_document.cc
|
| index 77e3953f4d8299577937343f4964594ab2ad2574..6d2a9a037ddc258c4c4e3c421ccfa2613eda9a50 100644
|
| --- a/printing/printed_document.cc
|
| +++ b/printing/printed_document.cc
|
| @@ -9,16 +9,23 @@
|
| #include <string>
|
| #include <vector>
|
|
|
| +#include "base/bind.h"
|
| #include "base/file_util.h"
|
| #include "base/files/file_path.h"
|
| #include "base/i18n/file_util_icu.h"
|
| #include "base/i18n/time_formatting.h"
|
| +#include "base/json/json_writer.h"
|
| #include "base/lazy_instance.h"
|
| +#include "base/memory/ref_counted_memory.h"
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/numerics/safe_conversions.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "base/time/time.h"
|
| +#include "base/values.h"
|
| #include "printing/page_number.h"
|
| +#include "printing/print_settings_conversion.h"
|
| #include "printing/printed_page.h"
|
| #include "printing/printed_pages_source.h"
|
| #include "printing/units.h"
|
| @@ -26,30 +33,65 @@
|
| #include "ui/gfx/font.h"
|
| #include "ui/gfx/text_elider.h"
|
|
|
| +namespace printing {
|
| +
|
| namespace {
|
|
|
| -struct PrintDebugDumpPath {
|
| - PrintDebugDumpPath()
|
| - : enabled(false) {
|
| - }
|
| +base::LazyInstance<base::FilePath> g_debug_dump_info =
|
| + LAZY_INSTANCE_INITIALIZER;
|
|
|
| - bool enabled;
|
| - base::FilePath debug_dump_path;
|
| -};
|
| +void DebugDumpPageTask(const base::string16& doc_name,
|
| + const PrintedPage* page) {
|
| + if (g_debug_dump_info.Get().empty())
|
| + return;
|
|
|
| -base::LazyInstance<PrintDebugDumpPath> g_debug_dump_info =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| + base::string16 filename = doc_name;
|
| + filename +=
|
| + base::ASCIIToUTF16(base::StringPrintf("_%04d", page->page_number()));
|
| +#if defined(OS_WIN)
|
| + page->metafile()->SaveTo(PrintedDocument::CreateDebugDumpPath(
|
| + filename, FILE_PATH_LITERAL(".emf")));
|
| +#else // OS_WIN
|
| + page->metafile()->SaveTo(PrintedDocument::CreateDebugDumpPath(
|
| + filename, FILE_PATH_LITERAL(".pdf")));
|
| +#endif // OS_WIN
|
| +}
|
|
|
| -} // namespace
|
| +void DebugDumpDataTask(const base::string16& doc_name,
|
| + const base::FilePath::StringType& extension,
|
| + const base::RefCountedMemory* data) {
|
| + base::FilePath path =
|
| + PrintedDocument::CreateDebugDumpPath(doc_name, extension);
|
| + if (path.empty())
|
| + return;
|
| + base::WriteFile(path,
|
| + reinterpret_cast<const char*>(data->front()),
|
| + base::checked_cast<int>(data->size()));
|
| +}
|
|
|
| -namespace printing {
|
| +void DebugDumpSettings(const base::string16& doc_name,
|
| + const PrintSettings& settings,
|
| + base::TaskRunner* blocking_runner) {
|
| + base::DictionaryValue job_settings;
|
| + PrintSettingsToJobSettingsDebug(settings, &job_settings);
|
| + std::string settings_str;
|
| + base::JSONWriter::WriteWithOptions(
|
| + &job_settings, base::JSONWriter::OPTIONS_PRETTY_PRINT, &settings_str);
|
| + scoped_refptr<base::RefCountedMemory> data =
|
| + base::RefCountedString::TakeString(&settings_str);
|
| + blocking_runner->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &DebugDumpDataTask, doc_name, FILE_PATH_LITERAL(".json"), data));
|
| +}
|
| +
|
| +} // namespace
|
|
|
| PrintedDocument::PrintedDocument(const PrintSettings& settings,
|
| PrintedPagesSource* source,
|
| - int cookie)
|
| - : mutable_(source),
|
| - immutable_(settings, source, cookie) {
|
| -
|
| + int cookie,
|
| + base::TaskRunner* blocking_runner)
|
| + : mutable_(source), immutable_(settings, source, cookie, blocking_runner) {
|
| // Records the expected page count if a range is setup.
|
| if (!settings.ranges().empty()) {
|
| // If there is a range, set the number of page
|
| @@ -58,6 +100,9 @@ PrintedDocument::PrintedDocument(const PrintSettings& settings,
|
| mutable_.expected_page_count_ += range.to - range.from + 1;
|
| }
|
| }
|
| +
|
| + if (!g_debug_dump_info.Get().empty())
|
| + DebugDumpSettings(name(), settings, blocking_runner);
|
| }
|
|
|
| PrintedDocument::~PrintedDocument() {
|
| @@ -86,20 +131,22 @@ void PrintedDocument::SetPage(int page_number,
|
| mutable_.first_page = page_number;
|
| #endif
|
| }
|
| - DebugDump(*page.get());
|
| +
|
| + if (!g_debug_dump_info.Get().empty()) {
|
| + immutable_.blocking_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DebugDumpPageTask, name(), page));
|
| + }
|
| }
|
|
|
| -bool PrintedDocument::GetPage(int page_number,
|
| - scoped_refptr<PrintedPage>* page) {
|
| - base::AutoLock lock(lock_);
|
| - PrintedPages::const_iterator itr = mutable_.pages_.find(page_number);
|
| - if (itr != mutable_.pages_.end()) {
|
| - if (itr->second.get()) {
|
| - *page = itr->second;
|
| - return true;
|
| - }
|
| +scoped_refptr<PrintedPage> PrintedDocument::GetPage(int page_number) {
|
| + scoped_refptr<PrintedPage> page;
|
| + {
|
| + base::AutoLock lock(lock_);
|
| + PrintedPages::const_iterator itr = mutable_.pages_.find(page_number);
|
| + if (itr != mutable_.pages_.end())
|
| + page = itr->second;
|
| }
|
| - return false;
|
| + return page;
|
| }
|
|
|
| bool PrintedDocument::IsComplete() const {
|
| @@ -173,35 +220,40 @@ int PrintedDocument::expected_page_count() const {
|
| return mutable_.expected_page_count_;
|
| }
|
|
|
| -void PrintedDocument::DebugDump(const PrintedPage& page) {
|
| - if (!g_debug_dump_info.Get().enabled)
|
| - return;
|
| +void PrintedDocument::set_debug_dump_path(
|
| + const base::FilePath& debug_dump_path) {
|
| + g_debug_dump_info.Get() = debug_dump_path;
|
| +}
|
|
|
| +base::FilePath PrintedDocument::CreateDebugDumpPath(
|
| + const base::string16& document_name,
|
| + const base::FilePath::StringType& extension) {
|
| + if (g_debug_dump_info.Get().empty())
|
| + return base::FilePath();
|
| + // Create a filename.
|
| base::string16 filename;
|
| - filename += name();
|
| + base::Time now(base::Time::Now());
|
| + filename = base::TimeFormatShortDateAndTime(now);
|
| filename += base::ASCIIToUTF16("_");
|
| - filename += base::ASCIIToUTF16(
|
| - base::StringPrintf("%02d", page.page_number()));
|
| + filename += document_name;
|
| + base::FilePath::StringType system_filename;
|
| #if defined(OS_WIN)
|
| - filename += base::ASCIIToUTF16("_.emf");
|
| - page.metafile()->SaveTo(
|
| - g_debug_dump_info.Get().debug_dump_path.Append(filename));
|
| -#else // OS_WIN
|
| - filename += base::ASCIIToUTF16("_.pdf");
|
| - page.metafile()->SaveTo(
|
| - g_debug_dump_info.Get().debug_dump_path.Append(
|
| - base::UTF16ToUTF8(filename)));
|
| + system_filename = filename;
|
| +#else // OS_WIN
|
| + system_filename = base::UTF16ToUTF8(filename);
|
| #endif // OS_WIN
|
| + file_util::ReplaceIllegalCharactersInPath(&system_filename, '_');
|
| + return g_debug_dump_info.Get().Append(system_filename).AddExtension(
|
| + extension);
|
| }
|
|
|
| -void PrintedDocument::set_debug_dump_path(
|
| - const base::FilePath& debug_dump_path) {
|
| - g_debug_dump_info.Get().enabled = !debug_dump_path.empty();
|
| - g_debug_dump_info.Get().debug_dump_path = debug_dump_path;
|
| -}
|
| -
|
| -const base::FilePath& PrintedDocument::debug_dump_path() {
|
| - return g_debug_dump_info.Get().debug_dump_path;
|
| +void PrintedDocument::DebugDumpData(
|
| + const base::RefCountedMemory* data,
|
| + const base::FilePath::StringType& extension) {
|
| + if (g_debug_dump_info.Get().empty())
|
| + return;
|
| + immutable_.blocking_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DebugDumpDataTask, name(), extension, data));
|
| }
|
|
|
| PrintedDocument::Mutable::Mutable(PrintedPagesSource* source)
|
| @@ -218,11 +270,12 @@ PrintedDocument::Mutable::~Mutable() {
|
|
|
| PrintedDocument::Immutable::Immutable(const PrintSettings& settings,
|
| PrintedPagesSource* source,
|
| - int cookie)
|
| + int cookie,
|
| + base::TaskRunner* blocking_runner)
|
| : settings_(settings),
|
| - source_message_loop_(base::MessageLoop::current()),
|
| name_(source->RenderSourceName()),
|
| - cookie_(cookie) {
|
| + cookie_(cookie),
|
| + blocking_runner_(blocking_runner) {
|
| }
|
|
|
| PrintedDocument::Immutable::~Immutable() {
|
|
|