All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 00/16]  Add DUN support
@ 2012-04-02 16:19 Daniel Wagner
  2012-04-02 16:19 ` [PATCH v6 01/16] bluetooth: Add Serial interface definition Daniel Wagner
                   ` (15 more replies)
  0 siblings, 16 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:19 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2270 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

Hi,

for what it is worth, here is an rebased version. I haven't changed
anything in the code. Some packaging updates such as including the header
file into the distro etc. Also fixed the systemd service file installation.


Changes v6:
 - Distro building fixes
 - Use dundee instead elect in disconnect-dundee

cheers,
daniel

Daniel Wagner (16):
  bluetooth: Add Serial interface definition
  dundee: Add documentation
  dundee: Add test scripts
  dundee: Add skeleton implementation
  dundee: Add D-Bus error messages
  dundee: Add D-Bus configuration file
  dundee: Add systemd configuration file
  dundee: Add Manager interface
  dundee: Add skeleton implementation for device
  dundee: Manager append devices
  dundee: Add callback helpers
  dundee: Add device un/register
  dundee: Add driver helper functions
  dundee: Add device D-Bus interface
  dundee: Add PPP handling code to device
  dundee: Add Bluetooth DUN driver

 Makefile.am              |   25 ++
 bootstrap-configure      |    1 +
 configure.ac             |    7 +-
 doc/dundee-api.txt       |   76 ++++++
 dundee/bluetooth.c       |  290 +++++++++++++++++++++
 dundee/dbus.c            |   45 ++++
 dundee/device.c          |  646 ++++++++++++++++++++++++++++++++++++++++++++++
 dundee/dundee.conf       |   23 ++
 dundee/dundee.h          |  145 +++++++++++
 dundee/dundee.service.in |   11 +
 dundee/main.c            |  256 ++++++++++++++++++
 dundee/manager.c         |  119 +++++++++
 plugins/bluetooth.h      |    1 +
 test/dundee-connect      |   20 ++
 test/dundee-disconnect   |   20 ++
 test/monitor-dundee      |  109 ++++++++
 16 files changed, 1793 insertions(+), 1 deletion(-)
 create mode 100644 doc/dundee-api.txt
 create mode 100644 dundee/bluetooth.c
 create mode 100644 dundee/dbus.c
 create mode 100644 dundee/device.c
 create mode 100644 dundee/dundee.conf
 create mode 100644 dundee/dundee.h
 create mode 100644 dundee/dundee.service.in
 create mode 100644 dundee/main.c
 create mode 100644 dundee/manager.c
 create mode 100755 test/dundee-connect
 create mode 100755 test/dundee-disconnect
 create mode 100755 test/monitor-dundee

-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH v6 01/16] bluetooth: Add Serial interface definition
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
@ 2012-04-02 16:19 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 02/16] dundee: Add documentation Daniel Wagner
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:19 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 579 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 plugins/bluetooth.h |    1 +
 1 file changed, 1 insertion(+)

diff --git a/plugins/bluetooth.h b/plugins/bluetooth.h
index daa1873..4fc16ad 100644
--- a/plugins/bluetooth.h
+++ b/plugins/bluetooth.h
@@ -27,6 +27,7 @@
 #define	BLUEZ_ADAPTER_INTERFACE		BLUEZ_SERVICE ".Adapter"
 #define	BLUEZ_DEVICE_INTERFACE		BLUEZ_SERVICE ".Device"
 #define	BLUEZ_SERVICE_INTERFACE		BLUEZ_SERVICE ".Service"
