// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <dbus/dbus.h>

#define CONNMAN_SERVICE			"org.chromium.flimflam"

#define CONNMAN_SERVICE_INTERFACE	CONNMAN_SERVICE ".Service"

static void append(DBusMessageIter *dict,
		   const char *key,
		   const char *value)
{
	DBusMessageIter entry;

	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
							NULL, &entry);

	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);

	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &value);

	dbus_message_iter_close_container(dict, &entry);
}

int main(int argc, char *argv[])
{
	DBusConnection *conn;
	DBusError error;
	DBusMessage *msg;
	DBusMessageIter iter, value, dict;
	const char *property;
	char *args;
	char *cp;
	char *argname;
	char *argvalue;
	int done;


	if (argc < 4) {
		fprintf(stderr,
	"Usage: %s <service-dbus-path> <property-name> <apn-args>\n",
			argv[0]);
		return 1;
	}

	dbus_error_init(&error);

	conn = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
	if (conn == NULL) {
		if (dbus_error_is_set(&error) == TRUE) {
			fprintf(stderr, "%s\n", error.message);
			dbus_error_free(&error);
		} else
			fprintf(stderr, "Failed to get on system bus\n");
		return 1;
	}

	msg = dbus_message_new_method_call(CONNMAN_SERVICE,
					   argv[1],
					   CONNMAN_SERVICE_INTERFACE,
					   "SetProperty");
	if (msg == NULL) {
		dbus_connection_unref(conn);
		fprintf(stderr, "Failed to allocate method call\n");
		return 1;
	}

	dbus_message_set_no_reply(msg, TRUE);

	dbus_message_iter_init_append(msg, &iter);

	property = argv[2];
	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &property);

	dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
			DBUS_TYPE_ARRAY_AS_STRING
			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING
			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &value);

	dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING
			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);

	args = argv[3];
	cp = args;
	done = 0;

	while (!done) {
		argname = cp;
		cp = strchr(cp, ',');
		if (cp == NULL) {
			fprintf(stderr, "Badly formed argument string\n");
			dbus_message_unref(msg);
			dbus_connection_unref(conn);
			return 1;
		}
		*cp++ = '\0';
		argvalue = cp;
		cp = strchr(cp, ',');
		if (cp == NULL)
			done = 1;
		else
			*cp++ = '\0';
		append(&dict, argname, argvalue);
	}

	dbus_message_iter_close_container(&iter, &dict);
	dbus_message_iter_close_container(&dict, &value);

	dbus_connection_send(conn, msg, NULL);

	dbus_message_unref(msg);
	dbus_connection_unref(conn);

	return 0;
}
