gboolean connman_manager_connect_service (ConnmanManager *manager,
                                          ConnmanService *service,
                                          const gchar *secret)
{
  GVariantBuilder *builder;
  GError *error = NULL;
  GVariant *variant;
  const gchar *ssid = connman_service_get_name(service);

  g_message("Connecting to service '%s'", connman_service_get_name(service));

  if (!connman_service_type_wifi(service))
    {
      g_critical("Service is not a Wifi service");
      return FALSE;
    }

  builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);

  g_variant_builder_add(builder, "{sv}", "Type", g_variant_new_string("wifi"));
  g_variant_builder_add(builder, "{sv}", "Mode", g_variant_new_string("managed"));
  g_variant_builder_add(builder, "{sv}", "SSID", g_variant_new_string(ssid));

  if (secret)
    {
      g_variant_builder_add(builder, "{sv}", "Security", g_variant_new_string("rsn"));
      g_variant_builder_add(builder, "{sv}", "Passphrase", g_variant_new_string(secret));
    }
  else
    {
      g_variant_builder_add(builder, "{sv}", "Security", g_variant_new_string("none"));
    }

  variant = g_variant_builder_end(builder);

  connman_proxy_manager_call_connect_service(manager->proxy,
                                             variant, NULL,
                                             service_connect_callback, manager);
  g_variant_unref(variant);

  if (error)
    {
      g_error("%s", error->message);
      g_error_free(error);
      return FALSE;
    }
  
  return TRUE;
}
static void update_connection_status(connman_service_t *connected_service, jvalue_ref *status)
{
	if(NULL == connected_service || NULL == status)
		return;

	int connman_state = 0;
	connman_state = connman_service_get_state(connected_service->state);
	if(connman_state == CONNMAN_SERVICE_STATE_ONLINE
		|| connman_state == CONNMAN_SERVICE_STATE_READY)
	{
		connman_service_get_ipinfo(connected_service);

		jobject_put(*status, J_CSTR_TO_JVAL("state"), jstring_create("connected"));
		if(NULL != connected_service->ipinfo.iface)
			jobject_put(*status, J_CSTR_TO_JVAL("interfaceName"), jstring_create(connected_service->ipinfo.iface));
		if(NULL != connected_service->ipinfo.ipv4.address)
			jobject_put(*status, J_CSTR_TO_JVAL("ipAddress"), jstring_create(connected_service->ipinfo.ipv4.address));
		if(NULL != connected_service->ipinfo.ipv4.netmask)
			jobject_put(*status, J_CSTR_TO_JVAL("netmask"), jstring_create(connected_service->ipinfo.ipv4.netmask));
		if(NULL != connected_service->ipinfo.ipv4.gateway)
			jobject_put(*status, J_CSTR_TO_JVAL("gateway"), jstring_create(connected_service->ipinfo.ipv4.gateway));
		
		gsize i;
		char dns_str[16];
		for (i = 0; i < g_strv_length(connected_service->ipinfo.dns); i++)
		{
			sprintf(dns_str,"dns%d",i+1);
			jobject_put(*status, jstring_create(dns_str), jstring_create(connected_service->ipinfo.dns[i]));
		}

		if(NULL != connected_service->ipinfo.ipv4.method)
			jobject_put(*status, J_CSTR_TO_JVAL("method"), jstring_create(connected_service->ipinfo.ipv4.method));
			
		if(connman_service_type_wifi(connected_service))
		{
			if(NULL != connected_service->name)
				jobject_put(*status, J_CSTR_TO_JVAL("ssid"), jstring_create(connected_service->name));
			jobject_put(*status, J_CSTR_TO_JVAL("isWakeOnWifiEnabled"), jboolean_create(false));
		}
		const char *s = (connman_state == CONNMAN_SERVICE_STATE_ONLINE)?"yes":"no";
		jobject_put(*status, J_CSTR_TO_JVAL("onInternet"), jstring_create(s));
	}
	else
		jobject_put(*status, J_CSTR_TO_JVAL("state"), jstring_create("disconnected"));

}