+#define BLUEZ_SERIAL_INTERFACE		BLUEZ_SERVICE ".Serial"
 
 #define DBUS_TIMEOUT 15
 
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 02/16] dundee: Add documentation
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
  2012-04-02 16:19 ` [PATCH v6 01/16] bluetooth: Add Serial interface definition Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 03/16] dundee: Add test scripts Daniel Wagner
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2432 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 doc/dundee-api.txt |   76 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)
 create mode 100644 doc/dundee-api.txt

diff --git a/doc/dundee-api.txt b/doc/dundee-api.txt
new file mode 100644
index 0000000..9f4cfe6
--- /dev/null
+++ b/doc/dundee-api.txt
@@ -0,0 +1,76 @@
+
+Manager hierarchy
+=================
+
+Service		org.ofono.dundee
+Interface	org.ofono.dundee.Manager
+Object path	/
+
+Methods		array{object,dict} GetDevices()
+
+			Get an array of device objects and properties
+			that represent the currently attached devices.
+
+			This method call should only be used once when an
+			application starts up. Further device additions
+			and removal shall be monitored via DeviceAdded and
+			DeviceRemoved signals.
+
+Signals		DeviceAdded(object path, dict properties)
+
+			Signal that is sent when a new device is added.  It
+			contains the object path of new device and its
+			properties.
+
+		DeviceRemoved(object path)
+
+			Signal that is sent when a device has been removed.
+			The object path is no longer accessible after this
+			signal and only emitted for reference.
+
+
+Device hierarchy
+================
+
+Service		org.ofono.dundee
+Interface	org.ofono.dundee.Device
+Object path	/{device0,device1,...}
+
+Methods		dict GetProperties()
+
+			Returns properties for the device object. See
+			the properties section for available properties.
+
+Signals		PropertyChanged(string name, variant value)
+
+			This signal indicates a changed value of the given
+			property.
+
+Properties	string Name [readonly]
+
+			Friendly name of the device.
+
+		boolean Active [readwrite]
+
+			Holds whether the device is connected. A
+			connection will be established when this value
+			is set to true. A existing connection will be
+			teared down when set to false.
+
+		dict Settings [readonly]
+
+			Holds all the IP network settings.
+
+			string Interface [readonly, optional]
+
+				Holds the interface of the network interface
+				used by this connection (e.g. "ppp0" "usb0")
+
+			string Address [readonly, optional]
+
+				Holds the IP address for this connection.
+
+			array{string} DomainNameServers [readonly, optional]
+
+				Holds the list of domain name servers for this
+				connection.
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 03/16] dundee: Add test scripts
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
  2012-04-02 16:19 ` [PATCH v6 01/16] bluetooth: Add Serial interface definition Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 02/16] dundee: Add documentation Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-23 10:13   ` Zheng, Wu
  2012-04-02 16:20 ` [PATCH v6 04/16] dundee: Add skeleton implementation Daniel Wagner
                   ` (12 subsequent siblings)
  15 siblings, 1 reply; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4875 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 test/dundee-connect    |   20 +++++++++
 test/dundee-disconnect |   20 +++++++++
 test/monitor-dundee    |  109 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 149 insertions(+)
 create mode 100755 test/dundee-connect
 create mode 100755 test/dundee-disconnect
 create mode 100755 test/monitor-dundee

diff --git a/test/dundee-connect b/test/dundee-connect
new file mode 100755
index 0000000..6cbc629
--- /dev/null
+++ b/test/dundee-connect
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+
+if len(sys.argv) == 2:
+	path = sys.argv[1]
+else:
+	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
+			'org.ofono.dundee.Manager')
+	devices = manager.GetDevices()
+	path = devices[0][0]
+
+print "Connect device %s..." % path
+device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
+						'org.ofono.dundee.Device')
+
+device.Connect()
diff --git a/test/dundee-disconnect b/test/dundee-disconnect
new file mode 100755
index 0000000..e67d8cd
--- /dev/null
+++ b/test/dundee-disconnect
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+
+if len(sys.argv) == 2:
+	path = sys.argv[1]
+else:
+	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
+			'org.ofono.dundee.Manager')
+	devices = manager.GetDevices()
+	path = devices[0][0]
+
+print "Disonnect device %s..." % path
+device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
+						'org.ofono.dundee.Device')
+
+device.Disconnect()
diff --git a/test/monitor-dundee b/test/monitor-dundee
new file mode 100755
index 0000000..cf96ceb
--- /dev/null
+++ b/test/monitor-dundee
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+import gobject
+
+import dbus
+import dbus.mainloop.glib
+
+_dbus2py = {
+	dbus.String : unicode,
+	dbus.UInt32 : int,
+	dbus.Int32 : int,
+	dbus.Int16 : int,
+	dbus.UInt16 : int,
+	dbus.UInt64 : int,
+	dbus.Int64 : int,
+	dbus.Byte : int,
+	dbus.Boolean : bool,
+	dbus.ByteArray : str,
+	dbus.ObjectPath : str
+    }
+
+def dbus2py(d):
+	t = type(d)
+	if t in _dbus2py:
+		return _dbus2py[t](d)
+	if t is dbus.Dictionary:
+		return dict([(dbus2py(k), dbus2py(v)) for k, v in d.items()])
+	if t is dbus.Array and d.signature == "y":
+		return "".join([chr(b) for b in d])
+	if t is dbus.Array or t is list:
+		return [dbus2py(v) for v in d]
+	if t is dbus.Struct or t is tuple:
+		return tuple([dbus2py(v) for v in d])
+	return d
+
+def pretty(d):
+	d = dbus2py(d)
+	t = type(d)
+
+	if t in (dict, tuple, list) and len(d) > 0:
+		if t is dict:
+			d = ", ".join(["%s = %s" % (k, pretty(v))
+					for k, v in d.items()])
+			return "{ %s }" % d
+
+		d = " ".join([pretty(e) for e in d])
+
+		if t is tuple:
+			return "( %s )" % d
+
+	return str(d)
+
+def property_changed(name, value, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s = %s" % (iface, path, name, pretty(value))
+
+def added(name, value, member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s %s" % (iface, member, name, pretty(value))
+
+def removed(name, member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s" % (iface, member, name)
+
+def event(member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s" % (iface, path, member)
+
+def message(msg, args, member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s %s (%s)" % (iface, path, member,
+					str(msg), pretty(args))
+
+def ussd(msg, member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s %s" % (iface, path, member, str(msg))
+
+def value(value, member, path, interface):
+	iface = interface[interface.rfind(".") + 1:]
+	print "{%s} [%s] %s %s" % (iface, path, member, str(value))
+
+if __name__ == '__main__':
+	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+
+	bus = dbus.SystemBus()
+
+	bus.add_signal_receiver(property_changed,
+					bus_name="org.ofono.dundee",
+					signal_name = "PropertyChanged",
+						path_keyword="path",
+						interface_keyword="interface")
+
+	bus.add_signal_receiver(added,
+					bus_name="org.ofono.dundee",
+					signal_name = "DeviceAdded",
+						member_keyword="member",
+						path_keyword="path",
+						interface_keyword="interface")
+
+	bus.add_signal_receiver(removed,
+					bus_name="org.ofono.dundee",
+					signal_name = "DeviceRemoved",
+						member_keyword="member",
+						path_keyword="path",
+						interface_keyword="interface")
+
+
+	mainloop = gobject.MainLoop()
+	mainloop.run()
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 04/16] dundee: Add skeleton implementation
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (2 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 03/16] dundee: Add test scripts Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 05/16] dundee: Add D-Bus error messages Daniel Wagner
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 9726 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am         |   12 +++
 bootstrap-configure |    1 +
 configure.ac        |    4 +
 dundee/dundee.h     |   46 ++++++++++
 dundee/main.c       |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 318 insertions(+)
 create mode 100644 dundee/dundee.h
 create mode 100644 dundee/main.c

diff --git a/Makefile.am b/Makefile.am
index af3c5a2..36ad8e0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -667,6 +667,18 @@ tools_lookup_provider_name_SOURCES = plugins/mbpi.c plugins/mbpi.h \
 tools_lookup_provider_name_LDADD = @GLIB_LIBS@
 endif
 
+if DUNDEE
+
+sbin_PROGRAMS += dundee/dundee
+
+dundee_dundee_SOURCES = $(gdbus_sources) \
+			src/log.c src/dbus.c \
+			dundee/dundee.h dundee/main.c
+
+dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
+
+endif
+
 noinst_PROGRAMS += gatchat/gsmdial gatchat/test-server gatchat/test-qcdm
 
 gatchat_gsmdial_SOURCES = gatchat/gsmdial.c $(gatchat_sources)
diff --git a/bootstrap-configure b/bootstrap-configure
index db70c66..1fae158 100755
--- a/bootstrap-configure
+++ b/bootstrap-configure
@@ -14,4 +14,5 @@ fi
 		--localstatedir=/var \
 		--enable-capng \
 		--enable-tools \
+		--enable-dundee \
 		--disable-datafiles $*
diff --git a/configure.ac b/configure.ac
index 5ed78ea..1e21cc4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -165,6 +165,10 @@ if (test "${enable_tools}" = "yes"); then
 fi
 AM_CONDITIONAL(TOOLS, test "${enable_tools}" = "yes")
 
+AC_ARG_ENABLE(dundee, AC_HELP_STRING([--enable-dundee],
+		[enable DUN deamon support]), [enable_dundee=${enableval}])
+AM_CONDITIONAL(DUNDEE, test "${enable_dundee}" = "yes")
+
 AC_ARG_ENABLE(atmodem, AC_HELP_STRING([--disable-atmodem],
 				[disable ETSI AT modem support]),
 					[enable_atmodem=${enableval}])
diff --git a/dundee/dundee.h b/dundee/dundee.h
new file mode 100644
index 0000000..83d8969
--- /dev/null
+++ b/dundee/dundee.h
@@ -0,0 +1,46 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <glib.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+
+#include <ofono/types.h>
+
+void __dundee_exit(void);
+
+#include <ofono/log.h>
+
+int __ofono_log_init(const char *program, const char *debug,
+					ofono_bool_t detach);
+void __ofono_log_cleanup(void);
+void __ofono_log_enable(struct ofono_debug_desc *start,
+					struct ofono_debug_desc *stop);
+
+#include <ofono/dbus.h>
+
+#define DUNDEE_SERVICE			"org.ofono.dundee"
+
+int __ofono_dbus_init(DBusConnection *conn);
+void __ofono_dbus_cleanup(void);
+
+void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply);
diff --git a/dundee/main.c b/dundee/main.c
new file mode 100644
index 0000000..0bee690
--- /dev/null
+++ b/dundee/main.c
@@ -0,0 +1,255 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <sys/signalfd.h>
+
+#include <gdbus.h>
+
+#ifdef HAVE_CAPNG
+#include <cap-ng.h>
+#endif
+
+#include "dundee.h"
+
+#define SHUTDOWN_GRACE_SECONDS 10
+
+static GMainLoop *event_loop;
+
+void __dundee_exit(void)
+{
+	g_main_loop_quit(event_loop);
+}
+
+static gboolean quit_eventloop(gpointer user_data)
+{
+	__dundee_exit();
+	return FALSE;
+}
+
+static unsigned int __terminated = 0;
+
+static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
+							gpointer user_data)
+{
+	struct signalfd_siginfo si;
+	ssize_t result;
+	int fd;
+
+	if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP))
+		return FALSE;
+
+	fd = g_io_channel_unix_get_fd(channel);
+
+	result = read(fd, &si, sizeof(si));
+	if (result != sizeof(si))
+		return FALSE;
+
+	switch (si.ssi_signo) {
+	case SIGINT:
+	case SIGTERM:
+		if (__terminated == 0) {
+			ofono_info("Terminating");
+			g_timeout_add_seconds(SHUTDOWN_GRACE_SECONDS,
+						quit_eventloop, NULL);
+
+			quit_eventloop(NULL);
+		}
+
+		__terminated = 1;
+		break;
+	}
+
+	return TRUE;
+}
+
+static guint setup_signalfd(void)
+{
+	GIOChannel *channel;
+	guint source;
+	sigset_t mask;
+	int fd;
+
+	sigemptyset(&mask);
+	sigaddset(&mask, SIGINT);
+	sigaddset(&mask, SIGTERM);
+
+	if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
+		perror("Failed to set signal mask");
+		return 0;
+	}
+
+	fd = signalfd(-1, &mask, 0);
+	if (fd < 0) {
+		perror("Failed to create signal descriptor");
+		return 0;
+	}
+
+	channel = g_io_channel_unix_new(fd);
+
+	g_io_channel_set_close_on_unref(channel, TRUE);
+	g_io_channel_set_encoding(channel, NULL, NULL);
+	g_io_channel_set_buffered(channel, FALSE);
+
+	source = g_io_add_watch(channel,
+				G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+				signal_handler, NULL);
+
+	g_io_channel_unref(channel);
+
+	return source;
+}
+
+static void system_bus_disconnected(DBusConnection *conn, void *user_data)
+{
+	ofono_error("System bus has disconnected!");
+
+	g_main_loop_quit(event_loop);
+}
+
+static gchar *option_debug = NULL;
+static gboolean option_detach = TRUE;
+static gboolean option_version = FALSE;
+
+static gboolean parse_debug(const char *key, const char *value,
+					gpointer user_data, GError **error)
+{
+	if (value)
+		option_debug = g_strdup(value);
+	else
+		option_debug = g_strdup("*");
+
+	return TRUE;
+}
+
+static GOptionEntry options[] = {
+	{ "debug", 'd', G_OPTION_FLAG_OPTIONAL_ARG,
+				G_OPTION_ARG_CALLBACK, parse_debug,
+				"Specify debug options to enable", "DEBUG" },
+	{ "nodetach", 'n', G_OPTION_FLAG_REVERSE,
+				G_OPTION_ARG_NONE, &option_detach,
+				"Don't run as daemon in background" },
+	{ "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
+				"Show version information and exit" },
+	{ NULL },
+};
+
+int main(int argc, char **argv)
+{
+	GOptionContext *context;
+	GError *err = NULL;
+	DBusConnection *conn;
+	DBusError error;
+	guint signal;
+
+#ifdef HAVE_CAPNG
+	/* Drop capabilities */
+	capng_clear(CAPNG_SELECT_BOTH);
+	capng_updatev(CAPNG_ADD, CAPNG_EFFECTIVE | CAPNG_PERMITTED,
+				CAP_NET_BIND_SERVICE, CAP_NET_ADMIN,
+				CAP_NET_RAW, CAP_SYS_ADMIN, -1);
+	capng_apply(CAPNG_SELECT_BOTH);
+#endif
+
+	context = g_option_context_new(NULL);
+	g_option_context_add_main_entries(context, options, NULL);
+
+	if (g_option_context_parse(context, &argc, &argv, &err) == FALSE) {
+		if (err != NULL) {
+			g_printerr("%s\n", err->message);
+			g_error_free(err);
+			return 1;
+		}
+
+		g_printerr("An unknown error occurred\n");
+		return 1;
+	}
+
+	g_option_context_free(context);
+
+	if (option_version == TRUE) {
+		printf("%s\n", VERSION);
+		exit(0);
+	}
+
+	if (option_detach == TRUE) {
+		if (daemon(0, 0)) {
+			perror("Can't start daemon");
+			return 1;
+		}
+	}
+
+	event_loop = g_main_loop_new(NULL, FALSE);
+
+	signal = setup_signalfd();
+
+	__ofono_log_init(argv[0], option_debug, option_detach);
+
+	dbus_error_init(&error);
+
+	conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, DUNDEE_SERVICE, &error);
+	if (conn == NULL) {
+		if (dbus_error_is_set(&error) == TRUE) {
+			ofono_error("Unable to hop onto D-Bus: %s",
+					error.message);
+			dbus_error_free(&error);
+		} else {
+			ofono_error("Unable to hop onto D-Bus");
+		}
+
+		goto cleanup;
+	}
+
+	g_dbus_set_disconnect_function(conn, system_bus_disconnected,
+					NULL, NULL);
+
+	__ofono_dbus_init(conn);
+
+	/*
+	 * The reason why this DBG is here is that we have the __stop__debug,
+	 * __start__debug linking symbols in the object. As soon we
+	 * have real DBG we can remove this one again.
+	 */
+	DBG("");
+
+	g_main_loop_run(event_loop);
+
+	__ofono_dbus_cleanup();
+	dbus_connection_unref(conn);
+
+cleanup:
+	g_source_remove(signal);
+
+	g_main_loop_unref(event_loop);
+
+	__ofono_log_cleanup();
+
+	return 0;
+}
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 05/16] dundee: Add D-Bus error messages
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (3 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 04/16] dundee: Add skeleton implementation Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 06/16] dundee: Add D-Bus configuration file Daniel Wagner
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2651 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am     |    2 +-
 dundee/dbus.c   |   45 +++++++++++++++++++++++++++++++++++++++++++++
 dundee/dundee.h |    3 +++
 3 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 dundee/dbus.c

diff --git a/Makefile.am b/Makefile.am
index 36ad8e0..fb0de75 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -673,7 +673,7 @@ sbin_PROGRAMS += dundee/dundee
 
 dundee_dundee_SOURCES = $(gdbus_sources) \
 			src/log.c src/dbus.c \
-			dundee/dundee.h dundee/main.c
+			dundee/dundee.h dundee/main.c dundee/dbus.c
 
 dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
 
diff --git a/dundee/dbus.c b/dundee/dbus.c
new file mode 100644
index 0000000..f15a2fc
--- /dev/null
+++ b/dundee/dbus.c
@@ -0,0 +1,45 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2011  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <gdbus.h>
+
+#include "dundee.h"
+
+#define DUNDEE_ERROR_INTERFACE "org.ofono.dundee.Error"
+
+DBusMessage *__dundee_error_invalid_args(DBusMessage *msg)
+{
+	return g_dbus_create_error(msg, DUNDEE_ERROR_INTERFACE
+					".InvalidArguments",
+					"Invalid arguments in method call");
+}
+
+DBusMessage *__dundee_error_failed(DBusMessage *msg)
+{
+	return g_dbus_create_error(msg, DUNDEE_ERROR_INTERFACE
+					".Failed",
+					"Operation failed");
+}
diff --git a/dundee/dundee.h b/dundee/dundee.h
index 83d8969..a56de9a 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -44,3 +44,6 @@ int __ofono_dbus_init(DBusConnection *conn);
 void __ofono_dbus_cleanup(void);
 
 void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply);
+
+DBusMessage *__dundee_error_invalid_args(DBusMessage *msg);
+DBusMessage *__dundee_error_failed(DBusMessage *msg);
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 06/16] dundee: Add D-Bus configuration file
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (4 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 05/16] dundee: Add D-Bus error messages Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 07/16] dundee: Add systemd " Daniel Wagner
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1551 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am        |    6 ++++++
 dundee/dundee.conf |   23 +++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 dundee/dundee.conf

diff --git a/Makefile.am b/Makefile.am
index fb0de75..ad61106 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -677,6 +677,12 @@ dundee_dundee_SOURCES = $(gdbus_sources) \
 
 dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
 
+if DATAFILES
+
+dist_dbusconf_DATA += dundee/dundee.conf
+
+endif
+
 endif
 
 noinst_PROGRAMS += gatchat/gsmdial gatchat/test-server gatchat/test-qcdm
diff --git a/dundee/dundee.conf b/dundee/dundee.conf
new file mode 100644
index 0000000..de79dd5
--- /dev/null
+++ b/dundee/dundee.conf
@@ -0,0 +1,23 @@
+<!-- This configuration file specifies the required security policies
+     for oFono dundee (DUN) daemon to work. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+  <!-- ../system.conf have denied everything, so we just punch some holes -->
+
+  <policy user="root">
+    <allow own="org.ofono.dundee"/>
+    <allow send_destination="org.ofono.dundee"/>
+  </policy>
+
+  <policy at_console="true">
+    <allow send_destination="org.ofono.dundee"/>
+  </policy>
+
+  <policy context="default">
+    <deny send_destination="org.ofono.dundee"/>
+  </policy>
+
+</busconfig>
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 07/16] dundee: Add systemd configuration file
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (5 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 06/16] dundee: Add D-Bus configuration file Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 08/16] dundee: Add Manager interface Daniel Wagner
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1361 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am              |    6 ++++++
 configure.ac             |    3 ++-
 dundee/dundee.service.in |   11 +++++++++++
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 dundee/dundee.service.in

diff --git a/Makefile.am b/Makefile.am
index ad61106..fb79a1d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -681,6 +681,12 @@ if DATAFILES
 
 dist_dbusconf_DATA += dundee/dundee.conf
 
+if SYSTEMD
+
+systemdunit_DATA += dundee/dundee.service
+
+endif
+
 endif
 
 endif
diff --git a/configure.ac b/configure.ac
index 1e21cc4..acc8114 100644
--- a/configure.ac
+++ b/configure.ac
@@ -255,4 +255,5 @@ fi
 AC_DEFINE_UNQUOTED(CONFIGDIR, "${configdir}",
 			[Directory for the configuration files])
 
-AC_OUTPUT(Makefile include/version.h src/ofono.service ofono.pc)
+AC_OUTPUT(Makefile include/version.h src/ofono.service ofono.pc \
+	   dundee/dundee.service)
diff --git a/dundee/dundee.service.in b/dundee/dundee.service.in
new file mode 100644
index 0000000..c57c618
--- /dev/null
+++ b/dundee/dundee.service.in
@@ -0,0 +1,11 @@
+[Unit]
+Description=DUN service
+After=syslog.target
+
+[Service]
+Type=dbus
+BusName=org.ofono.dundee
+ExecStart=@prefix@/sbin/dundee -n
+
+[Install]
+WantedBy=multi-user.target
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 08/16] dundee: Add Manager interface
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (6 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 07/16] dundee: Add systemd " Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 09/16] dundee: Add skeleton implementation for device Daniel Wagner
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4924 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am      |    3 +-
 dundee/dundee.h  |    6 ++++
 dundee/main.c    |    9 ++---
 dundee/manager.c |   97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 108 insertions(+), 7 deletions(-)
 create mode 100644 dundee/manager.c

diff --git a/Makefile.am b/Makefile.am
index fb79a1d..412164a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -673,7 +673,8 @@ sbin_PROGRAMS += dundee/dundee
 
 dundee_dundee_SOURCES = $(gdbus_sources) \
 			src/log.c src/dbus.c \
-			dundee/dundee.h dundee/main.c dundee/dbus.c
+			dundee/dundee.h dundee/main.c dundee/dbus.c \
+			dundee/manager.c
 
 dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
 
diff --git a/dundee/dundee.h b/dundee/dundee.h
index a56de9a..82ab5f8 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -39,6 +39,8 @@ void __ofono_log_enable(struct ofono_debug_desc *start,
 #include <ofono/dbus.h>
 
 #define DUNDEE_SERVICE			"org.ofono.dundee"
+#define DUNDEE_MANAGER_INTERFACE	"org.ofono.dundee.Manager"
+#define DUNDEE_MANAGER_PATH		"/"
 
 int __ofono_dbus_init(DBusConnection *conn);
 void __ofono_dbus_cleanup(void);
@@ -47,3 +49,7 @@ void __ofono_dbus_pending_reply(DBusMessage **msg, DBusMessage *reply);
 
 DBusMessage *__dundee_error_invalid_args(DBusMessage *msg);
 DBusMessage *__dundee_error_failed(DBusMessage *msg);
+
+
+int __dundee_manager_init(void);
+void __dundee_manager_cleanup(void);
diff --git a/dundee/main.c b/dundee/main.c
index 0bee690..bb7800b 100644
--- a/dundee/main.c
+++ b/dundee/main.c
@@ -232,15 +232,12 @@ int main(int argc, char **argv)
 
 	__ofono_dbus_init(conn);
 
-	/*
-	 * The reason why this DBG is here is that we have the __stop__debug,
-	 * __start__debug linking symbols in the object. As soon we
-	 * have real DBG we can remove this one again.
-	 */
-	DBG("");
+	__dundee_manager_init();
 
 	g_main_loop_run(event_loop);
 
+	__dundee_manager_cleanup();
+
 	__ofono_dbus_cleanup();
 	dbus_connection_unref(conn);
 
diff --git a/dundee/manager.c b/dundee/manager.c
new file mode 100644
index 0000000..9ffe5c0
--- /dev/null
+++ b/dundee/manager.c
@@ -0,0 +1,97 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <glib.h>
+#include <gdbus.h>
+
+#include "dundee.h"
+
+static DBusMessage *manager_get_devices(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	DBusMessage *reply;
+	DBusMessageIter iter;
+	DBusMessageIter array;
+
+	DBG("");
+
+	reply = dbus_message_new_method_return(msg);
+	if (reply == NULL)
+		return NULL;
+
+	dbus_message_iter_init_append(reply, &iter);
+
+	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+					DBUS_STRUCT_BEGIN_CHAR_AS_STRING
+					DBUS_TYPE_OBJECT_PATH_AS_STRING
+					DBUS_TYPE_ARRAY_AS_STRING
+					DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+					DBUS_TYPE_STRING_AS_STRING
+					DBUS_TYPE_VARIANT_AS_STRING
+					DBUS_DICT_ENTRY_END_CHAR_AS_STRING
+					DBUS_STRUCT_END_CHAR_AS_STRING,
+					&array);
+
+	dbus_message_iter_close_container(&iter, &array);
+
+	return reply;
+}
+
+static GDBusMethodTable manager_methods[] = {
+	{ "GetDevices",          "",    "a(oa{sv})",  manager_get_devices },
+	{ }
+};
+
+static GDBusSignalTable manager_signals[] = {
+	{ "DeviceAdded",        "oa{sv}" },
+	{ "DeviceRemoved",      "o" },
+	{ }
+};
+
+int __dundee_manager_init(void)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	gboolean ret;
+
+	ret = g_dbus_register_interface(conn, DUNDEE_MANAGER_PATH,
+					DUNDEE_MANAGER_INTERFACE,
+					manager_methods, manager_signals,
+					NULL, NULL, NULL);
+
+	if (ret == FALSE)
+		return -1;
+
+	return 0;
+}
+
+void __dundee_manager_cleanup(void)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+
+	g_dbus_unregister_interface(conn, DUNDEE_MANAGER_PATH,
+					DUNDEE_MANAGER_INTERFACE);
+}
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 09/16] dundee: Add skeleton implementation for device
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (7 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 08/16] dundee: Add Manager interface Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 10/16] dundee: Manager append devices Daniel Wagner
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4704 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am     |    2 +-
 dundee/device.c |  100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 dundee/dundee.h |   15 +++++++++
 dundee/main.c   |    4 ++-
 4 files changed, 119 insertions(+), 2 deletions(-)
 create mode 100644 dundee/device.c

diff --git a/Makefile.am b/Makefile.am
index 412164a..20026d2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -674,7 +674,7 @@ sbin_PROGRAMS += dundee/dundee
 dundee_dundee_SOURCES = $(gdbus_sources) \
 			src/log.c src/dbus.c \
 			dundee/dundee.h dundee/main.c dundee/dbus.c \
-			dundee/manager.c
+			dundee/manager.c dundee/device.c
 
 dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
 
diff --git a/dundee/device.c b/dundee/device.c
new file mode 100644
index 0000000..1b89e97
--- /dev/null
+++ b/dundee/device.c
@@ -0,0 +1,100 @@
+/*
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
+#include <netinet/ether.h>
+
+#include <glib.h>
+#include <gdbus.h>
+
+#include "dundee.h"
+
+static GHashTable *device_hash;
+
+struct dundee_device {
+};
+
+const char *__dundee_device_get_path(struct dundee_device *device)
+{
+	return "/";
+}
+
+void __dundee_device_append_properties(struct dundee_device *device,
+					DBusMessageIter *dict)
+{
+}
+
+void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
+{
+	GHashTableIter iter;
+	gpointer key, value;
+
+	DBG("");
+
+	g_hash_table_iter_init(&iter, device_hash);
+
+	while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) {
+		struct dundee_device *device = value;
+
+		func(device, userdata);
+	}
+}
+
+static void destroy_device(gpointer user)
+{
+	struct dundee_device *device = user;
+
+	g_free(device);
+}
+
+static void device_shutdown(gpointer key, gpointer value, gpointer user_data)
+{
+}
+
+void __dundee_device_shutdown(void)
+{
+	g_hash_table_foreach(device_hash, device_shutdown, NULL);
+
+	__dundee_exit();
+}
+
+int __dundee_device_init(void)
+{
+	DBG("");
+
+	device_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+						g_free, destroy_device);
+
+	return 0;
+}
+
+void __dundee_device_cleanup(void)
+{
+	DBG("");
+
+	g_hash_table_destroy(device_hash);
+}
diff --git a/dundee/dundee.h b/dundee/dundee.h
index 82ab5f8..4fe801b 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -53,3 +53,18 @@ DBusMessage *__dundee_error_failed(DBusMessage *msg);
 
 int __dundee_manager_init(void);
 void __dundee_manager_cleanup(void);
+
+
+struct dundee_device;
+
+int __dundee_device_init(void);
+void __dundee_device_cleanup(void);
+void __dundee_device_shutdown(void);
+
+typedef void (*dundee_device_foreach_func)(struct dundee_device *device,
+						void *data);
+void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
+
+const char *__dundee_device_get_path(struct dundee_device *device);
+void __dundee_device_append_properties(struct dundee_device *device,
+					DBusMessageIter *dict);
diff --git a/dundee/main.c b/dundee/main.c
index bb7800b..c74a94d 100644
--- a/dundee/main.c
+++ b/dundee/main.c
@@ -80,7 +80,7 @@ static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
 			g_timeout_add_seconds(SHUTDOWN_GRACE_SECONDS,
 						quit_eventloop, NULL);
 
-			quit_eventloop(NULL);
+			__dundee_device_shutdown();
 		}
 
 		__terminated = 1;
@@ -233,9 +233,11 @@ int main(int argc, char **argv)
 	__ofono_dbus_init(conn);
 
 	__dundee_manager_init();
+	__dundee_device_init();
 
 	g_main_loop_run(event_loop);
 
+	__dundee_device_cleanup();
 	__dundee_manager_cleanup();
 
 	__ofono_dbus_cleanup();
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 10/16] dundee: Manager append devices
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (8 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 09/16] dundee: Add skeleton implementation for device Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 11/16] dundee: Add callback helpers Daniel Wagner
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1377 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 dundee/manager.c |   22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/dundee/manager.c b/dundee/manager.c
index 9ffe5c0..58a5804 100644
--- a/dundee/manager.c
+++ b/dundee/manager.c
@@ -30,6 +30,26 @@
 
 #include "dundee.h"
 
+static void append_device(struct dundee_device *device, void *userdata)
+{
+	DBusMessageIter *array = userdata;
+	const char *path = __dundee_device_get_path(device);
+	DBusMessageIter entry, dict;
+
+	dbus_message_iter_open_container(array, DBUS_TYPE_STRUCT,
+						NULL, &entry);
+	dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
+					&path);
+	dbus_message_iter_open_container(&entry, DBUS_TYPE_ARRAY,
+				OFONO_PROPERTIES_ARRAY_SIGNATURE,
+				&dict);
+
+	__dundee_device_append_properties(device, &dict);
+
+	dbus_message_iter_close_container(&entry, &dict);
+	dbus_message_iter_close_container(array, &entry);
+}
+
 static DBusMessage *manager_get_devices(DBusConnection *conn,
 					DBusMessage *msg, void *data)
 {
@@ -56,6 +76,8 @@ static DBusMessage *manager_get_devices(DBusConnection *conn,
 					DBUS_STRUCT_END_CHAR_AS_STRING,
 					&array);
 
+	__dundee_device_foreach(append_device, &array);
+
 	dbus_message_iter_close_container(&iter, &array);
 
 	return reply;
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 11/16] dundee: Add callback helpers
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (9 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 10/16] dundee: Manager append devices Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 12/16] dundee: Add device un/register Daniel Wagner
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1339 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 dundee/dundee.h |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/dundee/dundee.h b/dundee/dundee.h
index 4fe801b..01edd53 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -28,6 +28,50 @@
 
 void __dundee_exit(void);
 
+enum dundee_error_type {
+	DUNDEE_ERROR_TYPE_NO_ERROR = 0,
+	DUNDEE_ERROR_TYPE_FAILURE,
+};
+
+struct dundee_error {
+	enum dundee_error_type type;
+	int error;
+};
+
+struct cb_data {
+	void *cb;
+	void *data;
+	void *user;
+};
+
+static inline struct cb_data *cb_data_new(void *cb, void *data)
+{
+	struct cb_data *ret;
+
+	ret = g_new0(struct cb_data, 1);
+	ret->cb = cb;
+	ret->data = data;
+
+	return ret;
+}
+
+#define CALLBACK_WITH_FAILURE(cb, args...)		\
+	do {						\
+		struct dundee_error cb_e;		\
+		cb_e.type = DUNDEE_ERROR_TYPE_FAILURE;	\
+		cb_e.error = 0;				\
+							\
+		cb(&cb_e, ##args);			\
+	} while (0)					\
+
+#define CALLBACK_WITH_SUCCESS(f, args...)		\
+	do {						\
+		struct dundee_error e;			\
+		e.type = DUNDEE_ERROR_TYPE_NO_ERROR;	\
+		e.error = 0;				\
+		f(&e, ##args);				\
+	} while(0)					\
+
 #include <ofono/log.h>
 
 int __ofono_log_init(const char *program, const char *debug,
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 12/16] dundee: Add device un/register
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (10 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 11/16] dundee: Add callback helpers Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 13/16] dundee: Add driver helper functions Daniel Wagner
                   ` (3 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 3531 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 dundee/device.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 dundee/dundee.h |   21 +++++++++++++++++
 2 files changed, 89 insertions(+), 1 deletion(-)

diff --git a/dundee/device.c b/dundee/device.c
index 1b89e97..bac8ead 100644
--- a/dundee/device.c
+++ b/dundee/device.c
@@ -33,14 +33,19 @@
 
 #include "dundee.h"
 
+static int next_device_id = 0;
 static GHashTable *device_hash;
 
 struct dundee_device {
+	char *path;
+	struct dundee_device_driver *driver;
+	gboolean registered;
+
 };
 
 const char *__dundee_device_get_path(struct dundee_device *device)
 {
-	return "/";
+	return device->path;
 }
 
 void __dundee_device_append_properties(struct dundee_device *device,
@@ -64,15 +69,77 @@ void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
 	}
 }
 
