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

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

Issue 1505213004: Copy Crashpad into the Chrome tree instead of importing it via DEPS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update Created 5 years 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
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 #include "util/misc/implicit_cast.h"
24
25 namespace crashpad {
26
27 launch_data_t CFPropertyToLaunchData(CFPropertyListRef property_cf) {
28 @autoreleasepool {
29 // This function mixes Foundation and Core Foundation access to property
30 // list elements according to which is more convenient and correct for any
31 // specific task.
32
33 launch_data_t data_launch = nullptr;
34 CFTypeID type_id_cf = CFGetTypeID(property_cf);
35
36 if (type_id_cf == CFDictionaryGetTypeID()) {
37 NSDictionary* dictionary_ns = base::mac::CFToNSCast(
38 base::mac::CFCastStrict<CFDictionaryRef>(property_cf));
39 base::mac::ScopedLaunchData dictionary_launch(
40 LaunchDataAlloc(LAUNCH_DATA_DICTIONARY));
41
42 for (NSString* key in dictionary_ns) {
43 if (![key isKindOfClass:[NSString class]]) {
44 return nullptr;
45 }
46
47 CFPropertyListRef value_cf =
48 implicit_cast<CFPropertyListRef>([dictionary_ns objectForKey:key]);
49 launch_data_t value_launch = CFPropertyToLaunchData(value_cf);
50 if (!value_launch) {
51 return nullptr;
52 }
53
54 LaunchDataDictInsert(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 LaunchDataAlloc(LAUNCH_DATA_ARRAY));
64 size_t index = 0;
65
66 for (id element_ns in array_ns) {
67 CFPropertyListRef element_cf =
68 implicit_cast<CFPropertyListRef>(element_ns);
69 launch_data_t element_launch = CFPropertyToLaunchData(element_cf);
70 if (!element_launch) {
71 return nullptr;
72 }
73
74 LaunchDataArraySetIndex(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 = LaunchDataNewInteger([number_ns longLongValue]);
95 break;
96 }
97
98 case kCFNumberFloat32Type:
99 case kCFNumberFloat64Type:
100 case kCFNumberFloatType:
101 case kCFNumberDoubleType: {
102 data_launch = LaunchDataNewReal([number_ns doubleValue]);
103 break;
104 }
105
106 default: { return nullptr; }
107 }
108
109 } else if (type_id_cf == CFBooleanGetTypeID()) {
110 CFBooleanRef boolean_cf =
111 base::mac::CFCastStrict<CFBooleanRef>(property_cf);
112 data_launch = LaunchDataNewBool(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 = LaunchDataNewString([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 = LaunchDataNewOpaque([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

Powered by Google App Engine
This is Rietveld 408576698