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 "chrome/browser/printing/print_job_manager.h" | 5 #include "chrome/browser/printing/print_job_manager.h" |
6 | 6 |
7 #include "chrome/browser/printing/print_job.h" | 7 #include "chrome/browser/printing/print_job.h" |
8 #include "chrome/browser/printing/printer_query.h" | 8 #include "chrome/browser/printing/printer_query.h" |
9 #include "chrome/common/chrome_notification_types.h" | 9 #include "chrome/common/chrome_notification_types.h" |
10 #include "content/public/browser/notification_service.h" | 10 #include "content/public/browser/notification_service.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 base::AutoLock lock(lock_); | 22 base::AutoLock lock(lock_); |
23 queued_queries_.clear(); | 23 queued_queries_.clear(); |
24 } | 24 } |
25 | 25 |
26 void PrintJobManager::OnQuit() { | 26 void PrintJobManager::OnQuit() { |
27 StopJobs(true); | 27 StopJobs(true); |
28 registrar_.RemoveAll(); | 28 registrar_.RemoveAll(); |
29 } | 29 } |
30 | 30 |
31 void PrintJobManager::StopJobs(bool wait_for_finish) { | 31 void PrintJobManager::StopJobs(bool wait_for_finish) { |
32 if (current_jobs_.empty()) | 32 // Copy the array since it can be modified in transit. |
33 return; | 33 PrintJobs to_stop; |
34 { | 34 to_stop.swap(current_jobs_); |
35 // Copy the array since it can be modified in transit. | 35 |
36 PrintJobs current_jobs(current_jobs_); | 36 for (PrintJobs::const_iterator job = to_stop.begin(); job != to_stop.end(); |
37 // Wait for each job to finish. | 37 ++job) { |
38 for (size_t i = 0; i < current_jobs.size(); ++i) { | 38 // Wait for two minutes for the print job to be spooled. |
39 PrintJob* job = current_jobs[i]; | 39 if (wait_for_finish) |
40 if (!job) | 40 (*job)->FlushJob(base::TimeDelta::FromMinutes(2)); |
41 continue; | 41 (*job)->Stop(); |
42 // Wait for two minutes for the print job to be spooled. | |
43 if (wait_for_finish) | |
44 job->FlushJob(base::TimeDelta::FromMinutes(2)); | |
45 job->Stop(); | |
46 } | |
47 } | 42 } |
48 current_jobs_.clear(); | |
49 } | 43 } |
50 | 44 |
51 void PrintJobManager::SetPrintDestination( | 45 void PrintJobManager::SetPrintDestination( |
52 PrintDestinationInterface* destination) { | 46 PrintDestinationInterface* destination) { |
53 destination_ = destination; | 47 destination_ = destination; |
54 } | 48 } |
55 | 49 |
56 void PrintJobManager::QueuePrinterQuery(PrinterQuery* job) { | 50 void PrintJobManager::QueuePrinterQuery(PrinterQuery* job) { |
57 base::AutoLock lock(lock_); | 51 base::AutoLock lock(lock_); |
58 DCHECK(job); | 52 DCHECK(job); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 break; | 85 break; |
92 } | 86 } |
93 } | 87 } |
94 } | 88 } |
95 | 89 |
96 void PrintJobManager::OnPrintJobEvent( | 90 void PrintJobManager::OnPrintJobEvent( |
97 PrintJob* print_job, | 91 PrintJob* print_job, |
98 const JobEventDetails& event_details) { | 92 const JobEventDetails& event_details) { |
99 switch (event_details.type()) { | 93 switch (event_details.type()) { |
100 case JobEventDetails::NEW_DOC: { | 94 case JobEventDetails::NEW_DOC: { |
101 DCHECK(current_jobs_.end() == std::find(current_jobs_.begin(), | 95 DCHECK(current_jobs_.end() == current_jobs_.find(print_job)); |
102 current_jobs_.end(), | |
103 print_job)); | |
104 // Causes a AddRef(). | 96 // Causes a AddRef(). |
105 current_jobs_.push_back(make_scoped_refptr(print_job)); | 97 current_jobs_.insert(print_job); |
106 break; | 98 break; |
107 } | 99 } |
108 case JobEventDetails::JOB_DONE: { | 100 case JobEventDetails::JOB_DONE: { |
109 PrintJobs::iterator itr = std::find(current_jobs_.begin(), | 101 DCHECK(current_jobs_.end() != current_jobs_.find(print_job)); |
110 current_jobs_.end(), | 102 current_jobs_.erase(print_job); |
111 print_job); | |
112 DCHECK(current_jobs_.end() != itr); | |
113 current_jobs_.erase(itr); | |
114 DCHECK(current_jobs_.end() == std::find(current_jobs_.begin(), | |
115 current_jobs_.end(), | |
116 print_job)); | |
117 destination_ = NULL; | |
118 break; | 103 break; |
119 } | 104 } |
120 case JobEventDetails::FAILED: { | 105 case JobEventDetails::FAILED: { |
121 PrintJobs::iterator itr = std::find(current_jobs_.begin(), | 106 current_jobs_.erase(print_job); |
122 current_jobs_.end(), | |
123 print_job); | |
124 // A failed job may have never started. | |
125 if (current_jobs_.end() != itr) { | |
126 current_jobs_.erase(itr); | |
127 DCHECK(current_jobs_.end() == | |
128 std::find(current_jobs_.begin(), | |
129 current_jobs_.end(), | |
130 print_job)); | |
131 } | |
132 break; | 107 break; |
133 } | 108 } |
134 case JobEventDetails::USER_INIT_DONE: | 109 case JobEventDetails::USER_INIT_DONE: |
135 case JobEventDetails::USER_INIT_CANCELED: | 110 case JobEventDetails::USER_INIT_CANCELED: |
136 case JobEventDetails::DEFAULT_INIT_DONE: | 111 case JobEventDetails::DEFAULT_INIT_DONE: |
137 case JobEventDetails::NEW_PAGE: | 112 case JobEventDetails::NEW_PAGE: |
138 case JobEventDetails::PAGE_DONE: | 113 case JobEventDetails::PAGE_DONE: |
139 case JobEventDetails::DOC_DONE: | 114 case JobEventDetails::DOC_DONE: |
140 case JobEventDetails::ALL_PAGES_REQUESTED: { | 115 case JobEventDetails::ALL_PAGES_REQUESTED: { |
141 // Don't care. | 116 // Don't care. |
142 break; | 117 break; |
143 } | 118 } |
144 default: { | 119 default: { |
145 NOTREACHED(); | 120 NOTREACHED(); |
146 break; | 121 break; |
147 } | 122 } |
148 } | 123 } |
149 } | 124 } |
150 | 125 |
151 } // namespace printing | 126 } // namespace printing |
OLD | NEW |