1 | /* |
2 | * Copyright 2020 Frederic Martinsons |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Lesser General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2.1 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Lesser General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Lesser General Public |
15 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
16 | * |
17 | * Author: Frederic Martinsons <frederic.martinsons@sigfox.com> |
18 | */ |
19 | |
20 | #include "config.h" |
21 | |
22 | #include <gio/gio.h> |
23 | |
24 | #if defined(G_OS_UNIX) && !defined(HAVE_COCOA) |
25 | #include <gio/gdesktopappinfo.h> |
26 | #endif |
27 | |
28 | #include <gi18n.h> |
29 | |
30 | #include "gio-tool.h" |
31 | |
32 | static const GOptionEntry entries[] = { |
33 | { NULL } |
34 | }; |
35 | |
36 | int |
37 | handle_launch (int argc, char *argv[], gboolean do_help) |
38 | { |
39 | GOptionContext *context; |
40 | GError *error = NULL; |
41 | #if defined(G_OS_UNIX) && !defined(HAVE_COCOA) |
42 | int i; |
43 | GAppInfo *app = NULL; |
44 | GAppLaunchContext *app_context = NULL; |
45 | GKeyFile *keyfile = NULL; |
46 | GList *args = NULL; |
47 | char *desktop_file = NULL; |
48 | #endif |
49 | int retval; |
50 | |
51 | g_set_prgname (prgname: "gio launch" ); |
52 | |
53 | /* Translators: commandline placeholder */ |
54 | context = g_option_context_new (_("DESKTOP-FILE [FILE-ARG …]" )); |
55 | g_option_context_set_help_enabled (context, FALSE); |
56 | g_option_context_set_summary (context, |
57 | _("Launch an application from a desktop file, passing optional filename arguments to it." )); |
58 | g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); |
59 | |
60 | if (do_help) |
61 | { |
62 | show_help (context, NULL); |
63 | g_option_context_free (context); |
64 | return 0; |
65 | } |
66 | |
67 | if (!g_option_context_parse (context, argc: &argc, argv: &argv, error: &error)) |
68 | { |
69 | show_help (context, message: error->message); |
70 | g_error_free (error); |
71 | g_option_context_free (context); |
72 | return 1; |
73 | } |
74 | |
75 | if (argc < 2) |
76 | { |
77 | show_help (context, _("No desktop file given" )); |
78 | g_option_context_free (context); |
79 | return 1; |
80 | } |
81 | |
82 | g_option_context_free (context); |
83 | |
84 | #if !defined(G_OS_UNIX) || defined(HAVE_COCOA) |
85 | print_error (_("The launch command is not currently supported on this platform" )); |
86 | retval = 1; |
87 | #else |
88 | retval = 0; |
89 | desktop_file = argv[1]; |
90 | |
91 | /* Use keyfile api for loading desktop app in order to check for |
92 | * - not existing file. |
93 | * - invalid keyfile format. |
94 | */ |
95 | keyfile = g_key_file_new (); |
96 | if (!g_key_file_load_from_file (key_file: keyfile, file: desktop_file, flags: G_KEY_FILE_NONE, error: &error)) |
97 | { |
98 | print_error (_("Unable to load ‘%s‘: %s" ), desktop_file, error->message); |
99 | g_clear_error (err: &error); |
100 | retval = 1; |
101 | } |
102 | else |
103 | { |
104 | app = (GAppInfo*)g_desktop_app_info_new_from_keyfile (key_file: keyfile); |
105 | if (!app) |
106 | { |
107 | print_error (_("Unable to load application information for ‘%s‘" ), desktop_file); |
108 | retval = 1; |
109 | } |
110 | else |
111 | { |
112 | for (i = 2; i < argc; i++) |
113 | { |
114 | args = g_list_append (list: args, data: g_file_new_for_commandline_arg (arg: argv[i])); |
115 | } |
116 | app_context = g_app_launch_context_new (); |
117 | if (!g_app_info_launch (appinfo: app, files: args, context: app_context, error: &error)) |
118 | { |
119 | print_error (_("Unable to launch application ‘%s’: %s" ), desktop_file, error->message); |
120 | g_clear_error (err: &error); |
121 | retval = 1; |
122 | } |
123 | g_list_free_full (list: args, free_func: g_object_unref); |
124 | g_clear_object (&app_context); |
125 | } |
126 | g_clear_object (&app); |
127 | } |
128 | g_key_file_free (key_file: keyfile); |
129 | #endif |
130 | return retval; |
131 | } |
132 | |