+static void _supplicant_dpp_not_compatible(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Not Compatible Signal");
+ netconfig_wifi_dpp_not_compatible_event(param);
+ return;
+}
+
+static void _supplicant_dpp_conf_failed(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Conf Failed Signal");
+ netconfig_wifi_dpp_conf_failed_event(param);
+ return;
+}
+
+static void _supplicant_dpp_scan_peer_qr(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Scan Peer QR Signal");
+ netconfig_wifi_dpp_scan_peer_qr_event(param);
+ return;
+}
+
+static void _supplicant_dpp_network_id(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Network Id Signal");
+ netconfig_wifi_dpp_network_id_event(param);
+ return;
+}
+
+static void _supplicant_dpp_conf_sent(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Conf Sent Signal");
+ netconfig_wifi_dpp_conf_sent_event(param);
+ return;
+}
+
+static void _supplicant_dpp_conf_received(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ DBG("Received DPP Conf Received Signal");
+ netconfig_wifi_dpp_conf_received_event(param);
+ return;
+}
+
+static void _supplicant_dpp_conf_obj(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ char *interface_name = NULL;
+
+ DBG("Received DPP Conf Obj Signal");
+
+ interface_name = __supplicant_get_interface_name(path, interface);
+ if (interface_name == NULL)
+ return;
+
+ netconfig_wifi_dpp_conf_obj_event(interface_name, param);
+
+ g_free(interface_name);
+ return;
+}
+
+static void _supplicant_wifi_wps_connected(const char *interface_name, GVariant *param)
+{
+ gchar *key;
+ char ssid[32] = {0, };
+ gchar *name;
+ GVariantIter *iter;
+ GVariant *variant;
+ int config_error = 0;
+ int error_indication = 0;
+ gsize ssid_len = 0;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(sa{sv})", &name, &iter);
+ INFO("wps Result: %s", name);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ INFO("wps Key is %s", key);
+ if (g_strcmp0(key, "SSID") == 0) {
+ const char *t_key = NULL;
+ t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar));
+ INFO("wps ssid_len is %zd ", ssid_len);
+ if (t_key == NULL) {
+ g_free(key);
+ g_variant_unref(variant);
+ ERR("WPS PBC Connection Failed");
+ goto error;
+ }
+ if (ssid_len > 0 && ssid_len <= 32) {
+ memcpy(ssid, t_key, ssid_len);
+ } else {
+ memset(ssid, 0, sizeof(ssid));
+ ssid_len = 0;
+ }
+ INFO("WPS PBC Connection completed with AP %s", ssid);
+ netconfig_wifi_notify_wps_completed(interface_name,
+ ssid, ssid_len);
+ }
+ }
+
+ g_variant_iter_free(iter);
+ g_free(name);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ g_free(name);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(interface_name,
+ config_error, error_indication);
+
+}
+
+static void _supplicant_wifi_wps_event(const char *interface_name, GVariant *param)
+{
+ gchar *key;
+ gchar *name;
+ GVariantIter *iter;
+ GVariant *variant;
+ gint32 config_error = 0;
+ gint32 error_indication = 0;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(sa{sv})", &name, &iter);
+ INFO("Event Result: %s", name);
+ if (g_strcmp0(name, "fail") == 0) {
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ if (key == NULL)
+ goto error;
+ INFO("Key is %s", key);
+ if (g_strcmp0(key, "config_error") == 0) {
+ config_error = g_variant_get_int32(variant);
+ ERR("Config Error %d", config_error);
+ } else if (g_strcmp0(key, "error_indication") == 0) {
+ error_indication = g_variant_get_int32(variant);
+ ERR("Error Indication %d", error_indication);
+ }
+ }
+ netconfig_wifi_notify_wps_fail_event(interface_name,
+ config_error, error_indication);
+ }
+
+ g_variant_iter_free(iter);
+ g_free(name);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ g_free(name);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(interface_name,
+ config_error, error_indication);
+}
+
+static void _find_service_and_set_passphrase(char *ssid, char *key)
+{
+ GString *str;
+ GVariant *reply = NULL;
+ int i, j, ssid_len;
+ char *service_path;
+ char *dev_mac_addr;
+ char ident[13];
+ gchar *enc_passphrase;
+
+ ssid_len = strlen(ssid);
+
+ str = g_string_sized_new((ssid_len * 2) + 55);
+ if (!str)
+ return;
+
+ dev_mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
+ if (!dev_mac_addr) {
+ ERR("Failed to get mac address from vconf key");
+ g_string_free(str, TRUE);
+ return;
+ }
+
+ j = 0;
+ for (i = 0; dev_mac_addr[i]; i++) {
+ if (dev_mac_addr[i] != ':')
+ ident[j++] = dev_mac_addr[i];
+ }
+ ident[j] = '\0';
+
+ g_string_append_printf(str, "%s%s_", CONNMAN_WIFI_SERVICE_PROFILE_PREFIX,
+ ident);
+ free(dev_mac_addr);
+
+ for (i = 0; i < ssid_len; i++) {
+ if (ssid[i] != '"')
+ g_string_append_printf(str, "%02x", ssid[i]);
+ }
+
+ g_string_append_printf(str, "_managed_psk");
+
+ service_path = g_string_free(str, FALSE);
+
+ enc_passphrase = _netconfig_encrypt_passphrase(key);
+ if (!enc_passphrase) {
+ ERR("Failed to encrypt passphrase");
+ g_free(service_path);
+ return;
+ }
+
+ INFO("wps service_path %s Passphrase %s", service_path, enc_passphrase);
+
+ reply = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service_path,
+ CONNMAN_SERVICE_INTERFACE, "SetProperty",
+ g_variant_new("(sv)", "Passphrase",
+ g_variant_new_string(enc_passphrase)));
+ if (reply != NULL)
+ g_variant_unref(reply);
+ else
+ ERR("Failed to set passphrase");
+
+ g_free(service_path);
+
+ return;
+}
+
+static void _supplicant_wifi_wps_credentials(const char *interface_name, GVariant *param)
+{
+ gchar *key;
+ char ssid[32] = {0, };
+ char wps_key[100] = {0, };
+ GVariantIter *iter;
+ GVariant *variant;
+ int config_error = 0;
+ int error_indication = 0;
+ gsize ssid_len = 0;
+ char *key_mgmt = NULL;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(a{sv})", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ if (key == NULL)
+ goto error;
+ INFO("wps Key is %s", key);
+ if (g_strcmp0(key, "Key") == 0) {
+ gsize key_len = 0;
+ const char *t_key = NULL;
+ key_len = g_variant_get_size(variant);
+
+ INFO("wps password len %zd ", key_len);
+ if (key_len > 0) {
+ t_key = g_variant_get_fixed_array(variant, &key_len,
+ sizeof(guchar));
+ if (!t_key) {
+ g_free(key);
+ g_variant_unref(variant);
+ goto error;
+ }
+ strncpy(wps_key, t_key, key_len);
+ wps_key[key_len] = '\0';
+ INFO("WPS Key in process credentials %s", wps_key);
+ } else
+ SLOGI("WPS AP Security ->Open");
+ } else if (g_strcmp0(key, "SSID") == 0) {
+ const char *t_key = NULL;
+ t_key = g_variant_get_fixed_array(variant, &ssid_len,
+ sizeof(guchar));
+ INFO("wps ssid_len is %zd ", ssid_len);
+ if (!t_key) {
+ g_free(key);
+ g_variant_unref(variant);
+ goto error;
+ }
+ if (ssid_len > 0 && ssid_len <= 32) {
+ memcpy(ssid, t_key, ssid_len);
+ } else {
+ memset(ssid, 0, sizeof(ssid));
+ ssid_len = 0;
+ }
+ INFO("SSID in process credentials %s", ssid);
+ } else if (g_strcmp0(key, "AuthType") == 0) {
+ gchar *auth_type;
+ GVariantIter *var_iter;
+ g_variant_get(variant, "as", &var_iter);
+ while (g_variant_iter_loop(var_iter, "s", &auth_type)) {
+ INFO("wps auth_type %s", auth_type);
+ if (g_strcmp0(auth_type, "wpa-psk") == 0 ||
+ g_strcmp0(auth_type, "wpa2-psk") == 0)
+ key_mgmt = "psk";
+ else if (g_strcmp0(auth_type, "open") == 0)
+ key_mgmt = "none";
+ }
+ g_variant_iter_free(var_iter);
+ } else if (g_strcmp0(key, "EncrType") == 0) {
+ gchar *encr_type;
+ GVariantIter *var_iter;
+ g_variant_get(variant, "as", &var_iter);
+ while (g_variant_iter_loop(var_iter, "s", &encr_type))
+ INFO("wps encr_type %s", encr_type);
+ g_variant_iter_free(var_iter);
+ } else if (g_strcmp0(key, "BSSID") == 0) {
+ const guchar *bssid;
+ gsize bssid_len;
+ bssid = g_variant_get_fixed_array(variant, &bssid_len,
+ sizeof(guchar));
+ if (bssid && bssid_len == 6)
+ INFO("wps BSSID %2x:%2x:%2x:%2x:%2x:%2x", bssid[0], bssid[1],
+ bssid[2], bssid[3], bssid[4], bssid[5]);
+ }
+ }
+
+ g_variant_iter_free(iter);
+
+ if (g_strcmp0(key_mgmt, "psk") == 0)
+ _find_service_and_set_passphrase(ssid, wps_key);
+
+ netconfig_wifi_notify_wps_credentials(interface_name, ssid, ssid_len, wps_key);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(interface_name, config_error, error_indication);
+}
+
+static void __netconfig_wps_signal_filter_handler(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ char *interface_name = NULL;
+
+ interface_name = __supplicant_get_interface_name(path, SUPPLICANT_IFACE_INTERFACE);
+ if (interface_name == NULL)
+ return;
+
+ if (g_strcmp0(sig, SIGNAL_WPS_CREDENTIALS) == 0) {
+ INFO("Received wps CREDENTIALS Signal from Supplicant");
+ _supplicant_wifi_wps_credentials(interface_name, param);
+ } else if (g_strcmp0(sig, SIGNAL_WPS_EVENT) == 0) {
+ INFO("Received wps EVENT Signal from Supplicant");
+ _supplicant_wifi_wps_event(interface_name, param);
+ } else if (g_strcmp0(sig, SIGNAL_WPS_CONNECTED) == 0) {
+ INFO("Received WPSConnected Signal from Supplicant");
+ _supplicant_wifi_wps_connected(interface_name, param);
+ }
+
+ g_free(interface_name);
+ return;
+}
+
+static void __telephony_svc_cs_changed_cb(keynode_t * node, void *data)
+{
+ int telephony_svc_cs = 0;
+
+ if (node != NULL)
+ telephony_svc_cs = vconf_keynode_get_int(node);
+ else
+ netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs);
+
+ DBG("Telephony svc cs [%d]", telephony_svc_cs);
+
+ switch (telephony_svc_cs) {
+ case 1:
+ netconfig_battery_end_dn();
+ break;
+ case 2:
+ netconfig_battery_start_dn();
+ break;
+ default:
+ break;
+ }
+}
+
+static void __telephony_rssi_changed_cb(keynode_t * node, void *data)
+{
+ int rssi = 0;
+
+ if (node != NULL)
+ rssi = vconf_keynode_get_int(node);
+ else
+ netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi);
+
+ DBG("Telephony rssi [%d]", rssi);
+
+ netconfig_battery_update_dn_rssi(rssi);
+}
+
+static void _notify_telephony_svc_cs(void)
+{
+ int telephony_svc_cs = 0;
+
+ netconfig_vconf_get_int(VCONFKEY_TELEPHONY_SVC_CS, &telephony_svc_cs);
+ DBG("Telephony svc cs [%d]", telephony_svc_cs);
+
+ switch (telephony_svc_cs) {
+ case 1:
+ netconfig_battery_end_dn();
+ break;
+ case 2:
+ netconfig_battery_start_dn();
+ break;
+ default:
+ break;
+ }
+
+ vconf_notify_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb, NULL);
+}
+
+static void _notify_telephony_rssi(void)
+{
+ int rssi = 0;
+
+ netconfig_vconf_get_int(VCONFKEY_TELEPHONY_RSSI, &rssi);
+ DBG("Telephony rssi [%d]", rssi);
+
+ netconfig_battery_update_dn_rssi(rssi);
+
+ vconf_notify_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb, NULL);
+}
+
+static void _ignore_telephony_svc_cs(void)
+{
+ vconf_ignore_key_changed(VCONFKEY_TELEPHONY_SVC_CS, __telephony_svc_cs_changed_cb);
+}
+
+static void _ignore_telephony_rssi(void)
+{
+ vconf_ignore_key_changed(VCONFKEY_TELEPHONY_RSSI, __telephony_rssi_changed_cb);
+}
+