+static int register_device(struct dundee_device *device)
+{
+	return 0;
+}
+
+static int unregister_device(struct dundee_device *device)
+{
+	return 0;
+}
+
 static void destroy_device(gpointer user)
 {
 	struct dundee_device *device = user;
 
+	g_free(device->path);
+
 	g_free(device);
 }
 
+struct dundee_device *dundee_device_create(struct dundee_device_driver *d)
+{
+	struct dundee_device *device;
+
+	device = g_try_new0(struct dundee_device, 1);
+	if (device == NULL)
+		return NULL;
+
+	device->driver = d;
+
+	device->path = g_strdup_printf("/device%d", next_device_id);
+	if (device->path == NULL) {
+		g_free(device);
+		return NULL;
+	}
+
+	next_device_id += 1;
+
+	return device;
+}
+
+int dundee_device_register(struct dundee_device *device)
+{
+	int err;
+
+	err = register_device(device);
+	if (err < 0)
+		return err;
+
+	device->registered = TRUE;
+
+	g_hash_table_insert(device_hash, g_strdup(device->path), device);
+
+	return 0;
+}
+
+void dundee_device_unregister(struct dundee_device *device)
+{
+	DBG("%p", device);
+
+	unregister_device(device);
+
+	device->registered = FALSE;
+
+	g_hash_table_remove(device_hash, device->path);
+}
+
 static void device_shutdown(gpointer key, gpointer value, gpointer user_data)
 {
+	struct dundee_device *device = value;
+
+	unregister_device(device);
 }
 
 void __dundee_device_shutdown(void)
