From c62d7760b32baa0abb95d6e671ccbf4d81b84712 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Mon, 23 Aug 2010 00:17:57 +0300 Subject: [PATCH] Fill the save project as dialog with current project properties --- daemon/room.c | 107 +++++++++++++++++++++++++++++++++++++- daemon/room_internal.h | 2 + daemon/room_save.c | 2 + gui/save_project_dialog.c | 15 +++++- proxies/room_proxy.c | 52 ++++++++++++++++++ proxies/room_proxy.h | 1 + 6 files changed, 176 insertions(+), 3 deletions(-) diff --git a/daemon/room.c b/daemon/room.c index 558cf2f7..8d704f8e 100644 --- a/daemon/room.c +++ b/daemon/room.c @@ -76,13 +76,28 @@ struct ladish_room * ladish_room_create_internal(const uuid_t uuid_ptr, const ch goto free_room; } + if (object_path != NULL) + { + room_ptr->object_path = strdup(object_path); + if (room_ptr->object_path == NULL) + { + log_error("strdup() failed for room name"); + goto free_name; + } + } + if (!ladish_graph_create(&room_ptr->graph, object_path)) { - goto free_name; + goto free_opath; } return room_ptr; +free_opath: + if (object_path != NULL) + { + free(room_ptr->object_path); + } free_name: free(room_ptr->name); free_room: @@ -745,6 +760,59 @@ ladish_room_handle ladish_room_from_list_node(struct list_head * node_ptr) return (ladish_room_handle)list_entry(node_ptr, struct ladish_room, siblings); } +static bool ladish_room_fill_project_properties(DBusMessageIter * iter_ptr, struct ladish_room * room_ptr) +{ + DBusMessageIter dict_iter; + + if (!dbus_message_iter_open_container(iter_ptr, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)) + { + log_error("dbus_message_iter_open_container() failed."); + return false; + } + + if (!dbus_maybe_add_dict_entry_string(&dict_iter, "name", room_ptr->project_name)) + { + log_error("dbus_maybe_add_dict_entry_string() failed."); + return false; + } + + if (!dbus_maybe_add_dict_entry_string(&dict_iter, "dir", room_ptr->project_dir)) + { + log_error("dbus_maybe_add_dict_entry_string() failed."); + return false; + } + + if (!dbus_message_iter_close_container(iter_ptr, &dict_iter)) + { + log_error("dbus_message_iter_close_container() failed."); + return false; + } + + return true; +} + +void ladish_room_emit_project_properties_changed(struct ladish_room * room_ptr) +{ + DBusMessage * message_ptr; + DBusMessageIter iter; + + message_ptr = dbus_message_new_signal(room_ptr->object_path, IFACE_ROOM, "ProjectPropertiesChanged"); + if (message_ptr == NULL) + { + log_error("dbus_message_new_signal() failed."); + return; + } + + dbus_message_iter_init_append(message_ptr, &iter); + + if (ladish_room_fill_project_properties(&iter, room_ptr)) + { + dbus_signal_send(g_dbus_connection, message_ptr); + } + + dbus_message_unref(message_ptr); +} + /**********************************************************************************/ /* D-Bus methods */ /**********************************************************************************/ @@ -805,6 +873,33 @@ static void ladish_room_dbus_load_project(struct dbus_method_call * call_ptr) } } +static void ladish_room_dbus_get_project_properties(struct dbus_method_call * call_ptr) +{ + DBusMessageIter iter; + + call_ptr->reply = dbus_message_new_method_return(call_ptr->message); + if (call_ptr->reply == NULL) + { + goto fail; + } + + dbus_message_iter_init_append(call_ptr->reply, &iter); + + if (!ladish_room_fill_project_properties(&iter, room_ptr)) + { + goto fail_unref; + } + + return; + +fail_unref: + dbus_message_unref(call_ptr->reply); + call_ptr->reply = NULL; + +fail: + log_error("Ran out of memory trying to construct method return"); +} + #undef room_ptr METHOD_ARGS_BEGIN(GetName, "Get room name") @@ -823,14 +918,24 @@ METHOD_ARGS_BEGIN(LoadProject, "Load project") METHOD_ARG_DESCRIBE_IN("project_dir", "s", "Project directory") METHOD_ARGS_END +METHOD_ARGS_BEGIN(GetProjectProperties, "Get project properties") + SIGNAL_ARG_DESCRIBE("properties", "a{sv}", "project properties") +METHOD_ARGS_END + METHODS_BEGIN METHOD_DESCRIBE(GetName, ladish_room_dbus_get_name) /* sync */ METHOD_DESCRIBE(SaveProject, ladish_room_dbus_save_project) /* async */ METHOD_DESCRIBE(UnloadProject, ladish_room_dbus_unload_project) /* async */ METHOD_DESCRIBE(LoadProject, ladish_room_dbus_load_project) /* async */ + METHOD_DESCRIBE(GetProjectProperties, ladish_room_dbus_get_project_properties) /* sync */ METHODS_END +SIGNAL_ARGS_BEGIN(ProjectPropertiesChanged, "Project properties changed") + SIGNAL_ARG_DESCRIBE("properties", "a{sv}", "project properties") +SIGNAL_ARGS_END + SIGNALS_BEGIN + SIGNAL_DESCRIBE(ProjectPropertiesChanged) SIGNALS_END INTERFACE_BEGIN(g_interface_room, IFACE_ROOM) diff --git a/daemon/room_internal.h b/daemon/room_internal.h index 131b4c23..583cc0d8 100644 --- a/daemon/room_internal.h +++ b/daemon/room_internal.h @@ -55,4 +55,6 @@ struct ladish_room char * project_name; }; +void ladish_room_emit_project_properties_changed(struct ladish_room * room_ptr); + #endif /* #ifndef ROOM_INTERNAL_H__FAF5B68F_E419_442A_8F9B_C729BAC00422__INCLUDED */ diff --git a/daemon/room_save.c b/daemon/room_save.c index 5ab86524..1a1a0bc5 100644 --- a/daemon/room_save.c +++ b/daemon/room_save.c @@ -188,6 +188,8 @@ static bool ladish_room_save_project_do(struct ladish_room * room_ptr) ladish_app_supervisor_save_L1(room_ptr->app_supervisor); + ladish_room_emit_project_properties_changed(room_ptr); + ret = true; close: diff --git a/gui/save_project_dialog.c b/gui/save_project_dialog.c index b5ceced5..4fd9cbc6 100644 --- a/gui/save_project_dialog.c +++ b/gui/save_project_dialog.c @@ -33,13 +33,24 @@ void ladish_run_save_project_dialog(ladish_room_proxy_handle room) GtkEntry * path; GtkEntry * name; GtkResponseType response; + char * project_dir; + char * project_name; dialog = get_gtk_builder_widget("project_save_as_dialog"); path = GTK_ENTRY(get_gtk_builder_widget("project_save_as_path_entry")); name = GTK_ENTRY(get_gtk_builder_widget("project_save_as_name_entry")); - gtk_entry_set_text(path, ""); - gtk_entry_set_text(name, ""); + if (!ladish_room_proxy_get_project_properties(room, &project_dir, &project_name)) + { + error_message_box("Get project properties failed, please inspect logs."); + return; + } + + gtk_entry_set_text(path, project_dir); + gtk_entry_set_text(name, project_name); + + free(project_name); + free(project_dir); gtk_widget_show(dialog); response = gtk_dialog_run(GTK_DIALOG(dialog)); diff --git a/proxies/room_proxy.c b/proxies/room_proxy.c index 90751eb7..75e0d02d 100644 --- a/proxies/room_proxy.c +++ b/proxies/room_proxy.c @@ -144,4 +144,56 @@ bool ladish_room_proxy_unload_project(ladish_room_proxy_handle proxy) return true; } +bool ladish_room_proxy_get_project_properties(ladish_room_proxy_handle proxy, char ** project_dir, char ** project_name) +{ + DBusMessage * reply_ptr; + DBusMessageIter iter; + const char * name; + const char * dir; + char * name_buffer; + char * dir_buffer; + + if (!dbus_call(proxy_ptr->service, proxy_ptr->object, IFACE_ROOM, "GetProjectProperties", "", NULL, &reply_ptr)) + { + log_error("GetProjectProperties() failed."); + return false; + } + + dbus_message_iter_init(reply_ptr, &iter); + + if (!dbus_iter_get_dict_entry_string(&iter, "name", &name)) + { + name = ""; + } + + if (!dbus_iter_get_dict_entry_string(&iter, "dir", &dir)) + { + dir = ""; + } + + name_buffer = strdup(name); + if (name_buffer == NULL) + { + log_error("strdup() failed for project name"); + dbus_message_unref(reply_ptr); + return false; + } + + dir_buffer = strdup(dir); + if (dir_buffer == NULL) + { + log_error("strdup() failed for project dir"); + free(name_buffer); + dbus_message_unref(reply_ptr); + return false; + } + + dbus_message_unref(reply_ptr); + + *project_name = name_buffer; + *project_dir = dir_buffer; + + return true; +} + #undef proxy_ptr diff --git a/proxies/room_proxy.h b/proxies/room_proxy.h index c3561ca4..7f3d1cab 100644 --- a/proxies/room_proxy.h +++ b/proxies/room_proxy.h @@ -37,5 +37,6 @@ char * ladish_room_proxy_get_name(ladish_room_proxy_handle proxy); bool ladish_room_proxy_load_project(ladish_room_proxy_handle proxy, const char * project_dir); bool ladish_room_proxy_save_project(ladish_room_proxy_handle proxy, const char * project_dir, const char * project_name); bool ladish_room_proxy_unload_project(ladish_room_proxy_handle proxy); +bool ladish_room_proxy_get_project_properties(ladish_room_proxy_handle proxy, char ** project_dir, char ** project_name); #endif /* #ifndef ROOM_PROXY_H__0FDD1790_EF07_4C6C_8C95_0F75E29A3E81__INCLUDED */