Blob Blame History Raw
From a57817c7e52ede1589ffbd7e2abb444734e2df92 Mon Sep 17 00:00:00 2001
From: Tomas Hozza <thozza@redhat.com>
Date: Mon, 9 Sep 2013 18:12:00 +0200
Subject: [PATCH 1/2] Add sample application obex_push

obex_push is a sample application capable of pushing
and receiving files over the Bluetooth OBEX Push Channel.

Signed-off-by: Tomas Hozza <thozza@redhat.com>
---
 apps/CMakeLists.txt      |   9 +++
 apps/obex_push.c         | 177 +++++++++++++++++++++++++++++++++++++++++++++++
 doc/obex_push.xml        |  78 +++++++++++++++++++++
 doc/openobex-apps.xml    |   1 +
 doc/referenceinfo.xml.in |   6 ++
 5 files changed, 271 insertions(+)
 create mode 100644 apps/obex_push.c
 create mode 100644 doc/obex_push.xml

diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
index 55268ca..6aefb23 100644
--- a/apps/CMakeLists.txt
+++ b/apps/CMakeLists.txt
@@ -4,6 +4,10 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib )
 add_subdirectory ( obex_test )
 add_subdirectory ( ircp )
 
+set ( OPENOBEX_BLUETOOTH_APPS
+  obex_push
+)
+
 set ( OPENOBEX_COMMON_APPS
   irxfer
   irobex_palm3
@@ -18,6 +22,11 @@ if ( NOT CMAKE_SYSTEM_NAME STREQUAL "Windows" )
   list ( APPEND OPENOBEX_COMMON_APPS obex_tcp )
 endif ( NOT CMAKE_SYSTEM_NAME STREQUAL "Windows" )
 
+foreach ( prog ${OPENOBEX_BLUETOOTH_APPS} )
+  list ( APPEND ${prog}_LIBS bluetooth )
+  list ( APPEND OPENOBEX_COMMON_APPS ${prog} )
+endforeach ( prog )
+
 foreach ( prog ${OPENOBEX_COMMON_APPS} )
   list ( APPEND ${prog}_LIBS openobex-apps-common )
   list ( APPEND OPENOBEX_APPS ${prog} )
diff --git a/apps/obex_push.c b/apps/obex_push.c
new file mode 100644
index 0000000..c5b7d2e
--- /dev/null
+++ b/apps/obex_push.c
@@ -0,0 +1,177 @@
+/*********************************************************************
+ *                
+ * Filename:      obex_push.c
+ * Version:       0.1
+ * Description:   Demonstrates use of PUSH command
+ * Status:        Experimental.
+ * Author:        Harald Hoyer <harald@redhat.com
+ *
+ *     modified irobex_palm3.c
+ * 
+ *     Copyright (C) 2003-2007 Harald Hoyer, All Rights Reserved.
+ *     Copyright (C) 2003-2007 Red Hat, Inc.
+ *     
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ * 
+ *     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., 59 Temple Place, Suite 330, Boston, 
+ *     MA 02111-1307 USA
+ *
+ *
+ *     Start without arguments to receive a file.
+ *     Start with address and filename as argument to send a file. 
+ *     
+ ********************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if _WIN32
+#include <winsock.h>
+#else
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#endif /* _WIN32 */
+
+#include <libgen.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/rfcomm.h>
+
+#include <openobex/obex.h>
+
+#include "obex_put_common.h"
+#include "ircp/ircp_io.h"
+
+#define OBEX_PUSH_HANDLE	10
+
+#define TRUE  1
+#define FALSE 0
+
+obex_t *handle = NULL;
+volatile int finished = FALSE;
+extern int last_rsp;
+
+/*
+ * Function main (argc, )
+ *
+ *    Starts all the fun!
+ *
+ */
+int main(int argc, char *argv[])
+{
+	obex_object_t *object;
+	int ret, exitval = EXIT_SUCCESS;
+	bdaddr_t bdaddr;
+	uint8_t channel;
+	char *filename;
+	if ((argc < 1) || (argc > 4))	{
+		printf ("Usage: %s [<channel>] [<bdaddr> <filename>]\n", argv[0]); 
+		return -1;
+	}
+	handle = OBEX_Init(OBEX_TRANS_BLUETOOTH, obex_event, 0);
+
+	switch (argc) {
+#ifdef HAVE_BLUETOOTH
+	case 4:
+		channel = atoi(argv[1]);
+		str2ba(argv[2], &bdaddr);
+		filename = argv[3];
+		break;
+	case 3:
+		str2ba(argv[1], &bdaddr);
+		filename = argv[2];
+		channel = OBEX_PUSH_HANDLE;
+		break;
+	case 2:
+		channel = atoi(argv[1]);
+		break;
+	case 1:
+		channel = OBEX_PUSH_HANDLE;
+		break;
+#endif
+	default:
+		printf("Wrong number of arguments\n");
+		exit(0);
+	}
+
+	printf("Send and receive files through bluetooth OBEX PUSH channel %d\n", channel);
+	if (argc <= 2)	{
+		char cmd[1024];
+		int ret;
+		/* We are server*/
+		snprintf(cmd, sizeof(cmd), "sdptool add --channel=%d OPUSH", channel);
+		ret = system(cmd);
+		if (ret != 0) {
+			fprintf(stderr, "Command failed: %s\n", cmd);
+		}
+		
+		printf("Waiting for files\n");
+		BtOBEX_ServerRegister(handle, NULL, channel);
+		
+		while (!finished)
+			OBEX_HandleInput(handle, 1);
+	}
+	else {
+		char *basefilename = basename(strdup(filename));
+		/* We are a client */
+		if (bacmp(&bdaddr, BDADDR_ANY) == 0) {
+			printf("Device address error! (Bluetooth)\n");
+			return -1;
+		}
+
+		/* Try to connect to peer */
+		ret = BtOBEX_TransportConnect(handle, BDADDR_ANY, &bdaddr,
+					      channel);
+		if (ret < 0) {
+			printf("Sorry, unable to connect!\n");
+			return EXIT_FAILURE;
+		}
+
+		object = OBEX_ObjectNew(handle, OBEX_CMD_CONNECT);
+		ret = do_sync_request(handle, object, FALSE);
+		if ((last_rsp != OBEX_RSP_SUCCESS) || (ret < 0)) {
+			printf("Sorry, unable to connect!\n");
+			return EXIT_FAILURE;
+		}
+		if ((object = build_object_from_file(handle, filename,
+					basefilename)))
+		{
+			ret = do_sync_request(handle, object, FALSE);
+			if ((last_rsp != OBEX_RSP_SUCCESS) || (ret < 0))
+				exitval = EXIT_FAILURE;
+		} else
+			exitval = EXIT_FAILURE;
+
+		object = OBEX_ObjectNew(handle, OBEX_CMD_DISCONNECT);
+		ret = do_sync_request(handle, object, FALSE);
+		if ((last_rsp != OBEX_RSP_SUCCESS) || (ret < 0))
+			exitval = EXIT_FAILURE;
+
+		if (exitval == EXIT_SUCCESS)
+			printf("PUT successful\n");
+		else
+			printf("PUT failed\n");
+	}
+//	sleep(1);
+	return exitval;
+}
diff --git a/doc/obex_push.xml b/doc/obex_push.xml
new file mode 100644
index 0000000..0d3b105
--- /dev/null
+++ b/doc/obex_push.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" ?>
+<!DOCTYPE reference PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<reference id="openobex-apps">
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="referenceinfo.xml" />
+
+  <title>openobex</title>
+
+  <refentry id="obex_push">
+    <refmeta>
+      <refentrytitle>obex_push</refentrytitle>
+      <manvolnum>1</manvolnum>
+      <refmiscinfo class="manual">User commands</refmiscinfo>
+    </refmeta>
+    <refnamediv>
+      <refname>obex_push</refname>
+      <refpurpose>Push and Receive Files over the Bluetooth OBEX Push Channel</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+      <cmdsynopsis>
+        <command>obex_push</command>
+        <arg><replaceable>channel</replaceable></arg>
+        <arg><replaceable>bdaddr</replaceable></arg>
+        <arg><replaceable>filename</replaceable></arg>
+      </cmdsynopsis>
+    </refsynopsisdiv>
+    <refsect1>
+      <title>Description</title>
+      <para>
+        obex_push can send and receive files over the Bluetooth OBEX Push Channel.
+      </para>
+      <para>
+        This program is designed to be an example application for the openobex library.
+      </para>
+      <para>
+        Link your bluetooth device with your computer.
+      </para>
+      <para>
+        You can see the SDP services with: "sdptool browse <replaceable>bdaddr</replaceable>"
+      </para>
+    </refsect1>
+    <refsect1>
+      <title>Options</title>
+      <para>
+        If no options are given, any files sent over bluetooth will be received over channel 10 and stored in /tmp.
+        If <replaceable>bdaddr</replaceable> and <replaceable>filename</replaceable> are given, the file will be
+        send to the device specified with <replaceable>bdaddr</replaceable>.
+      </para>
+      <para>
+        <variablelist>
+          <varlistentry>
+            <term><replaceable>channel</replaceable></term>
+            <listitem>
+              <para>
+                The bluetooth channel to use. Lookup the OBEX Push channel with sdptool browse <replaceable>bdaddr</replaceable>.
+              </para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term><replaceable>bdaddr</replaceable></term>
+            <listitem>
+              <para>
+                The bluetooth address <replaceable>bdaddr</replaceable> of the device to send to.
+              </para>
+            </listitem>
+          </varlistentry>
+          <varlistentry>
+            <term><replaceable>filename</replaceable></term>
+            <listitem>
+              <para>
+                The file to send.
+              </para>
+            </listitem>
+          </varlistentry>
+        </variablelist>
+      </para>
+    </refsect1>
+  </refentry>
+</reference>
diff --git a/doc/openobex-apps.xml b/doc/openobex-apps.xml
index e874f6c..202c842 100644
--- a/doc/openobex-apps.xml
+++ b/doc/openobex-apps.xml
@@ -11,4 +11,5 @@
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="obex_find.xml" xpointer="obex_find" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="obex_tcp.xml" xpointer="obex_tcp" />
   <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="obex_test.xml" xpointer="obex_test" />
+  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="obex_push.xml" xpointer="obex_push" />
 </reference>
diff --git a/doc/referenceinfo.xml.in b/doc/referenceinfo.xml.in
index 77f56c3..1dde6bd 100644
--- a/doc/referenceinfo.xml.in
+++ b/doc/referenceinfo.xml.in
@@ -11,5 +11,11 @@
       <contrib>initial version of manpage</contrib>
       <email>post@hendrik-sattler.de</email>
     </author>
+    <author>
+      <firstname>Harald</firstname>
+      <surname>Hoyer</surname>
+      <contrib>Initial version of obex_push manpage</contrib>
+      <email>harald@redhat.com</email>
+    </author>
   </authorgroup>
 </referenceinfo>
-- 
1.8.3.1