diff --git a/dundee/dundee.h b/dundee/dundee.h
index 01edd53..a32eebf 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -105,6 +105,27 @@ int __dundee_device_init(void);
 void __dundee_device_cleanup(void);
 void __dundee_device_shutdown(void);
 
+typedef void (*dundee_device_connect_cb_t)(const struct dundee_error *error,
+						int fd, void *data);
+typedef void (*dundee_device_disconnect_cb_t)(const struct dundee_error *error,
+						void *data);
+
+struct dundee_device_driver {
+	const char *name;
+
+	/* Connect and dial */
+	void (*connect)(struct dundee_device *device,
+			dundee_device_connect_cb_t cb, void *data);
+
+	/* Hangup and disconnect */
+	void (*disconnect)(struct dundee_device *device,
+			dundee_device_disconnect_cb_t cb, void *data);
+};
+
+struct dundee_device *dundee_device_create(struct dundee_device_driver *d);
+int dundee_device_register(struct dundee_device *device);
+void dundee_device_unregister(struct dundee_device *device);
+
 typedef void (*dundee_device_foreach_func)(struct dundee_device *device,
 						void *data);
 void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 13/16] dundee: Add driver helper functions
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (11 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 12/16] dundee: Add device un/register Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 14/16] dundee: Add device D-Bus interface Daniel Wagner
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 1875 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 dundee/device.c |   18 ++++++++++++++++++
 dundee/dundee.h |    5 +++++
 2 files changed, 23 insertions(+)

