15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#ifndef CHROME_BROWSER_PRINTING_PRINT_JOB_MANAGER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PRINTING_PRINT_JOB_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_destination_interface.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JobEventDetails; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrintJob; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrinterQuery; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class PrintQueriesQueue : public base::RefCountedThreadSafe<PrintQueriesQueue> { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrintQueriesQueue(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the print destination to be set on the next print job. 30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void SetDestination(PrintDestinationInterface* destination); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Queues a semi-initialized worker thread. Can be called from any thread. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current use case is queuing from the I/O thread. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(maruel): Have them vanish after a timeout (~5 minutes?) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void QueuePrinterQuery(PrinterQuery* job); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Pops a queued PrintJobWorkerOwner object that was previously queued or 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // create new one. Can be called from any thread. 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<PrinterQuery> PopPrinterQuery(int document_cookie); 40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Creates new query. 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<PrinterQuery> CreatePrinterQuery(); 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void Shutdown(); 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) friend class base::RefCountedThreadSafe<PrintQueriesQueue>; 48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) typedef std::vector<scoped_refptr<PrinterQuery> > PrinterQueries; 49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~PrintQueriesQueue(); 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Used to serialize access to queued_workers_. 53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::Lock lock_; 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrinterQueries queued_queries_; 56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<PrintDestinationInterface> destination_; 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrintQueriesQueue); 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class PrintJobManager : public content::NotificationObserver { 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PrintJobManager(); 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~PrintJobManager(); 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // On browser quit, we should wait to have the print job finished. 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void Shutdown(); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Returns queries queue. Never returns NULL. Must be called on Browser UI 76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Thread. Reference could be stored and used from any thread. 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<PrintQueriesQueue> queue(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::set<scoped_refptr<PrintJob> > PrintJobs; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Processes a NOTIFY_PRINT_JOB_EVENT notification. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPrintJobEvent(PrintJob* print_job, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const JobEventDetails& event_details); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Stops all printing jobs. If wait_for_finish is true, tries to give jobs 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // a chance to complete before stopping them. 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void StopJobs(bool wait_for_finish); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) content::NotificationRegistrar registrar_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current print jobs that are active. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintJobs current_jobs_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<PrintQueriesQueue> queue_; 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool is_shutdown_; 98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PrintJobManager); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PRINTING_PRINT_JOB_MANAGER_H_ 105