blob: 4d0e41ec5d0f17d5bd91ec48f6686ff26df7af90 [file] [log] [blame]
[email protected]71f40a72012-05-16 07:26:591// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]8ff1d422009-07-07 21:31:395#ifndef PRINTING_PRINTED_DOCUMENT_H_
6#define PRINTING_PRINTED_DOCUMENT_H_
initial.commit09911bf2008-07-26 23:55:297
8#include <map>
9
[email protected]c95198b2014-06-12 16:56:5510#include "base/files/file_path.h"
[email protected]3b63f8f42011-03-28 01:54:1511#include "base/memory/ref_counted.h"
[email protected]896d161f2013-06-11 22:52:2412#include "base/strings/string16.h"
[email protected]20305ec2011-01-21 04:55:5213#include "base/synchronization/lock.h"
[email protected]8ff1d422009-07-07 21:31:3914#include "printing/print_settings.h"
[email protected]08397d52011-02-05 01:53:3815#include "ui/gfx/native_widget_types.h"
initial.commit09911bf2008-07-26 23:55:2916
[email protected]a3ef4832013-02-02 05:12:3317namespace base {
[email protected]c95198b2014-06-12 16:56:5518class RefCountedMemory;
19class TaskRunner;
[email protected]a3ef4832013-02-02 05:12:3320}
21
initial.commit09911bf2008-07-26 23:55:2922namespace printing {
23
[email protected]7d7489902011-04-11 21:54:0624class Metafile;
initial.commit09911bf2008-07-26 23:55:2925class PrintedPage;
26class PrintedPagesSource;
[email protected]5cc4c422011-02-19 00:09:2227class PrintingContext;
initial.commit09911bf2008-07-26 23:55:2928
[email protected]4ecd07452009-03-31 14:34:4329// A collection of rendered pages. The settings are immutable. If the print
initial.commit09911bf2008-07-26 23:55:2930// settings are changed, a new PrintedDocument must be created.
31// Warning: May be accessed from many threads at the same time. Only one thread
32// will have write access. Sensible functions are protected by a lock.
33// Warning: Once a page is loaded, it cannot be replaced. Pages may be discarded
34// under low memory conditions.
[email protected]69f5b1e62011-09-01 06:34:0435class PRINTING_EXPORT PrintedDocument
36 : public base::RefCountedThreadSafe<PrintedDocument> {
initial.commit09911bf2008-07-26 23:55:2937 public:
38 // The cookie shall be unique and has a specific relationship with its
39 // originating source and settings.
40 PrintedDocument(const PrintSettings& settings,
41 PrintedPagesSource* source,
[email protected]c95198b2014-06-12 16:56:5542 int cookie,
43 base::TaskRunner* blocking_runner);
initial.commit09911bf2008-07-26 23:55:2944
[email protected]0e0fca32009-07-06 15:25:5045 // Sets a page's data. 0-based. Takes metafile ownership.
initial.commit09911bf2008-07-26 23:55:2946 // Note: locks for a short amount of time.
[email protected]9de1347a2014-06-12 09:49:0847 void SetPage(int page_number,
48 Metafile* metafile,
49#if defined(OS_WIN)
50 double shrink,
51#endif // OS_WIN
52 const gfx::Size& paper_size,
53 const gfx::Rect& page_rect);
initial.commit09911bf2008-07-26 23:55:2954
55 // Retrieves a page. If the page is not available right now, it
[email protected]c95198b2014-06-12 16:56:5556 // requests to have this page be rendered and returns NULL.
initial.commit09911bf2008-07-26 23:55:2957 // Note: locks for a short amount of time.
[email protected]c95198b2014-06-12 16:56:5558 scoped_refptr<PrintedPage> GetPage(int page_number);
initial.commit09911bf2008-07-26 23:55:2959
60 // Draws the page in the context.
61 // Note: locks for a short amount of time in debug only.
[email protected]2f47fc452011-11-21 03:12:1762#if defined(OS_WIN) || defined(OS_MACOSX) && !defined(USE_AURA)
[email protected]b75dca82009-10-13 18:46:2163 void RenderPrintedPage(const PrintedPage& page,
64 gfx::NativeDrawingContext context) const;
[email protected]5cc4c422011-02-19 00:09:2265#elif defined(OS_POSIX)
66 void RenderPrintedPage(const PrintedPage& page,
67 PrintingContext* context) const;
68#endif
initial.commit09911bf2008-07-26 23:55:2969
initial.commit09911bf2008-07-26 23:55:2970 // Returns true if all the necessary pages for the settings are already
71 // rendered.
72 // Note: locks while parsing the whole tree.
73 bool IsComplete() const;
74
initial.commit09911bf2008-07-26 23:55:2975 // Disconnects the PrintedPage source (PrintedPagesSource). It is done when
76 // the source is being destroyed.
77 void DisconnectSource();
78
79 // Retrieves the current memory usage of the renderer pages.
80 // Note: locks for a short amount of time.
[email protected]b5ab3982010-02-16 23:58:2781 uint32 MemoryUsage() const;
initial.commit09911bf2008-07-26 23:55:2982
83 // Sets the number of pages in the document to be rendered. Can only be set
84 // once.
85 // Note: locks for a short amount of time.
86 void set_page_count(int max_page);
87
88 // Number of pages in the document. Used for headers/footers.
89 // Note: locks for a short amount of time.
90 int page_count() const;
91
92 // Returns the number of expected pages to be rendered. It is a non-linear
93 // series if settings().ranges is not empty. It is the same value as
94 // document_page_count() otherwise.
95 // Note: locks for a short amount of time.
96 int expected_page_count() const;
97
[email protected]4ecd07452009-03-31 14:34:4398 // Getters. All these items are immutable hence thread-safe.
initial.commit09911bf2008-07-26 23:55:2999 const PrintSettings& settings() const { return immutable_.settings_; }
[email protected]b5fa4ee2013-10-01 07:19:07100 const base::string16& name() const { return immutable_.name_; }
[email protected]225c8f52010-02-05 22:23:20101 int cookie() const { return immutable_.cookie_; }
initial.commit09911bf2008-07-26 23:55:29102
[email protected]e1504d82009-07-03 15:27:15103 // Sets a path where to dump printing output files for debugging. If never set
104 // no files are generated.
[email protected]a3ef4832013-02-02 05:12:33105 static void set_debug_dump_path(const base::FilePath& debug_dump_path);
[email protected]e1504d82009-07-03 15:27:15106
[email protected]c95198b2014-06-12 16:56:55107 // Creates debug file name from given |document_name| and |extension|.
108 // |extension| should include '.', example ".pdf"
109 // Returns empty |base::FilePath| if debug dumps is not enabled.
110 static base::FilePath CreateDebugDumpPath(
111 const base::string16& document_name,
112 const base::FilePath::StringType& extension);
113
114 // Dump data on blocking task runner if debug dumps enabled.
115 void DebugDumpData(const base::RefCountedMemory* data,
116 const base::FilePath::StringType& extension);
[email protected]e1504d82009-07-03 15:27:15117
initial.commit09911bf2008-07-26 23:55:29118 private:
[email protected]877d55d2009-11-05 21:53:08119 friend class base::RefCountedThreadSafe<PrintedDocument>;
120
[email protected]20f0487a2010-09-30 20:06:30121 virtual ~PrintedDocument();
[email protected]877d55d2009-11-05 21:53:08122
[email protected]0e0fca32009-07-06 15:25:50123 // Array of data for each print previewed page.
[email protected]8ff1d422009-07-07 21:31:39124 typedef std::map<int, scoped_refptr<PrintedPage> > PrintedPages;
initial.commit09911bf2008-07-26 23:55:29125
126 // Contains all the mutable stuff. All this stuff MUST be accessed with the
127 // lock held.
128 struct Mutable {
[email protected]5930cb62009-12-08 02:04:22129 explicit Mutable(PrintedPagesSource* source);
[email protected]20f0487a2010-09-30 20:06:30130 ~Mutable();
initial.commit09911bf2008-07-26 23:55:29131
[email protected]57c6a652009-05-04 07:58:34132 // Source that generates the PrintedPage's (i.e. a TabContents). It will be
initial.commit09911bf2008-07-26 23:55:29133 // set back to NULL if the source is deleted before this object.
134 PrintedPagesSource* source_;
135
136 // Contains the pages' representation. This is a collection of PrintedPage.
137 // Warning: Lock must be held when accessing this member.
138 PrintedPages pages_;
139
140 // Number of expected pages to be rendered.
141 // Warning: Lock must be held when accessing this member.
142 int expected_page_count_;
143
144 // The total number of pages in the document.
145 int page_count_;
146
[email protected]da4eefd2011-03-03 23:40:27147#if defined(OS_POSIX) && !defined(OS_MACOSX)
148 // Page number of the first page.
149 int first_page;
150#endif
initial.commit09911bf2008-07-26 23:55:29151 };
152
153 // Contains all the immutable stuff. All this stuff can be accessed without
154 // any lock held. This is because it can't be changed after the object's
155 // construction.
156 struct Immutable {
[email protected]c95198b2014-06-12 16:56:55157 Immutable(const PrintSettings& settings,
158 PrintedPagesSource* source,
159 int cookie,
160 base::TaskRunner* blocking_runner);
[email protected]20f0487a2010-09-30 20:06:30161 ~Immutable();
initial.commit09911bf2008-07-26 23:55:29162
[email protected]4ecd07452009-03-31 14:34:43163 // Print settings used to generate this document. Immutable.
initial.commit09911bf2008-07-26 23:55:29164 PrintSettings settings_;
165
[email protected]4ecd07452009-03-31 14:34:43166 // Document name. Immutable.
[email protected]b5fa4ee2013-10-01 07:19:07167 base::string16 name_;
initial.commit09911bf2008-07-26 23:55:29168
initial.commit09911bf2008-07-26 23:55:29169 // Cookie to uniquely identify this document. It is used to make sure that a
170 // PrintedPage is correctly belonging to the PrintedDocument. Since
171 // PrintedPage generation is completely asynchronous, it could be easy to
172 // mess up and send the page to the wrong document. It can be viewed as a
173 // simpler hash of PrintSettings since a new document is made each time the
174 // print settings change.
175 int cookie_;
initial.commit09911bf2008-07-26 23:55:29176
[email protected]c95198b2014-06-12 16:56:55177 // Native thread for blocking operations, like file access.
178 scoped_refptr<base::TaskRunner> blocking_runner_;
179 };
[email protected]e1504d82009-07-03 15:27:15180
initial.commit09911bf2008-07-26 23:55:29181 // All writable data member access must be guarded by this lock. Needs to be
182 // mutable since it can be acquired from const member functions.
[email protected]20305ec2011-01-21 04:55:52183 mutable base::Lock lock_;
initial.commit09911bf2008-07-26 23:55:29184
185 // All the mutable members.
186 Mutable mutable_;
187
188 // All the immutable members.
189 const Immutable immutable_;
190
[email protected]5930cb62009-12-08 02:04:22191 DISALLOW_COPY_AND_ASSIGN(PrintedDocument);
initial.commit09911bf2008-07-26 23:55:29192};
193
194} // namespace printing
195
[email protected]8ff1d422009-07-07 21:31:39196#endif // PRINTING_PRINTED_DOCUMENT_H_