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

Side by Side Diff: util/mac/launchd.mm

Issue 579083003: Revert "Drop 10.5 support: use ServiceManagement.framework directly." (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Use an autorelease pool in the CFPropertyToLaunchData() implementation Created 6 years, 3 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
« no previous file with comments | « util/mac/launchd.h ('k') | util/mac/launchd_test.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Crashpad Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "util/mac/launchd.h"
16
17 #import <Foundation/Foundation.h>
18
19 #include "base/mac/foundation_util.h"
20 #include "base/mac/scoped_launch_data.h"
21 #include "base/mac/scoped_cftyperef.h"
22 #include "base/strings/sys_string_conversions.h"
23
24 namespace crashpad {
25
26 launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) {
27 @autoreleasepool {
28 // This function mixes Foundation and Core Foundation access to property
29 // list elements according to which is more convenient and correct for any
30 // specific task.
31
32 launch_data_t data_launch = NULL;
33 CFTypeID type_id_cf = CFGetTypeID(property_cf);
34
35 if (type_id_cf == CFDictionaryGetTypeID()) {
36 NSDictionary* dictionary_ns = base::mac::CFToNSCast(
37 base::mac::CFCastStrict<CFDictionaryRef>(property_cf));
38 base::mac::ScopedLaunchData dictionary_launch(
39 launch_data_alloc(LAUNCH_DATA_DICTIONARY));
40
41 for (NSString* key in dictionary_ns) {
42 if (![key isKindOfClass:[NSString class]]) {
43 return NULL;
44 }
45
46 CFPropertyListRef value_cf =
47 static_cast<CFPropertyListRef>([dictionary_ns objectForKey:key]);
48 launch_data_t value_launch = CFPropertyToLaunchData(value_cf);
49 if (!value_launch) {
50 return NULL;
51 }
52
53 launch_data_dict_insert(
54 dictionary_launch, value_launch, [key UTF8String]);
55 }
56
57 data_launch = dictionary_launch.release();
58
59 } else if (type_id_cf == CFArrayGetTypeID()) {
60 NSArray* array_ns = base::mac::CFToNSCast(
61 base::mac::CFCastStrict<CFArrayRef>(property_cf));
62 base::mac::ScopedLaunchData array_launch(
63 launch_data_alloc(LAUNCH_DATA_ARRAY));
64 size_t index = 0;
65
66 for (id element_ns in array_ns) {
67 CFPropertyListRef element_cf =
68 static_cast<CFPropertyListRef>(element_ns);
69 launch_data_t element_launch = CFPropertyToLaunchData(element_cf);
70 if (!element_launch) {
71 return NULL;
72 }
73
74 launch_data_array_set_index(array_launch, element_launch, index++);
75 }
76
77 data_launch = array_launch.release();
78
79 } else if (type_id_cf == CFNumberGetTypeID()) {
80 CFNumberRef number_cf = base::mac::CFCastStrict<CFNumberRef>(property_cf);
81 NSNumber* number_ns = base::mac::CFToNSCast(number_cf);
82 switch (CFNumberGetType(number_cf)) {
83 case kCFNumberSInt8Type:
84 case kCFNumberSInt16Type:
85 case kCFNumberSInt32Type:
86 case kCFNumberSInt64Type:
87 case kCFNumberCharType:
88 case kCFNumberShortType:
89 case kCFNumberIntType:
90 case kCFNumberLongType:
91 case kCFNumberLongLongType:
92 case kCFNumberCFIndexType:
93 case kCFNumberNSIntegerType: {
94 data_launch = launch_data_new_integer([number_ns longLongValue]);
95 break;
96 }
97
98 case kCFNumberFloat32Type:
99 case kCFNumberFloat64Type:
100 case kCFNumberFloatType:
101 case kCFNumberDoubleType: {
102 data_launch = launch_data_new_real([number_ns doubleValue]);
103 break;
104 }
105
106 default: { return NULL; }
107 }
108
109 } else if (type_id_cf == CFBooleanGetTypeID()) {
110 CFBooleanRef boolean_cf =
111 base::mac::CFCastStrict<CFBooleanRef>(property_cf);
112 data_launch = launch_data_new_bool(CFBooleanGetValue(boolean_cf));
113
114 } else if (type_id_cf == CFStringGetTypeID()) {
115 NSString* string_ns = base::mac::CFToNSCast(
116 base::mac::CFCastStrict<CFStringRef>(property_cf));
117
118 // -fileSystemRepresentation might be more correct than -UTF8String,
119 // because these strings can hold paths. The analogous function in
120 // launchctl, CF2launch_data() (10.9.4
121 // launchd-842.92.1/support/launchctl.c), uses UTF-8 instead of filesystem
122 // encoding, so do the same here. Note that there’s another occurrence of
123 // -UTF8String above, used for dictionary keys.
124 data_launch = launch_data_new_string([string_ns UTF8String]);
125
126 } else if (type_id_cf == CFDataGetTypeID()) {
127 NSData* data_ns = base::mac::CFToNSCast(
128 base::mac::CFCastStrict<CFDataRef>(property_cf));
129 data_launch = launch_data_new_opaque([data_ns bytes], [data_ns length]);
130 } else {
131 base::ScopedCFTypeRef<CFStringRef> type_name_cf(
132 CFCopyTypeIDDescription(type_id_cf));
133 DLOG(ERROR) << "unable to convert CFTypeID " << type_id_cf << " ("
134 << base::SysCFStringRefToUTF8(type_name_cf) << ")";
135 }
136
137 return data_launch;
138 }
139 }
140
141 } // namespace crashpad
OLDNEW
« no previous file with comments | « util/mac/launchd.h ('k') | util/mac/launchd_test.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698