diff --git a/source/ubl-settings-repomanager-data-structs.c b/source/ubl-settings-repomanager-data-structs.c index 27619e5..abdc460 100644 --- a/source/ubl-settings-repomanager-data-structs.c +++ b/source/ubl-settings-repomanager-data-structs.c @@ -68,7 +68,7 @@ repo_struct *yon_repo_struct_new(){ storage->path=NULL; storage->storage_path=NULL; storage->archs = g_hash_table_new(g_str_hash,g_str_equal); - storage->sign_status=0; + storage->sign_status=NULL; return storage; } @@ -120,7 +120,7 @@ void yon_package_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha 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->path=yon_char_new(repo->path); 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); @@ -140,7 +140,7 @@ void yon_arch_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash) 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->path=yon_char_new(repo->path); copy->storage_path=yon_char_new(repo->storage_path); copy->sign_status=repo->sign_status; yon_arch_hash_table_clone(repo->archs,copy->archs); @@ -160,7 +160,7 @@ void yon_repo_hash_table_clone(GHashTable *source_hash, GHashTable *target_hash) 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->path=yon_char_new(storage->path); copy->sign_status=storage->sign_status; yon_repo_hash_table_clone(storage->repos,copy->repos); return copy; @@ -174,4 +174,171 @@ void yon_storage_hash_table_clone(GHashTable *source_hash, GHashTable *target_ha storage_struct *storage_copy = yon_storage_copy_full(storage); g_hash_table_insert(target_hash,storage_copy->path,storage_copy); } +} + +void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct){ + char *changes = config(STORAGE(target_struct->path)); + if (!yon_char_is_empty(changes)){ + int size; + config_str parsed = yon_char_parse(changes,&size,";"); + if (size>0&&!yon_char_is_empty(parsed[0])){ + int removed_size; + config_str removed = yon_char_parse(parsed[0],&removed_size,","); + for (int i=0;irepos,removed[i]); + g_hash_table_remove(target_struct->repos,removed[i]); + yon_repo_sturct_free_full(repo); + } + yon_char_parsed_free(removed,removed_size); + } + if (size>1&&!yon_char_is_empty(parsed[1])){ + int added_size; + config_str added = yon_char_parse(parsed[1],&added_size,","); + for (int i=0;irepos,added[i]); + if (repo){ + repo_struct *copy = yon_repo_copy_full(repo); + g_hash_table_insert(target_struct->repos,copy->path,copy); + } + char *command = create_storage_command(repo->storage_path,repo->name); + yon_launch(yon_debug_output("%s\n",command)); + free(command); + + } + + yon_char_parsed_free(added,added_size); + } + if (size>2&&!yon_char_is_empty(parsed[2])){ + int sign_size; + config_str sign = yon_char_parse(parsed[2],&sign_size, ","); + for (int i=0;irepos,key); + char *command = repo_sign_command(repo->storage_path,repo->name,sign_key); + yon_launch(yon_debug_output("%s\n",command)); + free(command); + free(sign_key); + free(key); + } + yon_char_parsed_free(sign,sign_size); + } + + } + GList *list = g_hash_table_get_values(source_struct->repos); + GList *iter; + char *parameter=NULL; + yon_window_config_get_parameter("storage_info",source_struct->path,¶meter,YON_TYPE_STRING); + for (iter=list;iter;iter=iter->next){ + repo_struct *repo = (repo_struct*)iter->data; + char *temp = yon_char_append_element(parameter,repo->path,","); + if (!yon_char_is_empty(parameter)) free(parameter); + parameter = temp; + } + g_list_free(list); + yon_window_config_add_instant_parameter(source_struct->path,"storage_info",parameter,YON_TYPE_STRING); +} + +void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo){ + char *str = config(STORAGE(storage->path)); + if (!yon_char_is_empty(str)){ + int size; + config_str parsed = yon_char_parse(str,&size,";"); + + if (size>1&&!yon_char_is_empty(parsed[1])){ + int added_size; + config_str added = yon_char_parse(parsed[1],&added_size,","); + if (yon_char_parsed_check_exist(added,added_size,repo->name)==-1){ + yon_char_parsed_add_or_create_if_exists(added,&added_size,repo->name); + } else { + yon_char_parsed_free(added,added_size); + return; + } + if (!yon_char_is_empty(parsed[1])) free(parsed[1]); + parsed[1] = yon_char_parsed_to_string(parsed,size,","); + } else if (size>0){ + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + } else { + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); + } else { + char *final = yon_char_unite(";",repo->name,";",NULL); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + } + +} + +void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo){ + + char *str = config(STORAGE(storage->path)); + if (!yon_char_is_empty(str)){ + int size; + config_str parsed = yon_char_parse(str,&size,";"); + + if (size>0&&!yon_char_is_empty(parsed[0])){ + int removed_size; + config_str removed = yon_char_parse(parsed[0],&removed_size,","); + if (yon_char_parsed_check_exist(removed,removed_size,repo->name)==-1){ + yon_char_parsed_add_or_create_if_exists(removed,&removed_size,repo->name); + } else { + yon_char_parsed_free(removed,removed_size); + return; + } + if (!yon_char_is_empty(parsed[1])) free(parsed[1]); + parsed[1] = yon_char_parsed_to_string_full(parsed,size,","); + } else { + yon_char_parsed_add_or_create_if_exists(parsed,&size,repo->name); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); + } else { + char *final = yon_char_unite(repo->name,";;",NULL); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + } +} + +void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign){ + char *str = config(STORAGE(storage->path)); + int size; + config_str parsed = yon_char_parse(str,&size,";"); + if (size>2&&!yon_char_is_empty(parsed[2])){ + int signs_size; + config_str signs = yon_char_parse(parsed[2],&signs_size,","); + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(signs,&signs_size,final); + free(final); + yon_char_parsed_free(signs,signs_size); + } else if (size>1){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } else if (size>0){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } else if (!size){ + char *final = yon_char_unite(repo->name,":",sign,NULL); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,""); + yon_char_parsed_add_or_create_if_exists(parsed,&size,final); + free(final); + } + char *final = yon_char_parsed_to_string_full(parsed,size,";"); + yon_config_register(STORAGE(storage->path),STORAGE_command,final); + free(final); + if (parsed&&size) yon_char_parsed_free(parsed,size); } \ 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 6b85cbe..c3fa433 100644 --- a/source/ubl-settings-repomanager-storage-list.c +++ b/source/ubl-settings-repomanager-storage-list.c @@ -4,6 +4,11 @@ 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)); + 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); + repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name); + // yon_repo_struct_sign(storage,repo,sign); + yon_config_register(repo->path,STORAGE_command,(char*)sign); if (!yon_char_is_empty(block->sign_request)) free(block->sign_request); block->sign_request = yon_char_new(sign); } @@ -13,6 +18,9 @@ void on_repo_removed(GtkWidget *self,storage_repo_block *block){ 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)){ + repo_struct *repo = g_hash_table_lookup(storage->repos,block->repo_name); + // yon_storage_struct_remove(storage,repo); + yon_config_remove_element(storage->path,repo->path,","); g_hash_table_remove(storage->repos,block->repo_name); gtk_widget_destroy(block->MainBox); yon_storage_repo_block_destroy(block); diff --git a/source/ubl-settings-repomanager-storage-window.c b/source/ubl-settings-repomanager-storage-window.c index fb2e287..e27be4a 100644 --- a/source/ubl-settings-repomanager-storage-window.c +++ b/source/ubl-settings-repomanager-storage-window.c @@ -14,6 +14,8 @@ void on_storage_open(GtkWidget *self, storage_config_window *window){ 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); + while (gtk_events_pending()) gtk_main_iteration(); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); } } @@ -27,6 +29,8 @@ void on_storage_create(GtkWidget *self, storage_config_window *window){ 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); + while (gtk_events_pending()) gtk_main_iteration(); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(window->StoragePathCombo),storage->path); } } @@ -45,6 +49,8 @@ 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){ + const char *path = gtk_combo_box_get_active_id(GTK_COMBO_BOX(window->StoragePathCombo)); + yon_config_remove_by_key((char*)path); 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); @@ -77,9 +83,11 @@ void on_repo_add(GtkWidget *self, storage_config_window *window){ block->repo_name=new_repo; repo->path = yon_char_unite(storage_target,"/",new_repo,NULL); repo->storage_path = yon_char_new(storage_target); + yon_config_append_element(storage->path,(char*)repo->path,","); 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); + // yon_storage_struct_add_repo(storage,repo); gtk_entry_set_text(GTK_ENTRY(window->AddEntry),""); } @@ -112,8 +120,28 @@ void yon_storage_config_update(storage_config_window *window){ } } +void yon_storage_remove(char *key, storage_struct *storage,void*){ + char *parameter = config(key); + yon_window_config_add_instant_parameter(key,"storage_info",parameter,YON_TYPE_STRING); + int size; + config_str parsed = yon_char_parse(parameter,&size,","); + for (int i=0;ifirst,main_window*); + storage_config_window *window = yon_dictionary_get_data(dict->first->next,storage_config_window*); + gtk_widget_destroy(window->MainWindow); + g_hash_table_foreach_remove(window->storages_copy,(GHRFunc)yon_storage_remove,NULL); + g_hash_table_unref(window->storages_copy); + free(window); + yon_interface_update(widgets); // 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); @@ -160,6 +188,21 @@ storage_config_window *yon_storage_config_window_new(){ window->delete_storages_size=0; yon_storage_hash_table_clone(main_config.storages,window->storages_copy); + + GList *list = g_hash_table_get_values(window->storages_copy); + GList *iter; + for (iter=list;iter;iter=iter->next){ + storage_struct *storage = (storage_struct*)iter->data; + int repos_size; + config_str paths = NULL; + GList *repos = g_hash_table_get_values(storage->repos); + GList *iter2; + for (iter2=repos;iter2;iter2=iter2->next){ + repo_struct *repo = (repo_struct*)iter2->data; + yon_char_parsed_add_or_create_if_exists(paths,&repos_size,repo->path); + } + yon_config_register(storage->path,STORAGE_command,yon_char_parsed_to_string(paths,repos_size,",")); + } 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); @@ -180,11 +223,11 @@ void on_storage_configure_clicked(GtkWidget *self, main_window *widgets){ 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); + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(window->StoragePathCombo),cur_storage->path,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); + 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 50cd491..d3b31b8 100644 --- a/source/ubl-settings-repomanager.c +++ b/source/ubl-settings-repomanager.c @@ -65,7 +65,13 @@ char *yon_path_get_name(char *path){ return copy; } +void yon_remove_config_storages(char *key,storage_struct *storage,void*){ + yon_storage_sturct_free_full(storage); +} + int yon_storages_load(main_window *widgets){ + // g_hash_table_foreach_remove(main_config.storages,(GHRFunc)yon_remove_config_storages,NULL); + g_hash_table_remove_all(main_config.storages); gsize size; config_str storages = yon_window_config_get_section("storage_info",&size); @@ -73,12 +79,12 @@ int yon_storages_load(main_window *widgets){ for(int i=0;iname=storage_name; storage->path=yon_char_new(storages[i]); + g_hash_table_insert(main_config.storages,storage->path,storage); int repos_size; config_str repo_names = yon_char_parse(repos,&repos_size,","); diff --git a/source/ubl-settings-repomanager.h b/source/ubl-settings-repomanager.h index 5c34572..209a190 100644 --- a/source/ubl-settings-repomanager.h +++ b/source/ubl-settings-repomanager.h @@ -66,6 +66,8 @@ typedef char* string; #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 repo_sign_command(storage_path, repo, sign) yon_char_unite("repo-manager add -f -r '",repo,"' -d '", storage_path, "' -S ", sign,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) @@ -142,6 +144,11 @@ Expire-Date: ",!yon_char_is_empty(expire)?expire:"0","\n\ %echo done\n\ EOF",NULL) +#define STORAGE_search_macro "STORAGE[" +#define STORAGE(target) yon_char_unite("STORAGE[",target,"]",NULL) +#define STORAGE_command "echo \"\"" + + typedef char* string; __attribute__((unused)) static \ @@ -299,7 +306,7 @@ typedef struct { char *storage_path; GHashTable *archs; char *path; - int sign_status; + char *sign_status; } repo_struct; typedef struct { @@ -407,4 +414,9 @@ void yon_sublist_packages_build(char *key, char *file, main_window *widgets); 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 +void yon_storage_sturct_free_full(storage_struct *storage); +void yon_storage_edit_accept(storage_struct *target_struct, storage_struct *source_struct); +void yon_storage_struct_remove(storage_struct *storage,repo_struct *repo); +void yon_storage_struct_add_repo(storage_struct *storage,repo_struct *repo); +void yon_repo_struct_sign(storage_struct *storage, repo_struct *repo,const char *sign); +void yon_storage_remove(char *key, storage_struct *storage,void*); \ No newline at end of file