/
_CF-StandardAlert alternative.js
108 lines (95 loc) · 3.18 KB
/
_CF-StandardAlert alternative.js
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
var libcf = ctypes.open('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation');
// DEFINE TYPES
var CFIndex = ctypes.long;
var CFOptionFlags = ctypes.unsigned_long;
var CFTimeInterval = ctypes.double;
var SInt32 = ctypes.long;
var VOID = ctypes.void_t;
var __CFString = new ctypes.StructType("__CFString");
var CFStringRef = __CFString.ptr;
var __CFURL = new ctypes.StructType("__CFURL");
var CFURLRef = __CFURL.ptr;
var __CFAllocator = new ctypes.StructType("__CFAllocator");
var CFAllocatorRef = __CFAllocator.ptr;
var UniChar = ctypes.jschar; // uint16 with automatic conversion
// DECLARE FUNCTIONS
/* https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFUserNotificationRef/index.html#//apple_ref/c/func/CFUserNotificationDisplayNotice
* SInt32 CFUserNotificationDisplayNotice (
* CFTimeInterval timeout,
* CFOptionFlags flags,
* CFURLRef iconURL,
* CFURLRef soundURL,
* CFURLRef localizationURL,
* CFStringRef alertHeader,
* CFStringRef alertMessage,
* CFStringRef defaultButtonTitle
* );
*/
var CFUserNotificationDisplayNotice = libcf.declare("CFUserNotificationDisplayNotice", ctypes.default_abi,
SInt32, // return
CFTimeInterval, // timeout
CFOptionFlags, // flags
CFURLRef, // iconURL
CFURLRef, // soundURL
CFURLRef, // localizationURL
CFStringRef, // alertHeader
CFStringRef, // alertMessage
CFStringRef // defaultButtonTitle
);
/* https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFTypeRef/#//apple_ref/c/func/CFRelease
* void CFRelease (
* CFTypeRef cf
* );
*/
var CFRelease = lib.CoreFoundation.declare('CFRelease', ctypes.default_abi,
VOID, // return
CFTypeRef // cf
);
/* https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFStringRef/#//apple_ref/c/func/CFStringCreateWithCharacters
* CFStringRef CFStringCreateWithCharacters (
* CFAllocatorRef alloc,
* const UniChar *chars,
* CFIndex numChars
* );
*/
var CFStringCreateWithCharacters = lib.CoreFoundation.declare('CFStringCreateWithCharacters', ctypes.default_abi,
CFStringRef, // return
CFAllocatorRef, // alloc
UniChar.ptr, // *chars
CFIndex // numChars
);
// HELPER FUNCTIONS
function makeCFStr(jsStr) {
// js str is just a string
// returns a CFStr that must be released with CFRelease when done
return CFStringCreateWithCharacters(null, jsStr, jsStr.length);
}
// MAIN
var myCFStrs = {
ok: makeCFStr('OK'),
head: makeCFStr('My Alert Header'),
body: makeCFStr('body of the alert'),
};
var myArgs = {
timeout: 0, // CFTimeInterval
flags: 0, // CFOptionFlags
iconURL: null, // CFURLRef
soundURL: null, // CFURLRef
localizationURL: null, // CFURLRef
alertHeader: myCFStrs.head, // CFStringRef
alertMessage: myCFStrs.body, // CFStringRef
defaultButtonTitle: myCFStrs.ok // CFStringRef
};
var myArgsArr = [];
for (argName in myArgs) {
if (myArgs.hasOwnProperty(argName)) {
myArgsArr.push(myArgs[argName]);
}
}
var rez = CFUserNotificationDisplayNotice.apply(null, myArgsArr);
for (var cfstr in myCFStrs) {
if (myCFStrs.hasOwnProperty(cfstr)) {
var rez_CFRelease = CFRelease(myCFStrs[cfstr]); // returns void
}
}
libcf.close();