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 }