forked from iamgreaser/iceball
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iblauncher.c
133 lines (110 loc) · 3.37 KB
/
iblauncher.c
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
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
char *ib_base_fn = NULL;
char *ib_conn = NULL;
int fail_badly(void)
{
MessageBox(NULL,
"An error occurred while trying to access the registry.\r\n"
"Handler is not installed."
, "iceball:// URL installer", MB_OK | MB_APPLMODAL | MB_ICONSTOP);
return 2;
}
int set_hkcr_key(char *key, char *ent, char *value)
{
HKEY hk;
int e_open = RegOpenKeyEx(HKEY_CURRENT_USER, key, 0, KEY_ALL_ACCESS, &hk);
if(e_open != ERROR_SUCCESS)
{
int e_open = RegCreateKeyEx(HKEY_CURRENT_USER, key, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hk, NULL);
if(e_open != ERROR_SUCCESS)
{
printf("failure when creating \"%s\": %i (%08X)\n", key, e_open, e_open);
fflush(stdout);
return 1;
}
}
int e_setv = RegSetValueEx(hk, ent, 0, REG_SZ, value, strlen(value)+1);
if(e_setv != ERROR_SUCCESS)
{
printf("failure when setting \"%s\": %i (%08X)\n", key, e_setv, e_setv);
fflush(stdout);
return 1;
}
int e_close = RegCloseKey(hk);
if(e_close != ERROR_SUCCESS)
{
printf("failure when closing \"%s\": %i (%08X)\n", key, e_close, e_close);
fflush(stdout);
return 1;
}
}
int main(int argc, char *argv[])
{
if(IDCANCEL == MessageBox(NULL,
"This program will make iceball:// URLs work,\r\n"
"which means that you will be able to click on the links in the Server List,\r\n"
"and they will actually run Iceball.\r\n"
"\r\n"
"Press Cancel at any time if you do not want to do this."
, "iceball:// URL installer", MB_OKCANCEL | MB_APPLMODAL | MB_ICONINFORMATION))
return 1;
switch(MessageBox(NULL,
"Do you want the Hardware Accelerated OpenGL renderer?\r\n"
"\r\n"
"If you don't know what this is, just click Yes.\r\n"
, "iceball:// URL installer", MB_YESNOCANCEL | MB_APPLMODAL | MB_ICONQUESTION))
{
case IDYES:
ib_base_fn = "iceball-gl";
break;
case IDNO:
ib_base_fn = "iceball";
break;
default:
return 1;
}
switch(MessageBox(NULL,
"Do you want to use ENet?\r\n"
"\r\n"
"ENet runs a lot better than the TCP protocol,\r\n"
"but doesn't work over IPv6 at the moment.\r\n"
"\r\n"
"If you don't know what any one of those 3 things are, just click Yes.\r\n"
, "iceball:// URL installer", MB_YESNOCANCEL | MB_APPLMODAL | MB_ICONQUESTION))
{
case IDYES:
ib_conn = "-c";
break;
case IDNO:
ib_conn = "-C";
break;
default:
return 1;
}
char runbuf[2048];
char cwdbuf[1536] = "";
_getcwd(cwdbuf, 1535);
sprintf(runbuf, "\"%s\\%s.exe\" %s \"%%1\"", cwdbuf, ib_base_fn, ib_conn);
char msgboxbuf[2048+1024];
sprintf(msgboxbuf,
"When you click OK, iceball:// URLs will run this command:\r\n\r\n"
"%s\r\n\r\n"
"Click OK to continue, or click Cancel to abort and possibly try again.",
runbuf);
if(IDCANCEL == MessageBox(NULL,
msgboxbuf
, "iceball:// URL installer", MB_OKCANCEL | MB_APPLMODAL | MB_ICONEXCLAMATION))
return 1;
// Install it!
if(set_hkcr_key("Software\\Classes\\iceball\\", NULL, "URL:Iceball Protocol Handler")) return fail_badly();
if(set_hkcr_key("Software\\Classes\\iceball\\", "URL Protocol", "")) return fail_badly();
if(set_hkcr_key("Software\\Classes\\iceball\\shell\\open\\command\\", NULL, runbuf)) return fail_badly();
// Nothing more we can do.
MessageBox(NULL,
"iceball:// URL handler successfully installed."
, "iceball:// URL installer", MB_OK | MB_APPLMODAL | MB_ICONINFORMATION);
return 0;
}