app-manager/app-manager.c
changeset 109 2947214c450e
parent 106 cc42fad3fe31
     1.1 --- a/app-manager/app-manager.c	Tue Jun 29 10:08:33 2021 +0100
     1.2 +++ b/app-manager/app-manager.c	Tue Apr 25 17:41:00 2023 +0100
     1.3 @@ -32,6 +32,7 @@
     1.4  #include <plover-gtk/stockicons.h>
     1.5  #include "app-manager.h"
     1.6  #include "localmedia.h"
     1.7 +#include "localdistributions.h"
     1.8  
     1.9  LUALIB_API int luaopen_posix(lua_State *L);
    1.10  
    1.11 @@ -302,6 +303,17 @@
    1.12  #ifdef WIN32
    1.13      prefix=g_win32_get_package_installation_directory_of_module(NULL);
    1.14  #endif
    1.15 +    if (prefix)
    1.16 +    {
    1.17 +	/*
    1.18 +	 * Note that this won't generally work if the application is stored
    1.19 +	 * on a removable device. If you need the logfile, copy it to the
    1.20 +	 * harddisk first.
    1.21 +	 */
    1.22 +	s=g_strconcat(prefix,"/var/log/init",NULL);
    1.23 +	plover_log_open(s);
    1.24 +	g_free(s);
    1.25 +    }
    1.26      install_icons();
    1.27      ui=gtk_builder_new();
    1.28      if (!g_file_get_contents("app-manager.ui",&contents,&len,&err) &&
    1.29 @@ -384,15 +396,21 @@
    1.30  	    w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles"));
    1.31  	    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),TRUE);
    1.32  	}
    1.33 +	g_clear_object(&set);
    1.34  	applications=plover_applications_model_new(installed);
    1.35  	set_package_model(applications);
    1.36  	w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
    1.37 +	if (prefix)
    1.38 +	{
    1.39 +	    s=g_strconcat(prefix,"/var/log/interactive",NULL);
    1.40 +	    plover_log_open(s);
    1.41 +	    g_free(s);
    1.42 +	}
    1.43  	gtk_widget_show(w);
    1.44  	started=TRUE;
    1.45      }
    1.46      if (started)
    1.47  	gtk_main();
    1.48 -    g_clear_object(&set);
    1.49      objects=gtk_builder_get_objects(ui);
    1.50      for(lnk=objects;lnk;lnk=lnk->next)
    1.51  	if (GTK_IS_WIDGET(lnk->data) &&
    1.52 @@ -454,6 +472,108 @@
    1.53  	set_package_model(location);
    1.54  }
    1.55  
    1.56 +gboolean open_database(const char *uri,const char *destination,GError **err)
    1.57 +{
    1.58 +    gboolean retval;
    1.59 +    GSList *sets,*lnk;
    1.60 +    GtkWidget *w;
    1.61 +    PloverPackageSet *set;
    1.62 +    if (!g_strcmp0(uri,razor_get_database_uri()))
    1.63 +	return TRUE;
    1.64 +    if (relocations)
    1.65 +    {
    1.66 +	razor_relocations_destroy(relocations);
    1.67 +	relocations=NULL;
    1.68 +    }
    1.69 +    razor_set_database_uri(uri);
    1.70 +    if (destination)
    1.71 +    {
    1.72 +	relocations=razor_relocations_create();
    1.73 +	razor_relocations_add(relocations,"/usr",destination);
    1.74 +    }
    1.75 +    sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(installed));
    1.76 +    sets=g_slist_copy(sets);
    1.77 +    for(lnk=sets;lnk;lnk=lnk->next)
    1.78 +    {
    1.79 +	set=lnk->data;
    1.80 +	plover_package_store_remove_set(PLOVER_PACKAGE_STORE(installed),set);
    1.81 +    }
    1.82 +    g_slist_free(sets);
    1.83 +    set=plover_package_set_new();
    1.84 +    retval=plover_package_set_open(set,"",TRUE,err);
    1.85 +    plover_package_store_add_set(PLOVER_PACKAGE_STORE(installed),set);
    1.86 +    g_object_unref(set);
    1.87 +    w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles"));
    1.88 +    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),
    1.89 +      !!plover_package_set_get_no_details(set));
    1.90 +    return retval;
    1.91 +}
    1.92 +
    1.93 +G_MODULE_EXPORT void on_open_database(GtkWidget *widget)
    1.94 +{
    1.95 +    gboolean have_local_distributions;
    1.96 +    const char *database_uri;
    1.97 +    gchar *uri,*s;
    1.98 +    GList *cells;
    1.99 +    GtkWidget *w,*radio_global,*radio_local,*combo,*dialog;
   1.100 +    GtkCellRenderer *cell;
   1.101 +    GtkTreeModel *local;
   1.102 +    GtkTreeIter iter;
   1.103 +    dialog=GTK_WIDGET(gtk_builder_get_object(ui,"OpenDatabase"));
   1.104 +    local=GTK_TREE_MODEL(plover_local_distributions_new());
   1.105 +    have_local_distributions=!!gtk_tree_model_iter_n_children(local,NULL);
   1.106 +    radio_global=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_global"));
   1.107 +    radio_local=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_local"));
   1.108 +    gtk_widget_set_sensitive(radio_local,have_local_distributions);
   1.109 +    w=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases_label"));
   1.110 +    gtk_widget_set_sensitive(w,have_local_distributions);
   1.111 +    combo=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases"));
   1.112 +    gtk_combo_box_set_model(GTK_COMBO_BOX(combo),local);
   1.113 +    gtk_widget_set_sensitive(w,have_local_distributions);
   1.114 +    database_uri=razor_get_database_uri();
   1.115 +    gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),NULL);
   1.116 +    if (gtk_tree_model_get_iter_first(local,&iter))
   1.117 +	do
   1.118 +	{
   1.119 +	    gtk_tree_model_get(local,&iter,
   1.120 +	      PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&s,-1);
   1.121 +	    if (!g_strcmp0(s,database_uri))
   1.122 +		gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),&iter);
   1.123 +	    g_free(s);
   1.124 +	} while(gtk_tree_model_iter_next(local,&iter));
   1.125 +    if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter))
   1.126 +	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_local),TRUE);
   1.127 +    else
   1.128 +	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_global),TRUE);
   1.129 +    cells=gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo));
   1.130 +    if (cells)
   1.131 +	g_list_free(cells);
   1.132 +    else
   1.133 +    {
   1.134 +	cell=gtk_cell_renderer_text_new();
   1.135 +	gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo),cell,TRUE);
   1.136 +	gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo),cell,"text",
   1.137 +	  PLOVER_LOCAL_DISTRIBUTIONS_USER_FRIENDLY_COLUMN);
   1.138 +    }
   1.139 +    if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
   1.140 +    {
   1.141 +	show_busy_cursor(TRUE);
   1.142 +	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_global)))
   1.143 +	    open_database(NULL,prefix,NULL);
   1.144 +	else if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter))
   1.145 +	{
   1.146 +	    gtk_tree_model_get(local,&iter,
   1.147 +	      PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&uri,
   1.148 +	      PLOVER_LOCAL_DISTRIBUTIONS_PREFIX_COLUMN,&s,-1);
   1.149 +	    open_database(uri,s,NULL);
   1.150 +	    g_free(uri);
   1.151 +	    g_free(s);
   1.152 +	}
   1.153 +	show_busy_cursor(FALSE);
   1.154 +    }
   1.155 +    gtk_widget_hide(dialog);
   1.156 +}
   1.157 +
   1.158  G_MODULE_EXPORT void on_open_location(GtkWidget *widget)
   1.159  {
   1.160      GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
   1.161 @@ -546,6 +666,86 @@
   1.162      show_busy_cursor(FALSE);
   1.163  }
   1.164  
   1.165 +G_MODULE_EXPORT void on_open_archive(GtkWidget *widget)
   1.166 +{
   1.167 +    GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
   1.168 +    GtkWidget *dialog;
   1.169 +    GFile *file,*parent;
   1.170 +    GFileInfo *fi;
   1.171 +    GMount *mount;
   1.172 +    gchar *path,*name;
   1.173 +    PloverPackageSet *set;
   1.174 +    GSList *sets;
   1.175 +    GError *err=NULL;
   1.176 +    dialog=gtk_file_chooser_dialog_new("Open Achive",GTK_WINDOW(w),
   1.177 +      GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,
   1.178 +      GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
   1.179 +    if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
   1.180 +    {
   1.181 +	show_busy_cursor(TRUE);
   1.182 +	path=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
   1.183 +	set=plover_package_set_new_from_yum(path,relocations,&err);
   1.184 +	if (set)
   1.185 +	{
   1.186 +	    if (!location)
   1.187 +		location=GTK_TREE_MODEL(plover_package_store_new());
   1.188 +	    while((sets=
   1.189 +	      plover_package_store_get_sets(PLOVER_PACKAGE_STORE(location))))
   1.190 +		plover_package_store_remove_set(PLOVER_PACKAGE_STORE(location),
   1.191 +		  PLOVER_PACKAGE_SET(sets->data));
   1.192 +	    plover_package_store_add_set(PLOVER_PACKAGE_STORE(location),set);
   1.193 +	    g_object_unref(set);
   1.194 +	    w=GTK_WIDGET(gtk_builder_get_object(ui,"LocationButton"));
   1.195 +	    file=g_file_new_for_path(path);
   1.196 +	    parent=g_file_get_parent(file);
   1.197 +	    if (parent)
   1.198 +	    {
   1.199 +		g_object_unref(parent);
   1.200 +		mount=NULL;
   1.201 +	    }
   1.202 +	    else
   1.203 +		mount=g_file_find_enclosing_mount(file,NULL,NULL);
   1.204 +	    if (mount)
   1.205 +	    {
   1.206 +		name=g_mount_get_name(mount);
   1.207 +		g_object_unref(mount);
   1.208 +	    }
   1.209 +	    else
   1.210 +	    {
   1.211 +		fi=g_file_query_info(file,
   1.212 +		  G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
   1.213 +		  G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,NULL,NULL);
   1.214 +		if (fi)
   1.215 +		{
   1.216 +		    name=g_strdup(g_file_info_get_display_name(fi));
   1.217 +		    g_object_unref(fi);
   1.218 +		}
   1.219 +		else
   1.220 +		    name=g_filename_display_basename(path);
   1.221 +		g_object_unref(file);
   1.222 +	    }
   1.223 +	    gtk_tool_button_set_label(GTK_TOOL_BUTTON(w),name);
   1.224 +	    g_free(name);
   1.225 +	    gtk_widget_show(w);
   1.226 +	    gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(w),TRUE);
   1.227 +	}
   1.228 +	else
   1.229 +	{
   1.230 +	    gtk_widget_destroy(dialog);
   1.231 +	    dialog=gtk_message_dialog_new(GTK_WINDOW(w),
   1.232 +	      GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR,
   1.233 +	      GTK_BUTTONS_CLOSE,"Error loading repository '%s'",path);
   1.234 +	    gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
   1.235 +	      "%s",err->message);
   1.236 +	    gtk_dialog_run(GTK_DIALOG(dialog));
   1.237 +	    g_error_free(err);
   1.238 +	}
   1.239 +	g_free(path);
   1.240 +	show_busy_cursor(FALSE);
   1.241 +    }
   1.242 +    gtk_widget_destroy(dialog);
   1.243 +}
   1.244 +
   1.245  G_MODULE_EXPORT void on_help_about(GtkWidget *widget)
   1.246  {
   1.247      GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));