1 module wkhtmltox.dll;
2 
3 import core.stdc.stdlib;
4 import core.sys.posix.dlfcn;
5 
6 import std.string;
7 
8 
9 extern(C) @nogc nothrow {
10 	struct wkhtmltopdf_global_settings {};
11 	struct wkhtmltopdf_object_settings {};
12 	struct wkhtmltopdf_converter {};
13 
14 	alias wkhtmltopdf_str_callback = void function(wkhtmltopdf_converter*, const(char)*);
15 	alias wkhtmltopdf_int_callback = void function(wkhtmltopdf_converter*, const int);
16 	alias wkhtmltopdf_void_callback = void function(wkhtmltopdf_converter*);
17 
18 	alias F_wkhtmltopdf_init = int function(int);
19 	alias F_wkhtmltopdf_deinit = int function();
20 	alias F_wkhtmltopdf_extended_qt = int function();
21 	alias F_wkhtmltopdf_version = const(char)* function();
22 
23 	alias F_wkhtmltopdf_create_global_settings = wkhtmltopdf_global_settings* function();
24 	alias F_wkhtmltopdf_destroy_global_settings = void function(wkhtmltopdf_global_settings*);
25 
26 	alias F_wkhtmltopdf_create_object_settings = wkhtmltopdf_object_settings* function();
27 	alias F_wkhtmltopdf_destroy_object_settings = void function(wkhtmltopdf_object_settings*);
28 
29 	alias F_wkhtmltopdf_set_global_setting = int function(wkhtmltopdf_global_settings*, const(char)*, const(char)*);
30 	alias F_wkhtmltopdf_get_global_setting = int function(wkhtmltopdf_global_settings*, const(char)*, char*, int);
31 	alias F_wkhtmltopdf_set_object_setting = int function(wkhtmltopdf_object_settings*, const(char)*, const(char)*);
32 	alias F_wkhtmltopdf_get_object_setting = int function(wkhtmltopdf_object_settings*, const(char)*, char*, int);
33 
34 	alias F_wkhtmltopdf_create_converter = wkhtmltopdf_converter* function(wkhtmltopdf_global_settings*);
35 	alias F_wkhtmltopdf_destroy_converter = void function(wkhtmltopdf_converter*);
36 
37 	alias F_wkhtmltopdf_set_warning_callback = void function(wkhtmltopdf_converter*, wkhtmltopdf_str_callback);
38 	alias F_wkhtmltopdf_set_error_callback = void function(wkhtmltopdf_converter*, wkhtmltopdf_str_callback);
39 	alias F_wkhtmltopdf_set_phase_changed_callback = void function(wkhtmltopdf_converter*, wkhtmltopdf_void_callback);
40 	alias F_wkhtmltopdf_set_progress_changed_callback = void function(wkhtmltopdf_converter*, wkhtmltopdf_int_callback);
41 	alias F_wkhtmltopdf_set_finished_callback = void function(wkhtmltopdf_converter*, wkhtmltopdf_int_callback);
42 
43 	/* CAPI(void) wkhtmltopdf_begin_conversion(wkhtmltopdf_converter * converter); */
44 	/* CAPI(void) wkhtmltopdf_cancel(wkhtmltopdf_converter * converter); */
45 	alias F_wkhtmltopdf_convert = int function(wkhtmltopdf_converter*);
46 	alias F_wkhtmltopdf_add_object = void function(wkhtmltopdf_converter*, wkhtmltopdf_object_settings*, const(char)*);
47 
48 	alias F_wkhtmltopdf_current_phase = int function(wkhtmltopdf_converter*);
49 	alias F_wkhtmltopdf_phase_count = int function(wkhtmltopdf_converter*);
50 	alias F_wkhtmltopdf_phase_description = const(char)* function(wkhtmltopdf_converter*, int);
51 	alias F_wkhtmltopdf_progress_string = const(char)* function(wkhtmltopdf_converter *);
52 	alias F_wkhtmltopdf_http_error_code = int function(wkhtmltopdf_converter*);
53 
54 	alias F_wkhtmltopdf_get_output = long function(wkhtmltopdf_converter*, const(ubyte)**);
55 
56 	struct wkhtmltoimage_global_settings {};
57 	struct wkhtmltoimage_object_settings {};
58 	struct wkhtmltoimage_converter {};
59 
60 	alias wkhtmltoimage_str_callback = void function(wkhtmltoimage_converter*, const(char)*);
61 	alias wkhtmltoimage_int_callback = void function(wkhtmltoimage_converter*, const int);
62 	alias wkhtmltoimage_void_callback = void function(wkhtmltoimage_converter*);
63 
64 	alias F_wkhtmltoimage_init = int function(int);
65 	alias F_wkhtmltoimage_deinit = int function();
66 	alias F_wkhtmltoimage_extended_qt = int function();
67 	alias F_wkhtmltoimage_version = const(char)* function();
68 
69 	alias F_wkhtmltoimage_create_global_settings = wkhtmltoimage_global_settings* function();
70 
71 	alias F_wkhtmltoimage_set_global_setting = int function(wkhtmltoimage_global_settings*, const(char)*, const(char)*);
72 	alias F_wkhtmltoimage_get_global_setting = int function(wkhtmltoimage_global_settings*, const(char)*, char*, int);
73 
74 	alias F_wkhtmltoimage_create_converter = wkhtmltoimage_converter* function(wkhtmltoimage_global_settings*, const(char)*);
75 	alias F_wkhtmltoimage_destroy_converter = void function(wkhtmltoimage_converter*);
76 
77 	alias F_wkhtmltoimage_set_warning_callback = void function(wkhtmltoimage_converter*, wkhtmltoimage_str_callback);
78 	alias F_wkhtmltoimage_set_error_callback = void function(wkhtmltoimage_converter*, wkhtmltoimage_str_callback);
79 	alias F_wkhtmltoimage_set_phase_changed_callback = void function(wkhtmltoimage_converter*, wkhtmltoimage_void_callback);
80 	alias F_wkhtmltoimage_set_progress_changed_callback = void function(wkhtmltoimage_converter*, wkhtmltoimage_int_callback);
81 	alias F_wkhtmltoimage_set_finished_callback = void function(wkhtmltoimage_converter*, wkhtmltoimage_int_callback);
82 
83 	/* CAPI(void) wkhtmltoimage_begin_conversion(wkhtmltoimage_converter * converter); */
84 	/* CAPI(void) wkhtmltoimage_cancel(wkhtmltoimage_converter * converter); */
85 	alias F_wkhtmltoimage_convert = int function(wkhtmltoimage_converter*);
86 
87 	alias F_wkhtmltoimage_current_phase = int function(wkhtmltoimage_converter*);
88 	alias F_wkhtmltoimage_phase_count = int function(wkhtmltoimage_converter*);
89 	alias F_wkhtmltoimage_phase_description = const(char)* function(wkhtmltoimage_converter*, int);
90 	alias F_wkhtmltoimage_progress_string = const(char)* function(wkhtmltoimage_converter *);
91 	alias F_wkhtmltoimage_http_error_code = int function(wkhtmltoimage_converter*);
92 
93 	alias F_wkhtmltoimage_get_output = long function(wkhtmltoimage_converter*, const(ubyte)**);
94 }
95 
96 
97 __gshared static {
98 	F_wkhtmltopdf_init wkhtmltopdf_init;
99 	F_wkhtmltopdf_deinit wkhtmltopdf_deinit;
100 	F_wkhtmltopdf_version wkhtmltopdf_version;
101 
102 	F_wkhtmltopdf_create_global_settings wkhtmltopdf_create_global_settings;
103 	F_wkhtmltopdf_destroy_global_settings wkhtmltopdf_destroy_global_settings;
104 
105 	F_wkhtmltopdf_create_object_settings wkhtmltopdf_create_object_settings;
106 	F_wkhtmltopdf_destroy_object_settings wkhtmltopdf_destroy_object_settings;
107 
108 	F_wkhtmltopdf_set_global_setting wkhtmltopdf_set_global_setting;
109 	F_wkhtmltopdf_get_global_setting wkhtmltopdf_get_global_setting;
110 	F_wkhtmltopdf_set_object_setting wkhtmltopdf_set_object_setting;
111 	F_wkhtmltopdf_get_object_setting wkhtmltopdf_get_object_setting;
112 
113 	F_wkhtmltopdf_create_converter wkhtmltopdf_create_converter;
114 	F_wkhtmltopdf_destroy_converter wkhtmltopdf_destroy_converter;
115 
116 	F_wkhtmltopdf_set_warning_callback wkhtmltopdf_set_warning_callback;
117 	F_wkhtmltopdf_set_error_callback wkhtmltopdf_set_error_callback;
118 	F_wkhtmltopdf_set_phase_changed_callback wkhtmltopdf_set_phase_changed_callback;
119 	F_wkhtmltopdf_set_progress_changed_callback wkhtmltopdf_set_progress_changed_callback;
120 	F_wkhtmltopdf_set_finished_callback wkhtmltopdf_set_finished_callback;
121 
122 	F_wkhtmltopdf_current_phase wkhtmltopdf_current_phase;
123 	F_wkhtmltopdf_phase_count wkhtmltopdf_phase_count;
124 	F_wkhtmltopdf_phase_description wkhtmltopdf_phase_description;
125 	F_wkhtmltopdf_progress_string wkhtmltopdf_progress_string;
126 	F_wkhtmltopdf_http_error_code wkhtmltopdf_http_error_code;
127 
128 	F_wkhtmltopdf_convert wkhtmltopdf_convert;
129 	F_wkhtmltopdf_add_object wkhtmltopdf_add_object;
130 
131 	F_wkhtmltopdf_get_output wkhtmltopdf_get_output;
132 
133 
134 	F_wkhtmltoimage_init wkhtmltoimage_init;
135 	F_wkhtmltoimage_deinit wkhtmltoimage_deinit;
136 	F_wkhtmltoimage_version wkhtmltoimage_version;
137 
138 	F_wkhtmltoimage_create_global_settings wkhtmltoimage_create_global_settings;
139 
140 	F_wkhtmltoimage_set_global_setting wkhtmltoimage_set_global_setting;
141 	F_wkhtmltoimage_get_global_setting wkhtmltoimage_get_global_setting;
142 
143 	F_wkhtmltoimage_create_converter wkhtmltoimage_create_converter;
144 	F_wkhtmltoimage_destroy_converter wkhtmltoimage_destroy_converter;
145 
146 	F_wkhtmltoimage_set_warning_callback wkhtmltoimage_set_warning_callback;
147 	F_wkhtmltoimage_set_error_callback wkhtmltoimage_set_error_callback;
148 	F_wkhtmltoimage_set_phase_changed_callback wkhtmltoimage_set_phase_changed_callback;
149 	F_wkhtmltoimage_set_progress_changed_callback wkhtmltoimage_set_progress_changed_callback;
150 	F_wkhtmltoimage_set_finished_callback wkhtmltoimage_set_finished_callback;
151 
152 	F_wkhtmltoimage_current_phase wkhtmltoimage_current_phase;
153 	F_wkhtmltoimage_phase_count wkhtmltoimage_phase_count;
154 	F_wkhtmltoimage_phase_description wkhtmltoimage_phase_description;
155 	F_wkhtmltoimage_progress_string wkhtmltoimage_progress_string;
156 	F_wkhtmltoimage_http_error_code wkhtmltoimage_http_error_code;
157 
158 	F_wkhtmltoimage_convert wkhtmltoimage_convert;
159 
160 	F_wkhtmltoimage_get_output wkhtmltoimage_get_output;
161 
162 
163 	void* dll_ = null;
164 }
165 
166 
167 template LoadSymbol(string symbol) {
168 	enum LoadSymbol = symbol ~ " = cast(typeof(" ~ symbol ~ "))dlsym(dll_, \"" ~ symbol ~ "\"); if (!" ~ symbol ~ ") throw new Exception(fromStringz(dlerror()).idup());";
169 }
170 
171 
172 void init() {
173 	if (dll_)
174 		return;
175 
176 	version(OSX)
177 		dll_ = dlopen("libwkhtmltox.dylib", RTLD_LAZY);
178 	else
179 		dll_ = dlopen("libwkhtmltox.so", RTLD_LAZY);
180 
181 	if (!dll_)
182 		throw new Exception(fromStringz(dlerror()).idup());
183 
184 	mixin(LoadSymbol!"wkhtmltopdf_init");
185 	mixin(LoadSymbol!"wkhtmltopdf_deinit");
186 	mixin(LoadSymbol!"wkhtmltopdf_version");
187 
188 	mixin(LoadSymbol!"wkhtmltopdf_create_global_settings");
189 	mixin(LoadSymbol!"wkhtmltopdf_destroy_global_settings");
190 
191 	mixin(LoadSymbol!"wkhtmltopdf_create_object_settings");
192 	mixin(LoadSymbol!"wkhtmltopdf_destroy_object_settings");
193 
194 	mixin(LoadSymbol!"wkhtmltopdf_set_global_setting");
195 	mixin(LoadSymbol!"wkhtmltopdf_get_global_setting");
196 	mixin(LoadSymbol!"wkhtmltopdf_set_object_setting");
197 	mixin(LoadSymbol!"wkhtmltopdf_get_object_setting");
198 
199 	mixin(LoadSymbol!"wkhtmltopdf_create_converter");
200 	mixin(LoadSymbol!"wkhtmltopdf_destroy_converter");
201 
202 	mixin(LoadSymbol!"wkhtmltopdf_set_warning_callback");
203 	mixin(LoadSymbol!"wkhtmltopdf_set_error_callback");
204 	mixin(LoadSymbol!"wkhtmltopdf_set_phase_changed_callback");
205 	mixin(LoadSymbol!"wkhtmltopdf_set_progress_changed_callback");
206 	mixin(LoadSymbol!"wkhtmltopdf_set_finished_callback");
207 
208 	mixin(LoadSymbol!"wkhtmltopdf_convert");
209 	mixin(LoadSymbol!"wkhtmltopdf_add_object");
210 
211 	mixin(LoadSymbol!"wkhtmltopdf_current_phase");
212 	mixin(LoadSymbol!"wkhtmltopdf_phase_count");
213 	mixin(LoadSymbol!"wkhtmltopdf_phase_description");
214 	mixin(LoadSymbol!"wkhtmltopdf_progress_string");
215 	mixin(LoadSymbol!"wkhtmltopdf_http_error_code");
216 
217 	mixin(LoadSymbol!"wkhtmltopdf_get_output");
218 
219 
220 	mixin(LoadSymbol!"wkhtmltoimage_init");
221 	mixin(LoadSymbol!"wkhtmltoimage_deinit");
222 	mixin(LoadSymbol!"wkhtmltoimage_version");
223 
224 	mixin(LoadSymbol!"wkhtmltoimage_create_global_settings");
225 
226 	mixin(LoadSymbol!"wkhtmltoimage_set_global_setting");
227 	mixin(LoadSymbol!"wkhtmltoimage_get_global_setting");
228 
229 	mixin(LoadSymbol!"wkhtmltoimage_create_converter");
230 	mixin(LoadSymbol!"wkhtmltoimage_destroy_converter");
231 
232 	mixin(LoadSymbol!"wkhtmltoimage_set_warning_callback");
233 	mixin(LoadSymbol!"wkhtmltoimage_set_error_callback");
234 	mixin(LoadSymbol!"wkhtmltoimage_set_phase_changed_callback");
235 	mixin(LoadSymbol!"wkhtmltoimage_set_progress_changed_callback");
236 	mixin(LoadSymbol!"wkhtmltoimage_set_finished_callback");
237 
238 	mixin(LoadSymbol!"wkhtmltoimage_convert");
239 
240 	mixin(LoadSymbol!"wkhtmltoimage_current_phase");
241 	mixin(LoadSymbol!"wkhtmltoimage_phase_count");
242 	mixin(LoadSymbol!"wkhtmltoimage_phase_description");
243 	mixin(LoadSymbol!"wkhtmltoimage_progress_string");
244 	mixin(LoadSymbol!"wkhtmltoimage_http_error_code");
245 
246 	mixin(LoadSymbol!"wkhtmltoimage_get_output");
247 }
248 
249 
250 bool loaded() {
251 	return dll_ != null;
252 }
253 
254 
255 shared static ~this() {
256 	if (dll_) {
257 		dlclose(dll_);
258 		dll_ = null;
259 	}
260 }