service_utility_process_host.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_SERVICE_SERVICE_UTILITY_PROCESS_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_SERVICE_SERVICE_UTILITY_PROCESS_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_path.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/pdf_render_settings.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedTempDir;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChildProcessHost;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Emf;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PageRange;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrinterCapsAndDefaults;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Acts as the service-side host to a utility child process. A
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// utility process is a short-lived sandboxed process that is created to run
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a specific task.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceUtilityProcessHost : public content::ChildProcessHostDelegate {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consumers of ServiceUtilityProcessHost must implement this interface to
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get results back.  All functions are called on the thread passed along
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to ServiceUtilityProcessHost.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Client : public base::RefCountedThreadSafe<Client> {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Client() {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the child process died before a reply was receieved.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnChildDied() {}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when at least one page in the specified PDF has been rendered
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // successfully into |metafile|.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnRenderPDFPagesToMetafileSucceeded(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const printing::Emf& metafile,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int highest_rendered_page_number,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        double scale_factor) {}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when no page in the passed in PDF could be rendered.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnRenderPDFPagesToMetafileFailed() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the printer capabilities and defaults have been
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // retrieved successfully.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnGetPrinterCapsAndDefaultsSucceeded(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& printer_name,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const printing::PrinterCapsAndDefaults& caps_and_defaults) {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the printer capabilities and defaults could not be
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // retrieved successfully.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnGetPrinterCapsAndDefaultsFailed(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& printer_name) {}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Client() {}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCountedThreadSafe<Client>;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class ServiceUtilityProcessHost;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invoked when a metafile file is ready.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void MetafileAvailable(const FilePath& metafile_path,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int highest_rendered_page_number,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           double scale_factor);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Client);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceUtilityProcessHost(Client* client,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::MessageLoopProxy* client_message_loop_proxy);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ServiceUtilityProcessHost();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a process to render the specified pages in the given PDF file into
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a metafile. Currently only implemented for Windows. If the PDF has fewer
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pages than the specified page ranges, it will render as many as available.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartRenderPDFPagesToMetafile(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const FilePath& pdf_path,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const printing::PdfRenderSettings& render_settings,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<printing::PageRange>& page_ranges);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a process to get capabilities and defaults for the specified
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printer. Used on Windows to isolate the service process from printer driver
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashes by executing this in a separate process. The process does not run
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a sandbox.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartGetPrinterCapsAndDefaults(const std::string& printer_name);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows this method to be overridden for tests.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual FilePath GetUtilityProcessCmd();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChildProcessHostDelegate implementation:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChildDisconnected() OVERRIDE;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a process.  Returns true iff it succeeded. |exposed_dir| is the
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // path to the exposed to the sandbox. This is ignored if |no_sandbox| is
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartProcess(bool no_sandbox, const FilePath& exposed_dir);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch the child process synchronously.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sanjeevr): Determine whether we need to make the launch asynchronous.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |exposed_dir| is the path to tbe exposed to the sandbox. This is ignored
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if |no_sandbox| is true.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Launch(CommandLine* cmd_line,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bool no_sandbox,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const FilePath& exposed_dir);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle() const { return handle_; }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Messages handlers:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRenderPDFPagesToMetafileSucceeded(int highest_rendered_page_number,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           double scale_factor);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRenderPDFPagesToMetafileFailed();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetPrinterCapsAndDefaultsSucceeded(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& printer_name,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const printing::PrinterCapsAndDefaults& caps_and_defaults);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetPrinterCapsAndDefaultsFailed(const std::string& printer_name);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content::ChildProcessHost> child_process_host_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A pointer to our client interface, who will be informed of progress.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Client> client_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> client_message_loop_proxy_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_reply_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The path to the temp file where the metafile will be written to.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FilePath metafile_path_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The temporary folder created for the metafile.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedTempDir> scratch_metafile_dir_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServiceUtilityProcessHost);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_SERVICE_SERVICE_UTILITY_PROCESS_HOST_H_
155