From 743392e6c62478c73b23d10a181d76eb4d474d08 Mon Sep 17 00:00:00 2001
From: Thomas Perl <thp@thpinfo.com>
Date: Thu, 4 Mar 2010 23:34:51 +0100
Subject: [PATCH] Primitive dial-up networking support

---
 applet/main.c        |   67 ++++++++++++++++++++++++++++++++++++++++++++++++++
 applet/popup-menu.ui |    8 ++++++
 debian/changelog     |    6 ++++
 3 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/applet/main.c b/applet/main.c
index 2112a9e..bebbf7b 100644
--- a/applet/main.c
+++ b/applet/main.c
@@ -70,6 +70,7 @@ static GtkActionGroup *devices_action_group = NULL;
 void settings_callback(GObject *widget, gpointer user_data);
 void quit_callback(GObject *widget, gpointer user_data);
 void browse_callback(GObject *widget, gpointer user_data);
+void dun_callback(GObject *widget, gpointer user_data);
 void bluetooth_status_callback (GObject *widget, gpointer user_data);
 void wizard_callback(GObject *widget, gpointer user_data);
 void sendto_callback(GObject *widget, gpointer user_data);
@@ -100,6 +101,63 @@ select_device_changed(BluetoothChooser *sel,
 				GTK_RESPONSE_ACCEPT, address != NULL);
 }
 
+void dun_callback(GObject *widget, gpointer user_data)
+{
+	char *address, *cmd;
+
+	address = g_strdup (g_object_get_data (widget, "address"));
+	if (address == NULL) {
+		GtkWidget *dialog, *selector;
+		int response_id;
+
+		dialog = gtk_dialog_new_with_buttons(_("Select Device for DUN"), NULL,
+						     GTK_DIALOG_NO_SEPARATOR,
+						     GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+						     NULL);
+		gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Dial-up"), GTK_RESPONSE_ACCEPT);
+		gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog),
+						  GTK_RESPONSE_ACCEPT, FALSE);
+		gtk_window_set_default_size(GTK_WINDOW(dialog), 480, 400);
+
+		gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+		gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2);
+
+		selector = bluetooth_chooser_new(_("Select device for DUN"));
+		gtk_container_set_border_width(GTK_CONTAINER(selector), 5);
+		gtk_widget_show(selector);
+		g_object_set(selector,
+			     "show-searching", FALSE,
+			     "show-device-category", FALSE,
+			     "show-device-type", TRUE,
+			     "device-category-filter", BLUETOOTH_CATEGORY_PAIRED_OR_TRUSTED,
+			     "device-service-filter", "DialupNetworking",
+			     NULL);
+		g_signal_connect(selector, "selected-device-changed",
+				 G_CALLBACK(select_device_changed), dialog);
+		gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), selector);
+
+		address = NULL;
+		response_id = gtk_dialog_run (GTK_DIALOG (dialog));
+		if (response_id == GTK_RESPONSE_ACCEPT)
+			g_object_get (G_OBJECT (selector), "device-selected", &address, NULL);
+
+		gtk_widget_destroy (dialog);
+
+		if (response_id != GTK_RESPONSE_ACCEPT)
+			return;
+	}
+
+	cmd = g_strdup_printf("rfcomm connect 0 %s",
+                              address);
+	g_free (address);
+
+	if (!g_spawn_command_line_async(cmd, NULL))
+		g_printerr("Couldn't execute command: %s\n", cmd);
+
+	g_free (cmd);
+}
+
+
 void browse_callback(GObject *widget, gpointer user_data)
 {
 	char *address, *cmd;
@@ -801,6 +859,15 @@ update_device_list (GtkTreeIter *parent)
 					       G_CALLBACK (browse_callback));
 			}
 
+                        if (device_has_uuid ((const char**) uuids, "DialupNetworking") != FALSE) {
+				add_menu_item (address,
+					       "dun",
+					       _("Start dial-up networking"),
+					       uimanager,
+					       menu_merge_id,
+					       G_CALLBACK (dun_callback));
+                        }
+
 			add_separator_item (address, "files-sep", uimanager, menu_merge_id);
 
 			if (type == BLUETOOTH_TYPE_KEYBOARD && program_available (KEYBOARD_PREFS)) {
diff --git a/applet/popup-menu.ui b/applet/popup-menu.ui
index 1ced8a1..52aba2e 100644
--- a/applet/popup-menu.ui
+++ b/applet/popup-menu.ui
@@ -25,6 +25,13 @@
 		<child>
 			<object class="GtkActionGroup" id="adapter-action-group">
 				<child>
+					<object class="GtkAction" id="dun">
+						<property name="label" translatable="yes">Start dial-up networking</property>
+						<property name="icon-name">modem</property>
+						<signal name="activate" handler="dun_callback"/>
+					</object>
+				</child>
+				<child>
 					<object class="GtkAction" id="send-file">
 						<property name="label" translatable="yes">Send files to device...</property>
 						<property name="icon-name">document-send</property>
@@ -80,6 +87,7 @@
 
 				<menuitem name="send-file" action="send-file"/>
 				<menuitem name="browse-device" action="browse-device"/>
+				<menuitem name="dun" action="dun"/>
 
 				<separator name="action-separator"/>
 
diff --git a/debian/changelog b/debian/changelog
index 9809726..c04f7a9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+gnome-bluetooth (2.28.1-0ubuntu2~thp) karmic; urgency=low
+
+  * Hack-ish support for Bluetooth Dial-up networking
+
+ -- Thomas Perl <thp@thpinfo.com>  Thu, 04 Mar 2010 23:37:55 +0100
+
 gnome-bluetooth (2.28.1-0ubuntu2) karmic; urgency=low
 
   * fix LP: #437162 - Gnome Bluetooth needs to use different icons for
-- 
1.6.3.3


