device: renew dhcp leases on awake for software devices
[NetworkManager.git] / libnm / nm-vpn-connection.c
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /*
3  * This library is free software; you can redistribute it and/or
4  * modify it under the terms of the GNU Lesser General Public
5  * License as published by the Free Software Foundation; either
6  * version 2 of the License, or (at your option) any later version.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library; if not, write to the
15  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16  * Boston, MA 02110-1301 USA.
17  *
18  * Copyright 2007 - 2008 Novell, Inc.
19  * Copyright 2007 - 2012 Red Hat, Inc.
20  */
21
22 #include "nm-default.h"
23
24 #include <string.h>
25
26 #include "nm-vpn-connection.h"
27 #include "nm-dbus-interface.h"
28 #include "nm-utils.h"
29 #include "nm-object-private.h"
30 #include "nm-active-connection.h"
31 #include "nm-dbus-helpers.h"
32
33 #include "nmdbus-vpn-connection.h"
34
35 G_DEFINE_TYPE (NMVpnConnection, nm_vpn_connection, NM_TYPE_ACTIVE_CONNECTION)
36
37 #define NM_VPN_CONNECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_VPN_CONNECTION, NMVpnConnectionPrivate))
38
39 typedef struct {
40         char *banner;
41         NMVpnConnectionState vpn_state;
42 } NMVpnConnectionPrivate;
43
44 enum {
45         PROP_0,
46         PROP_VPN_STATE,
47         PROP_BANNER,
48
49         LAST_PROP
50 };
51
52 enum {
53         VPN_STATE_CHANGED,
54
55         LAST_SIGNAL
56 };
57
58 static guint signals[LAST_SIGNAL] = { 0 };
59
60
61 /**
62  * nm_vpn_connection_get_banner:
63  * @vpn: a #NMVpnConnection
64  *
65  * Gets the VPN login banner of the active #NMVpnConnection.
66  *
67  * Returns: the VPN login banner of the VPN connection. This is the internal
68  * string used by the connection, and must not be modified.
69  **/
70 const char *
71 nm_vpn_connection_get_banner (NMVpnConnection *vpn)
72 {
73         NMVpnConnectionPrivate *priv;
74
75         g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NULL);
76
77         priv = NM_VPN_CONNECTION_GET_PRIVATE (vpn);
78
79         if (priv->vpn_state != NM_VPN_CONNECTION_STATE_ACTIVATED)
80                 return NULL;
81
82         return priv->banner;
83 }
84
85 /**
86  * nm_vpn_connection_get_vpn_state:
87  * @vpn: a #NMVpnConnection
88  *
89  * Gets the current #NMVpnConnection state.
90  *
91  * Returns: the VPN state of the active VPN connection.
92  **/
93 NMVpnConnectionState
94 nm_vpn_connection_get_vpn_state (NMVpnConnection *vpn)
95 {
96         g_return_val_if_fail (NM_IS_VPN_CONNECTION (vpn), NM_VPN_CONNECTION_STATE_UNKNOWN);
97
98         return NM_VPN_CONNECTION_GET_PRIVATE (vpn)->vpn_state;
99 }
100
101 static void
102 vpn_state_changed_proxy (NMDBusVpnConnection *proxy,
103                          guint vpn_state,
104                          guint reason,
105                          gpointer user_data)
106 {
107         NMVpnConnection *connection = NM_VPN_CONNECTION (user_data);
108         NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
109
110         if (priv->vpn_state != vpn_state) {
111                 priv->vpn_state = vpn_state;
112                 g_signal_emit (connection, signals[VPN_STATE_CHANGED], 0, vpn_state, reason);
113                 g_object_notify (G_OBJECT (connection), NM_VPN_CONNECTION_VPN_STATE);
114         }
115 }
116
117 /*****************************************************************************/
118
119 static void
120 nm_vpn_connection_init (NMVpnConnection *connection)
121 {
122         NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
123
124         priv->vpn_state = NM_VPN_CONNECTION_STATE_UNKNOWN;
125 }
126
127 static void
128 init_dbus (NMObject *object)
129 {
130         NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object);
131         const NMPropertiesInfo property_info[] = {
132                 { NM_VPN_CONNECTION_BANNER,    &priv->banner },
133                 { NM_VPN_CONNECTION_VPN_STATE, &priv->vpn_state },
134                 { NULL },
135         };
136         GDBusProxy *proxy;
137
138         NM_OBJECT_CLASS (nm_vpn_connection_parent_class)->init_dbus (object);
139
140         _nm_object_register_properties (object,
141                                         NM_DBUS_INTERFACE_VPN_CONNECTION,
142                                         property_info);
143
144         proxy = _nm_object_get_proxy (object, NM_DBUS_INTERFACE_VPN_CONNECTION);
145         g_signal_connect (proxy, "vpn-state-changed",
146                           G_CALLBACK (vpn_state_changed_proxy), object);
147 }
148
149 static void
150 finalize (GObject *object)
151 {
152         NMVpnConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (object);
153
154         g_free (priv->banner);
155
156         G_OBJECT_CLASS (nm_vpn_connection_parent_class)->finalize (object);
157 }
158
159 static void
160 get_property (GObject *object,
161               guint prop_id,
162               GValue *value,
163               GParamSpec *pspec)
164 {
165         NMVpnConnection *self = NM_VPN_CONNECTION (object);
166
167         switch (prop_id) {
168         case PROP_VPN_STATE:
169                 g_value_set_enum (value, nm_vpn_connection_get_vpn_state (self));
170                 break;
171         case PROP_BANNER:
172                 g_value_set_string (value, nm_vpn_connection_get_banner (self));
173                 break;
174         default:
175                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
176                 break;
177         }
178 }
179
180 static void
181 nm_vpn_connection_class_init (NMVpnConnectionClass *connection_class)
182 {
183         GObjectClass *object_class = G_OBJECT_CLASS (connection_class);
184         NMObjectClass *nm_object_class = NM_OBJECT_CLASS (connection_class);
185
186         g_type_class_add_private (connection_class, sizeof (NMVpnConnectionPrivate));
187
188         _nm_object_class_add_interface (nm_object_class, NM_DBUS_INTERFACE_VPN_CONNECTION);
189         _nm_dbus_register_proxy_type (NM_DBUS_INTERFACE_VPN_CONNECTION,
190                                       NMDBUS_TYPE_VPN_CONNECTION_PROXY);
191
192         /* virtual methods */
193         object_class->get_property = get_property;
194         object_class->finalize = finalize;
195
196         nm_object_class->init_dbus = init_dbus;
197
198         /* properties */
199
200         /**
201          * NMVpnConnection:vpn-state:
202          *
203          * The VPN state of the active VPN connection.
204          **/
205         g_object_class_install_property
206                 (object_class, PROP_VPN_STATE,
207                  g_param_spec_enum (NM_VPN_CONNECTION_VPN_STATE, "", "",
208                                     NM_TYPE_VPN_CONNECTION_STATE,
209                                     NM_VPN_CONNECTION_STATE_UNKNOWN,
210                                     G_PARAM_READABLE |
211                                     G_PARAM_STATIC_STRINGS));
212
213         /**
214          * NMVpnConnection:banner:
215          *
216          * The VPN login banner of the active VPN connection.
217          **/
218         g_object_class_install_property
219                 (object_class, PROP_BANNER,
220                  g_param_spec_string (NM_VPN_CONNECTION_BANNER, "", "",
221                                       NULL,
222                                       G_PARAM_READABLE |
223                                       G_PARAM_STATIC_STRINGS));
224
225         /* signals */
226         signals[VPN_STATE_CHANGED] =
227                 g_signal_new ("vpn-state-changed",
228                               G_OBJECT_CLASS_TYPE (object_class),
229                               G_SIGNAL_RUN_FIRST,
230                               G_STRUCT_OFFSET (NMVpnConnectionClass, vpn_state_changed),
231                               NULL, NULL, NULL,
232                               G_TYPE_NONE, 2,
233                               G_TYPE_UINT, G_TYPE_UINT);
234 }