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