#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); } }