diff --git a/dundee/device.c b/dundee/device.c
index bac8ead..6f2a7ea 100644
--- a/dundee/device.c
+++ b/dundee/device.c
@@ -41,6 +41,7 @@ struct dundee_device {
 	struct dundee_device_driver *driver;
 	gboolean registered;
 
+	void *data;
 };
 
 const char *__dundee_device_get_path(struct dundee_device *device)
@@ -135,6 +136,23 @@ void dundee_device_unregister(struct dundee_device *device)
 	g_hash_table_remove(device_hash, device->path);
 }
 
+void dundee_device_set_data(struct dundee_device *device, void *data)
+{
+	device->data = data;
+}
+
+void *dundee_device_get_data(struct dundee_device *device)
+{
+	return device->data;
+}
+
+int dundee_device_set_name(struct dundee_device *device, const char *name)
+{
+	DBG("%p name %s", device, name);
+
+	return 0;
+}
+
 static void device_shutdown(gpointer key, gpointer value, gpointer user_data)
 {
 	struct dundee_device *device = value;
diff --git a/dundee/dundee.h b/dundee/dundee.h
index a32eebf..5149f8b 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -126,6 +126,11 @@ struct dundee_device *dundee_device_create(struct dundee_device_driver *d);
 int dundee_device_register(struct dundee_device *device);
 void dundee_device_unregister(struct dundee_device *device);
 
+void dundee_device_set_data(struct dundee_device *device, void *data);
+void *dundee_device_get_data(struct dundee_device *device);
+
+int dundee_device_set_name(struct dundee_device *device, const char *name);
+
 typedef void (*dundee_device_foreach_func)(struct dundee_device *device,
 						void *data);
 void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 14/16] dundee: Add device D-Bus interface
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (12 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 13/16] dundee: Add driver helper functions Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 15/16] dundee: Add PPP handling code to device Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 16/16] dundee: Add Bluetooth DUN driver Daniel Wagner
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 8061 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 dundee/device.c |  221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 dundee/dundee.h |    1 +
 2 files changed, 222 insertions(+)

diff --git a/dundee/device.c b/dundee/device.c
index 6f2a7ea..038bcc2 100644
--- a/dundee/device.c
+++ b/dundee/device.c
@@ -36,11 +36,21 @@
 static int next_device_id = 0;
 static GHashTable *device_hash;
 
+struct ipv4_settings {
+	char *interface;
+	char *ip;
+	char **nameservers;
+};
+
 struct dundee_device {
 	char *path;
 	struct dundee_device_driver *driver;
 	gboolean registered;
 
+	char *name;
+	gboolean active;
+	struct ipv4_settings settings;
+
 	void *data;
 };
 
@@ -49,9 +59,75 @@ const char *__dundee_device_get_path(struct dundee_device *device)
 	return device->path;
 }
 
+static void settings_append(struct dundee_device *device,
+					DBusMessageIter *iter)
+{
+	DBusMessageIter variant;
+	DBusMessageIter array;
+	char typesig[5];
+	char arraysig[6];
+
+	arraysig[0] = DBUS_TYPE_ARRAY;
+	arraysig[1] = typesig[0] = DBUS_DICT_ENTRY_BEGIN_CHAR;
+	arraysig[2] = typesig[1] = DBUS_TYPE_STRING;
+	arraysig[3] = typesig[2] = DBUS_TYPE_VARIANT;
+	arraysig[4] = typesig[3] = DBUS_DICT_ENTRY_END_CHAR;
+	arraysig[5] = typesig[4] = '\0';
+
+	dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
+						arraysig, &variant);
+
+	dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
+						typesig, &array);
+
+	if (device->active == FALSE)
+		goto out;
+
+	if (device->settings.interface)
+		ofono_dbus_dict_append(&array, "Interface",
+				DBUS_TYPE_STRING, &device->settings.interface);
+
+	if (device->settings.ip)
+		ofono_dbus_dict_append(&array, "Address", DBUS_TYPE_STRING,
+					&device->settings.ip);
+
+	if (device->settings.nameservers)
+		ofono_dbus_dict_append_array(&array, "DomainNameServers",
+						DBUS_TYPE_STRING,
+						&device->settings.nameservers);
+
+out:
+	dbus_message_iter_close_container(&variant, &array);
+
+	dbus_message_iter_close_container(iter, &variant);
+}
+
+static void settings_append_dict(struct dundee_device *device,
+				DBusMessageIter *dict)
+{
+	DBusMessageIter entry;
+	const char *key = "Settings";
+
+	dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
+						NULL, &entry);
+
+	dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+	settings_append(device, &entry);
+
+	dbus_message_iter_close_container(dict, &entry);
+}
+
 void __dundee_device_append_properties(struct dundee_device *device,
 					DBusMessageIter *dict)
 {
+	settings_append_dict(device, dict);
+
+	ofono_dbus_dict_append(dict, "Name", DBUS_TYPE_STRING,
+				&device->name);
+
+	ofono_dbus_dict_append(dict, "Active", DBUS_TYPE_BOOLEAN,
+				&device->active);
 }
 
 void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
@@ -70,13 +146,141 @@ void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
 	}
 }
 
+static DBusMessage *device_get_properties(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct dundee_device *device = data;
+	DBusMessage *reply;
+	DBusMessageIter iter;
+	DBusMessageIter dict;
+
+	reply = dbus_message_new_method_return(msg);
+	if (reply == NULL)
+		return NULL;
+
+	dbus_message_iter_init_append(reply, &iter);
+
+	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+					OFONO_PROPERTIES_ARRAY_SIGNATURE,
+					&dict);
+
+	__dundee_device_append_properties(device, &dict);
+
+	dbus_message_iter_close_container(&iter, &dict);
+
+	return reply;
+}
+
+static DBusMessage *set_property_active(struct dundee_device *device,
+					DBusMessage *msg,
+					DBusMessageIter *var)
+{
+	ofono_bool_t active;
+
+	DBG("%p path %s", device, device->path);
+
+	if (dbus_message_iter_get_arg_type(var) != DBUS_TYPE_BOOLEAN)
+		return __dundee_error_invalid_args(msg);
+
+	dbus_message_iter_get_basic(var, &active);
+
+	device->active = active;
+
+	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *device_set_property(DBusConnection *conn,
+					DBusMessage *msg, void *data)
+{
+	struct dundee_device *device = data;
+	DBusMessageIter iter, var;
+	const char *name;
+
+	if (dbus_message_iter_init(msg, &iter) == FALSE)
+		return __dundee_error_invalid_args(msg);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+		return __dundee_error_invalid_args(msg);
+
+	dbus_message_iter_get_basic(&iter, &name);
+	dbus_message_iter_next(&iter);
+
+	if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+		return __dundee_error_invalid_args(msg);
+
+	dbus_message_iter_recurse(&iter, &var);
+
+	if (g_str_equal(name, "Active"))
+		return set_property_active(device, msg, &var);
+
+	return __dundee_error_invalid_args(msg);
+}
+
+static GDBusMethodTable device_methods[] = {
+	{ "GetProperties",	"",	"a{sv}",	device_get_properties },
+	{ "SetProperty",	"sv",	"",		device_set_property,
+						G_DBUS_METHOD_FLAG_ASYNC },
+	{ }
+};
+
+static GDBusSignalTable device_signals[] = {
+	{ "PropertyChanged",	"sv" },
+	{ }
+};
+
 static int register_device(struct dundee_device *device)
 {
+	DBusConnection *conn = ofono_dbus_get_connection();
+	DBusMessage *signal;
+	DBusMessageIter iter;
+	DBusMessageIter dict;
+
+	DBG("%p path %s", device, device->path);
+
+	if (!g_dbus_register_interface(conn, device->path,
+					DUNDEE_DEVICE_INTERFACE,
+					device_methods, device_signals,
+					NULL, device, NULL)) {
+		ofono_error("Could not register Device %s", device->path);
+		return -EIO;
+	}
+
+	signal = dbus_message_new_signal(DUNDEE_MANAGER_PATH,
+						DUNDEE_MANAGER_INTERFACE,
+						"DeviceAdded");
+
+	if (signal == NULL)
+		return -ENOMEM;
+
+	dbus_message_iter_init_append(signal, &iter);
+
+	dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+					&device->path);
+	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+					OFONO_PROPERTIES_ARRAY_SIGNATURE,
+					&dict);
+	__dundee_device_append_properties(device, &dict);
+	dbus_message_iter_close_container(&iter, &dict);
+
+	g_dbus_send_message(conn, signal);
+
 	return 0;
 }
 
 static int unregister_device(struct dundee_device *device)
 {
+	DBusConnection *conn = ofono_dbus_get_connection();
+
+	DBG("%p path %s", device, device->path);
+
+	g_dbus_unregister_interface(conn, device->path,
+					DUNDEE_DEVICE_INTERFACE);
+
+	g_dbus_emit_signal(conn, DUNDEE_MANAGER_PATH,
+				DUNDEE_MANAGER_INTERFACE, "DeviceRemoved",
+				DBUS_TYPE_OBJECT_PATH, &device->path,
+				DBUS_TYPE_INVALID);
+
 	return 0;
 }
 
@@ -84,7 +288,12 @@ static void destroy_device(gpointer user)
 {
 	struct dundee_device *device = user;
 
+	g_free(device->settings.interface);
+	g_free(device->settings.ip);
+	g_strfreev(device->settings.nameservers);
+
 	g_free(device->path);
+	g_free(device->name);
 
 	g_free(device);
 }
@@ -148,8 +357,20 @@ void *dundee_device_get_data(struct dundee_device *device)
 
 int dundee_device_set_name(struct dundee_device *device, const char *name)
 {
+	DBusConnection *conn = ofono_dbus_get_connection();
+
 	DBG("%p name %s", device, name);
 
+	g_free(device->name);
+	device->name = g_strdup(name);
+
+	if (device->registered == FALSE)
+		return 0;
+
+	ofono_dbus_signal_property_changed(conn, device->path,
+					DUNDEE_DEVICE_INTERFACE, "Name",
+					DBUS_TYPE_STRING, &device->name);
+
 	return 0;
 }
 
