diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index cc5b44d..dc72f88 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -71,6 +71,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissin set(SOURCE_FILES ubl-settings-repomanager.c + ubl-settings-repomanager-add-window.c + ubl-settings-repomanager-storage-window.c ubl-settings-repomanager.h ubl-strings.h ) diff --git a/source/ubl-settings-repomanager-add-window.c b/source/ubl-settings-repomanager-add-window.c new file mode 100644 index 0000000..dbc17c2 --- /dev/null +++ b/source/ubl-settings-repomanager-add-window.c @@ -0,0 +1,405 @@ +#include "ubl-settings-repomanager.h" + + +gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){ + GtkTreeIter parent; + if (gtk_tree_model_iter_parent(model, &parent, iter)) + return 0; + return 1; + } + +config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){ + (*size)=0; + config_str final = NULL; + GtkTreePath *path=NULL, *parent_path=NULL; + GtkTreeIter iter; + if (parent){ + parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),parent); + } + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent); + for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ + path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),&iter); + if (path && gtk_tree_path_get_depth(path)==level&&(!parent_path||gtk_tree_path_is_descendant(path,parent_path))){ + char *append=NULL; + gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,column,&append,-1); + yon_char_parsed_add_or_create_if_exists(final,size,append); + } + gtk_tree_path_free(path); + } + return final; +} + +void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + if (!yon_char_is_empty(path_str)){ + GtkTreeIter iter, itar; + GtkTreePath *path = gtk_tree_path_new_from_string(path_str); + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ + + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); + for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ + char *current; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,-1); + if (!yon_char_is_empty(current)){ + char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->RepositoryCombo),path_str,current); + } + } + } + + } +} + +void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + if (!yon_char_is_empty(path_str)){ + GtkTreeIter iter, itar; + GtkTreePath *path = gtk_tree_path_new_from_string(path_str); + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ + + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); + for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ + char *current, *current_path; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,3,¤t_path,-1); + if (!yon_char_is_empty(current)){ + char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo),path_str,current); + + } + } + } + gtk_widget_set_sensitive(window->RepoSignCombo,1); + + } else { + gtk_widget_set_sensitive(window->RepoSignCombo,0); + + } +} + +void on_arch_chosen(GtkWidget *target,repo_add_window *window){ + char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + if (!yon_char_is_empty(path_str)){ + gtk_widget_set_sensitive(window->PackageSignCombo,1); + } else { + gtk_widget_set_sensitive(window->PackageSignCombo,0); + } +} + +void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ + gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); + if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){ + gtk_widget_set_sensitive(window->AddPackageButton,0); + } else { + gtk_widget_set_sensitive(window->AddPackageButton,1); + } +} + +void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry)); + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry)); + GtkTreeIter iter,itar; + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry),id); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); + char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry),child_id,target); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry),child_id,target); + } +} + +void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ + GtkWidget *ArchCombo = NULL; + ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; + + gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(ArchCombo)); + GtkTreeIter iter,itar; + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); + int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); + char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ArchCombo),child_id,target); + } + +} + +void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ + GtkWidget *TargetArchCombo = self==window->MoveTargetArchEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; + GtkWidget *TargetRepoCombo = self==window->MoveTargetArchEntry?window->MoveSourceRepoEntry:window->MoveTargetRepoEntry; + if (gtk_combo_box_get_active(GTK_COMBO_BOX(self))>-1){ + + const char *current = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(self)); + const char *repo_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(TargetRepoCombo)); + + if (!yon_char_is_empty(current)&&!yon_char_is_empty(repo_id)){ + + GtkTreeIter iter, itar; + + g_signal_handlers_block_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); + if (yon_gtk_combo_box_text_find(TargetArchCombo,(char*)current)==-1){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,repo_id); + gtk_tree_store_append(window->tree_copy,&itar,&iter); + char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); + yon_debug_output("%s\n","arch"); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(TargetArchCombo),id,current); + } + g_signal_handlers_unblock_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); + gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); + gtk_widget_set_sensitive(window->AddPackageButton,1); + } + } +} + +void on_add_accept(GtkWidget *self, dictionary *dict){ + repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); + file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*); + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + char *path,*arch_name; + GtkTreeIter iter,itar,itor; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&arch_name,3,&path,-1); + char *packages; + yon_window_config_get_parameter("package_info",path,&packages,YON_TYPE_STRING); + int size; + config_str parsed = yon_char_parse(packages,&size,","); + GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget)); + for (int i=0;iStatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + yon_char_remove_last_symbol(name[0],'\n'); + if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ + if (name_size<=0){ + yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + gtk_list_store_append(window->PackagesList,&itar); + gtk_list_store_set(window->PackagesList,&itar,1,name[0],2,current,3,1,-1); + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } + yon_char_parsed_free(name,name_size); + } + } + gtk_widget_destroy(dialog->Window); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ + gtk_widget_set_sensitive(window->StorageCombo,0); + gtk_widget_set_sensitive(window->RepositoryCombo,0); + gtk_widget_set_sensitive(window->ArchitectureCombo,0); + } +} + +void on_add_package(GtkWidget *self, repo_add_window *window){ + file_chooser_window *dialog = yon_file_chooser_new(); + yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"filechooserWindow"); + gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL); + gtk_widget_show(dialog->Window); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); + gtk_file_filter_set_name(filter,"*.pkg.tar*"); + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter); + g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_add_accept),dict); + g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),window); +} + +void on_remove_package(GtkWidget *self, repo_add_window *window){ + char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); + char *storage = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); + char *repo; + char *path; + GtkTreeModel *model; + GtkTreeIter iter,itar,itor; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,storage); + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&storage,-1); + + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){ + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1); + gtk_list_store_remove(window->PackagesList,&itar); + } + if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ + gtk_widget_set_sensitive(window->StorageCombo,1); + gtk_widget_set_sensitive(window->RepositoryCombo,1); + gtk_widget_set_sensitive(window->ArchitectureCombo,1); + } +} + +void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ + gtk_label_set_text(GTK_LABEL(window->InfoLabel),""); + GtkTreeModel *model; + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ + gtk_widget_set_sensitive(window->RemoveButton,1); + char *target; + gtk_tree_model_get(model,&iter,2,&target,-1); + int size; + config_str info = yon_config_load(get_package_info_command(target),&size); + char *result = yon_char_parsed_to_string(info,size,""); + gtk_label_set_text(GTK_LABEL(window->InfoLabel),result); + yon_char_parsed_free(info,size); + free(result); + } else { + gtk_widget_set_sensitive(window->RemoveButton,0); + } +} + + +void on_add_packages_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); + + GtkTreeIter iter, itar; + char *storage; + if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->tree_copy),&itar)){ + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&storage,-1); + const char *repo = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); + const char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); + GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); + int size=0; + config_str packages=NULL; + int valid = gtk_tree_model_get_iter_first(model,&iter); + for (;valid;valid=gtk_tree_model_iter_next(model,&iter)){ + char *target; + gtk_tree_model_get(model,&iter,2,&target,-1); + yon_char_parsed_add_or_create_if_exists(packages,&size,target); + free(target); + } + if (size>0){ + char *command = NULL; + int repo_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RepoSignCombo)); + int pack_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->PackageSignCombo)); + if (repo_sign&&pack_sign){ + command = add_packages_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); + } else if (repo_sign){ + command = add_packages_repo_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),yon_char_parsed_to_string(packages,size," ")); + } else if (pack_sign){ + command = add_packages_package_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); + } else { + command = add_packages_command(storage,arch,repo,yon_char_parsed_to_string(packages,size," ")); + } + yon_debug_output("%s\n",command); + if (!system(command)){ + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); + gtk_tree_store_clear(widgets->RepoList); + yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList); + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList)); + + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); + if (!yon_char_is_empty(id)){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); + gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); + on_main_tree_selection_changed(NULL,widgets); + } + gtk_widget_destroy(window->MainWindow); + yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_config_load_update(widgets); + } + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } + } else { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + } +} + +void on_repo_sign_load(GtkWidget *self, repo_add_window *window){ + GtkTreeIter iter; + yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(self),GTK_TREE_MODEL(window->tree_copy),&iter); + char *sign; + gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,5,&sign,-1); + if (!yon_char_is_empty(sign)) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign); +} + +repo_add_window *yon_repo_add_window_new(){ + repo_add_window *window = malloc(sizeof(repo_add_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_add); + window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->StorageCombo = yon_gtk_builder_get_widget(builder,"StorageCombo"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->RepositoryCombo = yon_gtk_builder_get_widget(builder,"RepositoryCombo"); + window->ArchitectureCombo = yon_gtk_builder_get_widget(builder,"ArchitectureCombo"); + window->MoveSourceFrame = yon_gtk_builder_get_widget(builder,"MoveSourceFrame"); + window->MoveSourceStorageEntry = yon_gtk_builder_get_widget(builder,"MoveSourceStorageEntry"); + window->MoveSourceRepoEntry = yon_gtk_builder_get_widget(builder,"MoveSourceRepoEntry"); + window->MoveSourceArchEntry = yon_gtk_builder_get_widget(builder,"MoveSourceArchEntry"); + window->MoveTargetFrame = yon_gtk_builder_get_widget(builder,"MoveTargetFrame"); + window->MoveTargetStorageEntry = yon_gtk_builder_get_widget(builder,"MoveTargetStorageEntry"); + window->MoveTargetRepoEntry = yon_gtk_builder_get_widget(builder,"MoveTargetRepoEntry"); + window->MoveTargetArchEntry = yon_gtk_builder_get_widget(builder,"MoveTargetArchEntry"); + window->PackageSignCombo = yon_gtk_builder_get_widget(builder,"PackageSignCombo"); + window->RepoSignCombo = yon_gtk_builder_get_widget(builder,"RepoSignCombo"); + window->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton"); + window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); + window->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree"); + window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); + window->PackagesToAddLabel = yon_gtk_builder_get_widget(builder,"PackagesToAddLabel"); + window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); + window->tree_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); + yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->PackagesTree),"cursor-changed",G_CALLBACK(on_add_window_tree_changed),window); + + window->added_packages_archs = NULL; + window->removed_packages_archs = NULL; + + return window; +} + +void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ + GtkTreeIter iter; + + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ + + char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter); + int mod = yon_char_count(target,":")+1; + char *arc=NULL; + char *repo=NULL; + char *stor=NULL; + if (mod ==3){ + arc = yon_char_new(target); + char *temp = yon_char_new(target); + repo = yon_char_divide(temp,yon_char_find_last(temp,':')); + free(temp); + temp = yon_char_new(repo); + stor = yon_char_divide(temp,yon_char_find_last(temp,':')); + free(temp); + } else if (mod>=2){ + repo = yon_char_new(target); + char *temp = yon_char_new(target); + stor = yon_char_divide(temp,yon_char_find_last(temp,':')); + free(temp); + } else if (mod>=1){ + stor = yon_char_new(target); + } + + if (stor) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),stor); + if (repo) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepositoryCombo),repo); + if (arc) + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->ArchitectureCombo),arc); + } +} \ No newline at end of file diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c new file mode 100644 index 0000000..c6048e3 --- /dev/null +++ b/source/ubl-settings-repomanager-storage-window.c @@ -0,0 +1,279 @@ +#include "ubl-settings-repomanager.h" + + +// storage-configure window section + +void on_storage_open(GtkWidget *self, storage_config_window *window){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser"); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce == GTK_RESPONSE_ACCEPT){ + char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(path)){ + int size; + config_str files = yon_file_list_dirs(path,&size); + if (!files){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_FOLDER_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + gtk_widget_destroy(dialog); + return; + } else { + yon_char_parsed_free(files,size); + GtkTreeIter iter, itar; + gtk_tree_store_append(window->storages_copy,&iter,NULL); + char *name = yon_char_new(path); + free(yon_char_divide(name,yon_char_find_last(name,'/'))); + gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); + char *repos=NULL; + int repos_size=0; + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); + config_str repos_list = yon_file_list_dirs(path,&repos_size); + for (int i=0;iAddEntry),render_name); + on_repo_add(self,window); + free(render_name); + } + } + yon_char_parsed_free(repos_list,repos_size); + } + + } + } + yon_storage_config_update(window); + gtk_widget_destroy(dialog); +} + +void on_storage_create(GtkWidget *self, storage_config_window *window){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser"); + int responce = gtk_dialog_run(GTK_DIALOG(dialog)); + if (responce == GTK_RESPONSE_ACCEPT){ + char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(path)){ + int size; + config_str files = yon_file_list_dirs(path,&size); + if (files){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),FILES_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + gtk_widget_destroy(dialog); + return; + } else { + yon_char_parsed_free(files,size); + GtkTreeIter iter; + gtk_tree_store_append(window->storages_copy,&iter,NULL); + char *name = yon_char_new(path); + free(yon_char_divide(name,yon_char_find_last(name,'/'))); + gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); + char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); + g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + yon_gtk_combo_box_text_find(window->StoragePathCombo,path); + g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); + } + } + } + yon_storage_config_update(window); + gtk_widget_destroy(dialog); +} + +void on_storage_disable(GtkWidget *self, storage_config_window *window){ + dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); + data->action_text=DISABLE_CONFIRMATION_LABEL; + GtkTreeIter iter,itar; + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ + if (yon_confirmation_dialog_call(self,data)){ + char *storage; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + } + } + yon_storage_config_update(window); + } +} + +void on_storage_remove(GtkWidget *self, storage_config_window *window){ + dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); + data->action_text=REMOVE_CONFIRMATION_LABEL; + if (yon_confirmation_dialog_call(self,data)){ + GtkTreeIter itar; + char *storage; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); + char *repos; + yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); + int repo_size; + config_str repo_list = yon_char_parse(repos,&repo_size,","); + for (int i=0;istorages_copy,&itar); + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + } + } + yon_storage_config_update(window); +} + +void on_repo_add(GtkWidget *self, storage_config_window *window){ + char *new_repo = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry))); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); + if (yon_char_is_empty(new_repo)){ + yon_ubl_status_highlight_incorrect(window->AddEntry); + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_NAME_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + GtkTreeIter iter,itar, childiter; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (id){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); + char *path; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1); + char *child_path = yon_char_unite(path,"/",new_repo,NULL); + gtk_tree_store_append(window->storages_copy,&childiter,&itar); + gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,3,child_path,-1); + yon_storage_config_update(window); + char *old; + yon_window_config_get_parameter("storage_info",path,&old,YON_TYPE_STRING); + int old_repos_size; + config_str old_repos_parsed = yon_char_parse(old,&old_repos_size,","); + if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){ + yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path); + } + yon_window_config_add_instant_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); + yon_char_parsed_free(old_repos_parsed,old_repos_size); + yon_debug_output("%s\n",create_storage_command(path, new_repo)); + yon_launch(create_storage_command(path, new_repo)); + int size; + config_str dirs = yon_file_list_dirs(child_path,&size); + for (int i=0;istorages_copy,&iter,&childiter); + gtk_tree_store_set(window->storages_copy,&iter,2,dirs[i],3,arch_path,-1); + + if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ + config_str final = NULL; + int final_size=0; + DIR *current_dir = opendir(arch_path); + struct dirent* cur_dir; + while ((cur_dir=readdir(current_dir))){ + if (strlen(cur_dir->d_name)>8){ + char *extension = yon_char_new(cur_dir->d_name); + free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); + if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ + yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); + } + } + } + closedir(current_dir); + if (size) + yon_window_config_add_instant_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,final_size,","),YON_TYPE_STRING); + } + } + yon_char_parsed_free(dirs,size); + } + free(new_repo); +} + +void on_storage_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); + gtk_tree_store_clear(main_config.tree_store); + yon_gtk_tree_store_copy_full(window->storages_copy,main_config.tree_store); + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(main_config.tree_store)); + yon_window_config_save_instant(); + GtkTreeIter iter; + const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (!yon_char_is_empty(id)){ + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); + gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); + on_main_tree_selection_changed(NULL,widgets); + } + on_subwindow_close(self); + yon_config_load_update(widgets); + yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); +} + + +void on_storage_changed(GtkWidget *self, storage_config_window *window){ + yon_storage_config_update(window); +} + +storage_config_window *yon_storage_config_window_new(){ + storage_config_window *window = malloc(sizeof(storage_config_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_storage_config); + window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->StoragePathCombo = yon_gtk_builder_get_widget(builder,"StoragePathCombo"); + window->OpenExistingButton = yon_gtk_builder_get_widget(builder,"OpenExistingButton"); + window->CreateNewButton = yon_gtk_builder_get_widget(builder,"CreateNewButton"); + window->DisableButton = yon_gtk_builder_get_widget(builder,"DisableButton"); + window->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton"); + window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); + window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); + window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); + window->storages_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); + yon_gtk_tree_store_copy_full(main_config.tree_store,window->storages_copy); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); + g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); + g_signal_connect(G_OBJECT(window->DisableButton),"clicked",G_CALLBACK(on_storage_disable),window); + g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); + g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); + g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); + + + return window; +} + +void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ + storage_config_window *window = yon_storage_config_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MANAGE_STORAGES_TITLE_LABEL,icon_path,"storage-configuration-window"); + gtk_label_set_text(GTK_LABEL(window->HeadLabel),MANAGE_STORAGES_TITLE_LABEL); + gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); + GtkTreeIter iter,itar; + for_iter(window->storages_copy,&iter){ + char *storage; + gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage,-1); + char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),id,storage); + } + + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict); + gtk_widget_show(window->MainWindow); +} diff --git a/source/ubl-settings-repomanager.c b/source/ubl-settings-repomanager.c index b6c1cbc..f2fce7d 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -45,7 +45,7 @@ void on_repo_sign_changed(GtkWidget *self, storage_config_window *window){ if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,child_id)){ if (!yon_char_is_empty(sign)){ gtk_tree_store_set(window->storages_copy,&itar,6,1,5,sign,-1); - if (system(yon_sign_repo(storage_path,target_repo,sign))){ + if (system(yon_debug_output("%s\n",yon_sign_repo(storage_path,target_repo,sign)))){ gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget*)g_list_nth_data(list,2)),0); yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),REPO_SIGN_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); } @@ -147,692 +147,6 @@ file_chooser_window *yon_file_chooser_new(){ return window; } -// storage-configure window section - -void on_storage_open(GtkWidget *self, storage_config_window *window){ - GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser"); - int responce = gtk_dialog_run(GTK_DIALOG(dialog)); - if (responce == GTK_RESPONSE_ACCEPT){ - char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - if (!yon_char_is_empty(path)){ - int size; - config_str files = yon_file_list_dirs(path,&size); - if (!files){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_FOLDER_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - gtk_widget_destroy(dialog); - return; - } else { - yon_char_parsed_free(files,size); - GtkTreeIter iter, itar; - gtk_tree_store_append(window->storages_copy,&iter,NULL); - char *name = yon_char_new(path); - free(yon_char_divide(name,yon_char_find_last(name,'/'))); - gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); - char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); - char *repos=NULL; - int repos_size=0; - g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); - yon_gtk_combo_box_text_find(window->StoragePathCombo,path); - g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); - yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); - config_str repos_list = yon_file_list_dirs(path,&repos_size); - for (int i=0;iAddEntry),render_name); - on_repo_add(self,window); - free(render_name); - } - } - yon_char_parsed_free(repos_list,repos_size); - } - - } - } - yon_storage_config_update(window); - gtk_widget_destroy(dialog); -} - -void on_storage_create(GtkWidget *self, storage_config_window *window){ - GtkWidget *dialog = gtk_file_chooser_dialog_new(CHOSE_FOLDER_TITLE_LABEL,GTK_WINDOW(window->MainWindow),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CLOSE_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); - yon_gtk_window_setup(GTK_WINDOW(dialog),GTK_WINDOW(window->MainWindow),CHOSE_FOLDER_TITLE_LABEL,icon_path,"file_chooser"); - int responce = gtk_dialog_run(GTK_DIALOG(dialog)); - if (responce == GTK_RESPONSE_ACCEPT){ - char *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - if (!yon_char_is_empty(path)){ - int size; - config_str files = yon_file_list_dirs(path,&size); - if (files){ - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),FILES_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - gtk_widget_destroy(dialog); - return; - } else { - yon_char_parsed_free(files,size); - GtkTreeIter iter; - gtk_tree_store_append(window->storages_copy,&iter,NULL); - char *name = yon_char_new(path); - free(yon_char_divide(name,yon_char_find_last(name,'/'))); - gtk_tree_store_set(window->storages_copy,&iter,2,name,3,path,-1); - char *iterpath = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),iterpath,path); - g_signal_handlers_block_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); - yon_gtk_combo_box_text_find(window->StoragePathCombo,path); - g_signal_handlers_unblock_by_func(G_OBJECT(window->StoragePathCombo),on_storage_changed,window); - gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); - yon_window_config_add_instant_parameter(path,"storage_info","",YON_TYPE_STRING); - } - } - } - yon_storage_config_update(window); - gtk_widget_destroy(dialog); -} - -void on_storage_disable(GtkWidget *self, storage_config_window *window){ - dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); - data->action_text=DISABLE_CONFIRMATION_LABEL; - GtkTreeIter iter,itar; - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->StoragePathCombo),&iter)){ - if (yon_confirmation_dialog_call(self,data)){ - char *storage; - const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); - if (id){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); - char *repos; - yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); - int repo_size; - config_str repo_list = yon_char_parse(repos,&repo_size,","); - for (int i=0;istorages_copy,&itar); - gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); - } - } - yon_storage_config_update(window); - } -} -void on_storage_remove(GtkWidget *self, storage_config_window *window){ - dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); - data->action_text=REMOVE_CONFIRMATION_LABEL; - if (yon_confirmation_dialog_call(self,data)){ - GtkTreeIter itar; - char *storage; - const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); - if (id){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&storage,-1); - char *repos; - yon_window_config_get_parameter("storage_info",storage,&repos,YON_TYPE_STRING); - int repo_size; - config_str repo_list = yon_char_parse(repos,&repo_size,","); - for (int i=0;istorages_copy,&itar); - gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); - } - } - yon_storage_config_update(window); -} - -void on_repo_add(GtkWidget *self, storage_config_window *window){ - char *new_repo = yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(window->AddEntry))); - gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); - if (yon_char_is_empty(new_repo)){ - yon_ubl_status_highlight_incorrect(window->AddEntry); - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_NAME_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - return; - } - GtkTreeIter iter,itar, childiter; - const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); - if (id){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&itar,id); - char *path; - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,3,&path,-1); - char *child_path = yon_char_unite(path,"/",new_repo,NULL); - gtk_tree_store_append(window->storages_copy,&childiter,&itar); - gtk_tree_store_set(window->storages_copy,&childiter,2,new_repo,3,child_path,-1); - yon_storage_config_update(window); - char *old; - yon_window_config_get_parameter("storage_info",path,&old,YON_TYPE_STRING); - int old_repos_size; - config_str old_repos_parsed = yon_char_parse(old,&old_repos_size,","); - if (yon_char_parsed_check_exist(old_repos_parsed,old_repos_size,child_path)==-1){ - yon_char_parsed_add_or_create_if_exists(old_repos_parsed,&old_repos_size,child_path); - } - yon_window_config_add_instant_parameter(path,"storage_info",yon_char_parsed_to_string(old_repos_parsed,old_repos_size,","),YON_TYPE_STRING); - yon_char_parsed_free(old_repos_parsed,old_repos_size); - yon_debug_output("%s\n",create_storage_command(path, new_repo)); - yon_launch(create_storage_command(path, new_repo)); - int size; - config_str dirs = yon_file_list_dirs(child_path,&size); - for (int i=0;istorages_copy,&iter,&childiter); - gtk_tree_store_set(window->storages_copy,&iter,2,dirs[i],3,arch_path,-1); - - if (!yon_char_is_empty(arch_path)&&!access(arch_path,F_OK)){ - config_str final = NULL; - int final_size=0; - DIR *current_dir = opendir(arch_path); - struct dirent* cur_dir; - while ((cur_dir=readdir(current_dir))){ - if (strlen(cur_dir->d_name)>8){ - char *extension = yon_char_new(cur_dir->d_name); - free(yon_char_divide(extension,yon_char_find_last(extension,'.')-4)); - if ((strcmp(cur_dir->d_name, ".") && strcmp(cur_dir->d_name, ".."))&&strstr(extension,"tar.")){ - yon_char_parsed_add_or_create_if_exists(final,&final_size,cur_dir->d_name); - } - } - } - closedir(current_dir); - if (size) - yon_window_config_add_instant_parameter(arch_path,"package_info",yon_char_parsed_to_string(final,final_size,","),YON_TYPE_STRING); - } - } - yon_char_parsed_free(dirs,size); - } - free(new_repo); -} - -void on_storage_accept(GtkWidget *self, dictionary *dict){ - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); - gtk_tree_store_clear(main_config.tree_store); - yon_gtk_tree_store_copy_full(window->storages_copy,main_config.tree_store); - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(main_config.tree_store)); - yon_window_config_save_instant(); - GtkTreeIter iter; - const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); - if (!yon_char_is_empty(id)){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); - gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); - on_main_tree_selection_changed(NULL,widgets); - } - on_subwindow_close(self); - yon_config_load_update(widgets); - yon_ubl_status_box_render(STORAGES_SAVED_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); -} - -gboolean yon_storage_filter_func(GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data); - -void on_storage_changed(GtkWidget *self, storage_config_window *window){ - yon_storage_config_update(window); -} - -storage_config_window *yon_storage_config_window_new(){ - storage_config_window *window = malloc(sizeof(storage_config_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_storage_config); - window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); - window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); - window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); - window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); - window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); - window->StoragePathCombo = yon_gtk_builder_get_widget(builder,"StoragePathCombo"); - window->OpenExistingButton = yon_gtk_builder_get_widget(builder,"OpenExistingButton"); - window->CreateNewButton = yon_gtk_builder_get_widget(builder,"CreateNewButton"); - window->DisableButton = yon_gtk_builder_get_widget(builder,"DisableButton"); - window->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton"); - window->ReposBox = yon_gtk_builder_get_widget(builder,"ReposBox"); - window->AddEntry = yon_gtk_builder_get_widget(builder,"AddEntry"); - window->AddRepoButton = yon_gtk_builder_get_widget(builder,"AddRepoButton"); - window->storages_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); - yon_gtk_tree_store_copy_full(main_config.tree_store,window->storages_copy); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->OpenExistingButton),"clicked",G_CALLBACK(on_storage_open),window); - g_signal_connect(G_OBJECT(window->CreateNewButton),"clicked",G_CALLBACK(on_storage_create),window); - g_signal_connect(G_OBJECT(window->DisableButton),"clicked",G_CALLBACK(on_storage_disable),window); - g_signal_connect(G_OBJECT(window->DeleteButton),"clicked",G_CALLBACK(on_storage_remove),window); - g_signal_connect(G_OBJECT(window->AddRepoButton),"clicked",G_CALLBACK(on_repo_add),window); - g_signal_connect(G_OBJECT(window->StoragePathCombo),"changed",G_CALLBACK(on_storage_changed),window); - - - return window; -} - -void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ - storage_config_window *window = yon_storage_config_window_new(); - yon_gtk_window_setup(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window),MANAGE_STORAGES_TITLE_LABEL,icon_path,"storage-configuration-window"); - gtk_label_set_text(GTK_LABEL(window->HeadLabel),MANAGE_STORAGES_TITLE_LABEL); - gtk_window_set_transient_for(GTK_WINDOW(window->MainWindow),GTK_WINDOW(widgets->Window)); - GtkTreeIter iter,itar; - for_iter(window->storages_copy,&iter){ - char *storage; - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&iter,3,&storage,-1); - char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->storages_copy),&iter); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),id,storage); - } - - dictionary *dict = NULL; - yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); - yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_storage_accept),dict); - gtk_widget_show(window->MainWindow); -} - -//repo-move window - - -//repo-add window section -gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data){ - GtkTreeIter parent; - if (gtk_tree_model_iter_parent(model, &parent, iter)) - return 0; - return 1; - } - -config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level){ - (*size)=0; - config_str final = NULL; - GtkTreePath *path=NULL, *parent_path=NULL; - GtkTreeIter iter; - if (parent){ - parent_path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),parent); - } - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(target),&iter,parent); - for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(target),&iter)){ - path = gtk_tree_model_get_path(GTK_TREE_MODEL(target),&iter); - if (path && gtk_tree_path_get_depth(path)==level&&(!parent_path||gtk_tree_path_is_descendant(path,parent_path))){ - char *append=NULL; - gtk_tree_model_get(GTK_TREE_MODEL(target),&iter,column,&append,-1); - yon_char_parsed_add_or_create_if_exists(final,size,append); - } - gtk_tree_path_free(path); - } - return final; -} - -void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window){ - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); - char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); - if (!yon_char_is_empty(path_str)){ - GtkTreeIter iter, itar; - GtkTreePath *path = gtk_tree_path_new_from_string(path_str); - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ - - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); - for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ - char *current; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,-1); - if (!yon_char_is_empty(current)){ - char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->RepositoryCombo),path_str,current); - } - } - } - - } -} - -void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window){ - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); - char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); - if (!yon_char_is_empty(path_str)){ - GtkTreeIter iter, itar; - GtkTreePath *path = gtk_tree_path_new_from_string(path_str); - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(window->tree_copy),&iter,path)){ - - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); - for(;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ - char *current, *current_path; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,¤t,3,¤t_path,-1); - if (!yon_char_is_empty(current)){ - char *path_str = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo),path_str,current); - - } - } - } - gtk_widget_set_sensitive(window->RepoSignCombo,1); - - } else { - gtk_widget_set_sensitive(window->RepoSignCombo,0); - - } -} - -void on_arch_chosen(GtkWidget *target,repo_add_window *window){ - char *path_str = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); - if (!yon_char_is_empty(path_str)){ - gtk_widget_set_sensitive(window->PackageSignCombo,1); - } else { - gtk_widget_set_sensitive(window->PackageSignCombo,0); - } -} - -void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window){ - gtk_list_store_clear(GTK_LIST_STORE(window->PackagesList)); - if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->ArchitectureCombo))==-1){ - gtk_widget_set_sensitive(window->AddPackageButton,0); - } else { - gtk_widget_set_sensitive(window->AddPackageButton,1); - } -} - -void on_move_storage_changed(GtkWidget *self, repo_add_window *window){ - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry)); - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry)); - GtkTreeIter iter,itar; - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->MoveTargetStorageEntry),id); - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ - char *target; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); - char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveTargetRepoEntry),child_id,target); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->MoveSourceRepoEntry),child_id,target); - } -} - -void on_move_repo_changed(GtkWidget *self, repo_add_window *window){ - GtkWidget *ArchCombo = NULL; - ArchCombo = self==window->MoveSourceRepoEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; - - gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(ArchCombo)); - GtkTreeIter iter,itar; - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(self)); - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->tree_copy),&itar,&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->tree_copy),&itar)){ - char *target; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,2,&target,-1); - char *child_id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(ArchCombo),child_id,target); - } - -} - -void on_move_arch_changed(GtkWidget *self, repo_add_window *window){ - GtkWidget *TargetArchCombo = self==window->MoveTargetArchEntry?window->MoveSourceArchEntry:window->MoveTargetArchEntry; - GtkWidget *TargetRepoCombo = self==window->MoveTargetArchEntry?window->MoveSourceRepoEntry:window->MoveTargetRepoEntry; - if (gtk_combo_box_get_active(GTK_COMBO_BOX(self))>-1){ - - const char *current = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(self)); - const char *repo_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(TargetRepoCombo)); - - if (!yon_char_is_empty(current)&&!yon_char_is_empty(repo_id)){ - - GtkTreeIter iter, itar; - - g_signal_handlers_block_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); - if (yon_gtk_combo_box_text_find(TargetArchCombo,(char*)current)==-1){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,repo_id); - gtk_tree_store_append(window->tree_copy,&itar,&iter); - char *id = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(window->tree_copy),&itar); - yon_debug_output("%s\n","arch"); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(TargetArchCombo),id,current); - } - g_signal_handlers_unblock_by_func(G_OBJECT(TargetArchCombo),on_move_arch_changed,window); - gtk_widget_set_sensitive(window->MoveTargetArchEntry,0); - gtk_widget_set_sensitive(window->AddPackageButton,1); - } - } -} - -void on_add_accept(GtkWidget *self, dictionary *dict){ - repo_add_window *window = yon_dictionary_get_data(dict->first,repo_add_window*); - file_chooser_window *dialog = yon_dictionary_get_data(dict->first->next,file_chooser_window*); - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); - char *path,*arch_name; - GtkTreeIter iter,itar,itor; - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&arch_name,3,&path,-1); - char *packages; - yon_window_config_get_parameter("package_info",path,&packages,YON_TYPE_STRING); - int size; - config_str parsed = yon_char_parse(packages,&size,","); - GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog->FileChooserWidget)); - for (int i=0;iStatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - return; - } - yon_char_remove_last_symbol(name[0],'\n'); - if (!yon_gtk_tree_model_check_exist(GTK_TREE_MODEL(window->PackagesList),&iter,name[0],1)){ - if (name_size<=0){ - yon_ubl_status_box_spawn(GTK_CONTAINER(dialog->StatusBox),PACKAGE_NAME_ERROR_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - return; - } - gtk_list_store_append(window->PackagesList,&itar); - gtk_list_store_set(window->PackagesList,&itar,1,name[0],2,current,3,1,-1); - } else { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - } - yon_char_parsed_free(name,name_size); - } - } - gtk_widget_destroy(dialog->Window); - if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ - gtk_widget_set_sensitive(window->StorageCombo,0); - gtk_widget_set_sensitive(window->RepositoryCombo,0); - gtk_widget_set_sensitive(window->ArchitectureCombo,0); - } -} - -void on_add_package(GtkWidget *self, repo_add_window *window){ - file_chooser_window *dialog = yon_file_chooser_new(); - yon_gtk_window_setup(GTK_WINDOW(dialog->Window),GTK_WINDOW(window->MainWindow),CHOSE_PACKAGES_TITLE_LABEL,icon_path,"filechooserWindow"); - gtk_label_set_text(GTK_LABEL(dialog->HeadLabel),CHOSE_PACKAGES_TITLE_LABEL); - gtk_widget_show(dialog->Window); - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(filter,"*.pkg.tar*[^.sig]"); - gtk_file_filter_set_name(filter,"*.pkg.tar*"); - dictionary *dict = NULL; - yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - yon_dictionary_add_or_create_if_exists_with_data(dict,"dialog",dialog); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog->FileChooserWidget),filter); - g_signal_connect(G_OBJECT(dialog->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(dialog->ChooseButton),"clicked",G_CALLBACK(on_add_accept),dict); - g_signal_connect(G_OBJECT(dialog->FileChooserWidget),"file-activated",G_CALLBACK(on_file_chooser_file_activate),window); -} - -void on_remove_package(GtkWidget *self, repo_add_window *window){ - char *id = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepositoryCombo)); - char *storage = (char*)gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StorageCombo)); - char *repo; - char *path; - GtkTreeModel *model; - GtkTreeIter iter,itar,itor; - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&itor,storage); - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itor,3,&storage,-1); - - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->tree_copy),&iter,id); - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&itar)){ - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,2,&repo,3,&path,-1); - gtk_list_store_remove(window->PackagesList,&itar); - } - if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(window->tree_copy),&iter)){ - gtk_widget_set_sensitive(window->StorageCombo,1); - gtk_widget_set_sensitive(window->RepositoryCombo,1); - gtk_widget_set_sensitive(window->ArchitectureCombo,1); - } -} - -void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window){ - gtk_label_set_text(GTK_LABEL(window->InfoLabel),""); - GtkTreeModel *model; - GtkTreeIter iter; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->PackagesTree)),&model,&iter)){ - gtk_widget_set_sensitive(window->RemoveButton,1); - char *target; - gtk_tree_model_get(model,&iter,2,&target,-1); - int size; - config_str info = yon_config_load(get_package_info_command(target),&size); - char *result = yon_char_parsed_to_string(info,size,""); - gtk_label_set_text(GTK_LABEL(window->InfoLabel),result); - yon_char_parsed_free(info,size); - free(result); - } else { - gtk_widget_set_sensitive(window->RemoveButton,0); - } -} - - -void on_add_packages_accept(GtkWidget *self, dictionary *dict){ - main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); - repo_add_window *window = yon_dictionary_get_data(dict->first->next,repo_add_window*); - - GtkTreeIter iter, itar; - char *storage; - if (yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(window->StorageCombo),GTK_TREE_MODEL(window->tree_copy),&itar)){ - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&itar,3,&storage,-1); - const char *repo = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->RepositoryCombo)); - const char *arch = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->ArchitectureCombo)); - GtkTreeModel *model = GTK_TREE_MODEL(window->PackagesList); - int size=0; - config_str packages=NULL; - int valid = gtk_tree_model_get_iter_first(model,&iter); - for (;valid;valid=gtk_tree_model_iter_next(model,&iter)){ - char *target; - gtk_tree_model_get(model,&iter,2,&target,-1); - yon_char_parsed_add_or_create_if_exists(packages,&size,target); - free(target); - } - if (size>0){ - char *command = NULL; - int repo_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->RepoSignCombo)); - int pack_sign = gtk_combo_box_get_active(GTK_COMBO_BOX(window->PackageSignCombo)); - if (repo_sign&&pack_sign){ - command = add_packages_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); - } else if (repo_sign){ - command = add_packages_repo_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->RepoSignCombo)),yon_char_parsed_to_string(packages,size," ")); - } else if (pack_sign){ - command = add_packages_package_sign_command(storage,arch,repo,gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->PackageSignCombo)),yon_char_parsed_to_string(packages,size," ")); - } else { - command = add_packages_command(storage,arch,repo,yon_char_parsed_to_string(packages,size," ")); - } - yon_debug_output("%s\n",command); - if (!system(command)){ - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),NULL); - gtk_tree_store_clear(widgets->RepoList); - yon_gtk_tree_store_copy_full(window->tree_copy,widgets->RepoList); - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ReposTree),GTK_TREE_MODEL(widgets->RepoList)); - - const char *id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->ArchitectureCombo)); - if (!yon_char_is_empty(id)){ - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->RepoList),&iter,id); - gtk_tree_view_expand_to_path(GTK_TREE_VIEW(widgets->ReposTree),gtk_tree_path_new_from_string(id)); - gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),&iter); - on_main_tree_selection_changed(NULL,widgets); - } - gtk_widget_destroy(window->MainWindow); - yon_ubl_status_box_render(PACKAGES_ADD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - yon_config_load_update(widgets); - } - } else { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - } - } else { - yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NOTHING_CHOSEN_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); - } -} - -void on_repo_sign_load(GtkWidget *self, repo_add_window *window){ - GtkTreeIter iter; - yon_gtk_tree_iter_get_from_combo_box_id(GTK_COMBO_BOX(self),GTK_TREE_MODEL(window->tree_copy),&iter); - char *sign; - gtk_tree_model_get(GTK_TREE_MODEL(window->tree_copy),&iter,5,&sign,-1); - if (!yon_char_is_empty(sign)) - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepoSignCombo),sign); -} - -repo_add_window *yon_repo_add_window_new(){ - repo_add_window *window = malloc(sizeof(repo_add_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_add); - window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow"); - window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); - window->StorageCombo = yon_gtk_builder_get_widget(builder,"StorageCombo"); - window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); - window->RepositoryCombo = yon_gtk_builder_get_widget(builder,"RepositoryCombo"); - window->ArchitectureCombo = yon_gtk_builder_get_widget(builder,"ArchitectureCombo"); - window->MoveSourceFrame = yon_gtk_builder_get_widget(builder,"MoveSourceFrame"); - window->MoveSourceStorageEntry = yon_gtk_builder_get_widget(builder,"MoveSourceStorageEntry"); - window->MoveSourceRepoEntry = yon_gtk_builder_get_widget(builder,"MoveSourceRepoEntry"); - window->MoveSourceArchEntry = yon_gtk_builder_get_widget(builder,"MoveSourceArchEntry"); - window->MoveTargetFrame = yon_gtk_builder_get_widget(builder,"MoveTargetFrame"); - window->MoveTargetStorageEntry = yon_gtk_builder_get_widget(builder,"MoveTargetStorageEntry"); - window->MoveTargetRepoEntry = yon_gtk_builder_get_widget(builder,"MoveTargetRepoEntry"); - window->MoveTargetArchEntry = yon_gtk_builder_get_widget(builder,"MoveTargetArchEntry"); - window->PackageSignCombo = yon_gtk_builder_get_widget(builder,"PackageSignCombo"); - window->RepoSignCombo = yon_gtk_builder_get_widget(builder,"RepoSignCombo"); - window->AddPackageButton = yon_gtk_builder_get_widget(builder,"AddPackageButton"); - window->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); - window->PackagesTree = yon_gtk_builder_get_widget(builder,"PackagesTree"); - window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); - window->PackagesToAddLabel = yon_gtk_builder_get_widget(builder,"PackagesToAddLabel"); - window->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); - window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); - window->PackagesList = GTK_LIST_STORE(gtk_builder_get_object(builder,"PackagesList")); - window->tree_copy = gtk_tree_store_new(7,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING,G_TYPE_INT); - yon_gtk_tree_store_copy_full(main_config.tree_store,window->tree_copy); - - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); - g_signal_connect(G_OBJECT(window->PackagesTree),"cursor-changed",G_CALLBACK(on_add_window_tree_changed),window); - - window->added_packages_archs = NULL; - window->removed_packages_archs = NULL; - - return window; -} - -void yon_add_window_set_selected(main_window *widgets, repo_add_window *window){ - GtkTreeIter iter; - - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->ReposTree)),NULL,&iter)){ - - char *target = gtk_tree_model_get_string_from_iter(GTK_TREE_MODEL(widgets->RepoList),&iter); - int mod = yon_char_count(target,":")+1; - char *arc=NULL; - char *repo=NULL; - char *stor=NULL; - if (mod ==3){ - arc = yon_char_new(target); - char *temp = yon_char_new(target); - repo = yon_char_divide(temp,yon_char_find_last(temp,':')); - free(temp); - temp = yon_char_new(repo); - stor = yon_char_divide(temp,yon_char_find_last(temp,':')); - free(temp); - } else if (mod>=2){ - repo = yon_char_new(target); - char *temp = yon_char_new(target); - stor = yon_char_divide(temp,yon_char_find_last(temp,':')); - free(temp); - } else if (mod>=1){ - stor = yon_char_new(target); - } - - if (stor) - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StorageCombo),stor); - if (repo) - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->RepositoryCombo),repo); - if (arc) - gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->ArchitectureCombo),arc); - } -} - // main window void on_add_clicked(GtkWidget *self, main_window *widgets){ repo_add_window *window = yon_repo_add_window_new(); @@ -1585,10 +899,10 @@ void on_key_generate_accept(GtkWidget *self, key_creation_window* window){ int ex_status=0; if (yon_char_is_empty(password)&&yon_char_is_empty(password_confirm)){ yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); - ex_status = system(yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password)); + ex_status = system(yon_debug_output("%s\n",yon_generate_key_no_password_command(type,name,email,strength,comment,expire,password))); } else if (!strcmp(password,password_confirm)){ yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password)); - ex_status = system(yon_generate_key_command(type,name,email,strength,comment,expire,password)); + ex_status = system(yon_debug_output("%s\n",yon_generate_key_command(type,name,email,strength,comment,expire,password))); } else { yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),PASSWORD_INCORRECT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); return; @@ -1856,7 +1170,7 @@ main_window *yon_main_window_complete(main_window *widgets){ } int main(int argc, char *argv[]){ - local=setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index bf5b62e..e2c5fda 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -63,23 +63,23 @@ typedef char* string; #define create_storage_command(path,name) yon_char_unite("repo-manager add -r '",name,"' -d '", path,"'",NULL) #define add_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL) -#define add_packages_sign_command(path,arch,name,repo_sign,pack_sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",repo_sign,"' -s '",pack_sign,"' ",packages_path,NULL) -#define add_packages_package_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -s '",sign,"' ",packages_path,NULL) -#define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S '",sign,"' ",packages_path,NULL) +#define add_packages_sign_command(path,arch,name,repo_sign,pack_sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S ",repo_sign," -s ",pack_sign," ",packages_path,NULL) +#define add_packages_package_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -s ",sign," ",packages_path,NULL) +#define add_packages_repo_sign_command(path,arch,name,sign,packages_path) yon_char_unite("repo-manager add -f -r '",name,"' -a '",arch,"' -d '", path,"' -S ",sign," ",packages_path,NULL) #define remove_packages_command(path,arch,name,packages_path) yon_char_unite("repo-manager remove -r '",name,"' -a '",arch,"' -d '", path,"' ",packages_path,NULL) #define yon_move_packages_command(storage,arch, source_repo, target_repo, packages) yon_char_unite("repo-manager move -d '",storage,"' -a '",arch,"' -R '",source_repo,"' -r '",target_repo,"' ", packages,NULL) #define yon_delete_packages_command(storage,arch, target_repo, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' ", packages,NULL) -#define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S '",sign,"' ", packages,NULL) +#define yon_delete_packages_sign_command(storage,arch, target_repo,sign, packages) yon_char_unite("repo-manager remove -d '",storage,"' -a '",arch,"' -r '",target_repo,"' -S ",sign," ", packages,NULL) #define ubl_settings_update_command "ubl-settings-update" -#define yon_get_packages_command(path,repo,arch) yon_char_unite("repo-manager show --quiet -d ",path," -a ",arch," -r ",repo," | sed -E 's/(\\S+)(\\s+)(\\S+)/\\1 \\3/g'",NULL) +#define yon_get_packages_command(path,repo,arch) yon_char_unite("repo-manager show --quiet -d '",path,"' -a ",arch," -r '",repo,"' | sed -E 's/(\\S+)(\\s+)(\\S+)/\\1 \\3/g'",NULL) -#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," . 2>&1 | cut -d: -f2 |sed -E 's/ *//g'",NULL) -#define yon_repo_get_signature_status(path,repo,arch, package) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," ",package,NULL) -#define yon_repo_get_signature_status_arch(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo," .",NULL) -#define yon_repo_get_signature_status_packages(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r ",repo,NULL) +#define yon_repo_get_signature(path, repo) yon_char_unite("repo-manager verify --quiet -d ",path," -r '",repo,"' . 2>&1 | cut -d: -f2 |sed -E 's/ *//g'",NULL) +#define yon_repo_get_signature_status(path,repo,arch, package) yon_char_unite("repo-manager verify --quiet -d ",path," -r '",repo,"' ",package,NULL) +#define yon_repo_get_signature_status_arch(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r '",repo,"' .",NULL) +#define yon_repo_get_signature_status_packages(path,repo,arch) yon_char_unite("repo-manager verify --quiet -d ",path," -r '",repo,"'",NULL) #define yon_get_package_name_from_filename(path) yon_char_unite("[[ '",path,"' =~ (.*/)*(.*)-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^.-]+ ]] && echo ${BASH_REMATCH[2]}",NULL) @@ -87,8 +87,8 @@ typedef char* string; #define get_gpg_keys_command yon_char_unite(yon_ubl_check_root()==1 ? yon_char_unite("su - ",yon_ubl_root_user_get()," -c \"gpg --list-signatures\"",NULL):"gpg --list-signatures"," | grep '^sig 3' | cut -d' ' -f10,11,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) -#define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r '",repo,"' -a '",arch,"' -d '", storage,"' -s '",sign,"' ",target,NULL) -#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage,"' --sign-repo='",sign,"'",NULL) +#define yon_sign_package(storage,repo,arch,target,sign) yon_char_unite("repo-manager add -r ''",repo,"'' -a '",arch,"' -d '", storage,"' -s ",sign," ",target,NULL) +#define yon_sign_repo(storage,repo,sign) yon_char_unite("repo-manager add -f -r ''",repo,"'' -d '", storage,"' --sign-repo=",sign,NULL) #define get_package_info_command(filename) yon_char_unite("pacman -Q --info --file ",filename," 2>/dev/null|sed -e 's/ */ /g' -e 's/ : /: /g' -e 's/\\n/ /g' -e 's/^ /\\t/g'",NULL) @@ -128,9 +128,10 @@ Expire-Date: ",expire,"\n\ %echo done\n\ EOF",NULL) -string version_application; +typedef char* string; -char *local; +__attribute__((unused)) static \ +string version_application; typedef struct { template_config_fields @@ -141,6 +142,8 @@ typedef struct { char *last_selection; } config; +extern config main_config; + typedef struct { template_window_fields GtkWidget *UpdateButton; @@ -277,4 +280,33 @@ void on_repo_add(GtkWidget *self, storage_config_window *window); void on_main_tree_selection_changed(GtkWidget *self, main_window *widgets); -void yon_config_load_update(main_window *widgets); \ No newline at end of file +void yon_config_load_update(main_window *widgets); +void yon_add_window_set_selected(main_window *widgets, repo_add_window *window); +repo_add_window *yon_repo_add_window_new(); +void on_repo_sign_load(GtkWidget *self, repo_add_window *window); +void on_add_packages_accept(GtkWidget *self, dictionary *dict); +void on_add_window_tree_changed(GtkWidget *self, repo_add_window *window); +void on_remove_package(GtkWidget *self, repo_add_window *window); +void on_add_package(GtkWidget *self, repo_add_window *window); +void on_add_accept(GtkWidget *self, dictionary *dict); +void on_move_arch_changed(GtkWidget *self, repo_add_window *window); +void on_move_repo_changed(GtkWidget *self, repo_add_window *window); +void on_move_storage_changed(GtkWidget *self, repo_add_window *window); +void on_add_target_package_selection_changed(GtkWidget *target,repo_add_window *window); +void on_arch_chosen(GtkWidget *target,repo_add_window *window); +void on_add_target_arch_selection_changed(GtkWidget *target,repo_add_window *window); +void on_add_target_repo_selection_changed(GtkWidget *target,repo_add_window *window); +config_str yon_tree_store_get_all_at_level(GtkTreeStore *target,GtkTreeIter *parent, int *size, int column, int level); +gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data); +void on_file_chooser_file_activate(GtkFileChooser *self, repo_add_window *window); +file_chooser_window *yon_file_chooser_new(); +gboolean yon_storage_filter_func(GtkTreeModel *model,GtkTreeIter *iter,gpointer data); +void on_storage_configure_clicked(GtkWidget *self, main_window *widgets); +storage_config_window *yon_storage_config_window_new(); +void on_storage_changed(GtkWidget *self, storage_config_window *window); +void on_storage_accept(GtkWidget *self, dictionary *dict); +void on_repo_add(GtkWidget *self, storage_config_window *window); +void on_storage_remove(GtkWidget *self, storage_config_window *window); +void on_storage_disable(GtkWidget *self, storage_config_window *window); +void on_storage_create(GtkWidget *self, storage_config_window *window); +void on_storage_open(GtkWidget *self, storage_config_window *window); \ No newline at end of file