Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/bt-device.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,9 +331,9 @@ static GHashTable *_bt_device_sdp_browse(const gchar *device_path, const gchar *
}

if(pattern == NULL || strlen(pattern) == 0)
execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", device_path, (char *) 0);
execlp("sdptool", "sdptool", "browse", "--xml", device_path, (char *) 0);
else
execl("/bin/sdptool", "/bin/sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);
execlp("sdptool", "sdptool", "browse", "--xml", "--uuid", pattern, device_path, (char *) 0);

}
if(pid == -1)
Expand Down
124 changes: 68 additions & 56 deletions src/bt-obex.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ struct _ObexTransferInfo {
gchar *status;
};

static void obex_transfer_info_free(ObexTransferInfo* info)
{
g_free(info->filename);
g_free(info->obex_root);
g_free(info->status);
g_free(info);
}

static void sigterm_handler(int sig)
{
g_message("%s received", sig == SIGTERM ? "SIGTERM" : "SIGINT");
Expand All @@ -70,25 +78,40 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
GVariant *properties = NULL;

if(g_variant_lookup(interfaces_and_properties, OBEX_TRANSFER_DBUS_INTERFACE, "@a{sv}", &properties))
{
g_print("[OBEX Server] Transfer started\n");
ObexTransfer *t = obex_transfer_new(interface_object_path);
g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);


GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);

ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));

info->status = g_strdup(g_variant_get_string(status_variant, NULL));

ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
info->obex_root = g_strdup(obex_session_get_root(session, NULL));

g_object_unref(session);

if (size_variant != NULL)
{
info->filesize = g_variant_get_uint64(size_variant);
g_variant_unref(size_variant);
}
else
{
info->filesize = 0;
}

g_variant_unref(status_variant);
g_variant_unref(session_variant);

g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
}

