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