Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(313)

Side by Side Diff: content/common/chrome_application_mac.mm

Issue 7485011: Virtual Cloud Print Driver for Mac. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Further style fixes. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #import "content/common/chrome_application_mac.h" 5 #import "content/common/chrome_application_mac.h"
6 #import "content/common/cloud_print_class_mac.h"
6 7
7 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/mac/foundation_util.h"
8 10
9 @interface CrApplication () 11 @interface CrApplication ()
10 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent; 12 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent;
13 - (void)setCloudPrintHandler;
14 - (void)submitPrint:(NSAppleEventDescriptor*)event;
11 @end 15 @end
12 16
13 @implementation CrApplication 17 @implementation CrApplication
14 // Initialize NSApplication using the custom subclass. Check whether NSApp 18 // Initialize NSApplication using the custom subclass. Check whether NSApp
15 // was already initialized using another class, because that would break 19 // was already initialized using another class, because that would break
16 // some things. 20 // some things.
17 + (NSApplication*)sharedApplication { 21 + (NSApplication*)sharedApplication {
18 NSApplication* app = [super sharedApplication]; 22 NSApplication* app = [super sharedApplication];
19 if (![NSApp isKindOfClass:self]) { 23 if (![NSApp isKindOfClass:self]) {
20 LOG(ERROR) << "NSApp should be of type " << [[self className] UTF8String] 24 LOG(ERROR) << "NSApp should be of type " << [[self className] UTF8String]
21 << ", not " << [[NSApp className] UTF8String]; 25 << ", not " << [[NSApp className] UTF8String];
22 DCHECK(false) << "NSApp is of wrong type"; 26 DCHECK(false) << "NSApp is of wrong type";
23 } 27 }
24 return app; 28 return app;
25 } 29 }
26 30
27 - (id)init { 31 - (id)init {
28 if ((self = [super init])) { 32 if ((self = [super init])) {
29 eventHooks_.reset([[NSMutableArray alloc] init]); 33 eventHooks_.reset([[NSMutableArray alloc] init]);
30 } 34 }
31 return self; 35 return self;
32 } 36 }
33 37
38 // Sets the Cloud Print Handler. Used only by service process.
39 - (void)setCloudPrintHandler {
40 NSAppleEventManager* em = [NSAppleEventManager sharedAppleEventManager];
41 [em setEventHandler:self
42 andSelector:@selector(submitPrint:)
43 forEventClass:cloudPrintClass
44 andEventID:cloudPrintClass];
45 }
46
47 // Event handler for Cloud Print Event. Forwards print job recieved to Chrome,
48 // launching Chrome if necessary. Used to beat CUPS sandboxing.
49 - (void)submitPrint:(NSAppleEventDescriptor*)event {
50 // TODO: Resolve dependency on flag.
51 const char silent[] = "--no-startup-window";
52 // Set up flag so that it can be passed along with Apple Event.
53 CFStringRef silentLaunchFlag = CFStringCreateWithCString(
Nico 2011/07/22 16:53:55 break after =
54 NULL,silent,kCFStringEncodingUTF8);
55 CFStringRef flags[] = {silentLaunchFlag};
Nico 2011/07/22 16:53:55 spaces inside {}
56 // Argv array that will be passed.
57 CFArrayRef passArgv = CFArrayCreate(NULL, (const void**) flags, 1,
58 &kCFTypeArrayCallBacks);
59 FSRef ref;
60 OSStatus status = noErr;
61 CFURLRef* kDontWantURL = NULL;
62 // Get Chrome's bundle ID.
63 std::string bundleID = base::mac::BaseBundleID();
64 CFStringRef bundleIDCF = CFStringCreateWithCString(
65 NULL,bundleID.c_str(),kCFStringEncodingUTF8);
66 // Use Launch Services to locate Chrome using its bundleID.
67 status = LSFindApplicationForInfo(kLSUnknownCreator, bundleIDCF,
68 NULL, &ref, kDontWantURL);
Nico 2011/07/22 16:53:55 wrong indent
69
70 if (status != noErr) {
71 LOG(ERROR) <<"Failed to make path ref";
Nico 2011/07/22 16:53:55 space after <<
72 LOG(ERROR) << GetMacOSStatusErrorString(status);
73 LOG(ERROR) << GetMacOSStatusCommentString(status);
74 }
75 // Actually create the Apple Event.
76 NSAppleEventDescriptor *sendEvent = [NSAppleEventDescriptor
77 appleEventWithEventClass:
78 cloudPrintClass
79 eventID:cloudPrintClass
80 targetDescriptor:nil
81 returnID:kAutoGenerateReturnID
82 transactionID:kAnyTransactionID];
83 // Pull the parameters out of AppleEvent sent to us and attach them
84 // to our Apple Event.
85 NSAppleEventDescriptor *parameters =
86 [event paramDescriptorForKeyword:cloudPrintClass];
87 [sendEvent setParamDescriptor:parameters forKeyword:cloudPrintClass];
88 LSApplicationParameters params = {0,
89 kLSLaunchDefaults,
90 &ref,
91 NULL,
92 NULL,
93 passArgv,
94 NULL };
95 params.initialEvent =(AppleEvent *) [sendEvent aeDesc];
96 // Send the Apple Event Using launch services, launching Chrome if necessary.
97 status = LSOpenApplication(&params, NULL);
98
99 if (status != noErr) {
100 LOG(ERROR) <<"Unable to launch";
101 LOG(ERROR) << GetMacOSStatusErrorString(status);
102 LOG(ERROR) << GetMacOSStatusCommentString(status);
103 }
104 }
105
106
34 - (BOOL)isHandlingSendEvent { 107 - (BOOL)isHandlingSendEvent {
35 return handlingSendEvent_; 108 return handlingSendEvent_;
36 } 109 }
37 110
38 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent { 111 - (void)setHandlingSendEvent:(BOOL)handlingSendEvent {
39 handlingSendEvent_ = handlingSendEvent; 112 handlingSendEvent_ = handlingSendEvent;
40 } 113 }
41 114
42 - (void)clearIsHandlingSendEvent { 115 - (void)clearIsHandlingSendEvent {
43 [self setHandlingSendEvent:NO]; 116 [self setHandlingSendEvent:NO];
(...skipping 11 matching lines...) Expand all
55 [eventHooks_ addObject:handler]; 128 [eventHooks_ addObject:handler];
56 } 129 }
57 130
58 - (void)removeEventHook:(id<CrApplicationEventHookProtocol>)handler { 131 - (void)removeEventHook:(id<CrApplicationEventHookProtocol>)handler {
59 [eventHooks_ removeObject:handler]; 132 [eventHooks_ removeObject:handler];
60 } 133 }
61 134
62 @end 135 @end
63 136
64 namespace chrome_application_mac { 137 namespace chrome_application_mac {
138 CrApplication* var;
65 139
66 ScopedSendingEvent::ScopedSendingEvent() 140 ScopedSendingEvent::ScopedSendingEvent()
67 : app_(static_cast<CrApplication*>([CrApplication sharedApplication])), 141 : app_(static_cast<CrApplication*>([CrApplication sharedApplication])),
68 handling_([app_ isHandlingSendEvent]) { 142 handling_([app_ isHandlingSendEvent]) {
69 [app_ setHandlingSendEvent:YES]; 143 [app_ setHandlingSendEvent:YES];
70 } 144 }
71 145
72 ScopedSendingEvent::~ScopedSendingEvent() { 146 ScopedSendingEvent::~ScopedSendingEvent() {
73 [app_ setHandlingSendEvent:handling_]; 147 [app_ setHandlingSendEvent:handling_];
74 } 148 }
75 149
76 void RegisterCrApp() { 150 void RegisterCrApp() {
77 [CrApplication sharedApplication]; 151 var = (CrApplication*)[CrApplication sharedApplication];
78 } 152 }
79 153
154 void SetHandler() {
155 [var setCloudPrintHandler];
156 }
157
158
80 } // namespace chrome_application_mac 159 } // namespace chrome_application_mac
160
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698