if(g_variant_lookup(interfaces_and_properties, OBEX_SESSION_DBUS_INTERFACE, "@a{sv}", &properties))
{
g_print("[OBEX Server] OBEX session opened\n");
Expand All @@ -110,10 +133,7 @@ static void _obex_server_object_manager_handler(GDBusConnection *connection, con
if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
{
g_print("[OBEX Server] OBEX transfer closed\n");
ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
g_hash_table_remove(_transfers, interface_object_path);
g_object_unref(transfer);
g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
g_hash_table_remove(_transfer_infos, interface_object_path);
}

Expand Down Expand Up @@ -177,7 +197,12 @@ static void _obex_server_properties_handler(GDBusConnection *connection, const g
{
g_print("[OBEX Server] Transfer succeeded\n");
ObexTransferInfo *info = g_hash_table_lookup(_transfer_infos, object_path);
g_rename(g_build_filename(info->obex_root, info->filename, NULL), g_build_filename(_root_path, info->filename, NULL));

gchar* old_name = g_build_filename(info->obex_root, info->filename, NULL);
gchar* new_name = g_build_filename(_root_path, info->filename, NULL);
g_rename(old_name, new_name);
g_free(old_name);
g_free(new_name);
}
else if(g_strcmp0(status, "error") == 0)
{
Expand All @@ -202,7 +227,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
{
if(g_strcmp0(signal_name, "InterfacesAdded") == 0)
{
const gchar *interface_object_path = g_variant_get_string(g_variant_get_child_value(parameters, 0), NULL);
GVariant* interface_value = g_variant_get_child_value(parameters, 0);
const gchar *interface_object_path = g_variant_get_string(interface_value, NULL);
GVariant *interfaces_and_properties = g_variant_get_child_value(parameters, 1);
GVariant *properties = NULL;

Expand All @@ -213,15 +239,24 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
g_hash_table_insert(_transfers, g_strdup(interface_object_path), t);

ObexTransferInfo *info = g_malloc0(sizeof(ObexTransferInfo));
info->filesize = g_variant_get_uint64(g_variant_lookup_value(properties, "Size", NULL));
info->filename = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Name", NULL), NULL));
info->status = g_strdup(g_variant_get_string(g_variant_lookup_value(properties, "Status", NULL), NULL));
ObexSession *session = obex_session_new(g_variant_get_string(g_variant_lookup_value(properties, "Session", NULL), NULL));


GVariant* size_variant = g_variant_lookup_value(properties, "Size", NULL);
GVariant* name_variant = g_variant_lookup_value(properties, "Name", NULL);
GVariant* status_variant = g_variant_lookup_value(properties, "Status", NULL);
GVariant* session_variant = g_variant_lookup_value(properties, "Session", NULL);

info->filesize = g_variant_get_uint64(size_variant);
info->filename = g_variant_dup_string(name_variant, NULL);
info->status = g_variant_dup_string(status_variant, NULL);
ObexSession *session = obex_session_new(g_variant_get_string(session_variant, NULL));
info->obex_root = g_strdup(obex_session_get_root(session, NULL));


g_variant_unref(size_variant);
g_variant_unref(name_variant);
g_variant_unref(status_variant);
g_variant_unref(session_variant);
g_object_unref(session);

g_hash_table_insert(_transfer_infos, g_strdup(interface_object_path), info);
if(g_strcmp0(info->status, "queued") == 0)
g_print("[Transfer#%s] Waiting...\n", info->filename);
Expand All @@ -233,6 +268,8 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
}

g_variant_unref(interfaces_and_properties);
g_variant_unref(interface_value);

if(properties)
g_variant_unref(properties);
}
Expand All @@ -248,10 +285,7 @@ static void _obex_opp_client_object_manager_handler(GDBusConnection *connection,
if(g_strcmp0(*inf, OBEX_TRANSFER_DBUS_INTERFACE) == 0)
{
// g_print("[OBEX Client] OBEX transfer closed\n");
ObexTransfer *transfer = g_hash_table_lookup(_transfers, interface_object_path);
g_hash_table_remove(_transfers, interface_object_path);
g_object_unref(transfer);
g_free(g_hash_table_lookup(_transfer_infos, interface_object_path));
g_hash_table_remove(_transfer_infos, interface_object_path);
if (g_main_loop_is_running(mainloop))
g_main_loop_quit(mainloop);
Expand Down Expand Up @@ -490,8 +524,8 @@ int main(int argc, char *argv[])
exit_if_error(error);
}

_transfers = g_hash_table_new(g_str_hash, g_str_equal);
_transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
_transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
_transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)obex_transfer_info_free);

ObexAgentManager *manager = obex_agent_manager_new();

Expand Down Expand Up @@ -528,21 +562,10 @@ int main(int argc, char *argv[])
g_hash_table_iter_init(&iter, _transfers);
while (g_hash_table_iter_next(&iter, &key, &value))
{
ObexTransfer *t = OBEX_TRANSFER(value);
obex_transfer_cancel(t, NULL); // skip errors
g_object_unref(t);
g_hash_table_iter_remove(&iter);
}
g_hash_table_unref(_transfers);

// Remove transfer information
g_hash_table_iter_init(&iter, _transfer_infos);
while (g_hash_table_iter_next(&iter, &key, &value))
{
g_free(value);
g_hash_table_iter_remove(&iter);
obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
}
g_hash_table_unref(_transfers);
g_hash_table_unref(_transfer_infos);

g_dbus_connection_signal_unsubscribe(session_conn, obex_server_object_id);
g_dbus_connection_signal_unsubscribe(session_conn, obex_server_properties_id);
Expand All @@ -564,8 +587,8 @@ int main(int argc, char *argv[])
exit_if_error(error);
}

_transfers = g_hash_table_new(g_str_hash, g_str_equal);
_transfer_infos = g_hash_table_new(g_str_hash, g_str_equal);
_transfers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
_transfer_infos = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);

gchar * files_to_send[] = {NULL, NULL};
files_to_send[0] = g_path_is_absolute(opp_file_arg) ? g_strdup(opp_file_arg) : get_absolute_path(opp_file_arg);
Expand Down Expand Up @@ -603,7 +626,7 @@ int main(int argc, char *argv[])
mainloop = g_main_loop_new(NULL, FALSE);

ObexClient *client = obex_client_new();
const gchar *session_path = obex_client_create_session(client, dst_address, device_dict, &error);
const gchar *session_path = obex_client_create_session(client, dst_address, g_variant_ref(device_dict), &error);
exit_if_error(error);
ObexSession *session = obex_session_new(session_path);
ObexObjectPush *oop = obex_object_push_new(obex_session_get_dbus_object_path(session));
Expand Down Expand Up @@ -639,24 +662,13 @@ int main(int argc, char *argv[])
g_hash_table_iter_init(&iter, _transfers);
while (g_hash_table_iter_next(&iter, &key, &value))
{
ObexTransfer *t = OBEX_TRANSFER(value);
obex_transfer_cancel(t, NULL); // skip errors
g_object_unref(t);
g_hash_table_iter_remove(&iter);
}
g_hash_table_unref(_transfers);

// Remove transfer information objects
g_hash_table_iter_init(&iter, _transfer_infos);
while (g_hash_table_iter_next(&iter, &key, &value))
{
g_free(value);
g_hash_table_iter_remove(&iter);
obex_transfer_cancel(OBEX_TRANSFER(value), NULL);
}
g_hash_table_unref(_transfers);

g_object_unref(client);

g_hash_table_unref(_transfer_infos);
g_object_unref(client);
g_object_unref(session);
g_variant_unref(device_dict);

g_free(src_address);
Expand Down
60 changes: 24 additions & 36 deletions src/lib/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,53 +159,41 @@ Adapter *find_adapter(const gchar *name, GError **error)

Manager *manager = g_object_new(MANAGER_TYPE, NULL);

// If name is null or empty - return default adapter
if (name == NULL || strlen(name) == 0)
// Try to find by id
adapter_path = (gchar *) manager_find_adapter(manager, name, error);

// Found
if (adapter_path)
{
adapter_path = (gchar *) manager_default_adapter(manager, error);
if (adapter_path)
{
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
else
{
// Try to find by id
adapter_path = (gchar *) manager_find_adapter(manager, name, error);

// Found
if (adapter_path)
// Try to find by name
GPtrArray *adapters_list = manager_get_adapters(manager);
g_assert(adapters_list != NULL);
for (int i = 0; i < adapters_list->len; i++)
{
adapter_path = g_ptr_array_index(adapters_list, i);
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
}
else
{
// Try to find by name
const GPtrArray *adapters_list = manager_get_adapters(manager);
g_assert(adapters_list != NULL);
for (int i = 0; i < adapters_list->len; i++)
{
adapter_path = g_ptr_array_index(adapters_list, i);
// adapter = g_object_new(ADAPTER_TYPE, "DBusObjectPath", adapter_path, NULL);
adapter = adapter_new(adapter_path);
adapter_path = NULL;
adapter_path = NULL;

if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
if (g_strcmp0(name, adapter_get_name(adapter, error)) == 0)
{
if (*error)
{
if (error)
{
g_error_free(*error);
*error = NULL;
}
break;
g_error_free(*error);
*error = NULL;
}

g_object_unref(adapter);
adapter = NULL;
break;
}

g_object_unref(adapter);
adapter = NULL;
}
g_ptr_array_unref(adapters_list);
}

g_object_unref(manager);
Expand Down Expand Up @@ -255,7 +243,7 @@ Device *find_device(Adapter *adapter, const gchar *name, GError **error)

if(g_variant_lookup(properties, "Address", "s", &address))
{
if(g_strcmp0(g_ascii_strdown(address, -1), g_ascii_strdown(name, -1)) == 0)
if(name && address && g_ascii_strcasecmp(address, name) == 0)
{
device = device_new(object_path);
}
Expand Down
Loading