1 /* 2 * This file is part of gtkD. 3 * 4 * gtkD is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * as published by the Free Software Foundation; either version 3 7 * of the License, or (at your option) any later version, with 8 * some exceptions, please read the COPYING file. 9 * 10 * gtkD is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with gtkD; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA 18 */ 19 20 // generated automatically - do not change 21 // find conversion definition on APILookup.txt 22 // implement new conversion functionalities on the wrap.utils pakage 23 24 25 module gio.ApplicationCommandLine; 26 27 private import gio.FileIF; 28 private import gio.InputStream; 29 private import gio.c.functions; 30 public import gio.c.types; 31 private import glib.Str; 32 private import glib.Variant; 33 private import glib.VariantDict; 34 private import gobject.ObjectG; 35 public import gtkc.giotypes; 36 37 38 /** 39 * #GApplicationCommandLine represents a command-line invocation of 40 * an application. It is created by #GApplication and emitted 41 * in the #GApplication::command-line signal and virtual function. 42 * 43 * The class contains the list of arguments that the program was invoked 44 * with. It is also possible to query if the commandline invocation was 45 * local (ie: the current process is running in direct response to the 46 * invocation) or remote (ie: some other process forwarded the 47 * commandline to this process). 48 * 49 * The GApplicationCommandLine object can provide the @argc and @argv 50 * parameters for use with the #GOptionContext command-line parsing API, 51 * with the g_application_command_line_get_arguments() function. See 52 * [gapplication-example-cmdline3.c][gapplication-example-cmdline3] 53 * for an example. 54 * 55 * The exit status of the originally-invoked process may be set and 56 * messages can be printed to stdout or stderr of that process. The 57 * lifecycle of the originally-invoked process is tied to the lifecycle 58 * of this object (ie: the process exits when the last reference is 59 * dropped). 60 * 61 * The main use for #GApplicationCommandLine (and the 62 * #GApplication::command-line signal) is 'Emacs server' like use cases: 63 * You can set the `EDITOR` environment variable to have e.g. git use 64 * your favourite editor to edit commit messages, and if you already 65 * have an instance of the editor running, the editing will happen 66 * in the running instance, instead of opening a new one. An important 67 * aspect of this use case is that the process that gets started by git 68 * does not return until the editing is done. 69 * 70 * Normally, the commandline is completely handled in the 71 * #GApplication::command-line handler. The launching instance exits 72 * once the signal handler in the primary instance has returned, and 73 * the return value of the signal handler becomes the exit status 74 * of the launching instance. 75 * |[<!-- language="C" --> 76 * static int 77 * command_line (GApplication *application, 78 * GApplicationCommandLine *cmdline) 79 * { 80 * gchar **argv; 81 * gint argc; 82 * gint i; 83 * 84 * argv = g_application_command_line_get_arguments (cmdline, &argc); 85 * 86 * g_application_command_line_print (cmdline, 87 * "This text is written back\n" 88 * "to stdout of the caller\n"); 89 * 90 * for (i = 0; i < argc; i++) 91 * g_print ("argument %d: %s\n", i, argv[i]); 92 * 93 * g_strfreev (argv); 94 * 95 * return 0; 96 * } 97 * ]| 98 * The complete example can be found here: 99 * [gapplication-example-cmdline.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-cmdline.c) 100 * 101 * In more complicated cases, the handling of the comandline can be 102 * split between the launcher and the primary instance. 103 * |[<!-- language="C" --> 104 * static gboolean 105 * test_local_cmdline (GApplication *application, 106 * gchar ***arguments, 107 * gint *exit_status) 108 * { 109 * gint i, j; 110 * gchar **argv; 111 * 112 * argv = *arguments; 113 * 114 * i = 1; 115 * while (argv[i]) 116 * { 117 * if (g_str_has_prefix (argv[i], "--local-")) 118 * { 119 * g_print ("handling argument %s locally\n", argv[i]); 120 * g_free (argv[i]); 121 * for (j = i; argv[j]; j++) 122 * argv[j] = argv[j + 1]; 123 * } 124 * else 125 * { 126 * g_print ("not handling argument %s locally\n", argv[i]); 127 * i++; 128 * } 129 * } 130 * 131 * *exit_status = 0; 132 * 133 * return FALSE; 134 * } 135 * 136 * static void 137 * test_application_class_init (TestApplicationClass *class) 138 * { 139 * G_APPLICATION_CLASS (class)->local_command_line = test_local_cmdline; 140 * 141 * ... 142 * } 143 * ]| 144 * In this example of split commandline handling, options that start 145 * with `--local-` are handled locally, all other options are passed 146 * to the #GApplication::command-line handler which runs in the primary 147 * instance. 148 * 149 * The complete example can be found here: 150 * [gapplication-example-cmdline2.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-cmdline2.c) 151 * 152 * If handling the commandline requires a lot of work, it may 153 * be better to defer it. 154 * |[<!-- language="C" --> 155 * static gboolean 156 * my_cmdline_handler (gpointer data) 157 * { 158 * GApplicationCommandLine *cmdline = data; 159 * 160 * // do the heavy lifting in an idle 161 * 162 * g_application_command_line_set_exit_status (cmdline, 0); 163 * g_object_unref (cmdline); // this releases the application 164 * 165 * return G_SOURCE_REMOVE; 166 * } 167 * 168 * static int 169 * command_line (GApplication *application, 170 * GApplicationCommandLine *cmdline) 171 * { 172 * // keep the application running until we are done with this commandline 173 * g_application_hold (application); 174 * 175 * g_object_set_data_full (G_OBJECT (cmdline), 176 * "application", application, 177 * (GDestroyNotify)g_application_release); 178 * 179 * g_object_ref (cmdline); 180 * g_idle_add (my_cmdline_handler, cmdline); 181 * 182 * return 0; 183 * } 184 * ]| 185 * In this example the commandline is not completely handled before 186 * the #GApplication::command-line handler returns. Instead, we keep 187 * a reference to the #GApplicationCommandLine object and handle it 188 * later (in this example, in an idle). Note that it is necessary to 189 * hold the application until you are done with the commandline. 190 * 191 * The complete example can be found here: 192 * [gapplication-example-cmdline3.c](https://git.gnome.org/browse/glib/tree/gio/tests/gapplication-example-cmdline3.c) 193 */ 194 public class ApplicationCommandLine : ObjectG 195 { 196 /** the main Gtk struct */ 197 protected GApplicationCommandLine* gApplicationCommandLine; 198 199 /** Get the main Gtk struct */ 200 public GApplicationCommandLine* getApplicationCommandLineStruct(bool transferOwnership = false) 201 { 202 if (transferOwnership) 203 ownedRef = false; 204 return gApplicationCommandLine; 205 } 206 207 /** the main Gtk struct as a void* */ 208 protected override void* getStruct() 209 { 210 return cast(void*)gApplicationCommandLine; 211 } 212 213 protected override void setStruct(GObject* obj) 214 { 215 gApplicationCommandLine = cast(GApplicationCommandLine*)obj; 216 super.setStruct(obj); 217 } 218 219 /** 220 * Sets our main struct and passes it to the parent class. 221 */ 222 public this (GApplicationCommandLine* gApplicationCommandLine, bool ownedRef = false) 223 { 224 this.gApplicationCommandLine = gApplicationCommandLine; 225 super(cast(GObject*)gApplicationCommandLine, ownedRef); 226 } 227 228 229 /** */ 230 public static GType getType() 231 { 232 return g_application_command_line_get_type(); 233 } 234 235 /** 236 * Creates a #GFile corresponding to a filename that was given as part 237 * of the invocation of @cmdline. 238 * 239 * This differs from g_file_new_for_commandline_arg() in that it 240 * resolves relative pathnames using the current working directory of 241 * the invoking process rather than the local process. 242 * 243 * Params: 244 * arg = an argument from @cmdline 245 * 246 * Returns: a new #GFile 247 * 248 * Since: 2.36 249 */ 250 public FileIF createFileForArg(string arg) 251 { 252 auto p = g_application_command_line_create_file_for_arg(gApplicationCommandLine, Str.toStringz(arg)); 253 254 if(p is null) 255 { 256 return null; 257 } 258 259 return ObjectG.getDObject!(FileIF)(cast(GFile*) p, true); 260 } 261 262 /** 263 * Gets the list of arguments that was passed on the command line. 264 * 265 * The strings in the array may contain non-UTF-8 data on UNIX (such as 266 * filenames or arguments given in the system locale) but are always in 267 * UTF-8 on Windows. 268 * 269 * If you wish to use the return value with #GOptionContext, you must 270 * use g_option_context_parse_strv(). 271 * 272 * The return value is %NULL-terminated and should be freed using 273 * g_strfreev(). 274 * 275 * Returns: the string array 276 * containing the arguments (the argv) 277 * 278 * Since: 2.28 279 */ 280 public string[] getArguments() 281 { 282 int argc; 283 284 auto retStr = g_application_command_line_get_arguments(gApplicationCommandLine, &argc); 285 286 scope(exit) Str.freeStringArray(retStr); 287 return Str.toStringArray(retStr, argc); 288 } 289 290 /** 291 * Gets the working directory of the command line invocation. 292 * The string may contain non-utf8 data. 293 * 294 * It is possible that the remote application did not send a working 295 * directory, so this may be %NULL. 296 * 297 * The return value should not be modified or freed and is valid for as 298 * long as @cmdline exists. 299 * 300 * Returns: the current directory, or %NULL 301 * 302 * Since: 2.28 303 */ 304 public string getCwd() 305 { 306 return Str.toString(g_application_command_line_get_cwd(gApplicationCommandLine)); 307 } 308 309 /** 310 * Gets the contents of the 'environ' variable of the command line 311 * invocation, as would be returned by g_get_environ(), ie as a 312 * %NULL-terminated list of strings in the form 'NAME=VALUE'. 313 * The strings may contain non-utf8 data. 314 * 315 * The remote application usually does not send an environment. Use 316 * %G_APPLICATION_SEND_ENVIRONMENT to affect that. Even with this flag 317 * set it is possible that the environment is still not available (due 318 * to invocation messages from other applications). 319 * 320 * The return value should not be modified or freed and is valid for as 321 * long as @cmdline exists. 322 * 323 * See g_application_command_line_getenv() if you are only interested 324 * in the value of a single environment variable. 325 * 326 * Returns: the environment 327 * strings, or %NULL if they were not sent 328 * 329 * Since: 2.28 330 */ 331 public string[] getEnviron() 332 { 333 return Str.toStringArray(g_application_command_line_get_environ(gApplicationCommandLine)); 334 } 335 336 /** 337 * Gets the exit status of @cmdline. See 338 * g_application_command_line_set_exit_status() for more information. 339 * 340 * Returns: the exit status 341 * 342 * Since: 2.28 343 */ 344 public int getExitStatus() 345 { 346 return g_application_command_line_get_exit_status(gApplicationCommandLine); 347 } 348 349 /** 350 * Determines if @cmdline represents a remote invocation. 351 * 352 * Returns: %TRUE if the invocation was remote 353 * 354 * Since: 2.28 355 */ 356 public bool getIsRemote() 357 { 358 return g_application_command_line_get_is_remote(gApplicationCommandLine) != 0; 359 } 360 361 /** 362 * Gets the options there were passed to g_application_command_line(). 363 * 364 * If you did not override local_command_line() then these are the same 365 * options that were parsed according to the #GOptionEntrys added to the 366 * application with g_application_add_main_option_entries() and possibly 367 * modified from your GApplication::handle-local-options handler. 368 * 369 * If no options were sent then an empty dictionary is returned so that 370 * you don't need to check for %NULL. 371 * 372 * Returns: a #GVariantDict with the options 373 * 374 * Since: 2.40 375 */ 376 public VariantDict getOptionsDict() 377 { 378 auto p = g_application_command_line_get_options_dict(gApplicationCommandLine); 379 380 if(p is null) 381 { 382 return null; 383 } 384 385 return new VariantDict(cast(GVariantDict*) p); 386 } 387 388 /** 389 * Gets the platform data associated with the invocation of @cmdline. 390 * 391 * This is a #GVariant dictionary containing information about the 392 * context in which the invocation occurred. It typically contains 393 * information like the current working directory and the startup 394 * notification ID. 395 * 396 * For local invocation, it will be %NULL. 397 * 398 * Returns: the platform data, or %NULL 399 * 400 * Since: 2.28 401 */ 402 public Variant getPlatformData() 403 { 404 auto p = g_application_command_line_get_platform_data(gApplicationCommandLine); 405 406 if(p is null) 407 { 408 return null; 409 } 410 411 return new Variant(cast(GVariant*) p, true); 412 } 413 414 /** 415 * Gets the stdin of the invoking process. 416 * 417 * The #GInputStream can be used to read data passed to the standard 418 * input of the invoking process. 419 * This doesn't work on all platforms. Presently, it is only available 420 * on UNIX when using a DBus daemon capable of passing file descriptors. 421 * If stdin is not available then %NULL will be returned. In the 422 * future, support may be expanded to other platforms. 423 * 424 * You must only call this function once per commandline invocation. 425 * 426 * Returns: a #GInputStream for stdin 427 * 428 * Since: 2.34 429 */ 430 public InputStream getStdin() 431 { 432 auto p = g_application_command_line_get_stdin(gApplicationCommandLine); 433 434 if(p is null) 435 { 436 return null; 437 } 438 439 return ObjectG.getDObject!(InputStream)(cast(GInputStream*) p, true); 440 } 441 442 /** 443 * Gets the value of a particular environment variable of the command 444 * line invocation, as would be returned by g_getenv(). The strings may 445 * contain non-utf8 data. 446 * 447 * The remote application usually does not send an environment. Use 448 * %G_APPLICATION_SEND_ENVIRONMENT to affect that. Even with this flag 449 * set it is possible that the environment is still not available (due 450 * to invocation messages from other applications). 451 * 452 * The return value should not be modified or freed and is valid for as 453 * long as @cmdline exists. 454 * 455 * Params: 456 * name = the environment variable to get 457 * 458 * Returns: the value of the variable, or %NULL if unset or unsent 459 * 460 * Since: 2.28 461 */ 462 public string getenv(string name) 463 { 464 return Str.toString(g_application_command_line_getenv(gApplicationCommandLine, Str.toStringz(name))); 465 } 466 467 /** 468 * Sets the exit status that will be used when the invoking process 469 * exits. 470 * 471 * The return value of the #GApplication::command-line signal is 472 * passed to this function when the handler returns. This is the usual 473 * way of setting the exit status. 474 * 475 * In the event that you want the remote invocation to continue running 476 * and want to decide on the exit status in the future, you can use this 477 * call. For the case of a remote invocation, the remote process will 478 * typically exit when the last reference is dropped on @cmdline. The 479 * exit status of the remote process will be equal to the last value 480 * that was set with this function. 481 * 482 * In the case that the commandline invocation is local, the situation 483 * is slightly more complicated. If the commandline invocation results 484 * in the mainloop running (ie: because the use-count of the application 485 * increased to a non-zero value) then the application is considered to 486 * have been 'successful' in a certain sense, and the exit status is 487 * always zero. If the application use count is zero, though, the exit 488 * status of the local #GApplicationCommandLine is used. 489 * 490 * Params: 491 * exitStatus = the exit status 492 * 493 * Since: 2.28 494 */ 495 public void setExitStatus(int exitStatus) 496 { 497 g_application_command_line_set_exit_status(gApplicationCommandLine, exitStatus); 498 } 499 }