- Notifications
You must be signed in to change notification settings - Fork 31.8k
/
Copy path_ios_support.py
71 lines (59 loc) · 2.61 KB
/
_ios_support.py
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
importsys
try:
fromctypesimportcdll, c_void_p, c_char_p, util
exceptImportError:
# ctypes is an optional module. If it's not present, we're limited in what
# we can tell about the system, but we don't want to prevent the module
# from working.
print("ctypes isn't available; iOS system calls will not be available", file=sys.stderr)
objc=None
else:
# ctypes is available. Load the ObjC library, and wrap the objc_getClass,
# sel_registerName methods
lib=util.find_library("objc")
iflibisNone:
# Failed to load the objc library
raiseImportError("ObjC runtime library couldn't be loaded")
objc=cdll.LoadLibrary(lib)
objc.objc_getClass.restype=c_void_p
objc.objc_getClass.argtypes= [c_char_p]
objc.sel_registerName.restype=c_void_p
objc.sel_registerName.argtypes= [c_char_p]
defget_platform_ios():
# Determine if this is a simulator using the multiarch value
is_simulator=sys.implementation._multiarch.endswith("simulator")
# We can't use ctypes; abort
ifnotobjc:
returnNone
# Most of the methods return ObjC objects
objc.objc_msgSend.restype=c_void_p
# All the methods used have no arguments.
objc.objc_msgSend.argtypes= [c_void_p, c_void_p]
# Equivalent of:
# device = [UIDevice currentDevice]
UIDevice=objc.objc_getClass(b"UIDevice")
SEL_currentDevice=objc.sel_registerName(b"currentDevice")
device=objc.objc_msgSend(UIDevice, SEL_currentDevice)
# Equivalent of:
# device_systemVersion = [device systemVersion]
SEL_systemVersion=objc.sel_registerName(b"systemVersion")
device_systemVersion=objc.objc_msgSend(device, SEL_systemVersion)
# Equivalent of:
# device_systemName = [device systemName]
SEL_systemName=objc.sel_registerName(b"systemName")
device_systemName=objc.objc_msgSend(device, SEL_systemName)
# Equivalent of:
# device_model = [device model]
SEL_model=objc.sel_registerName(b"model")
device_model=objc.objc_msgSend(device, SEL_model)
# UTF8String returns a const char*;
SEL_UTF8String=objc.sel_registerName(b"UTF8String")
objc.objc_msgSend.restype=c_char_p
# Equivalent of:
# system = [device_systemName UTF8String]
# release = [device_systemVersion UTF8String]
# model = [device_model UTF8String]
system=objc.objc_msgSend(device_systemName, SEL_UTF8String).decode()
release=objc.objc_msgSend(device_systemVersion, SEL_UTF8String).decode()
model=objc.objc_msgSend(device_model, SEL_UTF8String).decode()
returnsystem, release, model, is_simulator