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