Release Tizen 2.0 beta
[framework/connectivity/net-config.git] / src / network-state.c
1 /*
2  * Network Configuration Module
3  *
4  * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19
20 #include <vconf.h>
21 #include <vconf-keys.h>
22 #include <syspopup_caller.h>
23
24 #include "log.h"
25 #include "neterror.h"
26 #include "emulator.h"
27 #include "network-state.h"
28
29 #define NETCONFIG_NETWORK_STATE_PATH    "/net/netconfig/network"
30
31 #define PROP_DEFAULT            FALSE
32 #define PROP_DEFAULT_STR   NULL
33
34
35 gboolean netconfig_iface_network_state_update_default_connection_info(
36                 NetconfigNetworkState *master,
37                 gchar *connection_type, gchar *connection_state,
38                 gchar *ip_addr, gchar *proxy_addr, GError **error);
39
40 #include "netconfig-iface-network-state-glue.h"
41
42 enum {
43         PROP_O,
44         PROP_NETWORK_STATE_CONN,
45         PROP_NETWORK_STATE_PATH,
46 };
47
48 struct NetconfigNetworkStateClass {
49         GObjectClass parent;
50 };
51
52 struct NetconfigNetworkState {
53         GObject parent;
54
55         DBusGConnection *conn;
56         gchar *path;
57 };
58
59 G_DEFINE_TYPE(NetconfigNetworkState, netconfig_network_state, G_TYPE_OBJECT);
60
61
62 static void __netconfig_network_state_gobject_get_property(GObject *object,
63                 guint prop_id, GValue *value, GParamSpec *pspec)
64 {
65         return;
66 }
67
68 static void __netconfig_network_state_gobject_set_property(GObject *object,
69                 guint prop_id, const GValue *value, GParamSpec *pspec)
70 {
71         NetconfigNetworkState *network_state = NETCONFIG_NETWORK_STATE(object);
72
73         switch (prop_id) {
74         case PROP_NETWORK_STATE_CONN:
75         {
76                 network_state->conn = g_value_get_boxed(value);
77                 INFO("network_state(%p) set conn(%p)", network_state, network_state->conn);
78                 break;
79         }
80
81         case PROP_NETWORK_STATE_PATH:
82         {
83                 if (network_state->path)
84                         g_free(network_state->path);
85
86                 network_state->path = g_value_dup_string(value);
87                 INFO("network_state(%p) path(%s)", network_state, network_state->path);
88
89                 break;
90         }
91
92         default:
93                 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
94         }
95 }
96
97 static void netconfig_network_state_init(NetconfigNetworkState *network_state)
98 {
99         DBG("network_state initialize");
100
101         network_state->conn = NULL;
102         network_state->path = g_strdup(PROP_DEFAULT_STR);
103 }
104
105 static void netconfig_network_state_class_init(NetconfigNetworkStateClass *klass)
106 {
107         GObjectClass *object_class = G_OBJECT_CLASS(klass);
108
109         DBG("class initialize");
110
111         object_class->get_property = __netconfig_network_state_gobject_get_property;
112         object_class->set_property = __netconfig_network_state_gobject_set_property;
113
114         /* DBus register */
115         dbus_g_object_type_install_info(NETCONFIG_TYPE_NETWORK_STATE,
116                         &dbus_glib_netconfig_iface_network_state_object_info);
117
118         /* property */
119         g_object_class_install_property(object_class, PROP_NETWORK_STATE_CONN,
120                         g_param_spec_boxed("conn", "CONNECTION", "DBus connection",
121                                         DBUS_TYPE_G_CONNECTION,
122                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
123
124         g_object_class_install_property(object_class, PROP_NETWORK_STATE_PATH,
125                         g_param_spec_string("path", "Path", "Object path",
126                                         PROP_DEFAULT_STR,
127                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
128 }
129
130
131 static void __netconfig_pop_3g_alert_syspoppup(void)
132 {
133         int rv = 0;
134         bundle *b = NULL;
135         int wifi_ug_state = 0;
136
137         vconf_get_int(VCONFKEY_WIFI_UG_RUN_STATE, &wifi_ug_state);
138         if (wifi_ug_state == VCONFKEY_WIFI_UG_RUN_STATE_ON_FOREGROUND)
139                 return;
140
141         b = bundle_create();
142
143         bundle_add(b, "_SYSPOPUP_TITLE_", "Cellular connection popup");
144         bundle_add(b, "_SYSPOPUP_TYPE_", "notification");
145         bundle_add(b, "_SYSPOPUP_CONTENT_", "connected");
146
147         DBG("Launch 3G alert network popup");
148         rv = syspopup_launch("net-popup", b);
149
150         bundle_free(b);
151 }
152
153 gboolean netconfig_iface_network_state_update_default_connection_info(
154                 NetconfigNetworkState *master,
155                 gchar *connection_type, gchar *connection_state,
156                 gchar *ip_addr, gchar *proxy_addr, GError **error)
157 {
158         char *ip = NULL;
159         char *proxy = NULL;
160         int wifi_state = 0;
161         int previous_network_status = 0;
162
163         DBG("connection type (%s), connection state(%s), ip_addr(%s), proxy_addr(%s)",
164                         connection_type, connection_state, ip_addr, proxy_addr);
165
166         if (netconfig_emulator_is_emulated() == TRUE)
167                 return FALSE;
168
169         vconf_get_int(VCONFKEY_NETWORK_WIFI_STATE, &wifi_state);
170         vconf_get_int(VCONFKEY_NETWORK_STATUS, &previous_network_status);
171
172         if (g_str_equal(connection_state, "idle") == TRUE &&
173                         previous_network_status != VCONFKEY_NETWORK_OFF) {
174                 vconf_set_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_OFF);
175
176                 if (g_str_equal(connection_type, "wifi") == TRUE)
177                         if (wifi_state != VCONFKEY_NETWORK_WIFI_OFF)
178                                 vconf_set_int(VCONFKEY_NETWORK_WIFI_STATE,
179                                                 VCONFKEY_NETWORK_WIFI_NOT_CONNECTED);
180
181                 vconf_set_str(VCONFKEY_NETWORK_IP, "");
182                 vconf_set_str(VCONFKEY_NETWORK_PROXY, "");
183
184                 vconf_set_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 0);
185
186                 DBG("Successfully clear IP and PROXY up");
187         } else if (g_str_equal(connection_state, "ready") == TRUE ||
188                         g_str_equal(connection_state, "online") == TRUE) {
189                 ip = vconf_get_str(VCONFKEY_NETWORK_IP);
190                 proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
191
192                 DBG("existed ip (%s), proxy (%s)", ip, proxy);
193
194                 if (g_str_equal(connection_type, "wifi") == TRUE) {
195                         vconf_set_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_WIFI);
196
197                         if (wifi_state != VCONFKEY_NETWORK_WIFI_OFF)
198                                 vconf_set_int(VCONFKEY_NETWORK_WIFI_STATE,
199                                                 VCONFKEY_NETWORK_WIFI_CONNECTED);
200                 } else if (g_str_equal(connection_type, "cellular") == TRUE) {
201                         vconf_set_int(VCONFKEY_NETWORK_STATUS, VCONFKEY_NETWORK_CELLULAR);
202
203                         if (wifi_state != VCONFKEY_NETWORK_WIFI_OFF)
204                                 vconf_set_int(VCONFKEY_NETWORK_WIFI_STATE,
205                                                 VCONFKEY_NETWORK_WIFI_NOT_CONNECTED);
206
207                         if (previous_network_status != VCONFKEY_NETWORK_CELLULAR)
208                                 __netconfig_pop_3g_alert_syspoppup();
209                 }
210
211                 if (ip != NULL && ip_addr != NULL &&
212                                 g_str_equal(ip, ip_addr) != TRUE)
213                         vconf_set_str(VCONFKEY_NETWORK_IP, ip_addr);
214
215                 if (proxy != NULL && proxy_addr != NULL &&
216                                 g_str_equal(proxy, proxy_addr) != TRUE)
217                         vconf_set_str(VCONFKEY_NETWORK_PROXY, proxy_addr);
218
219                 vconf_set_int(VCONFKEY_NETWORK_CONFIGURATION_CHANGE_IND, 1);
220
221                 DBG("Successfully update default network configuration");
222         }
223
224         return TRUE;
225 }
226
227 gpointer netconfig_network_state_create_and_init(DBusGConnection *conn)
228 {
229         GObject *object;
230
231         g_return_val_if_fail(conn != NULL, NULL);
232
233         object = g_object_new(NETCONFIG_TYPE_NETWORK_STATE, "conn", conn, "path",
234                         NETCONFIG_NETWORK_STATE_PATH, NULL);
235
236         INFO("create network_state(%p)", object);
237
238         dbus_g_connection_register_g_object(conn, NETCONFIG_NETWORK_STATE_PATH, object);
239
240         INFO("network_state(%p) register DBus path(%s)", object, NETCONFIG_NETWORK_STATE_PATH);
241
242         return object;
243 }