From e9df273e484ee1f670723b30748659ba044de6ef Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 19 Jun 2025 11:59:31 +0000 Subject: [PATCH] WIP Storage configuration window --- .../ubl-settings-repomanager-data-structs.c | 107 +++++ .../ubl-settings-repomanager-storage-list.c | 80 ++-- .../ubl-settings-repomanager-storage-window.c | 421 +++++++----------- source/ubl-settings-repomanager.c | 107 +---- source/ubl-settings-repomanager.h | 33 +- ubl-settings-repomanager-configuration.glade | 2 + ubl-settings-repomanager-repo-block.glade | 22 - 7 files changed, 352 insertions(+), 420 deletions(-) diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index 37dbbac..27619e5 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -1,5 +1,8 @@ #include "ubl-settings-repomanager.h" +void yon_arch_sturct_free_full(arch_struct *arch); +void yon_repo_sturct_free_full(repo_struct *repo); + void yon_storage_fill_repos(storage_struct *storage, config_str repos, int repos_size){ for (int i=0;iname)) free(storage->name); + if (!yon_char_is_empty(storage->path)) free(storage->path); + GList *repos = g_hash_table_get_values(storage->repos); + GList *iter; + for (iter=repos;iter;iter=iter->next){ + yon_repo_sturct_free_full((repo_struct*)iter->data); + } + free(storage); +} + storage_struct *yon_storage_struct_new(){ storage_struct *storage = malloc(sizeof(storage_struct)); storage->name=NULL; @@ -36,6 +50,18 @@ void yon_repo_fill_archs(repo_struct *repo){ } } +void yon_repo_sturct_free_full(repo_struct *repo){ + if (!yon_char_is_empty(repo->name)) free(repo->name); + if (!yon_char_is_empty(repo->path)) free(repo->path); + if (!yon_char_is_empty(repo->storage_path)) free(repo->storage_path); + GList *archs = g_hash_table_get_values(repo->archs); + GList *iter; + for (iter=archs;iter;iter=iter->next){ + yon_arch_sturct_free_full((arch_struct*)iter->data); + } + free(repo); +} + repo_struct *yon_repo_struct_new(){ repo_struct *storage = malloc(sizeof(repo_struct)); storage->name=NULL; @@ -59,6 +85,18 @@ void yon_arch_fill_packages(arch_struct *arch){ } } +void yon_arch_sturct_free_full(arch_struct *arch){ + if (!yon_char_is_empty(arch->name)) free(arch->name); + if (!yon_char_is_empty(arch->path)) free(arch->path); + if (!yon_char_is_empty(arch->storage_path)) free(arch->storage_path); + GList *archs = g_hash_table_get_values(arch->packages); + GList *iter; + for (iter=archs;iter;iter=iter->next){ + free(iter->data); + } + free(arch); +} + arch_struct *yon_arch_struct_new(){ arch_struct *storage = malloc(sizeof(arch_struct)); storage->name=NULL; @@ -67,4 +105,73 @@ arch_struct *yon_arch_struct_new(){ storage->path=NULL; storage->packages = g_hash_table_new(g_str_hash,g_str_equal); return storage; +} + +void yon_package_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash){ + GList *list = g_hash_table_get_keys(source_hash); + GList *iter; + for (iter = list;iter;iter=iter->next){ + char *key = (char*)iter->data; + char *package_name = g_hash_table_lookup(source_hash,key); + g_hash_table_insert(target_hash,key,yon_char_new(package_name)); + } +} + +arch_struct *yon_arch_copy_full(arch_struct *repo){ + arch_struct *copy = yon_arch_struct_new(); + copy->name=yon_char_new(repo->name); + copy->path=yon_char_new(repo->name); + copy->storage_path=yon_char_new(repo->storage_path); + copy->repo_name=yon_char_new(repo->repo_name); + yon_package_hash_table_clone(repo->packages,copy->packages); + return copy; +} + +void yon_arch_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash){ + GList *list = g_hash_table_get_values(source_hash); + GList *iter; + for (iter = list;iter;iter=iter->next){ + arch_struct *storage = (arch_struct*)iter->data; + arch_struct *storage_copy = yon_arch_copy_full(storage); + g_hash_table_insert(target_hash,storage_copy->name,storage_copy); + } +} + +repo_struct *yon_repo_copy_full(repo_struct *repo){ + repo_struct *copy = yon_repo_struct_new(); + copy->name=yon_char_new(repo->name); + copy->path=yon_char_new(repo->name); + copy->storage_path=yon_char_new(repo->storage_path); + copy->sign_status=repo->sign_status; + yon_arch_hash_table_clone(repo->archs,copy->archs); + return copy; +} + +void yon_repo_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash){ + GList *list = g_hash_table_get_values(source_hash); + GList *iter; + for (iter = list;iter;iter=iter->next){ + repo_struct *storage = (repo_struct*)iter->data; + repo_struct *storage_copy = yon_repo_copy_full(storage); + g_hash_table_insert(target_hash,storage_copy->name,storage_copy); + } +} + +storage_struct *yon_storage_copy_full(storage_struct *storage){ + storage_struct *copy = yon_storage_struct_new(); + copy->name=yon_char_new(storage->name); + copy->path=yon_char_new(storage->name); + copy->sign_status=storage->sign_status; + yon_repo_hash_table_clone(storage->repos,copy->repos); + return copy; +} + +void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash){ + GList *list = g_hash_table_get_values(source_hash); + GList *iter; + for (iter = list;iter;iter=iter->next){ + storage_struct *storage = (storage_struct*)iter->data; + storage_struct *storage_copy = yon_storage_copy_full(storage); + g_hash_table_insert(target_hash,storage_copy->path,storage_copy); + } } \ No newline at end of file diff --git a/source/ubl-settings-repomanager-storage-list.c b/source/ubl-settings-repomanager-storage-list.c index 36e4717..6b85cbe 100644 --- a/source/ubl-settings-repomanager-storage-list.c +++ b/source/ubl-settings-repomanager-storage-list.c @@ -1,75 +1,53 @@ #include "ubl-settings-repomanager.h" -void on_repo_signed(){ - +void on_repo_signed(GtkWidget *self, storage_repo_block *block){ + storage_config_window *window = g_object_get_data(G_OBJECT(self),"window"); + const char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(block->SignatureCombo)); + if (!yon_char_is_empty(block->sign_request)) free(block->sign_request); + block->sign_request = yon_char_new(sign); } -void on_repo_removed(GtkWidget *self,storage_config_window *window){ - GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); - char *repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); - GtkTreeIter iter, itar; - char *storage; - char *id = (char*)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(window->storages_copy),&iter,id); - int valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ - char *target; - gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&target,-1); - if (!strcmp(target,repo)){ - gtk_tree_store_remove(window->storages_copy,&itar); - break; - } - } +void on_repo_removed(GtkWidget *self,storage_repo_block *block){ + storage_config_window *window = g_object_get_data(G_OBJECT(self),"window"); + const char *storage_id = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_id); + if (g_hash_table_lookup(storage->repos,block->repo_name)){ + g_hash_table_remove(storage->repos,block->repo_name); + gtk_widget_destroy(block->MainBox); + yon_storage_repo_block_destroy(block); } - // yon_storage_config_update(window); } -// void on_repo_sign_changed(GtkWidget *self, storage_repo_block *block){ -// GList *list = gtk_container_get_children(GTK_CONTAINER(gtk_widget_get_parent(self))); -// const char *sign = gtk_combo_box_get_active_id(GTK_COMBO_BOX(g_list_nth_data(list,2))); -// char *target_repo = (char*)gtk_entry_get_text(GTK_ENTRY(g_list_nth_data(list,0))); -// if (!yon_char_is_empty(target_repo)){ -// GtkTreeIter iter,itar; -// int size; -// char *storage_path; -// int found = yon_char_parsed_check_exist(repos,size,target_repo); -// if (found>-1){ -// char *child_id = yon_char_unite((char*)id,":",yon_char_from_int(found),NULL); -// 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_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); -// } -// }else -// gtk_tree_store_set(window->storages_copy,&itar,6,-1,5,NULL,-1); -// } -// } -// } -// } - storage_repo_block *yon_storage_repo_block_new(){ storage_repo_block *block = malloc(sizeof(storage_repo_block)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_repo_block); block->MainBox = yon_gtk_builder_get_widget(builder,"MainBox"); block->SignatureCombo = yon_gtk_builder_get_widget(builder,"SignatureCombo"); - block->SignatureButton = yon_gtk_builder_get_widget(builder,"SignatureButton"); block->RepoNameEntry = yon_gtk_builder_get_widget(builder,"RepoNameEntry"); block->RepoRemoveButton = yon_gtk_builder_get_widget(builder,"RepoRemoveButton"); block->repo_name=NULL; block->storage_path=NULL; + block->sign_request=NULL; + + g_object_set_data(G_OBJECT(block->MainBox),"repo_block",block); + g_object_set_data(G_OBJECT(block->SignatureCombo),"repo_block",block); + g_object_set_data(G_OBJECT(block->RepoRemoveButton),"repo_block",block); - // g_signal_connect(block->SignatureButton,"clicked",G_CALLBACK(on_repo_signed),block); - // g_signal_connect(block->RepoRemoveButton,"clicked",G_CALLBACK(on_repo_removed),block); - // g_signal_connect(block->SignatureButton,"clicked",G_CALLBACK(on_repo_sign_changed),block); - g_object_set_data(G_OBJECT(block->MainBox),"block_data",block); - // yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(block->SignatureCombo)); + yon_combo_box_text_set_signs(GTK_COMBO_BOX_TEXT(block->SignatureCombo)); gtk_combo_box_set_active(GTK_COMBO_BOX(block->SignatureCombo),0); + + g_signal_connect(block->SignatureCombo,"changed",G_CALLBACK(on_repo_signed),block); + g_signal_connect(block->RepoRemoveButton,"clicked",G_CALLBACK(on_repo_removed),block); + return block; +} + +void yon_storage_repo_block_destroy(storage_repo_block *block){ + if (!yon_char_is_empty(block->repo_name)) free(block->repo_name); + if (!yon_char_is_empty(block->storage_path)) free(block->storage_path); + free(block); } \ No newline at end of file diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index 96fc066..fb2e287 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -1,208 +1,119 @@ -// #include "ubl-settings-repomanager.h" +#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){ +void on_storage_open(GtkWidget *self, storage_config_window *window){ + + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_ACCEPT){ + char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog->MainFileChooser)); + storage_struct *storage = yon_storage_struct_new(); + storage->path=dialog->last_success_selection; + storage->name = yon_char_new(storage->path); + free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/'))); + g_hash_table_insert(window->storages_copy,storage->path,storage); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); + + } +} + +void on_storage_create(GtkWidget *self, storage_config_window *window){ + filechooser_window *dialog = yon_file_chooser_window_new(GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER); + if (yon_file_chooser_start(dialog)==GTK_RESPONSE_APPLY){ + storage_struct *storage = yon_storage_struct_new(); + storage->path=dialog->last_success_selection; + storage->name = yon_char_new(storage->path); + free(yon_char_divide(storage->name,yon_char_find_last(storage->name,'/'))); + g_hash_table_insert(window->storages_copy,storage->path,storage); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage->path,storage->path); + } +} + +void on_storage_disable(GtkWidget *self, storage_config_window *window){ + const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); + if (storage){ + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0); + g_hash_table_remove(window->storages_copy,storage_target); + yon_storage_sturct_free_full(storage); + } +} + +void on_storage_remove(GtkWidget *self, storage_config_window *window){ + const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); + if (storage){ + gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),gtk_combo_box_get_active(GTK_COMBO_BOX(window->StoragePathCombo))); + gtk_combo_box_set_active(GTK_COMBO_BOX(window->StoragePathCombo),0); + g_hash_table_remove(window->storages_copy,storage_target); + yon_storage_sturct_free_full(storage); + yon_char_parsed_add_or_create_if_exists(window->delete_storages,&window->delete_storages_size,(char*)storage_target); + } +} + +void on_repo_add(GtkWidget *self, storage_config_window *window){ + const char *repo_name = gtk_entry_get_text(GTK_ENTRY(window->AddEntry)); + if (yon_char_is_empty(repo_name)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->AddEntry); + return; + } + const char *storage_target = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + storage_struct *storage = g_hash_table_lookup(window->storages_copy,storage_target); + if (g_hash_table_lookup(storage->repos,repo_name)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),ALREADY_EXIST_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->AddEntry); + return; + } + char *new_repo = yon_char_new(repo_name); + repo_struct *repo = yon_repo_struct_new(); + storage_repo_block *block = yon_storage_repo_block_new(); + g_object_set_data(G_OBJECT(block->SignatureCombo),"repo_storage",repo); + g_object_set_data(G_OBJECT(block->SignatureCombo),"window",window); + g_object_set_data(G_OBJECT(block->RepoRemoveButton),"window",window); + repo->name=new_repo; + block->repo_name=new_repo; + repo->path = yon_char_unite(storage_target,"/",new_repo,NULL); + repo->storage_path = yon_char_new(storage_target); + gtk_entry_set_text(GTK_ENTRY(block->RepoNameEntry),new_repo); + gtk_box_pack_start(GTK_BOX(window->ReposBox),block->MainBox,0,0,0); + g_hash_table_insert(storage->repos,repo->name,repo); + gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); +} + +void yon_storage_config_update(storage_config_window *window){ + GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox)); + if (children){ + GList *iter; + for(iter=children;iter;iter=iter->next){ + gtk_widget_destroy(GTK_WIDGET(iter->data)); + } + } + const char *active = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + if (active){ + storage_struct *storage = g_hash_table_lookup(window->storages_copy,active); + GList *repos = g_hash_table_get_values(storage->repos); + if (repos){ + GList *iter; + for (iter = repos;iter;iter=iter->next){ + repo_struct *cur_repo = (repo_struct*)iter->data; + storage_repo_block *cur_block = NULL; + cur_block = yon_storage_repo_block_new(); + g_object_set_data(G_OBJECT(cur_block->SignatureCombo),"repo_storage",cur_repo); + g_object_set_data(G_OBJECT(cur_block->SignatureCombo),"window",window); + g_object_set_data(G_OBJECT(cur_block->RepoRemoveButton),"window",window); + cur_block->repo_name=yon_char_new(cur_repo->name); + gtk_entry_set_text(GTK_ENTRY(cur_block->RepoNameEntry),cur_repo->name); + gtk_box_pack_start(GTK_BOX(window->ReposBox),cur_block->MainBox,0,0,0); + } + } + } +} + +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); @@ -221,59 +132,59 @@ // 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); +} + + +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 = g_hash_table_new(g_str_hash,g_str_equal); + window->delete_storages=NULL; + window->delete_storages_size=0; + + yon_storage_hash_table_clone(main_config.storages,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); - -// gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),storage,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); -// } + 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"); + GtkTreeIter iter,itar; + GList *storages = g_hash_table_get_values(main_config.storages); + GList *listiter; + for (listiter = storages;listiter;listiter=listiter->next){ + storage_struct *cur_storage = (storage_struct*)listiter->data; + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->name,cur_storage->path); + } + 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 e63189a..50cd491 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -3,46 +3,6 @@ config main_config; -// void yon_storage_config_update(storage_config_window *window){ -// GList *children = gtk_container_get_children(GTK_CONTAINER(window->ReposBox)); -// for (int i=0;iStoragePathCombo)); -// if (id){ -// gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(window->storages_copy),&iter,id); -// if (gtk_tree_model_iter_children(GTK_TREE_MODEL(window->storages_copy),&itar,&iter)){ -// int valid = 1; -// for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(window->storages_copy),&itar)){ -// char *storage = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->StoragePathCombo)); -// char *repo; -// gtk_tree_model_get(GTK_TREE_MODEL(window->storages_copy),&itar,2,&repo,-1); -// storage_repo_block *block = yon_storage_repo_block_new(); -// block->repo_name = yon_char_new(repo); -// block->storage_path = yon_char_new(storage); -// gtk_box_pack_start(GTK_BOX(window->ReposBox),block->MainBox,0,0,0); -// gtk_entry_set_text(GTK_ENTRY(block->RepoNameEntry),repo); -// int sign_size; -// char *command = yon_repo_get_signature(storage,repo); -// yon_debug_output("%s\n",command); -// config_str sign = yon_config_load(command,&sign_size); -// if (sign_size>0){ -// yon_char_remove_last_symbol(sign[2],'\n'); -// char *mail = strstr(sign[2],"\""); -// if (!yon_char_is_empty(mail)){ -// char *email = yon_char_new(mail); -// yon_char_remove_brackets(email); -// gtk_combo_box_set_active_id(GTK_COMBO_BOX(block->SignatureCombo),email); -// free(email); -// } -// yon_char_parsed_free(sign,sign_size); -// } -// } -// } -// } -// } - // // filechooser window section // void on_file_chooser_entry_changed(GtkEntry *self, file_chooser_window *window){ @@ -91,7 +51,7 @@ void config_init(){ main_config.tree_store=NULL; main_config.signs=NULL; main_config.signs_size=0; - // yon_sign_list_update(); + yon_sign_list_update(); main_config.last_selection = NULL; main_config.storages = g_hash_table_new(g_str_hash,g_str_equal); } @@ -354,28 +314,27 @@ void on_package_selection_changed(GtkWidget *self, main_window *widgets){ } } -// void yon_combo_box_text_set_signs(GtkComboBoxText *target){ -// g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); -// gtk_combo_box_text_remove_all(target); -// gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL); -// for (int i=0;i")) -// yon_char_remove_last_symbol(temp,'>'); -// gtk_combo_box_text_append(target,temp,main_config.signs[i]); -// free(temp); -// } -// } +void yon_combo_box_text_set_signs(GtkComboBoxText *target){ + g_return_if_fail(GTK_IS_COMBO_BOX_TEXT(target)); + gtk_combo_box_text_remove_all(target); + gtk_combo_box_text_append_text(target,DO_NOT_SIGN_LABEL); + for (int i=0;iReposTree)); gtk_tree_selection_get_selected(tree_selection,&model,&iter); - // storage_struct *target_struct; - // gtk_tree_model_get(model,&iter,7,&target_struct,-1); - // if (gtk_tree_model_iter_has_child(model,&iter)){ - // GtkTreeModel *submodel; - // GtkTreeIter subiter; - // if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepoFileTree)),&submodel,&subiter)) return; - // char *target; - // gtk_tree_model_get(submodel,&subiter,1,&target,-1); - // GtkTreeIter childiter; - // gtk_tree_model_iter_children(model,&childiter, &iter); - // for_iter(model,&childiter){ - // char *check_target; - // gtk_tree_model_get(model,&childiter,2,&check_target,-1); - // if (!strcmp(check_target,target)){ - // GtkTreePath *path = gtk_tree_model_get_path(model,&iter); - // gtk_tree_selection_select_path(tree_selection,path); - // g_signal_emit_by_name(G_OBJECT(widgets->ReposTree),"cursor-changed",widgets,G_TYPE_NONE,NULL); - - // } - // } - // } - if (gtk_tree_store_iter_depth(GTK_TREE_STORE(widgets->RepoList),&iter)<2){ char *path_id = gtk_tree_model_get_string_from_iter(model,&iter); char *target_id = gtk_tree_path_to_string(path); @@ -680,7 +617,7 @@ main_window *yon_main_window_complete(main_window *widgets){ // REMOVE_PACKAGES_TITLE_LABEL,remove_icon,G_CALLBACK(on_rmb_remove),widgets, // NULL); - // g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); + g_signal_connect(G_OBJECT(widgets->DBConfigurationButton),"clicked",G_CALLBACK(on_storage_configure_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_add_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->MoveButton),"clicked",G_CALLBACK(on_move_clicked),widgets); // g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_remove_clicked),widgets); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 5360dd4..5c34572 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -83,7 +83,23 @@ typedef char* string; #define yon_get_filename_from_package_name(target) yon_char_unite("find ${PATH} -maxdepth 1 -regextype egrep -regex \".*/",target,"-[^-]+-[^-]+-[^-]+\\.pkg\\.tar\\.[^-.]*\"",NULL) -#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 '^uid' | cut -d' ' -f10,11,12,13- | sort -u |sed -e 's/[0-9]*-[0-9]*-[0-9]* //g'",NULL) +#define get_gpg_keys_command "gpg --list-keys | awk ' \ +/^pub/ { \ + key=\"\"; \ + getline; \ + if (match($0, /[0-9A-F]{8,}/)) \ + key=substr($0, RSTART, RLENGTH); \ +} \ +/^uid/ { \ + $1=\"\"; sub(/^ +/, \"\"); \ + if (match($0, /<[^>]+>/)) { \ + email = substr($0, RSTART+1, RLENGTH-2); \ + print $0 \";\" email; \ + } else { \ + print $0 \";\" key; \ + } \ +}'" + #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) @@ -215,9 +231,9 @@ typedef struct { GtkWidget *AddEntry; GtkWidget *AddRepoButton; GtkWidget *TestTree; - GtkListStore *StorageList; - GtkTreeStore *storages_copy; - GtkTreeModel *StorageFilter; + GHashTable *storages_copy; + int delete_storages_size; + config_str delete_storages; } storage_config_window; typedef struct { @@ -263,11 +279,11 @@ typedef struct { GtkWidget *MainBox; GtkWidget *RepoNameEntry; GtkWidget *SignatureCombo; - GtkWidget *SignatureButton; GtkWidget *RepoRemoveButton; char *storage_path; char *repo_name; + char *sign_request; } storage_repo_block; @@ -362,7 +378,7 @@ 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); void on_repo_signed(); -void on_repo_removed(GtkWidget *self,storage_config_window *window); +void on_repo_removed(GtkWidget *self,storage_repo_block *block); void on_repo_sign_changed(GtkWidget *self, storage_repo_block *block); void on_add_clicked(GtkWidget *self, main_window *widgets); void on_rmb_move(GtkWidget *self, main_window *widgets); @@ -388,4 +404,7 @@ void yon_repo_tree_build_repo(char *key, repo_struct *repo, struct repo_tree_bui void yon_repo_tree_build_arch(char *key, arch_struct *arch, struct repo_tree_build *data); void yon_interface_update(main_window *widgets); void yon_sublist_packages_build(char *key, char *file, main_window *widgets); -void yon_sublist_build(char *key, storage_struct *storage, main_window *widgets); \ No newline at end of file +void yon_sublist_build(char *key, storage_struct *storage, main_window *widgets); +void yon_storage_repo_block_destroy(storage_repo_block *block); +void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash); +void yon_storage_sturct_free_full(storage_struct *storage); \ No newline at end of file diff --git a/ubl-settings-repomanager-configuration.glade b/ubl-settings-repomanager-configuration.glade index 1575b04..32f8374 100644 --- a/ubl-settings-repomanager-configuration.glade +++ b/ubl-settings-repomanager-configuration.glade @@ -206,6 +206,7 @@ True False + 10 vertical 5 @@ -222,6 +223,7 @@ True False + 10 5 diff --git a/ubl-settings-repomanager-repo-block.glade b/ubl-settings-repomanager-repo-block.glade index 0880f29..8e6bcee 100644 --- a/ubl-settings-repomanager-repo-block.glade +++ b/ubl-settings-repomanager-repo-block.glade @@ -3,11 +3,6 @@ - - True - False - com.ublinux.libublsettingsui-gtk3.key-symbolic - True False @@ -53,23 +48,6 @@ 2 - - - True - True - True - Sign repo - image1 - - - - False - True - 3 - - True