1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.1+
6 */
7
8 /**
9 * SECTION:as-launchable
10 * @short_description: Object representing a way to launch the application.
11 * @include: appstream-glib.h
12 * @stability: Stable
13 *
14 * Applications may be launchable using a different application ID to the
15 * component ID or may be launchable in some other way, e.g D-Bus, or using
16 * the default terminal emulator.
17 *
18 * See also: #AsApp
19 */
20
21 #include "config.h"
22
23 #include "as-node-private.h"
24 #include "as-launchable-private.h"
25 #include "as-ref-string.h"
26 #include "as-utils-private.h"
27 #include "as-yaml.h"
28
29 typedef struct
30 {
31 AsLaunchableKind kind;
32 AsRefString *value;
33 } AsLaunchablePrivate;
34
G_DEFINE_TYPE_WITH_PRIVATE(AsLaunchable,as_launchable,G_TYPE_OBJECT)35 G_DEFINE_TYPE_WITH_PRIVATE (AsLaunchable, as_launchable, G_TYPE_OBJECT)
36
37 #define GET_PRIVATE(o) (as_launchable_get_instance_private (o))
38
39 static void
40 as_launchable_finalize (GObject *object)
41 {
42 AsLaunchable *launchable = AS_LAUNCHABLE (object);
43 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
44
45 if (priv->value != NULL)
46 as_ref_string_unref (priv->value);
47
48 G_OBJECT_CLASS (as_launchable_parent_class)->finalize (object);
49 }
50
51 static void
as_launchable_init(AsLaunchable * launchable)52 as_launchable_init (AsLaunchable *launchable)
53 {
54 }
55
56 static void
as_launchable_class_init(AsLaunchableClass * klass)57 as_launchable_class_init (AsLaunchableClass *klass)
58 {
59 GObjectClass *object_class = G_OBJECT_CLASS (klass);
60 object_class->finalize = as_launchable_finalize;
61 }
62
63
64 /**
65 * as_launchable_kind_from_string:
66 * @kind: the string.
67 *
68 * Converts the text representation to an enumerated value.
69 *
70 * Returns: (transfer full): a #AsLaunchableKind, or %AS_LAUNCHABLE_KIND_UNKNOWN for unknown.
71 *
72 * Since: 0.6.13
73 **/
74 AsLaunchableKind
as_launchable_kind_from_string(const gchar * kind)75 as_launchable_kind_from_string (const gchar *kind)
76 {
77 if (g_strcmp0 (kind, "desktop-id") == 0)
78 return AS_LAUNCHABLE_KIND_DESKTOP_ID;
79 if (g_strcmp0 (kind, "service") == 0)
80 return AS_LAUNCHABLE_KIND_SERVICE;
81 if (g_strcmp0 (kind, "cockpit-manifest") == 0)
82 return AS_LAUNCHABLE_KIND_COCKPIT_MANIFEST;
83 if (g_strcmp0 (kind, "url") == 0)
84 return AS_LAUNCHABLE_KIND_URL;
85 return AS_LAUNCHABLE_KIND_UNKNOWN;
86 }
87
88 /**
89 * as_launchable_kind_to_string:
90 * @kind: the #AsLaunchableKind.
91 *
92 * Converts the enumerated value to an text representation.
93 *
94 * Returns: string version of @kind
95 *
96 * Since: 0.6.13
97 **/
98 const gchar *
as_launchable_kind_to_string(AsLaunchableKind kind)99 as_launchable_kind_to_string (AsLaunchableKind kind)
100 {
101 if (kind == AS_LAUNCHABLE_KIND_DESKTOP_ID)
102 return "desktop-id";
103 if (kind == AS_LAUNCHABLE_KIND_SERVICE)
104 return "service";
105 if (kind == AS_LAUNCHABLE_KIND_COCKPIT_MANIFEST)
106 return "cockpit-manifest";
107 if (kind == AS_LAUNCHABLE_KIND_URL)
108 return "url";
109 return NULL;
110 }
111
112 /**
113 * as_launchable_get_value:
114 * @launchable: a #AsLaunchable instance.
115 *
116 * Gets the value to use for the launchable.
117 *
118 * Returns: usually a desktop ID, e.g. "gimp.desktop"
119 *
120 * Since: 0.6.13
121 **/
122 const gchar *
as_launchable_get_value(AsLaunchable * launchable)123 as_launchable_get_value (AsLaunchable *launchable)
124 {
125 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
126 g_return_val_if_fail (AS_IS_LAUNCHABLE (launchable), NULL);
127 return priv->value;
128 }
129
130 /**
131 * as_launchable_get_kind:
132 * @launchable: a #AsLaunchable instance.
133 *
134 * Gets the launchable kind.
135 *
136 * Returns: the #AsLaunchableKind
137 *
138 * Since: 0.6.13
139 **/
140 AsLaunchableKind
as_launchable_get_kind(AsLaunchable * launchable)141 as_launchable_get_kind (AsLaunchable *launchable)
142 {
143 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
144 g_return_val_if_fail (AS_IS_LAUNCHABLE (launchable), AS_LAUNCHABLE_KIND_UNKNOWN);
145 return priv->kind;
146 }
147
148 /**
149 * as_launchable_set_value:
150 * @launchable: a #AsLaunchable instance.
151 * @value: the URL.
152 *
153 * Sets the fully-qualified mirror URL to use for the launchable.
154 *
155 * Since: 0.6.13
156 **/
157 void
as_launchable_set_value(AsLaunchable * launchable,const gchar * value)158 as_launchable_set_value (AsLaunchable *launchable, const gchar *value)
159 {
160 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
161 g_return_if_fail (AS_IS_LAUNCHABLE (launchable));
162 as_ref_string_assign_safe (&priv->value, value);
163 }
164
165 /**
166 * as_launchable_set_kind:
167 * @launchable: a #AsLaunchable instance.
168 * @kind: the #AsLaunchableKind, e.g. %AS_LAUNCHABLE_KIND_DESKTOP_ID.
169 *
170 * Sets the launchable kind.
171 *
172 * Since: 0.6.13
173 **/
174 void
as_launchable_set_kind(AsLaunchable * launchable,AsLaunchableKind kind)175 as_launchable_set_kind (AsLaunchable *launchable, AsLaunchableKind kind)
176 {
177 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
178 g_return_if_fail (AS_IS_LAUNCHABLE (launchable));
179 priv->kind = kind;
180 }
181
182 /**
183 * as_launchable_node_insert: (skip)
184 * @launchable: a #AsLaunchable instance.
185 * @parent: the parent #GNode to use..
186 * @ctx: the #AsNodeContext
187 *
188 * Inserts the launchable into the DOM tree.
189 *
190 * Returns: (transfer none): A populated #GNode
191 *
192 * Since: 0.6.13
193 **/
194 GNode *
as_launchable_node_insert(AsLaunchable * launchable,GNode * parent,AsNodeContext * ctx)195 as_launchable_node_insert (AsLaunchable *launchable, GNode *parent, AsNodeContext *ctx)
196 {
197 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
198 GNode *n;
199 g_return_val_if_fail (AS_IS_LAUNCHABLE (launchable), NULL);
200 n = as_node_insert (parent, "launchable",
201 priv->value,
202 AS_NODE_INSERT_FLAG_NONE,
203 NULL);
204 if (priv->kind != AS_LAUNCHABLE_KIND_UNKNOWN)
205 as_node_add_attribute (n, "type", as_launchable_kind_to_string (priv->kind));
206 return n;
207 }
208
209 /**
210 * as_launchable_node_parse_dep11:
211 * @launchable: a #AsLaunchable instance.
212 * @node: a #GNode.
213 * @ctx: a #AsNodeContext.
214 * @error: A #GError or %NULL.
215 *
216 * Populates the object from a DEP-11 node.
217 *
218 * Returns: %TRUE for success
219 *
220 * Since: 0.3.0
221 **/
222 gboolean
as_launchable_node_parse_dep11(AsLaunchable * launchable,GNode * node,AsNodeContext * ctx,GError ** error)223 as_launchable_node_parse_dep11 (AsLaunchable *launchable, GNode *node,
224 AsNodeContext *ctx, GError **error)
225 {
226 return TRUE;
227 }
228
229 /**
230 * as_launchable_node_parse:
231 * @launchable: a #AsLaunchable instance.
232 * @node: a #GNode.
233 * @ctx: a #AsNodeContext.
234 * @error: A #GError or %NULL.
235 *
236 * Populates the object from a DOM node.
237 *
238 * Returns: %TRUE for success
239 *
240 * Since: 0.6.13
241 **/
242 gboolean
as_launchable_node_parse(AsLaunchable * launchable,GNode * node,AsNodeContext * ctx,GError ** error)243 as_launchable_node_parse (AsLaunchable *launchable, GNode *node,
244 AsNodeContext *ctx, GError **error)
245 {
246 AsLaunchablePrivate *priv = GET_PRIVATE (launchable);
247 g_return_val_if_fail (AS_IS_LAUNCHABLE (launchable), FALSE);
248 priv->kind = as_launchable_kind_from_string (as_node_get_attribute (node, "type"));
249 as_ref_string_assign (&priv->value, as_node_get_data_as_refstr (node));
250 return TRUE;
251 }
252
253 /**
254 * as_launchable_new:
255 *
256 * Creates a new #AsLaunchable.
257 *
258 * Returns: (transfer full): a #AsLaunchable
259 *
260 * Since: 0.6.13
261 **/
262 AsLaunchable *
as_launchable_new(void)263 as_launchable_new (void)
264 {
265 AsLaunchable *launchable;
266 launchable = g_object_new (AS_TYPE_LAUNCHABLE, NULL);
267 return AS_LAUNCHABLE (launchable);
268 }
269