]> www.fi.muni.cz Git - evince.git/blob - backend/ev-link-action.c
Rework links system, it adds support for remote links now and it makes
[evince.git] / backend / ev-link-action.c
1 /* this file is part of evince, a gnome document viewer
2  *
3  *  Copyright (C) 2006 Carlos Garcia Campos <carlosgc@gnome.org>
4  *  Copyright (C) 2005 Red Hat, Inc.
5  *
6  * Evince is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Evince is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
19  */
20
21 #include "ev-link-action.h"
22
23 enum {
24         PROP_0,
25         PROP_TYPE,
26         PROP_DEST,
27         PROP_URI,
28         PROP_FILENAME,
29         PROP_PARAMS
30 };
31
32 struct _EvLinkAction {
33         GObject base_instance;
34
35         EvLinkActionPrivate *priv;
36 };
37
38 struct _EvLinkActionClass {
39         GObjectClass base_class;
40 };
41
42 struct _EvLinkActionPrivate {
43         EvLinkActionType  type;
44         EvLinkDest       *dest;
45         gchar            *uri;
46         gchar            *filename;
47         gchar            *params;
48 };
49
50 G_DEFINE_TYPE (EvLinkAction, ev_link_action, G_TYPE_OBJECT)
51
52 #define EV_LINK_ACTION_GET_PRIVATE(object) \
53         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK_ACTION, EvLinkActionPrivate))
54
55 GType
56 ev_link_action_type_get_type (void)
57 {
58         static GType type = 0;
59
60         if (G_UNLIKELY (type == 0)) {
61                 static const GEnumValue values[] = {
62                         { EV_LINK_ACTION_TYPE_GOTO_DEST, "EV_LINK_ACTION_TYPE_GOTO_DEST", "goto-dest" },
63                         { EV_LINK_ACTION_TYPE_GOTO_REMOTE, "EV_LINK_ACTION_TYPE_GOTO_REMOTE", "goto-remote" },
64                         { EV_LINK_ACTION_TYPE_LAUNCH, "EV_LINK_ACTION_TYPE_LAUNCH", "launch" },
65                         { EV_LINK_ACTION_TYPE_EXTERNAL_URI, "EV_LINK_ACTION_TYPE_EXTERNAL_URI", "external-uri"},
66                         { 0, NULL, NULL }
67                 };
68
69                 type = g_enum_register_static ("EvLinkActionType", values);
70         }
71
72         return type;
73 }
74
75 EvLinkActionType
76 ev_link_action_get_action_type (EvLinkAction *self)
77 {
78         g_return_val_if_fail (EV_IS_LINK_ACTION (self), 0);
79
80         return self->priv->type;
81 }
82
83 EvLinkDest *
84 ev_link_action_get_dest (EvLinkAction *self)
85 {
86         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
87
88         return self->priv->dest;
89 }
90
91 const gchar *
92 ev_link_action_get_uri (EvLinkAction *self)
93 {
94         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
95
96         return self->priv->uri;
97 }
98
99 const gchar *
100 ev_link_action_get_filename (EvLinkAction *self)
101 {
102         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
103
104         return self->priv->filename;
105 }
106
107 const gchar *
108 ev_link_action_get_params (EvLinkAction *self)
109 {
110         g_return_val_if_fail (EV_IS_LINK_ACTION (self), NULL);
111
112         return self->priv->params;
113 }
114
115 static void
116 ev_link_action_get_property (GObject    *object,
117                              guint       prop_id,
118                              GValue     *value,
119                              GParamSpec *param_spec)
120 {
121         EvLinkAction *self;
122
123         self = EV_LINK_ACTION (object);
124
125         switch (prop_id) {
126                 case PROP_TYPE:
127                         g_value_set_enum (value, self->priv->type);
128                         break;
129                 case PROP_DEST:
130                         g_value_set_pointer (value, self->priv->dest);
131                         break;
132                 case PROP_URI:
133                         g_value_set_string (value, self->priv->uri);
134                         break;
135                 case PROP_FILENAME:
136                         g_value_set_string (value, self->priv->filename);
137                         break;
138                 case PROP_PARAMS:
139                         g_value_set_string (value, self->priv->params);
140                         break;
141                 default:
142                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
143                                                            prop_id,
144                                                            param_spec);
145                         break;
146         }
147 }
148
149 static void
150 ev_link_action_set_property (GObject      *object,
151                              guint         prop_id,
152                              const GValue *value,
153                              GParamSpec   *param_spec)
154 {
155         EvLinkAction *self = EV_LINK_ACTION (object);
156
157         switch (prop_id) {
158                 case PROP_TYPE:
159                         self->priv->type = g_value_get_enum (value);
160                         break;
161                 case PROP_DEST:
162                         self->priv->dest = g_value_get_pointer (value);
163                         break;
164                 case PROP_URI:
165                         g_free (self->priv->uri);
166                         self->priv->uri = g_value_dup_string (value);
167                         break;
168                 case PROP_FILENAME:
169                         g_free (self->priv->filename);
170                         self->priv->filename = g_value_dup_string (value);
171                         break;
172                 case PROP_PARAMS:
173                         g_free (self->priv->params);
174                         self->priv->params = g_value_dup_string (value);
175                         break;
176                 default:
177                         G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
178                                                            prop_id,
179                                                            param_spec);
180                         break;
181         }
182 }
183
184 static void
185 ev_link_action_finalize (GObject *object)
186 {
187         EvLinkActionPrivate *priv;
188
189         priv = EV_LINK_ACTION (object)->priv;
190
191         if (priv->dest) {
192                 g_object_unref (priv->dest);
193                 priv->dest = NULL;
194         }
195
196         if (priv->uri) {
197                 g_free (priv->uri);
198                 priv->uri = NULL;
199         }
200
201         if (priv->filename) {
202                 g_free (priv->filename);
203                 priv->filename = NULL;
204         }
205
206         if (priv->params) {
207                 g_free (priv->params);
208                 priv->params = NULL;
209         }
210
211         G_OBJECT_CLASS (ev_link_action_parent_class)->finalize (object);
212 }
213
214 static void
215 ev_link_action_init (EvLinkAction *ev_link_action)
216 {
217         ev_link_action->priv = EV_LINK_ACTION_GET_PRIVATE (ev_link_action);
218
219         ev_link_action->priv->dest = NULL;
220         ev_link_action->priv->uri = NULL;
221         ev_link_action->priv->filename = NULL;
222         ev_link_action->priv->params = NULL;
223 }
224
225 static void
226 ev_link_action_class_init (EvLinkActionClass *ev_link_action_class)
227 {
228         GObjectClass *g_object_class;
229
230         g_object_class = G_OBJECT_CLASS (ev_link_action_class);
231
232         g_object_class->set_property = ev_link_action_set_property;
233         g_object_class->get_property = ev_link_action_get_property;
234
235         g_object_class->finalize = ev_link_action_finalize;
236
237         g_type_class_add_private (g_object_class, sizeof (EvLinkActionPrivate));
238
239         g_object_class_install_property (g_object_class,
240                                          PROP_TYPE,
241                                          g_param_spec_enum  ("type",
242                                                              "Action Type",
243                                                              "The link action type",
244                                                              EV_TYPE_LINK_ACTION_TYPE,
245                                                              EV_LINK_ACTION_TYPE_GOTO_DEST,
246                                                              G_PARAM_READWRITE |
247                                                              G_PARAM_CONSTRUCT_ONLY));
248         g_object_class_install_property (g_object_class,
249                                          PROP_DEST,
250                                          g_param_spec_pointer ("dest",
251                                                                "Action destination",
252                                                                "The link action destination",
253                                                                G_PARAM_READWRITE |
254                                                                G_PARAM_CONSTRUCT_ONLY));
255         g_object_class_install_property (g_object_class,
256                                          PROP_URI,
257                                          g_param_spec_string ("uri",
258                                                               "Link Action URI",
259                                                               "The link action URI",
260                                                               NULL,
261                                                               G_PARAM_READWRITE |
262                                                               G_PARAM_CONSTRUCT_ONLY));
263         g_object_class_install_property (g_object_class,
264                                          PROP_FILENAME,
265                                          g_param_spec_string ("filename",
266                                                               "Filename",
267                                                               "The link action filename",
268                                                               NULL,
269                                                               G_PARAM_READWRITE |
270                                                               G_PARAM_CONSTRUCT_ONLY));
271         g_object_class_install_property (g_object_class,
272                                          PROP_PARAMS,
273                                          g_param_spec_string ("params",
274                                                               "Params",
275                                                               "The link action params",
276                                                               NULL,
277                                                               G_PARAM_READWRITE |
278                                                               G_PARAM_CONSTRUCT_ONLY));
279 }
280
281 EvLinkAction *
282 ev_link_action_new_dest (EvLinkDest *dest)
283 {
284         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
285                                              "dest", dest,
286                                              "type", EV_LINK_ACTION_TYPE_GOTO_DEST,
287                                              NULL));
288 }
289
290 EvLinkAction *
291 ev_link_action_new_remote (EvLinkDest  *dest,
292                            const gchar *filename)
293 {
294         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
295                                              "dest", dest,
296                                              "filename", filename,
297                                              "type", EV_LINK_ACTION_TYPE_GOTO_REMOTE,
298                                              NULL));
299 }
300
301 EvLinkAction *
302 ev_link_action_new_external_uri (const gchar *uri)
303 {
304         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
305                                              "uri", uri,
306                                              "type", EV_LINK_ACTION_TYPE_EXTERNAL_URI,
307                                              NULL));
308 }
309
310 EvLinkAction *
311 ev_link_action_new_launch (const gchar *filename,
312                            const gchar *params)
313 {
314         return EV_LINK_ACTION (g_object_new (EV_TYPE_LINK_ACTION,
315                                              "filename", filename,
316                                              "params", params,
317                                              "type", EV_LINK_ACTION_TYPE_LAUNCH,
318                                              NULL));
319 }