15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printed_document.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/file_util_icu.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/time_formatting.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/json/json_writer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
209ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/time/time.h"
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/values.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_number.h"
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/print_settings_conversion.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printed_page.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/printed_pages_source.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_device.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_elider.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace printing {
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::LazyInstance<base::FilePath> g_debug_dump_info =
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DebugDumpPageTask(const base::string16& doc_name,
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const PrintedPage* page) {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (g_debug_dump_info.Get().empty())
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::string16 filename = doc_name;
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  filename +=
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::ASCIIToUTF16(base::StringPrintf("_%04d", page->page_number()));
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath file_path =
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrintedDocument::CreateDebugDumpPath(filename, FILE_PATH_LITERAL(".emf"));
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else   // OS_WIN
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      PrintedDocument::CreateDebugDumpPath(filename, FILE_PATH_LITERAL(".pdf"));
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // OS_WIN
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::File file(file_path,
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  page->metafile()->SaveTo(&file);
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DebugDumpDataTask(const base::string16& doc_name,
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const base::FilePath::StringType& extension,
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const base::RefCountedMemory* data) {
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath path =
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PrintedDocument::CreateDebugDumpPath(doc_name, extension);
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (path.empty())
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::WriteFile(path,
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  reinterpret_cast<const char*>(data->front()),
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                  base::checked_cast<int>(data->size()));
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DebugDumpSettings(const base::string16& doc_name,
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const PrintSettings& settings,
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       base::TaskRunner* blocking_runner) {
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue job_settings;
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PrintSettingsToJobSettingsDebug(settings, &job_settings);
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string settings_str;
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::JSONWriter::WriteWithOptions(
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &job_settings, base::JSONWriter::OPTIONS_PRETTY_PRINT, &settings_str);
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> data =
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::RefCountedString::TakeString(&settings_str);
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  blocking_runner->PostTask(
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      FROM_HERE,
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          &DebugDumpDataTask, doc_name, FILE_PATH_LITERAL(".json"), data));
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::PrintedDocument(const PrintSettings& settings,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 PrintedPagesSource* source,
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 int cookie,
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 base::TaskRunner* blocking_runner)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : mutable_(source), immutable_(settings, source, cookie, blocking_runner) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records the expected page count if a range is setup.
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!settings.ranges().empty()) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If there is a range, set the number of page
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (unsigned i = 0; i < settings.ranges().size(); ++i) {
1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const PageRange& range = settings.ranges()[i];
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mutable_.expected_page_count_ += range.to - range.from + 1;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!g_debug_dump_info.Get().empty())
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DebugDumpSettings(name(), settings, blocking_runner);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::~PrintedDocument() {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintedDocument::SetPage(int page_number,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              scoped_ptr<MetafilePlayer> metafile,
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              double shrink,
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // OS_WIN
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Size& paper_size,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& page_rect) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notice the page_number + 1, the reason is that this is the value that will
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be shown. Users dislike 0-based counting.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrintedPage> page(
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PrintedPage(page_number + 1, metafile.Pass(), paper_size, page_rect));
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_WIN)
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  page->set_shrink_factor(shrink);
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif  // OS_WIN
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::AutoLock lock(lock_);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutable_.pages_[page_number] = page;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (page_number < mutable_.first_page)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mutable_.first_page = page_number;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!g_debug_dump_info.Get().empty()) {
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    immutable_.blocking_runner_->PostTask(
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        FROM_HERE, base::Bind(&DebugDumpPageTask, name(), page));
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)scoped_refptr<PrintedPage> PrintedDocument::GetPage(int page_number) {
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<PrintedPage> page;
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  {
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::AutoLock lock(lock_);
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PrintedPages::const_iterator itr = mutable_.pages_.find(page_number);
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (itr != mutable_.pages_.end())
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page = itr->second;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return page;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PrintedDocument::IsComplete() const {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!mutable_.page_count_)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PageNumber page(immutable_.settings_, mutable_.page_count_);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page == PageNumber::npos())
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; page != PageNumber::npos(); ++page) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool metafile_must_be_valid = true;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool metafile_must_be_valid = (page.ToInt() == mutable_.first_page);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrintedPages::const_iterator itr = mutable_.pages_.find(page.ToInt());
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (itr == mutable_.pages_.end() || !itr->second.get())
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (metafile_must_be_valid && !itr->second->metafile())
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintedDocument::DisconnectSource() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable_.source_ = NULL;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintedDocument::set_page_count(int max_page) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(0, mutable_.page_count_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mutable_.page_count_ = max_page;
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (immutable_.settings_.ranges().empty()) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mutable_.expected_page_count_ = max_page;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If there is a range, don't bother since expected_page_count_ is already
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // initialized.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_NE(mutable_.expected_page_count_, 0);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PrintedDocument::page_count() const {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return mutable_.page_count_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PrintedDocument::expected_page_count() const {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::AutoLock lock(lock_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return mutable_.expected_page_count_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintedDocument::set_debug_dump_path(
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::FilePath& debug_dump_path) {
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  g_debug_dump_info.Get() = debug_dump_path;
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)base::FilePath PrintedDocument::CreateDebugDumpPath(
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::string16& document_name,
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::FilePath::StringType& extension) {
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (g_debug_dump_info.Get().empty())
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return base::FilePath();
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Create a filename.
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::string16 filename;
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::Time now(base::Time::Now());
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  filename = base::TimeFormatShortDateAndTime(now);
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  filename += base::ASCIIToUTF16("_");
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  filename += document_name;
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::FilePath::StringType system_filename;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  system_filename = filename;
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else   // OS_WIN
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  system_filename = base::UTF16ToUTF8(filename);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_WIN
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::i18n::ReplaceIllegalCharactersInPath(&system_filename, '_');
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return g_debug_dump_info.Get().Append(system_filename).AddExtension(
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      extension);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintedDocument::DebugDumpData(
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::RefCountedMemory* data,
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::FilePath::StringType& extension) {
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (g_debug_dump_info.Get().empty())
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  immutable_.blocking_runner_->PostTask(
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      FROM_HERE, base::Bind(&DebugDumpDataTask, name(), extension, data));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::Mutable::Mutable(PrintedPagesSource* source)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : source_(source),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_page_count_(0),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_count_(0) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  first_page = INT_MAX;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::Mutable::~Mutable() {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::Immutable::Immutable(const PrintSettings& settings,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      PrintedPagesSource* source,
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      int cookie,
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                      base::TaskRunner* blocking_runner)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : settings_(settings),
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name_(source->RenderSourceName()),
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      cookie_(cookie),
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      blocking_runner_(blocking_runner) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintedDocument::Immutable::~Immutable() {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_ANDROID)
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This function is not used on aura linux/chromeos or android.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintedDocument::RenderPrintedPage(const PrintedPage& page,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PrintingContext* context) const {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
274