diff --git a/daemon/control.c b/daemon/control.c
index 2aaa8ebc..c5e6898d 100644
--- a/daemon/control.c
+++ b/daemon/control.c
@@ -164,6 +164,25 @@ static void ladish_load_studio(method_call_t * call_ptr)
}
}
+static void ladish_delete_studio(method_call_t * call_ptr)
+{
+ const char * name;
+
+ dbus_error_init(&g_dbus_error);
+
+ if (!dbus_message_get_args(call_ptr->message, &g_dbus_error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
+ {
+ lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "Invalid arguments to method \"%s\": %s", call_ptr->method_name, g_dbus_error.message);
+ dbus_error_free(&g_dbus_error);
+ return;
+ }
+
+ if (studio_delete(call_ptr, name))
+ {
+ method_return_new_void(call_ptr);
+ }
+}
+
static void ladish_get_application_list(method_call_t * call_ptr)
{
DBusMessageIter iter;
@@ -267,6 +286,10 @@ METHOD_ARGS_BEGIN(LoadStudio, "Load studio")
METHOD_ARG_DESCRIBE_IN("options", "a{sv}", "Load options")
METHOD_ARGS_END
+METHOD_ARGS_BEGIN(DeleteStudio, "Delete studio")
+ METHOD_ARG_DESCRIBE_IN("studio_name", "s", "Name of studio to delete")
+METHOD_ARGS_END
+
METHOD_ARGS_BEGIN(GetApplicationList, "Get list of applications that can be launched")
METHOD_ARG_DESCRIBE_OUT("applications", "a(sa{sv})", "List of applications, name and properties")
METHOD_ARGS_END
@@ -278,6 +301,7 @@ METHODS_BEGIN
METHOD_DESCRIBE(IsStudioLoaded, ladish_is_studio_loaded)
METHOD_DESCRIBE(GetStudioList, ladish_get_studio_list)
METHOD_DESCRIBE(LoadStudio, ladish_load_studio)
+ METHOD_DESCRIBE(DeleteStudio, ladish_delete_studio)
METHOD_DESCRIBE(GetApplicationList, ladish_get_application_list)
METHOD_DESCRIBE(Exit, ladish_exit)
METHODS_END
diff --git a/daemon/studio.c b/daemon/studio.c
index c6d74a0b..8174c4a9 100644
--- a/daemon/studio.c
+++ b/daemon/studio.c
@@ -1393,6 +1393,48 @@ fail_free_address:
#undef context_ptr
+bool studio_delete(void * call_ptr, const char * studio_name)
+{
+ char * filename;
+ char * bak_filename;
+ struct stat st;
+ bool ret;
+
+ ret = false;
+
+ if (!compose_filename(studio_name, &filename, &bak_filename))
+ {
+ lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "failed to compose studio filename");
+ goto exit;
+ }
+
+ lash_info("Loading studio ('%s')", filename);
+
+ if (unlink(filename) != 0)
+ {
+ lash_dbus_error(call_ptr, LASH_DBUS_ERROR_GENERIC, "unlink(%s) failed: %d (%s)", filename, errno, strerror(errno));
+ goto free;
+ }
+
+ /* try to delete the backup file */
+ if (stat(bak_filename, &st) == 0)
+ {
+ if (unlink(bak_filename) != 0)
+ {
+ /* failing to delete backup file will not case delete command failure */
+ lash_error("unlink(%s) failed: %d (%s)", bak_filename, errno, strerror(errno));
+ }
+ }
+
+ ret = true;
+
+free:
+ free(filename);
+ free(bak_filename);
+exit:
+ return ret;
+}
+
bool studio_load(void * call_ptr, const char * studio_name)
{
char * path;
diff --git a/daemon/studio.h b/daemon/studio.h
index e809754c..8a8fbd5b 100644
--- a/daemon/studio.h
+++ b/daemon/studio.h
@@ -34,5 +34,6 @@ bool studio_is_loaded(void);
bool studios_iterate(void * call_ptr, void * context, bool (* callback)(void * call_ptr, void * context, const char * studio, uint32_t modtime));
bool studio_load(void * call_ptr, const char * studio_name);
+bool studio_delete(void * call_ptr, const char * studio_name);
#endif /* #ifndef STUDIO_H__0BEDE85E_4FB3_4D74_BC08_C373A22409C0__INCLUDED */
diff --git a/gui/control_proxy.c b/gui/control_proxy.c
index 8665943d..666d8119 100644
--- a/gui/control_proxy.c
+++ b/gui/control_proxy.c
@@ -160,6 +160,17 @@ bool control_proxy_load_studio(const char * studio_name)
return true;
}
+bool control_proxy_delete_studio(const char * studio_name)
+{
+ if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "DeleteStudio", "s", &studio_name, ""))
+ {
+ lash_error("DeleteStudio() failed.");
+ return false;
+ }
+
+ return true;
+}
+
bool control_proxy_exit(void)
{
if (!dbus_call_simple(SERVICE_NAME, CONTROL_OBJECT_PATH, IFACE_CONTROL, "Exit", "", ""))
diff --git a/gui/control_proxy.h b/gui/control_proxy.h
index 353add01..6ea1b450 100644
--- a/gui/control_proxy.h
+++ b/gui/control_proxy.h
@@ -37,6 +37,7 @@ void control_proxy_on_studio_appeared(void);
void control_proxy_on_studio_disappeared(void);
bool control_proxy_get_studio_list(void (* callback)(void * context, const char * studio_name), void * context);
bool control_proxy_load_studio(const char * studio_name);
+bool control_proxy_delete_studio(const char * studio_name);
bool control_proxy_exit(void);
#endif /* #ifndef CONTROL_PROXY_H__8BC89E98_FE1B_4831_8B89_1A48F676E019__INCLUDED */
diff --git a/gui/gui.glade b/gui/gui.glade
index 63c545ad..1320bea5 100644
--- a/gui/gui.glade
+++ b/gui/gui.glade
@@ -67,6 +67,22 @@
+
+
+
-