diff --git a/dundee/dundee.h b/dundee/dundee.h
index 5149f8b..5f5db11 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -84,6 +84,7 @@ void __ofono_log_enable(struct ofono_debug_desc *start,
 
 #define DUNDEE_SERVICE			"org.ofono.dundee"
 #define DUNDEE_MANAGER_INTERFACE	"org.ofono.dundee.Manager"
+#define DUNDEE_DEVICE_INTERFACE		"org.ofono.dundee.Device"
 #define DUNDEE_MANAGER_PATH		"/"
 
 int __ofono_dbus_init(DBusConnection *conn);
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 15/16] dundee: Add PPP handling code to device
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (13 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 14/16] dundee: Add device D-Bus interface Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  2012-04-02 16:20 ` [PATCH v6 16/16] dundee: Add Bluetooth DUN driver Daniel Wagner
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 8386 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am     |    2 +-
 dundee/device.c |  244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 243 insertions(+), 3 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 20026d2..b2487ff 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -671,7 +671,7 @@ if DUNDEE
 
 sbin_PROGRAMS += dundee/dundee
 
-dundee_dundee_SOURCES = $(gdbus_sources) \
+dundee_dundee_SOURCES = $(gdbus_sources) $(gatchat_sources) \
 			src/log.c src/dbus.c \
 			dundee/dundee.h dundee/main.c dundee/dbus.c \
 			dundee/manager.c dundee/device.c
diff --git a/dundee/device.c b/dundee/device.c
index 038bcc2..9a25ac1 100644
--- a/dundee/device.c
+++ b/dundee/device.c
@@ -30,12 +30,16 @@
 
 #include <glib.h>
 #include <gdbus.h>
+#include <gatchat.h>
+#include <gatppp.h>
 
 #include "dundee.h"
 
 static int next_device_id = 0;
 static GHashTable *device_hash;
 
+static const char *none_prefix[] = { NULL };
+
 struct ipv4_settings {
 	char *interface;
 	char *ip;
@@ -47,10 +51,14 @@ struct dundee_device {
 	struct dundee_device_driver *driver;
 	gboolean registered;
 
+	GAtPPP *ppp;
+	GAtChat *chat;
+
 	char *name;
 	gboolean active;
 	struct ipv4_settings settings;
 
+	DBusMessage *pending;
 	void *data;
 };
 
@@ -146,6 +154,27 @@ void __dundee_device_foreach(dundee_device_foreach_func func, void *userdata)
 	}
 }
 
+static void settings_changed(struct dundee_device *device)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	DBusMessage *signal;
+	DBusMessageIter iter;
+	const char *key = "Settings";
+
+	signal = dbus_message_new_signal(device->path,
+					DUNDEE_DEVICE_INTERFACE,
+					"PropertyChanged");
+
+	if (signal == NULL)
+		return;
+	dbus_message_iter_init_append(signal, &iter);
+	dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key);
+
+	settings_append(device, &iter);
+
+	g_dbus_send_message(conn, signal);
+}
+
 static DBusMessage *device_get_properties(DBusConnection *conn,
 					DBusMessage *msg, void *data)
 {
@@ -171,6 +200,203 @@ static DBusMessage *device_get_properties(DBusConnection *conn,
 	return reply;
 }
 
+
+static void debug(const char *str, void *data)
+{
+	DBG("%s: %s\n", (const char *) data, str);
+}
+
+static void ppp_connect(const char *iface, const char *local, const char *peer,
+			const char *dns1, const char *dns2,
+			gpointer user_data)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct dundee_device *device = user_data;
+	const char *dns[3] = { dns1, dns2, 0 };
+
+	DBG("%p", device);
+	DBG("Network Device: %s\n", iface);
+	DBG("IP Address: %s\n", local);
+	DBG("Peer IP Address: %s\n", peer);
+	DBG("Primary DNS Server: %s\n", dns1);
+	DBG("Secondary DNS Server: %s\n", dns2);
+
+	g_free(device->settings.interface);
+	device->settings.interface = g_strdup(iface);
+	if (device->settings.interface == NULL)
+		goto err;
+
+	g_free(device->settings.ip);
+	device->settings.ip = g_strdup(local);
+	if (device->settings.ip == NULL)
+		goto err;
+
+	g_strfreev(device->settings.nameservers);
+	device->settings.nameservers = g_strdupv((gchar **)dns);
+	if (device->settings.nameservers == NULL)
+		goto err;
+
+	device->active = TRUE;
+
+	settings_changed(device);
+	ofono_dbus_signal_property_changed(conn, device->path,
+					DUNDEE_DEVICE_INTERFACE, "Active",
+					DBUS_TYPE_BOOLEAN, &device->active);
+
+	return;
+
+err:
+	g_free(device->settings.interface);
+	g_free(device->settings.ip);
+	g_strfreev(device->settings.nameservers);
+	device->settings.interface = NULL;
+	device->settings.ip = NULL;
+	device->settings.nameservers = NULL;
+}
+
+static void disconnect_callback(const struct dundee_error *error, void *data)
+{
+	struct dundee_device *device = data;
+
+	DBG("%p", device);
+
+	g_at_chat_unref(device->chat);
+	device->chat = NULL;
+
+	if (device->pending == NULL)
+		return;
+
+	if (error->type != DUNDEE_ERROR_TYPE_NO_ERROR) {
+		__ofono_dbus_pending_reply(&device->pending,
+					__dundee_error_failed(device->pending));
+		goto out;
+	}
+
+	__ofono_dbus_pending_reply(&device->pending,
+		dbus_message_new_method_return(device->pending));
+
+out:
+	device->pending = NULL;
+}
+
+static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer user_data)
+{
+	DBusConnection *conn = ofono_dbus_get_connection();
+	struct dundee_device *device = user_data;
+
+	DBG("%p", device);
+	DBG("PPP Link down: %d\n", reason);
+
+	g_at_ppp_unref(device->ppp);
+	device->ppp = NULL;
+
+	g_at_chat_resume(device->chat);
+
+	g_free(device->settings.interface);
+	g_free(device->settings.ip);
+	g_strfreev(device->settings.nameservers);
+	device->settings.interface = NULL;
+	device->settings.ip = NULL;
+	device->settings.nameservers = NULL;
+
+	device->active = FALSE;
+
+	settings_changed(device);
+	ofono_dbus_signal_property_changed(conn, device->path,
+					DUNDEE_DEVICE_INTERFACE, "Active",
+					DBUS_TYPE_BOOLEAN, &device->active);
+
+	device->driver->disconnect(device, disconnect_callback, device);
+}
+
+static void dial_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct dundee_device *device = user_data;
+	GAtIO *io;
+
+	if (!ok) {
+		DBG("Unable to define context\n");
+		return;
+	}
+
+	/* get the data IO channel */
+	io = g_at_chat_get_io(device->chat);
+
+	/*
+	 * shutdown gatchat or else it tries to take all the input
+	 * from the modem and does not let PPP get it.
+	 */
+	g_at_chat_suspend(device->chat);
+
+	/* open ppp */
+	device->ppp = g_at_ppp_new();
+	if (device->ppp == NULL) {
+		DBG("Unable to create PPP object\n");
+		return;
+	}
+	g_at_ppp_set_debug(device->ppp, debug, "PPP");
+
+	/* set connect and disconnect callbacks */
+	g_at_ppp_set_connect_function(device->ppp, ppp_connect, device);
+	g_at_ppp_set_disconnect_function(device->ppp, ppp_disconnect, device);
+
+	/* open the ppp connection */
+	g_at_ppp_open(device->ppp, io);
+}
+
+static int device_dial_setup(struct dundee_device *device, int fd)
+{
+	GAtSyntax *syntax;
+	GIOChannel *io;
+
+	io = g_io_channel_unix_new(fd);
+	if (io == NULL)
+		return -EIO;
+
+	syntax = g_at_syntax_new_gsm_permissive();
+	device->chat = g_at_chat_new(io, syntax);
+	g_io_channel_unref(io);
+	g_at_syntax_unref(syntax);
+
+	if (device->chat == NULL)
+		return -EIO;
+
+	g_at_chat_set_debug(device->chat, debug, "Control");
+
+	g_at_chat_send(device->chat, "ATD*99#", none_prefix, dial_cb,
+			device, NULL);
+
+	return 0;
+}
+
+static void connect_callback(const struct dundee_error *error,
+				int fd, void *data)
+{
+	struct dundee_device *device = data;
+	int err;
+
+	DBG("%p", device);
+
+	if (error->type != DUNDEE_ERROR_TYPE_NO_ERROR) {
+		__ofono_dbus_pending_reply(&device->pending,
+				__dundee_error_failed(device->pending));
+		goto out;
+	}
+
+	err = device_dial_setup(device, fd);
+	if (err < 0) {
+		__ofono_dbus_pending_reply(&device->pending,
+				__dundee_error_failed(device->pending));
+		goto out;
+	}
+
+	__ofono_dbus_pending_reply(&device->pending,
+			dbus_message_new_method_return(device->pending));
+
+out:
+	device->pending = NULL;
+}
+
 static DBusMessage *set_property_active(struct dundee_device *device,
 					DBusMessage *msg,
 					DBusMessageIter *var)
@@ -184,9 +410,14 @@ static DBusMessage *set_property_active(struct dundee_device *device,
 
 	dbus_message_iter_get_basic(var, &active);
 
-	device->active = active;
+	device->pending = dbus_message_ref(msg);
+
+	if (active)
+		device->driver->connect(device, connect_callback, device);
+	else
+		g_at_ppp_shutdown(device->ppp);
 
-	return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+	return NULL;
 }
 
 static DBusMessage *device_set_property(DBusConnection *conn,
@@ -288,6 +519,15 @@ static void destroy_device(gpointer user)
 {
 	struct dundee_device *device = user;
 
+	if (device->chat != NULL)
+		g_at_chat_unref(device->chat);
+
+	if (device->ppp != NULL)
+		g_at_ppp_unref(device->ppp);
+
+	if (device->pending)
+		dbus_message_unref(device->pending);
+
 	g_free(device->settings.interface);
 	g_free(device->settings.ip);
 	g_strfreev(device->settings.nameservers);
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH v6 16/16] dundee: Add Bluetooth DUN driver
  2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
                   ` (14 preceding siblings ...)
  2012-04-02 16:20 ` [PATCH v6 15/16] dundee: Add PPP handling code to device Daniel Wagner
@ 2012-04-02 16:20 ` Daniel Wagner
  15 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-02 16:20 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 8515 bytes --]

From: Daniel Wagner <daniel.wagner@bmw-carit.de>

