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

Unified Diff: chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc

Issue 2963173003: Remove the cups_print_job_manager_impl header (Closed)
Patch Set: rebase Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/printing/cups_print_job_manager_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
index 15df1907e77a75084a418b050532548f1f6f47ba..f6bcfc02904a761bf8f986027abe6636c2a6b7cb 100644
--- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
+++ b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/chromeos/printing/cups_print_job_manager_impl.h"
+#include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
#include <cups/cups.h>
#include <algorithm>
@@ -208,304 +208,353 @@ bool UpdatePrintJob(const ::printing::PrinterStatus& printer_status,
namespace chromeos {
-QueryResult::QueryResult() = default;
+struct QueryResult {
+ QueryResult() = default;
+ QueryResult(const QueryResult& other) = default;
+ ~QueryResult() = default;
-QueryResult::QueryResult(const QueryResult& other) = default;
-
-QueryResult::~QueryResult() = default;
+ bool success;
+ std::vector<::printing::QueueStatus> queues;
+};
-CupsWrapper::CupsWrapper()
- : cups_connection_(GURL(), HTTP_ENCRYPT_NEVER, false) {
- DETACH_FROM_SEQUENCE(sequence_checker_);
-}
+// A wrapper around the CUPS connection to ensure that it's always accessed on
+// the same sequence.
+class CupsWrapper {
+ public:
+ CupsWrapper() : cups_connection_(GURL(), HTTP_ENCRYPT_NEVER, false) {
+ DETACH_FROM_SEQUENCE(sequence_checker_);
+ }
-CupsWrapper::~CupsWrapper() = default;
+ ~CupsWrapper() = default;
-void CupsWrapper::QueryCups(const std::vector<std::string>& printer_ids,
- QueryResult* result) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- base::ThreadRestrictions::AssertIOAllowed();
+ // Query CUPS for the current jobs for the given |printer_ids|. Writes result
+ // to |result|.
+ void QueryCups(const std::vector<std::string>& printer_ids,
+ QueryResult* result) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ base::ThreadRestrictions::AssertIOAllowed();
- result->success = cups_connection_.GetJobs(printer_ids, &result->queues);
-}
+ result->success = cups_connection_.GetJobs(printer_ids, &result->queues);
+ }
-void CupsWrapper::CancelJobImpl(const std::string& printer_id,
- const int job_id) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- base::ThreadRestrictions::AssertIOAllowed();
+ // Cancel the print job on the blocking thread.
+ void CancelJobImpl(const std::string& printer_id, const int job_id) {
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+ base::ThreadRestrictions::AssertIOAllowed();
- std::unique_ptr<::printing::CupsPrinter> printer =
- cups_connection_.GetPrinter(printer_id);
- if (!printer) {
- LOG(WARNING) << "Printer not found: " << printer_id;
- return;
- }
+ std::unique_ptr<::printing::CupsPrinter> printer =
+ cups_connection_.GetPrinter(printer_id);
+ if (!printer) {
+ LOG(WARNING) << "Printer not found: " << printer_id;
+ return;
+ }
- if (!printer->CancelJob(job_id)) {
- // This is not expected to fail but log it if it does.
- LOG(WARNING) << "Cancelling job failed. Job may be stuck in queue.";
+ if (!printer->CancelJob(job_id)) {
+ // This is not expected to fail but log it if it does.
+ LOG(WARNING) << "Cancelling job failed. Job may be stuck in queue.";
+ }
}
-}
-CupsPrintJobManagerImpl::CupsPrintJobManagerImpl(Profile* profile)
- : CupsPrintJobManager(profile),
- query_runner_(base::CreateSequencedTaskRunnerWithTraits(
- base::TaskTraits(base::TaskPriority::BACKGROUND,
- base::MayBlock(),
- base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN))),
- cups_wrapper_(new CupsWrapper(),
- base::OnTaskRunnerDeleter(query_runner_)),
- weak_ptr_factory_(this) {
- registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
- content::NotificationService::AllSources());
-}
-
-CupsPrintJobManagerImpl::~CupsPrintJobManagerImpl() {}
+ private:
+ ::printing::CupsConnection cups_connection_;
+ SEQUENCE_CHECKER(sequence_checker_);
-// Must be run from the UI thread.
-void CupsPrintJobManagerImpl::CancelPrintJob(CupsPrintJob* job) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ DISALLOW_COPY_AND_ASSIGN(CupsWrapper);
+};
- // Copy job_id and printer_id. |job| is about to be freed.
- const int job_id = job->job_id();
- const std::string printer_id = job->printer().id();
+class CupsPrintJobManagerImpl : public CupsPrintJobManager,
+ public content::NotificationObserver {
+ public:
+ explicit CupsPrintJobManagerImpl(Profile* profile)
+ : CupsPrintJobManager(profile),
+ query_runner_(base::CreateSequencedTaskRunnerWithTraits(
+ base::TaskTraits(base::TaskPriority::BACKGROUND,
+ base::MayBlock(),
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN))),
+ cups_wrapper_(new CupsWrapper(),
+ base::OnTaskRunnerDeleter(query_runner_)),
+ weak_ptr_factory_(this) {
+ registrar_.Add(this, chrome::NOTIFICATION_PRINT_JOB_EVENT,
+ content::NotificationService::AllSources());
+ }
- // Stop montioring jobs after we cancel them. The user no longer cares.
- jobs_.erase(job->GetUniqueId());
+ ~CupsPrintJobManagerImpl() override = default;
- query_runner_->PostTask(
- FROM_HERE,
- base::Bind(&CupsWrapper::CancelJobImpl,
- base::Unretained(cups_wrapper_.get()), printer_id, job_id));
-}
+ // CupsPrintJobManager overrides:
+ // Must be run from the UI thread.
+ void CancelPrintJob(CupsPrintJob* job) override {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-bool CupsPrintJobManagerImpl::SuspendPrintJob(CupsPrintJob* job) {
- NOTREACHED() << "Pause printer is not implemented";
- return false;
-}
+ // Copy job_id and printer_id. |job| is about to be freed.
+ const int job_id = job->job_id();
+ const std::string printer_id = job->printer().id();
-bool CupsPrintJobManagerImpl::ResumePrintJob(CupsPrintJob* job) {
- NOTREACHED() << "Resume printer is not implemented";
- return false;
-}
+ // Stop montioring jobs after we cancel them. The user no longer cares.
+ jobs_.erase(job->GetUniqueId());
-void CupsPrintJobManagerImpl::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- DCHECK_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type);
-
- content::Details<::printing::JobEventDetails> job_details(details);
-
- // DOC_DONE occurs after the print job has been successfully sent to the
- // spooler which is when we begin tracking the print queue.
- if (job_details->type() == ::printing::JobEventDetails::DOC_DONE) {
- const ::printing::PrintedDocument* document = job_details->document();
- DCHECK(document);
- CreatePrintJob(base::UTF16ToUTF8(document->settings().device_name()),
- base::UTF16ToUTF8(document->settings().title()),
- job_details->job_id(), document->page_count());
+ query_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CupsWrapper::CancelJobImpl,
+ base::Unretained(cups_wrapper_.get()), printer_id, job_id));
}
-}
-bool CupsPrintJobManagerImpl::CreatePrintJob(const std::string& printer_name,
- const std::string& title,
- int job_id,
- int total_page_number) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
- auto printer =
- PrintersManagerFactory::GetForBrowserContext(profile_)->GetPrinter(
- printer_name);
- if (!printer) {
- LOG(WARNING) << "Printer was removed while job was in progress. It cannot "
- "be tracked";
+ bool SuspendPrintJob(CupsPrintJob* job) override {
+ NOTREACHED() << "Pause printer is not implemented";
return false;
}
- // Records the number of jobs we're currently tracking when a new job is
- // started. This is equivalent to print queue size in the current
- // implementation.
- UMA_HISTOGRAM_EXACT_LINEAR("Printing.CUPS.PrintJobsQueued", jobs_.size(), 20);
-
- // Create a new print job.
- auto cpj = base::MakeUnique<CupsPrintJob>(*printer, job_id, title,
- total_page_number);
- std::string key = cpj->GetUniqueId();
- jobs_[key] = std::move(cpj);
+ bool ResumePrintJob(CupsPrintJob* job) override {
+ NOTREACHED() << "Resume printer is not implemented";
+ return false;
+ }
- CupsPrintJob* job = jobs_[key].get();
- NotifyJobCreated(job);
+ // NotificationObserver overrides:
+ void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) override {
+ DCHECK_EQ(chrome::NOTIFICATION_PRINT_JOB_EVENT, type);
+
+ content::Details<::printing::JobEventDetails> job_details(details);
+
+ // DOC_DONE occurs after the print job has been successfully sent to the
+ // spooler which is when we begin tracking the print queue.
+ if (job_details->type() == ::printing::JobEventDetails::DOC_DONE) {
+ const ::printing::PrintedDocument* document = job_details->document();
+ DCHECK(document);
+ CreatePrintJob(base::UTF16ToUTF8(document->settings().device_name()),
+ base::UTF16ToUTF8(document->settings().title()),
+ job_details->job_id(), document->page_count());
+ }
+ }
- // Always start jobs in the waiting state.
- job->set_state(CupsPrintJob::State::STATE_WAITING);
- NotifyJobUpdated(job);
+ private:
+ // Begin monitoring a print job for a given |printer_name| with the given
+ // |title| with the pages |total_page_number|.
+ bool CreatePrintJob(const std::string& printer_name,
+ const std::string& title,
+ int job_id,
+ int total_page_number) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ auto printer =
+ PrintersManagerFactory::GetForBrowserContext(profile_)->GetPrinter(
+ printer_name);
+ if (!printer) {
+ LOG(WARNING)
+ << "Printer was removed while job was in progress. It cannot "
+ "be tracked";
+ return false;
+ }
- ScheduleQuery(base::TimeDelta());
+ // Records the number of jobs we're currently tracking when a new job is
+ // started. This is equivalent to print queue size in the current
+ // implementation.
+ UMA_HISTOGRAM_EXACT_LINEAR("Printing.CUPS.PrintJobsQueued", jobs_.size(),
+ 20);
- return true;
-}
+ // Create a new print job.
+ auto cpj = base::MakeUnique<CupsPrintJob>(*printer, job_id, title,
+ total_page_number);
+ std::string key = cpj->GetUniqueId();
+ jobs_[key] = std::move(cpj);
-void CupsPrintJobManagerImpl::ScheduleQuery() {
- ScheduleQuery(base::TimeDelta::FromMilliseconds(kPollRate));
-}
+ CupsPrintJob* job = jobs_[key].get();
+ NotifyJobCreated(job);
-void CupsPrintJobManagerImpl::ScheduleQuery(const base::TimeDelta& delay) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // Always start jobs in the waiting state.
+ job->set_state(CupsPrintJob::State::STATE_WAITING);
+ NotifyJobUpdated(job);
- if (!in_query_) {
- in_query_ = true;
+ ScheduleQuery(base::TimeDelta());
- content::BrowserThread::PostDelayedTask(
- content::BrowserThread::UI, FROM_HERE,
- base::Bind(&CupsPrintJobManagerImpl::PostQuery,
- weak_ptr_factory_.GetWeakPtr()),
- delay);
+ return true;
}
-}
-void CupsPrintJobManagerImpl::PostQuery() {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-
- // The set of active printers is expected to be small.
- std::set<std::string> printer_ids;
- for (const auto& entry : jobs_) {
- printer_ids.insert(entry.second->printer().id());
+ // Schedule a query of CUPS for print job status with the default delay.
+ void ScheduleQuery() {
+ ScheduleQuery(base::TimeDelta::FromMilliseconds(kPollRate));
}
- std::vector<std::string> ids{printer_ids.begin(), printer_ids.end()};
-
- auto result = base::MakeUnique<QueryResult>();
- QueryResult* result_ptr = result.get();
- // Runs a query on |query_runner_| which will rejoin this sequnece on
- // completion.
- query_runner_->PostTaskAndReply(
- FROM_HERE,
- base::Bind(&CupsWrapper::QueryCups, base::Unretained(cups_wrapper_.get()),
- ids, result_ptr),
- base::Bind(&CupsPrintJobManagerImpl::UpdateJobs,
- weak_ptr_factory_.GetWeakPtr(), base::Passed(&result)));
-}
-// Use job information to update local job states. Previously completed jobs
-// could be in |jobs| but those are ignored as we will not emit updates for
-// them after they are completed.
-void CupsPrintJobManagerImpl::UpdateJobs(std::unique_ptr<QueryResult> result) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // Schedule a query of CUPS for print job status with a delay of |delay|.
+ void ScheduleQuery(const base::TimeDelta& delay) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- const std::vector<::printing::QueueStatus>& queues = result->queues;
+ if (!in_query_) {
+ in_query_ = true;
- // Query has completed. Allow more queries.
- in_query_ = false;
+ content::BrowserThread::PostDelayedTask(
+ content::BrowserThread::UI, FROM_HERE,
+ base::Bind(&CupsPrintJobManagerImpl::PostQuery,
+ weak_ptr_factory_.GetWeakPtr()),
+ delay);
+ }
+ }
- // If the query failed, either retry or purge.
- if (!result->success) {
- retry_count_++;
- LOG(WARNING) << "Failed to query CUPS for queue status. Schedule retry ("
- << retry_count_ << ")";
- if (retry_count_ > kRetryMax) {
- LOG(ERROR) << "CUPS is unreachable. Giving up on all jobs.";
- PurgeJobs();
- } else {
- // Schedule another query with a larger delay.
- DCHECK_GE(1, retry_count_);
- ScheduleQuery(
- base::TimeDelta::FromMilliseconds(kPollRate * retry_count_));
+ // Schedule the CUPS query off the UI thread. Posts results back to UI thread
+ // to UpdateJobs.
+ void PostQuery() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ // The set of active printers is expected to be small.
+ std::set<std::string> printer_ids;
+ for (const auto& entry : jobs_) {
+ printer_ids.insert(entry.second->printer().id());
}
- return;
+ std::vector<std::string> ids{printer_ids.begin(), printer_ids.end()};
+
+ auto result = base::MakeUnique<QueryResult>();
+ QueryResult* result_ptr = result.get();
+ // Runs a query on |query_runner_| which will rejoin this sequnece on
+ // completion.
+ query_runner_->PostTaskAndReply(
+ FROM_HERE,
+ base::Bind(&CupsWrapper::QueryCups,
+ base::Unretained(cups_wrapper_.get()), ids, result_ptr),
+ base::Bind(&CupsPrintJobManagerImpl::UpdateJobs,
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(&result)));
}
- // A query has completed. Reset retry counter.
- retry_count_ = 0;
+ // Process jobs from CUPS and perform notifications.
+ // Use job information to update local job states. Previously completed jobs
+ // could be in |jobs| but those are ignored as we will not emit updates for
+ // them after they are completed.
+ void UpdateJobs(std::unique_ptr<QueryResult> result) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ const std::vector<::printing::QueueStatus>& queues = result->queues;
+
+ // Query has completed. Allow more queries.
+ in_query_ = false;
+
+ // If the query failed, either retry or purge.
+ if (!result->success) {
+ retry_count_++;
+ LOG(WARNING) << "Failed to query CUPS for queue status. Schedule retry ("
+ << retry_count_ << ")";
+ if (retry_count_ > kRetryMax) {
+ LOG(ERROR) << "CUPS is unreachable. Giving up on all jobs.";
+ PurgeJobs();
+ } else {
+ // Schedule another query with a larger delay.
+ DCHECK_GE(1, retry_count_);
+ ScheduleQuery(
+ base::TimeDelta::FromMilliseconds(kPollRate * retry_count_));
+ }
+ return;
+ }
+
+ // A query has completed. Reset retry counter.
+ retry_count_ = 0;
- std::vector<std::string> active_jobs;
- for (const auto& queue : queues) {
- for (auto& job : queue.jobs) {
- std::string key = CupsPrintJob::GetUniqueId(job.printer_id, job.id);
- const auto& entry = jobs_.find(key);
- if (entry == jobs_.end())
- continue;
+ std::vector<std::string> active_jobs;
+ for (const auto& queue : queues) {
+ for (auto& job : queue.jobs) {
+ std::string key = CupsPrintJob::GetUniqueId(job.printer_id, job.id);
+ const auto& entry = jobs_.find(key);
+ if (entry == jobs_.end())
+ continue;
- CupsPrintJob* print_job = entry->second.get();
+ CupsPrintJob* print_job = entry->second.get();
- if (UpdatePrintJob(queue.printer_status, job, print_job)) {
- // The state of the job changed, notify observers.
- NotifyJobStateUpdate(print_job);
- }
+ if (UpdatePrintJob(queue.printer_status, job, print_job)) {
+ // The state of the job changed, notify observers.
+ NotifyJobStateUpdate(print_job);
+ }
- if (print_job->expired()) {
- // Job needs to be forcibly cancelled.
- RecordJobResult(TIMEOUT_CANCEL);
- CancelPrintJob(print_job);
- // Beware, print_job was removed from jobs_ and deleted.
- } else if (print_job->IsJobFinished()) {
- // Cleanup completed jobs.
- RecordJobResult(ResultForHistogram(print_job->state()));
- jobs_.erase(entry);
- } else {
- active_jobs.push_back(key);
+ if (print_job->expired()) {
+ // Job needs to be forcibly cancelled.
+ RecordJobResult(TIMEOUT_CANCEL);
+ CancelPrintJob(print_job);
+ // Beware, print_job was removed from jobs_ and deleted.
+ } else if (print_job->IsJobFinished()) {
+ // Cleanup completed jobs.
+ RecordJobResult(ResultForHistogram(print_job->state()));
+ jobs_.erase(entry);
+ } else {
+ active_jobs.push_back(key);
+ }
}
}
+
+ // Keep polling until all jobs complete or error.
+ if (!active_jobs.empty()) {
+ // During normal operations, we poll at the default rate.
+ ScheduleQuery();
+ } else if (!jobs_.empty()) {
+ // We're tracking jobs that we didn't receive an update for. Something
+ // bad has happened.
+ LOG(ERROR) << "Lost track of (" << jobs_.size() << ") jobs";
+ PurgeJobs();
+ }
}
- // Keep polling until all jobs complete or error.
- if (!active_jobs.empty()) {
- // During normal operations, we poll at the default rate.
- ScheduleQuery();
- } else if (!jobs_.empty()) {
- // We're tracking jobs that we didn't receive an update for. Something
- // bad has happened.
- LOG(ERROR) << "Lost track of (" << jobs_.size() << ") jobs";
- PurgeJobs();
+ // Mark remaining jobs as errors and remove active jobs.
+ void PurgeJobs() {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+ for (const auto& entry : jobs_) {
+ // Declare all lost jobs errors.
+ RecordJobResult(LOST);
+ CupsPrintJob* job = entry.second.get();
+ job->set_state(CupsPrintJob::State::STATE_ERROR);
+ NotifyJobStateUpdate(job);
+ }
+
+ jobs_.clear();
}
-}
-void CupsPrintJobManagerImpl::PurgeJobs() {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // Notify observers that a state update has occured for |job|.
+ void NotifyJobStateUpdate(CupsPrintJob* job) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- for (const auto& entry : jobs_) {
- // Declare all lost jobs errors.
- RecordJobResult(LOST);
- CupsPrintJob* job = entry.second.get();
- job->set_state(CupsPrintJob::State::STATE_ERROR);
- NotifyJobStateUpdate(job);
+ switch (job->state()) {
+ case State::STATE_NONE:
+ // State does not require notification.
+ break;
+ case State::STATE_WAITING:
+ NotifyJobUpdated(job);
+ break;
+ case State::STATE_STARTED:
+ NotifyJobStarted(job);
+ break;
+ case State::STATE_PAGE_DONE:
+ NotifyJobUpdated(job);
+ break;
+ case State::STATE_RESUMED:
+ NotifyJobResumed(job);
+ break;
+ case State::STATE_SUSPENDED:
+ NotifyJobSuspended(job);
+ break;
+ case State::STATE_CANCELLED:
+ NotifyJobCanceled(job);
+ break;
+ case State::STATE_ERROR:
+ NotifyJobError(job);
+ break;
+ case State::STATE_DOCUMENT_DONE:
+ NotifyJobDone(job);
+ break;
+ }
}
- jobs_.clear();
-}
+ // Ongoing print jobs.
+ std::map<std::string, std::unique_ptr<CupsPrintJob>> jobs_;
-void CupsPrintJobManagerImpl::NotifyJobStateUpdate(CupsPrintJob* job) {
- DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+ // Prevents multiple queries from being scheduled simultaneously.
+ bool in_query_ = false;
- switch (job->state()) {
- case State::STATE_NONE:
- // State does not require notification.
- break;
- case State::STATE_WAITING:
- NotifyJobUpdated(job);
- break;
- case State::STATE_STARTED:
- NotifyJobStarted(job);
- break;
- case State::STATE_PAGE_DONE:
- NotifyJobUpdated(job);
- break;
- case State::STATE_RESUMED:
- NotifyJobResumed(job);
- break;
- case State::STATE_SUSPENDED:
- NotifyJobSuspended(job);
- break;
- case State::STATE_CANCELLED:
- NotifyJobCanceled(job);
- break;
- case State::STATE_ERROR:
- NotifyJobError(job);
- break;
- case State::STATE_DOCUMENT_DONE:
- NotifyJobDone(job);
- break;
- }
-}
+ // Records the number of consecutive times the GetJobs query has failed.
+ int retry_count_ = 0;
+
+ content::NotificationRegistrar registrar_;
+ // Task runner for queries to CUPS.
+ scoped_refptr<base::SequencedTaskRunner> query_runner_;
+ std::unique_ptr<CupsWrapper, base::OnTaskRunnerDeleter> cups_wrapper_;
+ base::WeakPtrFactory<CupsPrintJobManagerImpl> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(CupsPrintJobManagerImpl);
+};
// static
CupsPrintJobManager* CupsPrintJobManager::CreateInstance(Profile* profile) {
« no previous file with comments | « chrome/browser/chromeos/printing/cups_print_job_manager_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698