1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
2 *
3 * Copyright (C) 2011 Richard Hughes <richard@hughsie.com>
4 *
5 * Licensed under the GNU General Public License Version 2
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 */
21
22 #include "config.h"
23
24 #include <glib-object.h>
25 #include <glib/gi18n.h>
26
27 #include "net-object.h"
28
29 #define NET_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NET_TYPE_OBJECT, NetObjectPrivate))
30
31 struct _NetObjectPrivate
32 {
33 gchar *id;
34 gchar *title;
35 gboolean removable;
36 GCancellable *cancellable;
37 NMClient *client;
38 CcNetworkPanel *panel;
39 };
40
41 enum {
42 PROP_0,
43 PROP_ID,
44 PROP_TITLE,
45 PROP_REMOVABLE,
46 PROP_CLIENT,
47 PROP_CANCELLABLE,
48 PROP_PANEL,
49 PROP_LAST
50 };
51
52 enum {
53 SIGNAL_CHANGED,
54 SIGNAL_REMOVED,
55 SIGNAL_LAST
56 };
57
58 static guint signals[SIGNAL_LAST] = { 0 };
G_DEFINE_TYPE(NetObject,net_object,G_TYPE_OBJECT)59 G_DEFINE_TYPE (NetObject, net_object, G_TYPE_OBJECT)
60
61 void
62 net_object_emit_changed (NetObject *object)
63 {
64 g_return_if_fail (NET_IS_OBJECT (object));
65 g_debug ("NetObject: %s emit 'changed'", object->priv->id);
66 g_signal_emit (object, signals[SIGNAL_CHANGED], 0);
67 }
68
69 void
net_object_emit_removed(NetObject * object)70 net_object_emit_removed (NetObject *object)
71 {
72 g_return_if_fail (NET_IS_OBJECT (object));
73 g_debug ("NetObject: %s emit 'removed'", object->priv->id);
74 g_signal_emit (object, signals[SIGNAL_REMOVED], 0);
75 }
76
77 const gchar *
net_object_get_id(NetObject * object)78 net_object_get_id (NetObject *object)
79 {
80 g_return_val_if_fail (NET_IS_OBJECT (object), NULL);
81 return object->priv->id;
82 }
83
84 void
net_object_set_id(NetObject * object,const gchar * id)85 net_object_set_id (NetObject *object, const gchar *id)
86 {
87 g_return_if_fail (NET_IS_OBJECT (object));
88 g_clear_pointer (&object->priv->id, g_free);
89 object->priv->id = g_strdup (id);
90 g_object_notify (G_OBJECT (object), "id");
91 }
92
93 gboolean
net_object_get_removable(NetObject * object)94 net_object_get_removable (NetObject *object)
95 {
96 g_return_val_if_fail (NET_IS_OBJECT (object), FALSE);
97 return object->priv->removable;
98 }
99
100 const gchar *
net_object_get_title(NetObject * object)101 net_object_get_title (NetObject *object)
102 {
103 g_return_val_if_fail (NET_IS_OBJECT (object), NULL);
104 return object->priv->title;
105 }
106
107 void
net_object_set_title(NetObject * object,const gchar * title)108 net_object_set_title (NetObject *object, const gchar *title)
109 {
110 g_return_if_fail (NET_IS_OBJECT (object));
111 g_clear_pointer (&object->priv->title, g_free);
112 object->priv->title = g_strdup (title);
113 g_object_notify (G_OBJECT (object), "title");
114 }
115
116 NMClient *
net_object_get_client(NetObject * object)117 net_object_get_client (NetObject *object)
118 {
119 g_return_val_if_fail (NET_IS_OBJECT (object), NULL);
120 return object->priv->client;
121 }
122
123 GCancellable *
net_object_get_cancellable(NetObject * object)124 net_object_get_cancellable (NetObject *object)
125 {
126 g_return_val_if_fail (NET_IS_OBJECT (object), NULL);
127 return object->priv->cancellable;
128 }
129
130 CcNetworkPanel *
net_object_get_panel(NetObject * object)131 net_object_get_panel (NetObject *object)
132 {
133 g_return_val_if_fail (NET_IS_OBJECT (object), NULL);
134 return object->priv->panel;
135 }
136
137 GtkWidget *
net_object_add_to_notebook(NetObject * object,GtkNotebook * notebook,GtkSizeGroup * heading_size_group)138 net_object_add_to_notebook (NetObject *object,
139 GtkNotebook *notebook,
140 GtkSizeGroup *heading_size_group)
141 {
142 GtkWidget *widget;
143 NetObjectClass *klass = NET_OBJECT_GET_CLASS (object);
144 if (klass->add_to_notebook != NULL) {
145 widget = klass->add_to_notebook (object,
146 notebook,
147 heading_size_group);
148 g_object_set_data_full (G_OBJECT (widget),
149 "NetObject::id",
150 g_strdup (object->priv->id),
151 g_free);
152 return widget;
153 }
154 g_debug ("no klass->add_to_notebook for %s", object->priv->id);
155 return NULL;
156 }
157
158 void
net_object_delete(NetObject * object)159 net_object_delete (NetObject *object)
160 {
161 NetObjectClass *klass = NET_OBJECT_GET_CLASS (object);
162 if (klass->delete != NULL)
163 klass->delete (object);
164 }
165
166 void
net_object_refresh(NetObject * object)167 net_object_refresh (NetObject *object)
168 {
169 NetObjectClass *klass = NET_OBJECT_GET_CLASS (object);
170 if (klass->refresh != NULL)
171 klass->refresh (object);
172 }
173
174 void
net_object_edit(NetObject * object)175 net_object_edit (NetObject *object)
176 {
177 NetObjectClass *klass = NET_OBJECT_GET_CLASS (object);
178 if (klass->edit != NULL)
179 klass->edit (object);
180 }
181
182 /**
183 * net_object_get_property:
184 **/
185 static void
net_object_get_property(GObject * object_,guint prop_id,GValue * value,GParamSpec * pspec)186 net_object_get_property (GObject *object_,
187 guint prop_id,
188 GValue *value,
189 GParamSpec *pspec)
190 {
191 NetObject *object = NET_OBJECT (object_);
192 NetObjectPrivate *priv = object->priv;
193
194 switch (prop_id) {
195 case PROP_ID:
196 g_value_set_string (value, priv->id);
197 break;
198 case PROP_TITLE:
199 g_value_set_string (value, priv->title);
200 break;
201 case PROP_REMOVABLE:
202 g_value_set_boolean (value, priv->removable);
203 break;
204 case PROP_CLIENT:
205 g_value_set_pointer (value, priv->client);
206 break;
207 case PROP_CANCELLABLE:
208 g_value_set_object (value, priv->cancellable);
209 break;
210 case PROP_PANEL:
211 g_value_set_pointer (value, priv->panel);
212 break;
213 default:
214 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
215 break;
216 }
217 }
218
219 /**
220 * net_object_set_property:
221 **/
222 static void
net_object_set_property(GObject * object_,guint prop_id,const GValue * value,GParamSpec * pspec)223 net_object_set_property (GObject *object_,
224 guint prop_id,
225 const GValue *value,
226 GParamSpec *pspec)
227 {
228 NetObject *object = NET_OBJECT (object_);
229 NetObjectPrivate *priv = object->priv;
230
231 switch (prop_id) {
232 case PROP_ID:
233 g_free (priv->id);
234 priv->id = g_strdup (g_value_get_string (value));
235 break;
236 case PROP_TITLE:
237 g_free (priv->title);
238 priv->title = g_strdup (g_value_get_string (value));
239 break;
240 case PROP_REMOVABLE:
241 priv->removable = g_value_get_boolean (value);
242 break;
243 case PROP_CLIENT:
244 priv->client = g_value_get_pointer (value);
245 if (priv->client)
246 g_object_add_weak_pointer (G_OBJECT (priv->client), (gpointer *) (&priv->client));
247 break;
248 case PROP_CANCELLABLE:
249 g_assert (!priv->cancellable);
250 priv->cancellable = g_value_dup_object (value);
251 break;
252 case PROP_PANEL:
253 g_assert (!priv->panel);
254 priv->panel = g_value_get_pointer (value);
255 if (priv->panel)
256 g_object_add_weak_pointer (G_OBJECT (priv->panel), (gpointer *) (&priv->panel));
257 break;
258 default:
259 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
260 break;
261 }
262 }
263
264 static void
net_object_finalize(GObject * object)265 net_object_finalize (GObject *object)
266 {
267 NetObject *nm_object = NET_OBJECT (object);
268 NetObjectPrivate *priv = nm_object->priv;
269
270 g_free (priv->id);
271 g_free (priv->title);
272 if (priv->cancellable != NULL)
273 g_object_unref (priv->cancellable);
274
275 if (priv->client)
276 g_object_remove_weak_pointer (G_OBJECT (priv->client), (gpointer *) (&priv->client));
277 if (priv->panel)
278 g_object_remove_weak_pointer (G_OBJECT (priv->panel), (gpointer *) (&priv->panel));
279
280 G_OBJECT_CLASS (net_object_parent_class)->finalize (object);
281 }
282
283 static void
net_object_class_init(NetObjectClass * klass)284 net_object_class_init (NetObjectClass *klass)
285 {
286 GParamSpec *pspec;
287 GObjectClass *object_class = G_OBJECT_CLASS (klass);
288 object_class->finalize = net_object_finalize;
289 object_class->get_property = net_object_get_property;
290 object_class->set_property = net_object_set_property;
291
292 pspec = g_param_spec_string ("id", NULL, NULL,
293 NULL,
294 G_PARAM_READWRITE);
295 g_object_class_install_property (object_class, PROP_ID, pspec);
296
297 pspec = g_param_spec_string ("title", NULL, NULL,
298 NULL,
299 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
300 g_object_class_install_property (object_class, PROP_TITLE, pspec);
301
302 pspec = g_param_spec_boolean ("removable", NULL, NULL,
303 TRUE,
304 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
305 g_object_class_install_property (object_class, PROP_REMOVABLE, pspec);
306
307 pspec = g_param_spec_pointer ("client", NULL, NULL,
308 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
309 g_object_class_install_property (object_class, PROP_CLIENT, pspec);
310
311 pspec = g_param_spec_object ("cancellable", NULL, NULL,
312 G_TYPE_CANCELLABLE,
313 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
314 g_object_class_install_property (object_class, PROP_CANCELLABLE, pspec);
315
316 pspec = g_param_spec_pointer ("panel", NULL, NULL,
317 G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
318 g_object_class_install_property (object_class, PROP_PANEL, pspec);
319
320 signals[SIGNAL_CHANGED] =
321 g_signal_new ("changed",
322 G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
323 G_STRUCT_OFFSET (NetObjectClass, changed),
324 NULL, NULL, g_cclosure_marshal_VOID__VOID,
325 G_TYPE_NONE, 0);
326 signals[SIGNAL_REMOVED] =
327 g_signal_new ("removed",
328 G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
329 G_STRUCT_OFFSET (NetObjectClass, changed),
330 NULL, NULL, g_cclosure_marshal_VOID__VOID,
331 G_TYPE_NONE, 0);
332
333 g_type_class_add_private (klass, sizeof (NetObjectPrivate));
334 }
335
336 static void
net_object_init(NetObject * object)337 net_object_init (NetObject *object)
338 {
339 object->priv = NET_OBJECT_GET_PRIVATE (object);
340 }
341
342