---
 Makefile.am        |    6 +-
 dundee/bluetooth.c |  290 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 dundee/dundee.h    |    4 +
 dundee/main.c      |    2 +
 4 files changed, 299 insertions(+), 3 deletions(-)
 create mode 100644 dundee/bluetooth.c

diff --git a/Makefile.am b/Makefile.am
index b2487ff..2361950 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -671,10 +671,10 @@ if DUNDEE
 
 sbin_PROGRAMS += dundee/dundee
 
-dundee_dundee_SOURCES = $(gdbus_sources) $(gatchat_sources) \
-			src/log.c src/dbus.c \
+dundee_dundee_SOURCES = $(gdbus_sources) $(gatchat_sources) $(btio_sources) \
+			src/log.c src/dbus.c plugins/bluetooth.c \
 			dundee/dundee.h dundee/main.c dundee/dbus.c \
-			dundee/manager.c dundee/device.c
+			dundee/manager.c dundee/device.c dundee/bluetooth.c
 
 dundee_dundee_LDADD = $(builtin_libadd) @GLIB_LIBS@ @DBUS_LIBS@ @CAPNG_LIBS@ -ldl
 
diff --git a/dundee/bluetooth.c b/dundee/bluetooth.c
new file mode 100644
index 0000000..4ca3617
--- /dev/null
+++ b/dundee/bluetooth.c
@@ -0,0 +1,290 @@
+/*
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2012  BMW Car IT GmbH. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include "plugins/bluetooth.h"
+
+#include "dundee.h"
+
+static GHashTable *bluetooth_hash;
+
+struct bluetooth_device {
+	struct dundee_device *device;
+
+	char *path;
+	char *address;
+	char *name;
+
+	DBusPendingCall *call;
+};
+
+static void bt_disconnect(struct dundee_device *device,
+				dundee_device_disconnect_cb_t cb, void *data)
+{
+	struct bluetooth_device *bt = dundee_device_get_data(device);
+
+	DBG("%p", bt);
+
+	CALLBACK_WITH_SUCCESS(cb, data);
+}
+
+static void bt_connect_reply(DBusPendingCall *call, gpointer user_data)
+{
+	struct cb_data *cbd = user_data;
+	dundee_device_connect_cb_t cb = cbd->cb;
+	struct bluetooth_device *bt = cbd->user;
+	DBusMessage *reply;
+	DBusError derr;
+	int fd;
+
+	DBG("%p", bt);
+
+	reply = dbus_pending_call_steal_reply(call);
+
+	bt->call = NULL;
+
+	dbus_error_init(&derr);
+	if (dbus_set_error_from_message(&derr, reply)) {
+		DBG("Connection to bt serial returned with error: %s, %s",
+						derr.name, derr.message);
+
+		dbus_error_free(&derr);
+
+		CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+		goto done;
+	}
+
+	dbus_message_get_args(reply, NULL, DBUS_TYPE_UNIX_FD, &fd,
+			DBUS_TYPE_INVALID);
+
+	DBG("%p fd %d", bt, fd);
+
+	if (fd < 0) {
+		CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+		goto done;
+	}
+
+	CALLBACK_WITH_SUCCESS(cb, fd, cbd->data);
+
+done:
+	dbus_message_unref(reply);
+	g_free(cbd);
+}
+
+static void bt_connect(struct dundee_device *device,
+			dundee_device_connect_cb_t cb, void *data)
+{
+	struct bluetooth_device *bt = dundee_device_get_data(device);
+	struct cb_data *cbd = cb_data_new(cb, data);
+	char *profile = "dun";
+	int status;
+
+	DBG("%p", bt);
+
+	cbd->user = bt;
+
+	status = bluetooth_send_with_reply(bt->path,
+					BLUEZ_SERIAL_INTERFACE, "ConnectFD",
+					&bt->call, bt_connect_reply,
+					cbd, NULL, DBUS_TIMEOUT,
+					DBUS_TYPE_STRING, &profile,
+					DBUS_TYPE_INVALID);
+	if (status == 0)
+		return;
+
+	g_free(cbd);
+
+	CALLBACK_WITH_FAILURE(cb, -1, cbd->data);
+}
+
+struct dundee_device_driver bluetooth_driver = {
+	.name = "bluetooth",
+	.connect = bt_connect,
+	.disconnect = bt_disconnect,
+};
+
+static int bt_probe(const char *path, const char *dev_addr,
+				const char *adapter_addr, const char *alias)
+{
+	struct bluetooth_device *bt;
+	struct dundee_device *device;
+	char buf[256];
+
+	DBG("");
+
+	/* We already have this device in our hash, ignore */
+	if (g_hash_table_lookup(bluetooth_hash, path) != NULL)
+		return -EALREADY;
+
+	ofono_info("Using device: %s, devaddr: %s, adapter: %s",
+			path, dev_addr, adapter_addr);
+
+	strcpy(buf, "dun/");
+	bluetooth_create_path(dev_addr, adapter_addr, buf + 4, sizeof(buf) - 4);
+
+	bt = g_try_new0(struct bluetooth_device, 1);
+	if (bt == NULL)
+		return -ENOMEM;
+
+	DBG("%p", bt);
+
+	device = dundee_device_create(&bluetooth_driver);
+	if (device == NULL)
+		goto free;
+
+	dundee_device_set_data(device, bt);
+
+	bt->path = g_strdup(path);
+	if (bt->path == NULL)
+		goto free;
+
+	bt->address = g_strdup(dev_addr);
+	if (bt->address == NULL)
+		goto free;
+
+	bt->name = g_strdup(alias);
+	if (bt->name == NULL)
+		goto free;
+
+	dundee_device_set_name(device, bt->name);
+
+	if (dundee_device_register(device) < 0) {
+		g_free(device);
+		goto free;
+	}
+
+	bt->device = device;
+	g_hash_table_insert(bluetooth_hash, g_strdup(path), bt);
+
+	return 0;
+
+free:
+	g_free(bt->path);
+	g_free(bt->address);
+	g_free(bt->name);
+	g_free(bt);
+
+	return -ENOMEM;
+}
+
+static void destroy_device(gpointer user)
+{
+	struct bluetooth_device *bt = user;
+
+	DBG("%p", bt);
+
+	if (bt->call != NULL)
+		dbus_pending_call_cancel(bt->call);
+
+	g_free(bt->path);
+	g_free(bt->address);
+
+	g_free(bt);
+}
+
+static gboolean bt_remove_device(gpointer key, gpointer value,
+					gpointer user_data)
+{
+	struct bluetooth_device *bt = value;
+	const char *path = key;
+	const char *prefix = user_data;
+
+	DBG("%p", bt);
+
+	if (prefix && g_str_has_prefix(path, prefix) == FALSE)
+		return FALSE;
+
+	dundee_device_unregister(bt->device);
+
+	return TRUE;
+}
+
+static void bt_remove(const char *prefix)
+{
+	DBG("%s", prefix);
+
+	if (bluetooth_hash == NULL)
+		return;
+
+	g_hash_table_foreach_remove(bluetooth_hash, bt_remove_device,
+							(gpointer) prefix);
+}
+
+static void bt_set_alias(const char *path, const char *alias)
+{
+	struct bluetooth_device *bt;
+
+	DBG("");
+
+	if (path == NULL || alias == NULL)
+		return;
+
+	bt = g_hash_table_lookup(bluetooth_hash, path);
+	if (bt == NULL)
+		return;
+
+	g_free(bt->name);
+	bt->name = g_strdup(alias);
+
+	dundee_device_set_name(bt->device, bt->name);
+}
+
+static struct bluetooth_profile dun_profile = {
+	.name		= "dun_dt",
+	.probe		= bt_probe,
+	.remove		= bt_remove,
+	.set_alias	= bt_set_alias,
+};
+
+int __dundee_bluetooth_init(void)
+{
+	int err;
+
+	DBG("");
+
+	err = bluetooth_register_uuid(DUN_GW_UUID, &dun_profile);
+	if (err < 0)
+		return err;
+
+	bluetooth_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+						g_free, destroy_device);
+
+	return 0;
+}
+
+void  __dundee_bluetooth_cleanup(void)
+{
+	DBG("");
+
+	bluetooth_unregister_uuid(DUN_GW_UUID);
+	g_hash_table_destroy(bluetooth_hash);
+}
diff --git a/dundee/dundee.h b/dundee/dundee.h
index 5f5db11..ebda5fb 100644
--- a/dundee/dundee.h
+++ b/dundee/dundee.h
@@ -139,3 +139,7 @@ void __dundee_device_foreach(dundee_device_foreach_func cb, void *userdata);
 const char *__dundee_device_get_path(struct dundee_device *device);
 void __dundee_device_append_properties(struct dundee_device *device,
 					DBusMessageIter *dict);
+
+
+int __dundee_bluetooth_init(void);
+void  __dundee_bluetooth_cleanup(void);
diff --git a/dundee/main.c b/dundee/main.c
index c74a94d..8562fc7 100644
--- a/dundee/main.c
+++ b/dundee/main.c
@@ -234,9 +234,11 @@ int main(int argc, char **argv)
 
 	__dundee_manager_init();
 	__dundee_device_init();
+	__dundee_bluetooth_init();
 
 	g_main_loop_run(event_loop);
 
+	__dundee_bluetooth_cleanup();
 	__dundee_device_cleanup();
 	__dundee_manager_cleanup();
 
