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