diff options
author | abeera@google.com <abeera@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-15 20:56:17 +0000 |
---|---|---|
committer | abeera@google.com <abeera@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-15 20:56:17 +0000 |
commit | a529af57f7b475e18cb878712c42c95c7c82e56b (patch) | |
tree | ea36e92433fecae3a8febb0635b4c8112a5a2ca3 /chrome/service | |
parent | 3ef7fb0d42affe262ab8cc3637a9982c65a59335 (diff) | |
download | chromium_src-a529af57f7b475e18cb878712c42c95c7c82e56b.zip chromium_src-a529af57f7b475e18cb878712c42c95c7c82e56b.tar.gz chromium_src-a529af57f7b475e18cb878712c42c95c7c82e56b.tar.bz2 |
Virtual Cloud Print Driver for Mac.
Includes code for the driver itself. Also modifies the browser process as well as service process to register Apple Event handlers. Also changes the service process to allow registration of driver.
BUG=
TEST=
Review URL: http://codereview.chromium.org/7485011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96825 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/service')
-rw-r--r-- | chrome/service/chrome_service_application_mac.h | 27 | ||||
-rw-r--r-- | chrome/service/chrome_service_application_mac.mm | 101 | ||||
-rw-r--r-- | chrome/service/service_ipc_server.cc | 13 | ||||
-rw-r--r-- | chrome/service/service_ipc_server.h | 2 | ||||
-rw-r--r-- | chrome/service/service_main.cc | 4 | ||||
-rw-r--r-- | chrome/service/service_process.cc | 24 | ||||
-rw-r--r-- | chrome/service/service_process.h | 5 |
7 files changed, 174 insertions, 2 deletions
diff --git a/chrome/service/chrome_service_application_mac.h b/chrome/service/chrome_service_application_mac.h new file mode 100644 index 0000000..554a19f --- /dev/null +++ b/chrome/service/chrome_service_application_mac.h @@ -0,0 +1,27 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_SERVICE_CHROME_SERVICE_APPLICATION_MAC_H_ +#define CHROME_SERVICE_CHROME_SERVICE_APPLICATION_MAC_H_ +#pragma once + +#ifdef __OBJC__ + +#import "content/common/chrome_application_mac.h" + +// Top level Mac Application for the service process. +@interface ServiceCrApplication : CrApplication + +@end + +#endif // __OBJC__ + +namespace chrome_service_application_mac { + +// To be used to instantiate ServiceCrApplication from C++ code. +void RegisterServiceCrApp(); +} // namespace chrome_service_application_mac + +#endif // CHROME_SERVICE_CHROME_SERVICE_APPLICATION_MAC_H_ + diff --git a/chrome/service/chrome_service_application_mac.mm b/chrome/service/chrome_service_application_mac.mm new file mode 100644 index 0000000..e7815e9 --- /dev/null +++ b/chrome/service/chrome_service_application_mac.mm @@ -0,0 +1,101 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "chrome/service/chrome_service_application_mac.h" + +#include "base/logging.h" +#include "base/mac/foundation_util.h" +#import "content/common/cloud_print_class_mac.h" +#include "chrome/common/chrome_switches.h" + +@interface ServiceCrApplication () +- (void)setCloudPrintHandler; +- (void)submitPrint:(NSAppleEventDescriptor*)event; +@end + +@implementation ServiceCrApplication + +-(void)setCloudPrintHandler { + NSAppleEventManager* em = [NSAppleEventManager sharedAppleEventManager]; + [em setEventHandler:self + andSelector:@selector(submitPrint:) + forEventClass:content::kAECloudPrintClass + andEventID:content::kAECloudPrintClass]; +} + +// Event handler for Cloud Print Event. Forwards print job received to Chrome, +// launching Chrome if necessary. Used to beat CUPS sandboxing. +- (void)submitPrint:(NSAppleEventDescriptor*)event { + std::string silent = std::string("--") + switches::kNoStartupWindow; + // Set up flag so that it can be passed along with the Apple Event. + CFStringRef silentLaunchFlag = + CFStringCreateWithCString(NULL, silent.c_str(), kCFStringEncodingUTF8); + CFStringRef flags[] = { silentLaunchFlag }; + // Argv array that will be passed. + CFArrayRef passArgv = + CFArrayCreate(NULL, (const void**) flags, 1, &kCFTypeArrayCallBacks); + FSRef ref; + OSStatus status = noErr; + CFURLRef* kDontWantURL = NULL; + // Get Chrome's bundle ID. + std::string bundleID = base::mac::BaseBundleID(); + CFStringRef bundleIDCF = + CFStringCreateWithCString(NULL, bundleID.c_str(), kCFStringEncodingUTF8); + // Use Launch Services to locate Chrome using its bundleID. + status = LSFindApplicationForInfo(kLSUnknownCreator, bundleIDCF, + NULL, &ref, kDontWantURL); + + if (status != noErr) { + LOG(ERROR) << "Failed to make path ref"; + LOG(ERROR) << GetMacOSStatusErrorString(status); + LOG(ERROR) << GetMacOSStatusCommentString(status); + return; + } + // Actually create the Apple Event. + NSAppleEventDescriptor* sendEvent = + [NSAppleEventDescriptor + appleEventWithEventClass:content::kAECloudPrintClass + eventID:content::kAECloudPrintClass + targetDescriptor:nil + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID]; + // Pull the parameters out of AppleEvent sent to us and attach them + // to our Apple Event. + NSAppleEventDescriptor* parameters = + [event paramDescriptorForKeyword:content::kAECloudPrintClass]; + [sendEvent setParamDescriptor:parameters + forKeyword:content::kAECloudPrintClass]; + LSApplicationParameters params = { 0, + kLSLaunchDefaults, + &ref, + NULL, + NULL, + passArgv, + NULL }; + AEDesc* initialEvent = const_cast<AEDesc*> ([sendEvent aeDesc]); + params.initialEvent = static_cast<AppleEvent*> (initialEvent); + // Send the Apple Event Using launch services, launching Chrome if necessary. + status = LSOpenApplication(¶ms, NULL); + if (status != noErr) { + LOG(ERROR) << "Unable to launch"; + LOG(ERROR) << GetMacOSStatusErrorString(status); + LOG(ERROR) << GetMacOSStatusCommentString(status); + } +} + + +@end + + +namespace chrome_service_application_mac { + +void RegisterServiceCrApp() { + ServiceCrApplication* var = + static_cast<ServiceCrApplication*> + ([ServiceCrApplication sharedApplication]); + [var setCloudPrintHandler]; +} + +} // namespace chrome_service_application_mac + diff --git a/chrome/service/service_ipc_server.cc b/chrome/service/service_ipc_server.cc index b3582a2..01b5deb 100644 --- a/chrome/service/service_ipc_server.cc +++ b/chrome/service/service_ipc_server.cc @@ -109,6 +109,10 @@ bool ServiceIPCServer::OnMessageReceived(const IPC::Message& msg) { OnGetCloudPrintProxyInfo) IPC_MESSAGE_HANDLER(ServiceMsg_Shutdown, OnShutdown); IPC_MESSAGE_HANDLER(ServiceMsg_UpdateAvailable, OnUpdateAvailable); + IPC_MESSAGE_HANDLER(ServiceMsg_EnableVirtualDriver, + OnEnableVirtualDriver); + IPC_MESSAGE_HANDLER(ServiceMsg_DisableVirtualDriver, + OnDisableVirtualDriver); IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -145,3 +149,12 @@ void ServiceIPCServer::OnShutdown() { void ServiceIPCServer::OnUpdateAvailable() { g_service_process->SetUpdateAvailable(); } + +void ServiceIPCServer::OnEnableVirtualDriver() { + g_service_process->EnableVirtualPrintDriver(); +} + +void ServiceIPCServer::OnDisableVirtualDriver() { + g_service_process->DisableVirtualPrintDriver(); +} + diff --git a/chrome/service/service_ipc_server.h b/chrome/service/service_ipc_server.h index eeb1f74..ed1613f 100644 --- a/chrome/service/service_ipc_server.h +++ b/chrome/service/service_ipc_server.h @@ -48,6 +48,8 @@ class ServiceIPCServer : public IPC::Channel::Listener, const std::string& user_email); void OnGetCloudPrintProxyInfo(); void OnDisableCloudPrintProxy(); + void OnEnableVirtualDriver(); + void OnDisableVirtualDriver(); void OnShutdown(); void OnUpdateAvailable(); diff --git a/chrome/service/service_main.cc b/chrome/service/service_main.cc index 9242c17..bd5e66f 100644 --- a/chrome/service/service_main.cc +++ b/chrome/service/service_main.cc @@ -12,7 +12,7 @@ #if defined(OS_WIN) #include "content/common/sandbox_policy.h" #elif defined(OS_MACOSX) -#include "content/common/chrome_application_mac.h" +#include "chrome/service/chrome_service_application_mac.h" #endif // defined(OS_WIN) // Mainline routine for running as the service process. @@ -27,7 +27,7 @@ int ServiceProcessMain(const MainFunctionParams& parameters) { << parameters.command_line_.GetCommandLineString(); #if defined(OS_MACOSX) - chrome_application_mac::RegisterCrApp(); + chrome_service_application_mac::RegisterServiceCrApp(); #endif base::PlatformThread::SetName("CrServiceMain"); diff --git a/chrome/service/service_process.cc b/chrome/service/service_process.cc index e5e0494..8fc8e95 100644 --- a/chrome/service/service_process.cc +++ b/chrome/service/service_process.cc @@ -192,6 +192,16 @@ bool ServiceProcess::Initialize(MessageLoopForUI* message_loop, if (cloud_print_proxy_enabled) { GetCloudPrintProxy()->EnableForUser(lsid); } + // Enable Virtual Printer Driver if needed. + bool virtual_printer_driver_enabled = false; + service_prefs_->GetBoolean(prefs::kVirtualPrinterDriverEnabled, + &virtual_printer_driver_enabled); + + if (virtual_printer_driver_enabled) { + // Register the fact that there is at least one + // service needing the process. + OnServiceEnabled(); + } VLOG(1) << "Starting Service Process IPC Server"; ipc_server_.reset(new ServiceIPCServer( @@ -272,6 +282,20 @@ void ServiceProcess::OnCloudPrintProxyDisabled(bool persist_state) { OnServiceDisabled(); } +void ServiceProcess::EnableVirtualPrintDriver() { + OnServiceEnabled(); + // Save the preference that we have enabled the virtual driver. + service_prefs_->SetBoolean(prefs::kVirtualPrinterDriverEnabled, true); + service_prefs_->WritePrefs(); +} + +void ServiceProcess::DisableVirtualPrintDriver() { + OnServiceDisabled(); + // Save the preference that we have disabled the virtual driver. + service_prefs_->SetBoolean(prefs::kVirtualPrinterDriverEnabled, false); + service_prefs_->WritePrefs(); +} + ServiceURLRequestContextGetter* ServiceProcess::GetServiceURLRequestContextGetter() { DCHECK(request_context_getter_.get()); diff --git a/chrome/service/service_process.h b/chrome/service/service_process.h index ce1fc5a..8379fb8 100644 --- a/chrome/service/service_process.h +++ b/chrome/service/service_process.h @@ -39,6 +39,11 @@ class ServiceProcess : public CloudPrintProxy::Client { bool Initialize(MessageLoopForUI* message_loop, const CommandLine& command_line, ServiceProcessState* state); + + // Functions for Cloud Print virtual driver on Mac. + void EnableVirtualPrintDriver(); + void DisableVirtualPrintDriver(); + bool Teardown(); // TODO(sanjeevr): Change various parts of the code such as // net::ProxyService::CreateSystemProxyConfigService to take in |