-- 
1.7.10.rc3.1.gb3065


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* RE: [PATCH v6 03/16] dundee: Add test scripts
  2012-04-02 16:20 ` [PATCH v6 03/16] dundee: Add test scripts Daniel Wagner
@ 2012-04-23 10:13   ` Zheng, Wu
  2012-04-24 12:33     ` Daniel Wagner
  0 siblings, 1 reply; 19+ messages in thread
From: Zheng, Wu @ 2012-04-23 10:13 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 5991 bytes --]

Hi Daniel,

I try to test your patches.

> -----Original Message-----
> From: ofono-bounces(a)ofono.org [mailto:ofono-bounces(a)ofono.org] On Behalf
> Of Daniel Wagner
> Sent: Tuesday, April 03, 2012 12:20 AM
> To: ofono(a)ofono.org
> Cc: Daniel Wagner
> Subject: [PATCH v6 03/16] dundee: Add test scripts
> 
> From: Daniel Wagner <daniel.wagner@bmw-carit.de>
> 
> ---
>  test/dundee-connect    |   20 +++++++++
>  test/dundee-disconnect |   20 +++++++++
>  test/monitor-dundee    |  109
> ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 149 insertions(+)
>  create mode 100755 test/dundee-connect
>  create mode 100755 test/dundee-disconnect  create mode 100755
> test/monitor-dundee
> 
> diff --git a/test/dundee-connect b/test/dundee-connect new file mode 100755
> index 0000000..6cbc629
> --- /dev/null
> +++ b/test/dundee-connect
> @@ -0,0 +1,20 @@
> +#!/usr/bin/python
> +
> +import dbus
> +import sys
> +
> +bus = dbus.SystemBus()
> +
> +if len(sys.argv) == 2:
> +	path = sys.argv[1]
> +else:
> +	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
> +			'org.ofono.dundee.Manager')
> +	devices = manager.GetDevices()
> +	path = devices[0][0]
> +
> +print "Connect device %s..." % path
> +device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
> +						'org.ofono.dundee.Device')
> +
> +device.Connect()

The dbus method connect() does not exist on org.ofono.dundee.Device, it cannot be found in device.c and doc/dundee-api.txt.
Why?

Best regards

> diff --git a/test/dundee-disconnect b/test/dundee-disconnect new file mode
> 100755 index 0000000..e67d8cd
> --- /dev/null
> +++ b/test/dundee-disconnect
> @@ -0,0 +1,20 @@
> +#!/usr/bin/python
> +
> +import dbus
> +import sys
> +
> +bus = dbus.SystemBus()
> +
> +if len(sys.argv) == 2:
> +	path = sys.argv[1]
> +else:
> +	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
> +			'org.ofono.dundee.Manager')
> +	devices = manager.GetDevices()
> +	path = devices[0][0]
> +
> +print "Disonnect device %s..." % path
> +device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
> +						'org.ofono.dundee.Device')
> +
> +device.Disconnect()

The dbus method Disconnect() does not exist on org.ofono.dundee.Device, it cannot be found in device.c and doc/dundee-api.txt.
Why?

Best regards

> diff --git a/test/monitor-dundee b/test/monitor-dundee new file mode 100755
> index 0000000..cf96ceb
> --- /dev/null
> +++ b/test/monitor-dundee
> @@ -0,0 +1,109 @@
> +#!/usr/bin/python
> +
> +import gobject
> +
> +import dbus
> +import dbus.mainloop.glib
> +
> +_dbus2py = {
> +	dbus.String : unicode,
> +	dbus.UInt32 : int,
> +	dbus.Int32 : int,
> +	dbus.Int16 : int,
> +	dbus.UInt16 : int,
> +	dbus.UInt64 : int,
> +	dbus.Int64 : int,
> +	dbus.Byte : int,
> +	dbus.Boolean : bool,
> +	dbus.ByteArray : str,
> +	dbus.ObjectPath : str
> +    }
> +
> +def dbus2py(d):
> +	t = type(d)
> +	if t in _dbus2py:
> +		return _dbus2py[t](d)
> +	if t is dbus.Dictionary:
> +		return dict([(dbus2py(k), dbus2py(v)) for k, v in d.items()])
> +	if t is dbus.Array and d.signature == "y":
> +		return "".join([chr(b) for b in d])
> +	if t is dbus.Array or t is list:
> +		return [dbus2py(v) for v in d]
> +	if t is dbus.Struct or t is tuple:
> +		return tuple([dbus2py(v) for v in d])
> +	return d
> +
> +def pretty(d):
> +	d = dbus2py(d)
> +	t = type(d)
> +
> +	if t in (dict, tuple, list) and len(d) > 0:
> +		if t is dict:
> +			d = ", ".join(["%s = %s" % (k, pretty(v))
> +					for k, v in d.items()])
> +			return "{ %s }" % d
> +
> +		d = " ".join([pretty(e) for e in d])
> +
> +		if t is tuple:
> +			return "( %s )" % d
> +
> +	return str(d)
> +
> +def property_changed(name, value, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s = %s" % (iface, path, name, pretty(value))
> +
> +def added(name, value, member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s %s" % (iface, member, name, pretty(value))
> +
> +def removed(name, member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s" % (iface, member, name)
> +
> +def event(member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s" % (iface, path, member)
> +
> +def message(msg, args, member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s %s (%s)" % (iface, path, member,
> +					str(msg), pretty(args))
> +
> +def ussd(msg, member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s %s" % (iface, path, member, str(msg))
> +
> +def value(value, member, path, interface):
> +	iface = interface[interface.rfind(".") + 1:]
> +	print "{%s} [%s] %s %s" % (iface, path, member, str(value))
> +
> +if __name__ == '__main__':
> +	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
> +
> +	bus = dbus.SystemBus()
> +
> +	bus.add_signal_receiver(property_changed,
> +					bus_name="org.ofono.dundee",
> +					signal_name = "PropertyChanged",
> +						path_keyword="path",
> +						interface_keyword="interface")
> +
> +	bus.add_signal_receiver(added,
> +					bus_name="org.ofono.dundee",
> +					signal_name = "DeviceAdded",
> +						member_keyword="member",
> +						path_keyword="path",
> +						interface_keyword="interface")
> +
> +	bus.add_signal_receiver(removed,
> +					bus_name="org.ofono.dundee",
> +					signal_name = "DeviceRemoved",
> +						member_keyword="member",
> +						path_keyword="path",
> +						interface_keyword="interface")
> +
> +
> +	mainloop = gobject.MainLoop()
> +	mainloop.run()
> --
> 1.7.10.rc3.1.gb3065
> 
> _______________________________________________
> ofono mailing list
> ofono(a)ofono.org
> http://lists.ofono.org/listinfo/ofono

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH v6 03/16] dundee: Add test scripts
  2012-04-23 10:13   ` Zheng, Wu
@ 2012-04-24 12:33     ` Daniel Wagner
  0 siblings, 0 replies; 19+ messages in thread
From: Daniel Wagner @ 2012-04-24 12:33 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2869 bytes --]

Hi Wu,

On 23.04.2012 12:13, Zheng, Wu wrote:
> Hi Daniel,
>
> I try to test your patches.

Thanks for giving them a try.

>> -----Original Message-----
>> From: ofono-bounces(a)ofono.org [mailto:ofono-bounces(a)ofono.org] On Behalf
>> Of Daniel Wagner
>> Sent: Tuesday, April 03, 2012 12:20 AM
>> To: ofono(a)ofono.org
>> Cc: Daniel Wagner
>> Subject: [PATCH v6 03/16] dundee: Add test scripts
>>
>> From: Daniel Wagner<daniel.wagner@bmw-carit.de>
>>
>> ---
>>   test/dundee-connect    |   20 +++++++++
>>   test/dundee-disconnect |   20 +++++++++
>>   test/monitor-dundee    |  109
>> ++++++++++++++++++++++++++++++++++++++++++++++++
>>   3 files changed, 149 insertions(+)
>>   create mode 100755 test/dundee-connect
>>   create mode 100755 test/dundee-disconnect  create mode 100755
>> test/monitor-dundee
>>
>> diff --git a/test/dundee-connect b/test/dundee-connect new file mode 100755
>> index 0000000..6cbc629
>> --- /dev/null
>> +++ b/test/dundee-connect
>> @@ -0,0 +1,20 @@
>> +#!/usr/bin/python
>> +
>> +import dbus
>> +import sys
>> +
>> +bus = dbus.SystemBus()
>> +
>> +if len(sys.argv) == 2:
>> +	path = sys.argv[1]
>> +else:
>> +	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
>> +			'org.ofono.dundee.Manager')
>> +	devices = manager.GetDevices()
>> +	path = devices[0][0]
>> +
>> +print "Connect device %s..." % path
>> +device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
>> +						'org.ofono.dundee.Device')
>> +
>> +device.Connect()
>
> The dbus method connect() does not exist on org.ofono.dundee.Device, it cannot be found in device.c and doc/dundee-api.txt.
> Why?
>
> Best regards
>
>> diff --git a/test/dundee-disconnect b/test/dundee-disconnect new file mode
>> 100755 index 0000000..e67d8cd
>> --- /dev/null
>> +++ b/test/dundee-disconnect
>> @@ -0,0 +1,20 @@
>> +#!/usr/bin/python
>> +
>> +import dbus
>> +import sys
>> +
>> +bus = dbus.SystemBus()
>> +
>> +if len(sys.argv) == 2:
>> +	path = sys.argv[1]
>> +else:
>> +	manager = dbus.Interface(bus.get_object('org.ofono.dundee', '/'),
>> +			'org.ofono.dundee.Manager')
>> +	devices = manager.GetDevices()
>> +	path = devices[0][0]
>> +
>> +print "Disonnect device %s..." % path
>> +device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
>> +						'org.ofono.dundee.Device')
>> +
>> +device.Disconnect()

Change this line to

device.SetProperty("Active", True)

That should do the trick.

> The dbus method Disconnect() does not exist on org.ofono.dundee.Device, it cannot be found in device.c and doc/dundee-api.txt.
> Why?

The documentation and the script are not in sync with the 
implementation. I'll fix that.

Documentation change:

Methods
	SetProperty()

Test script change:

	device.SetProperty("Active", True)

cheers,
daniel

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-04-24 12:33 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-02 16:19 [PATCH v6 00/16] Add DUN support Daniel Wagner
2012-04-02 16:19 ` [PATCH v6 01/16] bluetooth: Add Serial interface definition Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 02/16] dundee: Add documentation Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 03/16] dundee: Add test scripts Daniel Wagner
2012-04-23 10:13   ` Zheng, Wu
2012-04-24 12:33     ` Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 04/16] dundee: Add skeleton implementation Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 05/16] dundee: Add D-Bus error messages Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 06/16] dundee: Add D-Bus configuration file Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 07/16] dundee: Add systemd " Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 08/16] dundee: Add Manager interface Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 09/16] dundee: Add skeleton implementation for device Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 10/16] dundee: Manager append devices Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 11/16] dundee: Add callback helpers Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 12/16] dundee: Add device un/register Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 13/16] dundee: Add driver helper functions Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 14/16] dundee: Add device D-Bus interface Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 15/16] dundee: Add PPP handling code to device Daniel Wagner
2012-04-02 16:20 ` [PATCH v6 16/16] dundee: Add Bluetooth DUN driver Daniel Wagner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.