summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Orlenko <zxteam@gmail.com>2010-08-06 00:16:42 +1100
committerAlexander Orlenko <zxteam@gmail.com>2010-08-06 00:16:42 +1100
commitd1c224a0a9b4784ace2bcc6d47853e7be14b37f9 (patch)
tree82d297cf2afbd93183fbf043743d3303f66af1ff
parent0481758ed2da4de6f4f92295dad91e0c07c6e316 (diff)
downloadbluez-tools-d1c224a0a9b4784ace2bcc6d47853e7be14b37f9.tar.gz
Added type 'dict{s,s}' to api-generator && fixed obex-data-server api
Base impl of obex server. TODO: client Some others changes
-rwxr-xr-xcontrib/gen-dbus-gobject.pl1
-rw-r--r--contrib/obex-data-server-api-0.4.5-fixed.txt12
-rw-r--r--src/bt-adapter.c2
-rw-r--r--src/bt-agent.c2
-rw-r--r--src/bt-audio.c2
-rw-r--r--src/bt-device.c2
-rw-r--r--src/bt-input.c2
-rw-r--r--src/bt-monitor.c2
-rw-r--r--src/bt-network.c2
-rw-r--r--src/bt-obex.c395
-rw-r--r--src/bt-serial.c2
-rw-r--r--src/lib/agent.c10
-rw-r--r--src/lib/helpers.c8
-rw-r--r--src/lib/obexmanager.c8
-rw-r--r--src/lib/obexserver.c4
-rw-r--r--src/lib/obexserver_session.c4
-rw-r--r--src/lib/obexsession.c4
17 files changed, 416 insertions, 46 deletions
diff --git a/contrib/gen-dbus-gobject.pl b/contrib/gen-dbus-gobject.pl
index 7ff247b..002b0b4 100755
--- a/contrib/gen-dbus-gobject.pl
+++ b/contrib/gen-dbus-gobject.pl
@@ -184,6 +184,7 @@ sub get_g_type_name {
$g_type_name = 'G_TYPE_UINT64' if $bluez_type eq 'uint64';
$g_type_name = 'DBUS_TYPE_G_STRING_VARIANT_HASHTABLE' if $bluez_type eq 'dict';
$g_type_name = 'DBUS_TYPE_G_UINT_STRING_HASHTABLE' if $bluez_type eq 'dict{u,s}';
+ $g_type_name = 'DBUS_TYPE_G_STRING_STRING_HASHTABLE' if $bluez_type eq 'dict{s,s}';
$g_type_name = 'DBUS_TYPE_G_OBJECT_ARRAY' if $bluez_type eq 'array{object}';
$g_type_name = 'G_TYPE_STRV' if $bluez_type eq 'array{string}';
$g_type_name = 'G_TYPE_UCHAR' if $bluez_type eq 'byte';
diff --git a/contrib/obex-data-server-api-0.4.5-fixed.txt b/contrib/obex-data-server-api-0.4.5-fixed.txt
index b9a7325..ec2731b 100644
--- a/contrib/obex-data-server-api-0.4.5-fixed.txt
+++ b/contrib/obex-data-server-api-0.4.5-fixed.txt
@@ -96,7 +96,7 @@ Methods object CreateBluetoothSession(string target_address, string source_addr
Possible errors: none
- dict GetUsbInterfaceInfo(integer interface_number) {skipped}
+ dict{s,s} GetUsbInterfaceInfo(integer interface_number) {skipped}
Returns info about specified USB OBEX interface:
"Manufacturer" : Manufacturer of the device
@@ -156,7 +156,7 @@ Methods object CreateBluetoothSession(string target_address, string source_addr
Possible errors: org.openobex.Error.Failed
org.openobex.Error.InvalidArguments
- dict GetSessionInfo(object session_object)
+ dict{s,s} GetSessionInfo(object session_object)
Returns info about specified session:
"BluetoothTargetAddress" : Target device Bluetooth address (only for Bluetooth sessions);
@@ -169,7 +169,7 @@ Methods object CreateBluetoothSession(string target_address, string source_addr
Possible errors: none
- dict GetServerInfo(object server_object)
+ dict{s,s} GetServerInfo(object server_object)
Returns info about specified server:
"BluetoothSourceAddress" : Bluetooth source address (only for Bluetooth servers);
@@ -287,7 +287,7 @@ Methods void Start(string path, boolean allow_write, boolean auto_accept)
Possible errors: org.openobex.Error.InvalidArguments
- dict GetServerSessionInfo(object session_object)
+ dict{s,s} GetServerSessionInfo(object session_object)
Returns info about specified server session:
"BluetoothAddress" : Client device Bluetooth address;
@@ -696,7 +696,7 @@ Methods void Disconnect()
Possible errors: org.openobex.Error.Failed
- dict GetTransferInfo()
+ dict{s,s} GetTransferInfo()
Returns info about the ongoing transfer:
"LocalPath" : full local path;
@@ -805,7 +805,7 @@ Methods void Accept()
Possible errors: none?
- dict GetTransferInfo()
+ dict{s,s} GetTransferInfo()
Returns all info about the ongoing transfer (filename, local path,
total bytes).
diff --git a/src/bt-adapter.c b/src/bt-adapter.c
index 5a9b311..e34cb3d 100644
--- a/src/bt-adapter.c
+++ b/src/bt-adapter.c
@@ -114,7 +114,7 @@ int main(int argc, char *argv[])
" PairableTimeout\n"
" Powered\n\n"
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-agent.c b/src/bt-agent.c
index 9646e1c..f6b9a16 100644
--- a/src/bt-agent.c
+++ b/src/bt-agent.c
@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
g_option_context_set_description(context,
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-audio.c b/src/bt-audio.c
index a4151bc..2bc555e 100644
--- a/src/bt-audio.c
+++ b/src/bt-audio.c
@@ -72,7 +72,7 @@ int main(int argc, char *argv[])
g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
g_option_context_set_description(context,
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-device.c b/src/bt-device.c
index f14a503..abc2dd6 100644
--- a/src/bt-device.c
+++ b/src/bt-device.c
@@ -263,7 +263,7 @@ int main(int argc, char *argv[])
" Trusted\n"
" Blocked\n\n"
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-input.c b/src/bt-input.c
index ca41fd3..57bb471 100644
--- a/src/bt-input.c
+++ b/src/bt-input.c
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
g_option_context_set_description(context,
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-monitor.c b/src/bt-monitor.c
index e57aac6..8522a3e 100644
--- a/src/bt-monitor.c
+++ b/src/bt-monitor.c
@@ -429,7 +429,7 @@ int main(int argc, char *argv[])
g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
g_option_context_set_description(context,
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-network.c b/src/bt-network.c
index ff54830..21a9fb1 100644
--- a/src/bt-network.c
+++ b/src/bt-network.c
@@ -88,7 +88,7 @@ int main(int argc, char *argv[])
" Enabled\n"
" By default - show status\n\n"
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/bt-obex.c b/src/bt-obex.c
index 3743636..ea27e28 100644
--- a/src/bt-obex.c
+++ b/src/bt-obex.c
@@ -27,16 +27,303 @@
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
#include <glib.h>
#include "lib/bluez-dbus.h"
+typedef struct {
+ OBEXServer *serv;
+ OBEXServerSession *sess;
+ gchar *sess_id;
+
+ /* Client address */
+ gchar *client_name;
+ gchar *client_addr;
+
+ /* Transfer info */
+ gchar *filename;
+ gchar *local_path;
+ guint64 size;
+ guint pp; // per sent
+} sess_transf_s;
+
+static gchar *server_type = NULL;
+static GHashTable *server_sessions = NULL;
+
+/* Main arguments */
static gchar *adapter_arg = NULL;
-static gchar *server_arg = NULL;
+static gboolean server_arg = FALSE;
+static gchar *server_type_arg = NULL;
+static gchar *server_path_arg = NULL;
+static gboolean opp_arg = FALSE;
+static gchar *opp_device_arg = NULL;
+static gchar *opp_file_arg = NULL;
+static gchar *ftp_arg = NULL;
+
+/* Sessions signals defs */
+static void obexserver_session_cancelled(OBEXServerSession *session, gpointer data);
+static void obexserver_session_disconnected(OBEXServerSession *session, gpointer data);
+static void obexserver_session_transfer_started(OBEXServerSession *session, const gchar *filename, const gchar *local_path, guint64 total_bytes, gpointer data);
+static void obexserver_session_transfer_progress(OBEXServerSession *session, guint64 bytes_transferred, gpointer data);
+static void obexserver_session_transfer_completed(OBEXServerSession *session, gpointer data);
+static void obexserver_session_error_occurred(OBEXServerSession *session, const gchar *error_name, const gchar *error_message, gpointer data);
+
+static void obexsession_cancelled(OBEXSession *session, gpointer data);
+static void obexsession_disconnected(OBEXSession *session, gpointer data);
+static void obexsession_closed(OBEXSession *session, gpointer data);
+static void obexsession_transfer_started(OBEXSession *session, const gchar *filename, const gchar *local_path, guint64 total_bytes, gpointer data);
+static void obexsession_transfer_progress(OBEXSession *session, guint64 bytes_transferred, gpointer data);
+static void obexsession_transfer_completed(OBEXSession *session, gpointer data);
+static void obexsession_error_occurred(OBEXSession *session, const gchar *error_name, const gchar *error_message, gpointer data);
+
+/*
+ * OBEXManager signals
+ */
+static void obexmanager_session_connected(OBEXManager *manager, const gchar *path, gpointer data)
+{
+ g_print("[OBEXManager] Session connected: %s\n", path);
+}
+
+static void obexmanager_session_connect_error(OBEXManager *manager, const gchar *path, const gchar *error_name, const gchar *error_message, gpointer data)
+{
+ g_print("[OBEXManager] Session connect error: %s:%s\n", path, error_name, error_message);
+}
+
+static void obexmanager_session_closed(OBEXManager *manager, const gchar *path, gpointer data)
+{
+ g_print("[OBEXManager] Session closed: %s\n", path);
+}
+
+/*
+ * OBEXServer signals
+ */
+static void obexserver_started(OBEXServer *server, gpointer data)
+{
+ g_print("[%sServer] Started\n", server_type);
+}
+
+static void obexserver_stopped(OBEXServer *server, gpointer data)
+{
+ g_print("[%sServer] Stopped\n", server_type);
+}
+
+static void obexserver_closed(OBEXServer *server, gpointer data)
+{
+ g_print("[%sServer] Closed\n", server_type);
+}
+
+static void obexserver_error_occurred(OBEXServer *server, const gchar *error_name, const gchar *error_message, gpointer data)
+{
+ g_print("[%sServer] %s:%s\n", server_type, error_name, error_message);
+}
+
+static void obexserver_session_created(OBEXServer *server, const gchar *path, gpointer data)
+{
+ OBEXServerSession *session = g_object_new(OBEXSERVER_SESSION_TYPE, "DBusObjectPath", path, NULL);
+ g_signal_connect(session, "Cancelled", G_CALLBACK(obexserver_session_cancelled), NULL);
+ g_signal_connect(session, "Disconnected", G_CALLBACK(obexserver_session_disconnected), NULL);
+ g_signal_connect(session, "TransferStarted", G_CALLBACK(obexserver_session_transfer_started), NULL);
+ g_signal_connect(session, "TransferProgress", G_CALLBACK(obexserver_session_transfer_progress), NULL);
+ g_signal_connect(session, "TransferCompleted", G_CALLBACK(obexserver_session_transfer_completed), NULL);
+ g_signal_connect(session, "ErrorOccurred", G_CALLBACK(obexserver_session_error_occurred), NULL);
+
+ sess_transf_s *t = g_new0(sess_transf_s, 1);
+ t->serv = server;
+ t->sess = session;
+ t->sess_id = g_path_get_basename(path);
+
+ g_print("[%sServer] Session created: %s\n", server_type, t->sess_id);
+
+ /* Get remote address & name (if possible) */
+ GError *error = NULL;
+ GHashTable *sess_info = obexserver_get_server_session_info(server, path, &error);
+ exit_if_error(error);
+ t->client_addr = g_strdup(g_hash_table_lookup(sess_info, "BluetoothAddress"));
+ g_hash_table_unref(sess_info);
+
+ Adapter *adapter_t = find_adapter(adapter_arg, &error);
+ exit_if_error(error);
+ Device *device_t = find_device(adapter_t, t->client_addr, &error);
+ exit_if_error(error);
+ if (device_t)
+ t->client_name = g_strdup(device_get_name(device_t));
+ g_object_unref(device_t);
+ g_object_unref(adapter_t);
+
+ g_hash_table_insert(server_sessions, g_strdup(path), t);
+
+ if (t->client_name)
+ g_print("[%sServer] Client: %s (%s)\n", server_type, t->client_name, t->client_addr);
+ else
+ g_print("[%sServer] Client: %s\n", server_type, t->client_addr);
+}
+
+static void obexserver_session_removed(OBEXServer *server, const gchar *path, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, path);
+ g_assert(t != NULL);
+
+ g_print("[%sServer] Session removed: %s\n", server_type, t->sess_id);
+
+ /* Transfer free (if exists) */
+ g_free(t->filename);
+ g_free(t->local_path);
+ t->size = 0;
+ t->pp = 0;
+
+ /* Session data free */
+ g_free(t->sess_id);
+ g_free(t->client_addr);
+ g_free(t->client_name);
+ g_object_unref(t->sess);
+ g_free(t);
+
+ g_hash_table_remove(server_sessions, path);
+}
+
+/*
+ * OBEXServerSession signals
+ */
+static void obexserver_session_cancelled(OBEXServerSession *session, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ g_print("[%s] Cancelled\n", t->sess_id);
+}
+
+static void obexserver_session_disconnected(OBEXServerSession *session, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ g_print("[%s] Disconnected\n", t->sess_id);
+}
+
+static void obexserver_session_transfer_started(OBEXServerSession *session, const gchar *filename, const gchar *local_path, guint64 total_bytes, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ GError *error = NULL;
+
+ g_print("[%s] Transfer started:\n", t->sess_id);
+ g_print(" Filename: %s\n", filename);
+ g_print(" Save path: %s\n", local_path);
+ g_print(" Size: %llu bytes\n", total_bytes);
+
+ gchar yn[4] = {0,};
+ g_print("Accept (yes/no)? ");
+ errno = 0;
+ if (scanf("%3s", yn) == EOF && errno) {
+ g_warning("%s\n", strerror(errno));
+ }
+ if (g_strcmp0(yn, "y") == 0 || g_strcmp0(yn, "yes") == 0) {
+ obexserver_session_accept(session, &error);
+ exit_if_error(error);
+ } else {
+ obexserver_session_reject(session, &error);
+ exit_if_error(error);
+ return;
+ }
+
+ t->filename = g_strdup(filename);
+ t->local_path = g_strdup(local_path);
+ t->size = total_bytes;
+ t->pp = 0;
+}
+
+static void obexserver_session_transfer_progress(OBEXServerSession *session, guint64 bytes_transferred, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ t->pp = (bytes_transferred / (gfloat) t->size)*100;
+
+ static gboolean update_progress = FALSE;
+ if (!update_progress) {
+ g_print("[%s] Transfer progress: %3u%%", t->sess_id, t->pp);
+ update_progress = TRUE;
+ } else {
+ g_print("\b\b\b\b%3u%%", t->pp);
+ }
+
+ if (t->pp == 100) g_print("\n");
+}
+
+static void obexserver_session_transfer_completed(OBEXServerSession *session, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ g_print("[%s] Transfer completed\n", t->sess_id);
+
+ g_free(t->filename);
+ t->filename = NULL;
+ g_free(t->local_path);
+ t->local_path = NULL;
+ t->size = 0;
+ t->pp = 0;
+}
+
+static void obexserver_session_error_occurred(OBEXServerSession *session, const gchar *error_name, const gchar *error_message, gpointer data)
+{
+ sess_transf_s *t = g_hash_table_lookup(server_sessions, obexserver_session_get_dbus_object_path(session));
+ g_assert(t != NULL);
+
+ /* If an error occurred during transfer */
+ if (t->pp > 0 && t->pp < 100) g_print("\n");
+
+ g_print("[%s] %s:%s\n", t->sess_id, error_name, error_message);
+}
+
+/*
+ * OBEXSession signals
+ */
+static void obexsession_cancelled(OBEXSession *session, gpointer data)
+{
+
+}
+
+static void obexsession_disconnected(OBEXSession *session, gpointer data)
+{
+
+}
+
+static void obexsession_closed(OBEXSession *session, gpointer data)
+{
+
+}
+
+static void obexsession_transfer_started(OBEXSession *session, const gchar *filename, const gchar *local_path, guint64 total_bytes, gpointer data)
+{
+
+}
+
+static void obexsession_transfer_progress(OBEXSession *session, guint64 bytes_transferred, gpointer data)
+{
+
+}
+
+static void obexsession_transfer_completed(OBEXSession *session, gpointer data)
+{
+
+}
+
+static void obexsession_error_occurred(OBEXSession *session, const gchar *error_name, const gchar *error_message, gpointer data)
+{
+
+}
static GOptionEntry entries[] = {
{"adapter", 'a', 0, G_OPTION_ARG_STRING, &adapter_arg, "Adapter name or MAC", "<name|mac>"},
- {"server", 's', 0, G_OPTION_ARG_STRING, &server_arg, "Start OPP/FTP server", "<opp|ftp>"},
+ {"server", 's', 0, G_OPTION_ARG_NONE, &server_arg, "Start OPP/FTP server", NULL},
+ {"opp", 'p', 0, G_OPTION_ARG_NONE, &opp_arg, "Send file to remote device", NULL},
+ {"ftp", 'f', 0, G_OPTION_ARG_STRING, &ftp_arg, "Start FTP session with remote device", "<name|mac>"},
{NULL}
};
@@ -51,19 +338,30 @@ int main(int argc, char *argv[])
g_option_context_add_main_entries(context, entries, NULL);
g_option_context_set_summary(context, "Version "PACKAGE_VERSION);
g_option_context_set_description(context,
+ "Server Options:\n"
+ " -s, --server <opp|ftp> [<path>]\n"
+ " Start OPP/FTP server and use given `path` as root directory\n"
+ " If `path` does not specified - use current directory\n\n"
+ "OPP Options:\n"
+ " -p, --opp <name|mac> <file>\n"
+ " Send `file` to remote device using Object Push Profile\n\n"
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
g_print("%s: %s\n", g_get_prgname(), error->message);
g_print("Try `%s --help` for more information.\n", g_get_prgname());
exit(EXIT_FAILURE);
- } else if (!server_arg) {
+ } else if (!server_arg && !opp_arg && (!ftp_arg || strlen(ftp_arg) == 0)) {
g_print("%s", g_option_context_get_help(context, FALSE, NULL));
exit(EXIT_FAILURE);
- } else if (server_arg && g_strcmp0(server_arg, "opp") != 0 && g_strcmp0(server_arg, "ftp") != 0) {
- g_print("%s: Invalid server type\n", g_get_prgname());
+ } else if (server_arg && (argc != 2 || strlen(argv[1]) == 0) && (argc != 3 || strlen(argv[1]) == 0 || strlen(argv[2]) == 0)) {
+ g_print("%s: Invalid arguments for --server\n", g_get_prgname());
+ g_print("Try `%s --help` for more information.\n", g_get_prgname());
+ exit(EXIT_FAILURE);
+ } else if (opp_arg && (argc != 3 || strlen(argv[1]) == 0 || strlen(argv[2]) == 0)) {
+ g_print("%s: Invalid arguments for --opp\n", g_get_prgname());
g_print("Try `%s --help` for more information.\n", g_get_prgname());
exit(EXIT_FAILURE);
}
@@ -75,32 +373,97 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
+ if (!intf_is_supported(BLUEZ_DBUS_OBEXMANAGER_PATH, OBEXMANAGER_INTF)) {
+ g_printerr("%s: OBEX service does not found\n", g_get_prgname());
+ g_printerr("Did you forget to run obex-data-server?\n");
+ exit(EXIT_FAILURE);
+ }
+
Adapter *adapter = find_adapter(adapter_arg, &error);
exit_if_error(error);
- OBEXManager *obexmanager = g_object_new(OBEXMANAGER_TYPE, NULL);
+ OBEXManager *manager = g_object_new(OBEXMANAGER_TYPE, NULL);
+ g_signal_connect(manager, "SessionConnected", G_CALLBACK(obexmanager_session_connected), NULL);
+ g_signal_connect(manager, "SessionConnectError", G_CALLBACK(obexmanager_session_connect_error), NULL);
+ g_signal_connect(manager, "SessionClosed", G_CALLBACK(obexmanager_session_closed), NULL);
if (server_arg) {
- if (g_strcmp0(server_arg, "opp") == 0) {
- gchar *opp_serv_path = obexmanager_create_bluetooth_server(obexmanager, adapter_get_address(adapter), server_arg, FALSE, error);
- exit_if_error(error);
+ server_sessions = g_hash_table_new(g_str_hash, g_str_equal);
+ server_type_arg = argv[1];
+ if (argc == 3) {
+ server_path_arg = argv[2];
+ }
+
+ /* Check that `path` is valid */
+ gchar *root_dir = NULL;
+ if (server_path_arg == NULL) {
+ root_dir = g_get_current_dir();
+ } else {
+ struct stat buf;
+ if (stat(server_path_arg, &buf) != 0) {
+ g_printerr("%s: %s\n", g_get_prgname(), strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+ if (!S_ISDIR(buf.st_mode)) {
+ g_printerr("%s: Invalid directory: %s\n", g_get_prgname(), server_path_arg);
+ exit(EXIT_FAILURE);
+ }
+ root_dir = g_strdup(server_path_arg);
+ }
+
+ gboolean require_pairing = TRUE;
+ gboolean auto_accept = FALSE;
- OBEXServer *serv = g_object_new(OBEXSERVER_TYPE, "DBusObjectPath", opp_serv_path, NULL);
- obexserver_start(serv, "/home/zak/obex_t", TRUE, TRUE, error);
- exit_if_error(error);
+ if (g_strcmp0(server_type_arg, "opp") == 0) {
+ require_pairing = FALSE;
+ auto_accept = FALSE;
+ server_type = "OPP";
+ } else if (g_strcmp0(server_type_arg, "ftp") == 0) {
+ require_pairing = TRUE;
+ auto_accept = TRUE;
+ server_type = "FTP";
+ } else {
+ g_print("%s: Invalid server type: %s\n", g_get_prgname(), server_type_arg);
+ g_print("Try `%s --help` for more information.\n", g_get_prgname());
+ exit(EXIT_FAILURE);
+ }
+
+ gchar *serv_path = obexmanager_create_bluetooth_server(manager, adapter_get_address(adapter), server_type_arg, require_pairing, &error);
+ exit_if_error(error);
- g_free(opp_serv_path);
- } else if (g_strcmp0(server_arg, "ftp") == 0) {
+ OBEXServer *serv = g_object_new(OBEXSERVER_TYPE, "DBusObjectPath", serv_path, NULL);
+ g_signal_connect(serv, "Started", G_CALLBACK(obexserver_started), NULL);
+ g_signal_connect(serv, "Stopped", G_CALLBACK(obexserver_stopped), NULL);
+ g_signal_connect(serv, "Closed", G_CALLBACK(obexserver_closed), NULL);
+ g_signal_connect(serv, "ErrorOccurred", G_CALLBACK(obexserver_error_occurred), NULL);
+ g_signal_connect(serv, "SessionCreated", G_CALLBACK(obexserver_session_created), NULL);
+ g_signal_connect(serv, "SessionRemoved", G_CALLBACK(obexserver_session_removed), NULL);
+ gboolean is_started = obexserver_is_started(serv, &error);
+ exit_if_error(error);
+ if (is_started) {
+ g_printerr("%s: Server is already started\n", g_get_prgname());
+ exit(EXIT_FAILURE);
}
+ obexserver_start(serv, root_dir, TRUE, auto_accept, &error);
+ exit_if_error(error);
+
GMainLoop *mainloop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(mainloop);
+ /* Waiting for connections... */
+
g_main_loop_unref(mainloop);
+ g_object_unref(serv);
+ g_free(serv_path);
+ g_free(root_dir);
+ g_hash_table_unref(server_sessions);
+ } else if (opp_arg) {
+
}
- g_object_unref(obexmanager);
+ g_object_unref(manager);
g_object_unref(adapter);
dbus_disconnect();
diff --git a/src/bt-serial.c b/src/bt-serial.c
index ae80849..2d2ed11 100644
--- a/src/bt-serial.c
+++ b/src/bt-serial.c
@@ -68,7 +68,7 @@ int main(int argc, char *argv[])
" Where `tty_device` is:\n"
" RFCOMM TTY device that has been connected\n\n"
//"Report bugs to <"PACKAGE_BUGREPORT">."
- "Project home <"PACKAGE_URL">."
+ "Project home page <"PACKAGE_URL">."
);
if (!g_option_context_parse(context, &argc, &argv, &error)) {
diff --git a/src/lib/agent.c b/src/lib/agent.c
index 5781c0d..eb1c6b9 100644
--- a/src/lib/agent.c
+++ b/src/lib/agent.c
@@ -84,7 +84,7 @@ gboolean agent_release(Agent *self, GError **error)
gboolean agent_request_pin_code(Agent *self, const gchar *device, gchar **ret, GError **error)
{
Device *device_obj = g_object_new(DEVICE_TYPE, "DBusObjectPath", device, NULL);
- g_print("Device: %s (%s)\n", device_get_address(device_obj), device_get_alias(device_obj));
+ g_print("Device: %s (%s)\n", device_get_alias(device_obj), device_get_address(device_obj));
g_object_unref(device_obj);
*ret = g_new0(gchar, 17);
@@ -99,7 +99,7 @@ gboolean agent_request_pin_code(Agent *self, const gchar *device, gchar **ret, G
gboolean agent_request_passkey(Agent *self, const gchar *device, guint *ret, GError **error)
{
Device *device_obj = g_object_new(DEVICE_TYPE, "DBusObjectPath", device, NULL);
- g_print("Device: %s (%s)\n", device_get_address(device_obj), device_get_alias(device_obj));
+ g_print("Device: %s (%s)\n", device_get_alias(device_obj), device_get_address(device_obj));
g_object_unref(device_obj);
g_print("Enter passkey: ");
@@ -113,7 +113,7 @@ gboolean agent_request_passkey(Agent *self, const gchar *device, guint *ret, GEr
gboolean agent_display_passkey(Agent *self, const gchar *device, guint passkey, guint8 entered, GError **error)
{
Device *device_obj = g_object_new(DEVICE_TYPE, "DBusObjectPath", device, NULL);
- g_print("Device: %s (%s)\n", device_get_address(device_obj), device_get_alias(device_obj));
+ g_print("Device: %s (%s)\n", device_get_alias(device_obj), device_get_address(device_obj));
g_object_unref(device_obj);
g_print("Passkey: %u, entered: %u\n", passkey, entered);
@@ -123,7 +123,7 @@ gboolean agent_display_passkey(Agent *self, const gchar *device, guint passkey,
gboolean agent_request_confirmation(Agent *self, const gchar *device, guint passkey, GError **error)
{
Device *device_obj = g_object_new(DEVICE_TYPE, "DBusObjectPath", device, NULL);
- g_print("Device: %s (%s)\n", device_get_address(device_obj), device_get_alias(device_obj));
+ g_print("Device: %s (%s)\n", device_get_alias(device_obj), device_get_address(device_obj));
g_object_unref(device_obj);
gchar yn[4] = {0,};
@@ -147,7 +147,7 @@ gboolean agent_request_confirmation(Agent *self, const gchar *device, guint pass
gboolean agent_authorize(Agent *self, const gchar *device, const gchar *uuid, GError **error)
{
Device *device_obj = g_object_new(DEVICE_TYPE, "DBusObjectPath", device, NULL);
- g_print("Device: %s (%s)\n", device_get_address(device_obj), device_get_alias(device_obj));
+ g_print("Device: %s (%s)\n", device_get_alias(device_obj), device_get_address(device_obj));
g_object_unref(device_obj);
gchar yn[4] = {0,};
diff --git a/src/lib/helpers.c b/src/lib/helpers.c
index f9e64ca..8dd2a41 100644
--- a/src/lib/helpers.c
+++ b/src/lib/helpers.c
@@ -143,7 +143,7 @@ Adapter *find_adapter(const gchar *name, GError **error)
Manager *manager = g_object_new(MANAGER_TYPE, NULL);
- // If name is null - return default adapter
+ // If name is null or empty - return default adapter
if (name == NULL || strlen(name) == 0) {
adapter_path = manager_default_adapter(manager, error);
if (adapter_path) {
@@ -297,7 +297,13 @@ gboolean intf_is_supported(const gchar *dbus_object_path, int intf_id)
gchar *introspection_xml = NULL;
GError *error = NULL;
if (!dbus_g_proxy_call(introspection_g_proxy, "Introspect", &error, G_TYPE_INVALID, G_TYPE_STRING, &introspection_xml, G_TYPE_INVALID)) {
+#if 0
g_critical("%s", error->message);
+#else
+ g_error_free(error);
+ error = NULL;
+ introspection_xml = g_strdup("null");
+#endif
}
g_assert(error == NULL);
diff --git a/src/lib/obexmanager.c b/src/lib/obexmanager.c
index 3fb9734..576e36c 100644
--- a/src/lib/obexmanager.c
+++ b/src/lib/obexmanager.c
@@ -184,13 +184,13 @@ gchar *obexmanager_create_bluetooth_session(OBEXManager *self, const gchar *targ
return ret;
}
-/* dict GetServerInfo(object server_object) */
+/* dict{s,s} GetServerInfo(object server_object) */
GHashTable *obexmanager_get_server_info(OBEXManager *self, const gchar *server_object, GError **error)
{
g_assert(OBEXMANAGER_IS(self));
GHashTable *ret = NULL;
- dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetServerInfo", error, DBUS_TYPE_G_OBJECT_PATH, server_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID);
+ dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetServerInfo", error, DBUS_TYPE_G_OBJECT_PATH, server_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_STRING_HASHTABLE, &ret, G_TYPE_INVALID);
return ret;
}
@@ -206,13 +206,13 @@ gchar **obexmanager_get_server_list(OBEXManager *self, GError **error)
return ret;
}
-/* dict GetSessionInfo(object session_object) */
+/* dict{s,s} GetSessionInfo(object session_object) */
GHashTable *obexmanager_get_session_info(OBEXManager *self, const gchar *session_object, GError **error)
{
g_assert(OBEXMANAGER_IS(self));
GHashTable *ret = NULL;
- dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetSessionInfo", error, DBUS_TYPE_G_OBJECT_PATH, session_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID);
+ dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetSessionInfo", error, DBUS_TYPE_G_OBJECT_PATH, session_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_STRING_HASHTABLE, &ret, G_TYPE_INVALID);
return ret;
}
diff --git a/src/lib/obexserver.c b/src/lib/obexserver.c
index d796550..df07a68 100644
--- a/src/lib/obexserver.c
+++ b/src/lib/obexserver.c
@@ -262,13 +262,13 @@ void obexserver_close(OBEXServer *self, GError **error)
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Close", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
-/* dict GetServerSessionInfo(object session_object) */
+/* dict{s,s} GetServerSessionInfo(object session_object) */
GHashTable *obexserver_get_server_session_info(OBEXServer *self, const gchar *session_object, GError **error)
{
g_assert(OBEXSERVER_IS(self));
GHashTable *ret = NULL;
- dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetServerSessionInfo", error, DBUS_TYPE_G_OBJECT_PATH, session_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID);
+ dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetServerSessionInfo", error, DBUS_TYPE_G_OBJECT_PATH, session_object, G_TYPE_INVALID, DBUS_TYPE_G_STRING_STRING_HASHTABLE, &ret, G_TYPE_INVALID);
return ret;
}
diff --git a/src/lib/obexserver_session.c b/src/lib/obexserver_session.c
index 9a53cff..45f493f 100644
--- a/src/lib/obexserver_session.c
+++ b/src/lib/obexserver_session.c
@@ -278,13 +278,13 @@ void obexserver_session_disconnect(OBEXServerSession *self, GError **error)
dbus_g_proxy_call(self->priv->dbus_g_proxy, "Disconnect", error, G_TYPE_INVALID, G_TYPE_INVALID);
}
-/* dict GetTransferInfo() */
+/* dict{s,s} GetTransferInfo() */
GHashTable *obexserver_session_get_transfer_info(OBEXServerSession *self, GError **error)
{
g_assert(OBEXSERVER_SESSION_IS(self));
GHashTable *ret = NULL;
- dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetTransferInfo", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID);
+ dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetTransferInfo", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_STRING_HASHTABLE, &ret, G_TYPE_INVALID);
return ret;
}
diff --git a/src/lib/obexsession.c b/src/lib/obexsession.c
index 117d050..368a622 100644
--- a/src/lib/obexsession.c
+++ b/src/lib/obexsession.c
@@ -370,13 +370,13 @@ gchar *obexsession_get_current_path(OBEXSession *self, GError **error)
return ret;
}
-/* dict GetTransferInfo() */
+/* dict{s,s} GetTransferInfo() */
GHashTable *obexsession_get_transfer_info(OBEXSession *self, GError **error)
{
g_assert(OBEXSESSION_IS(self));
GHashTable *ret = NULL;
- dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetTransferInfo", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_VARIANT_HASHTABLE, &ret, G_TYPE_INVALID);
+ dbus_g_proxy_call(self->priv->dbus_g_proxy, "GetTransferInfo", error, G_TYPE_INVALID, DBUS_TYPE_G_STRING_STRING_HASHTABLE, &ret, G_TYPE_INVALID);
return ret;
}