-
Notifications
You must be signed in to change notification settings - Fork 21
/
sbalert.mm
137 lines (113 loc) · 4.14 KB
/
sbalert.mm
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
#import <CoreFoundation/CoreFoundation.h>
#import <CoreFoundation/CFUserNotification.h>
#include <unistd.h>
void display_usage( char **argv ){
fprintf(stderr, "Usage: %s [arguments...]\n"
" -t: title/header text\n"
" -m: message text\n"
" -d: default button text\n"
" -a: alternate button text\n"
" -o: other button text\n"
" -q: timeout in seconds\n"
" -p: prompt for text input\n"
" -v: default value for text input\n"
" -h: This help message\n"
"\n"
" It will exit with a status code of the result:\n"
" 0: Default Button\n"
" 1: Alternate Button\n"
" 2: Other Button\n"
" 3: Timeout\n"
, argv[0]);
exit(-1);
}
//Main
int main(int argc, char **argv, char **envp) {
//getopt stuff
extern char *optarg;
extern int optind;
//Setup the Timeout
CFTimeInterval timeout = 0;
//Setup the notification dictionary
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
//If not enough options
if (argc == 1) {
//Display the usage and exit
display_usage(argv);
}
//Setup c for getopt
int ch;
//While more options to parse
while ((ch = getopt(argc, argv, "ht:m:d:a:o:pv:q:")) != -1){
//switch based on option
switch (ch){
case 't':
//Title/Header
CFDictionaryAddValue( dict, kCFUserNotificationAlertHeaderKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
break;
case 'm':
//Message
CFDictionaryAddValue( dict, kCFUserNotificationAlertMessageKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
break;
case 'd':
//Default Button
CFDictionaryAddValue( dict, kCFUserNotificationDefaultButtonTitleKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
break;
case 'a':
//Alternate Button
CFDictionaryAddValue( dict, kCFUserNotificationAlternateButtonTitleKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
break;
case 'o':
//Other Button
CFDictionaryAddValue( dict, kCFUserNotificationOtherButtonTitleKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
break;
case 'p':
//Prompt
CFDictionaryAddValue( dict, kCFUserNotificationTextFieldTitlesKey, @"title" );
break;
case 'v':
//Value
CFDictionaryAddValue( dict, kCFUserNotificationTextFieldValuesKey, CFStringCreateWithCString(NULL, optarg, kCFStringEncodingUTF8) );
case 'q':
//Timeout
timeout = atoi(optarg);
break;
case 'h':
default:
display_usage(argv);
}
}
//Finish up
argc -= optind;
argv += optind;
//Setup error value used later
SInt32 error;
//Setup the flags
CFOptionFlags flags = 0;
//Normal alert level
flags |= kCFUserNotificationPlainAlertLevel;
//Make important
CFDictionaryAddValue( dict, kCFUserNotificationAlertTopMostKey, kCFBooleanTrue );
//Setup notification
CFNotificationCenterPostNotificationWithOptions( CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("test"), NULL, NULL, kCFNotificationDeliverImmediately );
//Send it
CFUserNotificationRef notif = CFUserNotificationCreate( NULL, timeout, flags, &error, dict );
//Setup options
CFOptionFlags options;
//Get result and save to options
CFUserNotificationReceiveResponse( notif, 0, &options );
CFDictionaryRef result = CFUserNotificationGetResponseDictionary(notif);
//Setup autoreleasepool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSDictionary * powerDic = (NSDictionary *) result;
NSString * aValue = [powerDic objectForKey:@"TextFieldValues"];
if( aValue.length > 0 ){
printf( "%s\n", [aValue UTF8String] );
}
[pool drain];
if((int) error == 0){
exit((int) options);
}else{
exit(error);
}
}