forked from IngmarStein/Monolingual
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXPCObject.swift
199 lines (176 loc) · 3.99 KB
/
XPCObject.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//
// XPCObject.swift
// Monolingual
//
// Created by Ingmar Stein on 21.07.14.
//
//
import Foundation
public enum XPCObject : Printable {
case XPCBool(xpc_object_t)
case XPCInt64(xpc_object_t)
case XPCUInt64(xpc_object_t)
case XPCString(xpc_object_t)
case XPCDouble(xpc_object_t)
case XPCData(xpc_object_t)
case XPCArray(xpc_object_t)
case XPCDictionary(xpc_object_t)
case _Invalid
init(_ object : xpc_object_t) {
let type = xpc_get_type(object)
switch type {
case xpc_type_bool:
self = .XPCBool(object)
case xpc_type_int64:
self = .XPCInt64(object)
case xpc_type_uint64:
self = .XPCUInt64(object)
case xpc_type_string:
self = .XPCString(object)
case xpc_type_double:
self = .XPCDouble(object)
case xpc_type_data:
self = .XPCData(object)
case xpc_type_array:
self = .XPCArray(object)
case xpc_type_dictionary:
self = .XPCDictionary(object)
default:
assert(false, "invalid XPC object type")
self = ._Invalid
}
}
init(_ value : Bool) {
self = .XPCBool(xpc_bool_create(value))
}
init(_ value : Int64) {
self = .XPCInt64(xpc_int64_create(value))
}
init(_ value : UInt64) {
self = .XPCUInt64(xpc_uint64_create(value))
}
init(_ value : String) {
let nsstring : NSString = value
self = .XPCString(xpc_string_create(nsstring.UTF8String))
}
init(_ value : Double) {
self = .XPCDouble(xpc_double_create(value))
}
init(_ value : NSData) {
self = .XPCData(xpc_data_create(value.bytes, UInt(value.length)))
}
init(_ array: [XPCObject]) {
let xpc_array = xpc_array_create(nil, 0)
for value in array {
xpc_array_set_value(xpc_array, kXPC_ARRAY_APPEND, value.object)
}
self = .XPCArray(xpc_array)
}
init(_ dictionary: [String:XPCObject]) {
let xpc_dictionary = xpc_dictionary_create(nil, nil, 0)
for (key, value) in dictionary {
key.withCString { xpc_dictionary_set_value(xpc_dictionary, $0, value.object) }
}
self = .XPCDictionary(xpc_dictionary)
}
var object : xpc_object_t! {
switch self {
case XPCBool(let value):
return value
case XPCInt64(let value):
return value
case XPCUInt64(let value):
return value
case XPCString(let value):
return value
case XPCDouble(let value):
return value
case XPCData(let value):
return value
case .XPCArray(let value):
return value
case .XPCDictionary(let value):
return value
default:
return nil
}
}
public var description : String {
switch (self) {
case XPCBool(let value):
return xpc_bool_get_value(value).description
case XPCInt64(let value):
return xpc_int64_get_value(value).description
case XPCUInt64(let value):
return xpc_uint64_get_value(value).description
case XPCString(let value):
return String.fromCString(xpc_string_get_string_ptr(value))!
case XPCDouble(let value):
return xpc_double_get_value(value).description
case XPCData(let value):
return value.description
case XPCArray(let value):
return value.description
case XPCDictionary(let value):
return value.description
default:
return ""
}
}
}
extension XPCObject : ArrayLiteralConvertible {
public init(arrayLiteral elements: XPCObject...) {
self.init(elements)
}
}
extension XPCObject : DictionaryLiteralConvertible {
public init(dictionaryLiteral elements: (String, XPCObject)...) {
var dict = [String:XPCObject]()
for (k, v) in elements {
dict[k] = v
}
self.init(dict)
}
}
/*
extension Bool {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension Int64 {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension UInt64 {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension String {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension Double {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension NSData {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension Array {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
extension Dictionary {
func __conversion() -> XPCObject {
return XPCObject(self)
}
}
*/