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 "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_host_delegate.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ipc/ipc_platform_file.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass File;
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass FilePath;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScopedTempDir;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChildProcessHost;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MetafilePlayer;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PdfRenderSettings;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PageRange;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PrinterCapsAndDefaults;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct PrinterSemanticCapsAndDefaults;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Acts as the service-side host to a utility child process. A
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// utility process is a short-lived sandboxed process that is created to run
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a specific task.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServiceUtilityProcessHost : public content::ChildProcessHostDelegate {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Consumers of ServiceUtilityProcessHost must implement this interface to
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get results back.  All functions are called on the thread passed along
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to ServiceUtilityProcessHost.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Client : public base::RefCountedThreadSafe<Client> {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Client() {}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the child process died before a reply was receieved.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnChildDied() {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnRenderPDFPagesToMetafilePageDone(
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        double scale_factor,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        const printing::MetafilePlayer& emf) {}
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Called when at all pages in the PDF has been rendered.
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    virtual void OnRenderPDFPagesToMetafileDone(bool success) {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the printer capabilities and defaults have been
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // retrieved successfully or if retrieval failed.
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual void OnGetPrinterCapsAndDefaults(
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bool succedded,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const std::string& printer_name,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const printing::PrinterCapsAndDefaults& caps_and_defaults) {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Called when the printer capabilities and defaults have been
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // retrieved successfully or if retrieval failed.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual void OnGetPrinterSemanticCapsAndDefaults(
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        bool succedded,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const std::string& printer_name,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        const printing::PrinterSemanticCapsAndDefaults& caps_and_defaults) {}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Client() {}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class base::RefCountedThreadSafe<Client>;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend class ServiceUtilityProcessHost;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invoked when a metafile file is ready.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Returns true if metafile successfully loaded from |file|.
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool MetafileAvailable(double scale_factor, base::File file);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Client);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceUtilityProcessHost(Client* client,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::MessageLoopProxy* client_message_loop_proxy);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ServiceUtilityProcessHost();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a process to render the specified pages in the given PDF file into
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a metafile. Currently only implemented for Windows. If the PDF has fewer
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pages than the specified page ranges, it will render as many as available.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartRenderPDFPagesToMetafile(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& pdf_path,
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const printing::PdfRenderSettings& render_settings);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a process to get capabilities and defaults for the specified
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // printer. Used on Windows to isolate the service process from printer driver
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashes by executing this in a separate process. The process does not run
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a sandbox.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool StartGetPrinterCapsAndDefaults(const std::string& printer_name);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Starts a process to get capabilities and defaults for the specified
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // printer. Used on Windows to isolate the service process from printer driver
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // crashes by executing this in a separate process. The process does not run
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // in a sandbox. Returns result as printing::PrinterSemanticCapsAndDefaults.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool StartGetPrinterSemanticCapsAndDefaults(const std::string& printer_name);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool Send(IPC::Message* msg);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows this method to be overridden for tests.
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual base::FilePath GetUtilityProcessCmd();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChildProcessHostDelegate implementation:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChildDisconnected() OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual base::ProcessHandle GetHandle() const OVERRIDE;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Starts a process.  Returns true iff it succeeded.
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool StartProcess(bool no_sandbox);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch the child process synchronously.
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool Launch(base::CommandLine* cmd_line, bool no_sandbox);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle() const { return handle_; }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnMetafileSpooled(bool success);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPDFToEmfFinished(bool success);
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Messages handlers:
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderPDFPagesToMetafilesPageCount(int page_count);
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnRenderPDFPagesToMetafilesPageDone(bool success, double scale_factor);
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);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetPrinterSemanticCapsAndDefaultsSucceeded(
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& printer_name,
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const printing::PrinterSemanticCapsAndDefaults& caps_and_defaults);
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnGetPrinterSemanticCapsAndDefaultsFailed(
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& printer_name);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content::ChildProcessHost> child_process_host_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle handle_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A pointer to our client interface, who will be informed of progress.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Client> client_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> client_message_loop_proxy_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool waiting_for_reply_;
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Start time of operation.
1530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::Time start_time_;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  class PdfToEmfState;
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<PdfToEmfState> pdf_to_emf_state_;
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WeakPtrFactory<ServiceUtilityProcessHost> weak_ptr_factory_;
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ServiceUtilityProcessHost);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_SERVICE_SERVICE_UTILITY_PROCESS_HOST_H_
164