From d1c224a0a9b4784ace2bcc6d47853e7be14b37f9 Mon Sep 17 00:00:00 2001 From: Alexander Orlenko Date: Fri, 6 Aug 2010 00:16:42 +1100 Subject: Added type 'dict{s,s}' to api-generator && fixed obex-data-server api Base impl of obex server. TODO: client Some others changes --- contrib/gen-dbus-gobject.pl | 1 + contrib/obex-data-server-api-0.4.5-fixed.txt | 12 +- src/bt-adapter.c | 2 +- src/bt-agent.c | 2 +- src/bt-audio.c | 2 +- src/bt-device.c | 2 +- src/bt-input.c | 2 +- src/bt-monitor.c | 2 +- src/bt-network.c | 2 +- src/bt-obex.c | 395 +++++++++++++++++++++++++-- src/bt-serial.c | 2 +- src/lib/agent.c | 10 +- src/lib/helpers.c | 8 +- src/lib/obexmanager.c | 8 +- src/lib/obexserver.c | 4 +- src/lib/obexserver_session.c | 4 +- src/lib/obexsession.c | 4 +- 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 #include +#include +#include +#include +#include #include #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", ""}, - {"server", 's', 0, G_OPTION_ARG_STRING, &server_arg, "Start OPP/FTP server", ""}, + {"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", ""}, {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 []\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 \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; } -- cgit v1.2.1