From 2ac710f0f20a16372c9cb40d85bcc7dea4b3a8de Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 17 Oct 2024 18:01:27 +0600 Subject: [PATCH] Editing windows WIP --- source/ubl-settings-update.c | 183 +++++++++++++++--- source/ubl-settings-update.h | 12 +- source/ubl-strings.h | 1 + ubl-settings-update-mirror-path-add.glade | 2 +- ubl-settings-update-web-publication-add.glade | 25 ++- ubl-settings-update.glade | 87 +++++++-- 6 files changed, 265 insertions(+), 45 deletions(-) diff --git a/source/ubl-settings-update.c b/source/ubl-settings-update.c index 01a493f..dfb38f6 100644 --- a/source/ubl-settings-update.c +++ b/source/ubl-settings-update.c @@ -183,11 +183,17 @@ void yon_interface_update(main_window *widgets){ char *key = yon_char_divide_search(cur,"=",-1); free(yon_char_divide_search(key,"[",-1)); key[strlen(key)-1]='\0'; - char *path = !strstr(key,"=") ? NULL : yon_char_divide_search(key,":",-1); + char *path = NULL; + if (!strstr(key,":")){ + path=key; + key=NULL; + } else { + path = yon_char_divide_search(key,":",-1); + } int repos_size; - config_str repos = yon_char_parse(path,&repos_size,","); + config_str repos = yon_char_parse(key,&repos_size,","); - gtk_list_store_set(widgets->WebPublicationList,&iter,1,key,2,yon_char_parsed_to_string(repos,repos_size,"\n"),-1); + gtk_list_store_set(widgets->WebPublicationList,&iter,1,path,2,yon_char_parsed_to_string(repos,repos_size,"\n"),-1); int cur_size; config_str parsed = yon_char_parse(cur,&cur_size,":"); if (cur_size){ @@ -272,18 +278,29 @@ void on_selection_changed(GtkWidget *self, main_window *widgets){ } } -void on_repo_add(GtkWidget *, main_window *widgets){ - repo_add_window *window = yon_repo_add_window_new(); - yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"add_repo_window"); - - 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_repo_accept_clicked),dict); +void on_web_publish_path_changed(GtkWidget *, web_publication_add_window *window){ + gtk_list_store_clear(window->list); + char *path = (char*)gtk_entry_get_text(GTK_ENTRY(window->PathEntry)); + if (yon_char_is_empty(path) || access(path,F_OK)) return; + int size; + config_str parsed = yon_dir_get_contents(path,&size); + GtkTreeIter iter; + for (int i=0;ilist,&iter); + gtk_list_store_set(window->list,&iter,0,1,1,parsed[i],-1); + } + free(cur_path); + } + yon_char_parsed_free(parsed,size); } void on_web_publish_add(GtkWidget *,main_window *widgets){ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MirrorTree))); web_publication_add_window *window = yon_web_publication_add_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"web_publish_window"); @@ -293,7 +310,20 @@ void on_web_publish_add(GtkWidget *,main_window *widgets){ g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_web_publish_accept),dict); } +void on_repo_add(GtkWidget *, main_window *widgets){ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MirrorTree))); + repo_add_window *window = yon_repo_add_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"add_repo_window"); + + 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_repo_accept_clicked),dict); + +} + void on_mirror_add(GtkWidget *,main_window *widgets){ + gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MirrorTree))); mirror_add_window *window = yon_mirror_add_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"mirror_window"); @@ -307,16 +337,16 @@ void on_mirror_add(GtkWidget *,main_window *widgets){ void on_web_publish_remove(GtkWidget *self,main_window *widgets){ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); data->action_text=REMOVE_REPO_WARNING_LABEL; - data->function=(void(*)(void*,void*))on_remove_accept; - data->data = widgets->WebPublicationTree; + data->function=(void(*)(void*,void*))on_web_publish_remove_accept; + data->data = widgets; yon_confirmation_dialog_call(self,data); } void on_mirror_remove(GtkWidget *self,main_window *widgets){ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); data->action_text=REMOVE_REPO_WARNING_LABEL; - data->function=(void(*)(void*,void*))on_remove_accept; - data->data = widgets->MirrorTree; + data->function=(void(*)(void*,void*))on_mirror_remove_accept; + data->data = widgets; yon_confirmation_dialog_call(self,data); } @@ -324,27 +354,75 @@ void on_mirror_remove(GtkWidget *self,main_window *widgets){ void on_repo_remove(GtkWidget *self, main_window *widgets){ dialog_confirmation_data *data = malloc(sizeof(dialog_confirmation_data)); data->action_text=REMOVE_REPO_WARNING_LABEL; - data->function=(void(*)(void*,void*))on_remove_accept; - data->data = widgets->RepositoriesTree; + data->function=(void(*)(void*,void*))on_repositories_remove_accept; + data->data = widgets; yon_confirmation_dialog_call(self,data); } -void on_remove_accept(GtkWidget *, GtkWidget *target){ +void on_web_publish_remove_accept(GtkWidget *, main_window *widgets){ + GtkTreeModel *model=NULL; + GtkTreeIter iter; + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->WebPublicationTree)),&model,&iter)) { + return; + } + char *storage; + char *repositories; + gtk_tree_model_get(model,&iter,1,&storage,2,&repositories,-1); + char *full_name = NULL; + if (!yon_char_is_empty(repositories)){ + int size; + config_str parsed = yon_char_parse(repositories,&size,"\n"); + char *temp = yon_char_parsed_to_string(parsed,size,","); + full_name=yon_char_unite(storage,":",temp); + free(temp); + yon_char_parsed_free(parsed,size); + } else full_name = storage; + yon_config_remove_by_key(full_name); + yon_interface_update(widgets); +} + +void on_mirror_remove_accept(GtkWidget *, main_window *widgets){ + GtkTreeModel *model=NULL; + GtkTreeIter iter; + if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MirrorTree)),&model,&iter)) { + return; + } + char *repo; + gtk_tree_model_get(model,&iter,0,&repo,-1); + yon_config_remove_by_key(repo); + yon_interface_update(widgets); +} + +void on_repositories_remove_accept(GtkWidget *, main_window *widgets){ GtkTreeModel *model=NULL; GtkTreeIter iter; - if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(target)),&model,&iter)) { - gtk_list_store_remove(GTK_LIST_STORE(model),&iter); + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->RepositoriesTree)),&model,&iter)) { + return; } + char *repo; + gtk_tree_model_get(model,&iter,1,&repo,-1); + yon_config_remove_by_key(repo); + yon_interface_update(widgets); +} + +void on_repo_edit(GtkWidget *,main_window *widgets){ + repo_add_window *window = yon_repo_add_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"add_repo_window"); + + 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_repo_accept_clicked),dict); } void on_web_publish_edit(GtkWidget *,main_window *widgets){ web_publication_add_window *window = yon_web_publication_add_window_new(); - yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"mirror_window"); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->Window),ADD_REPO_LABEL,icon_path,"web_publish_window"); 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_mirror_accept),dict); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_web_publish_accept),dict); } void on_mirror_edit(GtkWidget *,main_window *widgets){ @@ -355,6 +433,18 @@ void on_mirror_edit(GtkWidget *,main_window *widgets){ 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_mirror_accept),dict); + + char *target; + GtkTreeIter iter; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->MirrorList),&iter,0,&target,-1); + char *parameter = config(REPOPUBLIC_CACHE_full(target)); + int size; + config_str parsed = yon_char_parse(parameter,&size,","); + for (int i=0;iPathEntry)); char *full_name = ""; GtkTreeIter iter; + int disabled=0; + int overall=0; for_iter (GTK_TREE_MODEL(window->list),&iter){ + overall++; int chosen; char *repos; - gtk_tree_model_get(GTK_TREE_MODEL(window->list),0,&chosen,1,&repos,-1); + gtk_tree_model_get(GTK_TREE_MODEL(window->list),&iter,0,&chosen,1,&repos,-1); if (chosen){ char *temp = yon_char_unite(full_name,yon_char_is_empty(full_name)?"":",",repos,NULL); if (!yon_char_is_empty(full_name)) free(full_name); full_name = temp; + } else { + disabled++; } } - char *final_name = yon_char_is_empty(full_name) ? name : yon_char_unite(name,":",full_name,NULL); + if (overall==disabled) { + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),NO_SHARED_REPOS_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + return; + } + char *final_name = yon_char_is_empty(full_name)||!disabled ? name : yon_char_unite(name,":",full_name,NULL); char *final = yon_char_unite(enabled?"enable":"disable",":",enable_browser?"listing":"",":",port_enabled?port:"",":",username_check?username:"",username_check?user_password:"",NULL); yon_config_register(REPOPUBLIC_WEB_full(final_name),REPOPUBLIC_WEB_command(final_name),final); yon_interface_update(widgets); @@ -525,6 +624,18 @@ void on_repo_source_add(GtkWidget *, repo_add_window *window){ g_signal_connect(gtk_builder_get_object(builder,"PathRemoveButton"),"clicked",G_CALLBACK(on_mirror_path_removed),gtk_builder_get_object(builder,"PathRemovalBox")); } +void on_file_chooser_open(GtkWidget *, GtkEntry *target){ + GtkWidget *dialog = gtk_file_chooser_dialog_new(TITLE_LABEL,GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(target))),GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,CANCEL_LABEL,GTK_RESPONSE_CANCEL,ACCEPT_LABEL,GTK_RESPONSE_ACCEPT,NULL); + int resp = gtk_dialog_run(GTK_DIALOG(dialog)); + if (resp == GTK_RESPONSE_ACCEPT){ + char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(file)){ + gtk_entry_set_text(target,file); + } + } + gtk_widget_destroy(dialog); +} + repo_add_window *yon_repo_add_window_new(){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_repo_add_path); repo_add_window *window = malloc(sizeof(repo_add_window)); @@ -548,6 +659,7 @@ repo_add_window *yon_repo_add_window_new(){ window->SourceBox = yon_gtk_builder_get_widget(builder,"SourceBox"); window->RepoSourceAddButton = yon_gtk_builder_get_widget(builder,"RepoSourceAddButton"); + g_signal_connect(G_OBJECT(window->RepoSourceButton),"clicked",G_CALLBACK(on_file_chooser_open),window->RepoSourceEntry); g_signal_connect(G_OBJECT(window->RepoSourceAddButton),"clicked",G_CALLBACK(on_repo_source_add),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); gtk_widget_show(window->Window); @@ -576,7 +688,11 @@ web_publication_add_window *yon_web_publication_add_window_new(){ window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->SelectionCellRenderer = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"SelectionCellRenderer")); + g_signal_connect(G_OBJECT(window->SelectionCellRenderer),"toggled",G_CALLBACK(on_cell_renderer_toggle_toggled),window->RepositoriesTree); + g_signal_connect(G_OBJECT(window->PathButton),"clicked",G_CALLBACK(on_file_chooser_open),window->PathEntry); + g_signal_connect(G_OBJECT(window->PathEntry),"changed",G_CALLBACK(on_web_publish_path_changed),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); gtk_widget_show(window->Window); @@ -631,6 +747,7 @@ mirror_add_window *yon_mirror_add_window_new(){ window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); window->PathBox = yon_gtk_builder_get_widget(builder,"PathBox"); + g_signal_connect(G_OBJECT(window->TypeButton),"clicked",G_CALLBACK(on_file_chooser_open),window->TypeEntry); g_signal_connect(G_OBJECT(window->AddButton),"clicked",G_CALLBACK(on_mirror_path_add),window); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); gtk_widget_show(window->Window); @@ -638,6 +755,16 @@ mirror_add_window *yon_mirror_add_window_new(){ return window; } +void on_cell_renderer_toggle_toggled(GtkWidget *, gchar* path, GtkWidget *table){ + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(table)); + if (gtk_tree_model_get_iter_from_string(model,&iter,path)){ + int status; + gtk_tree_model_get(model,&iter,0,&status,-1); + gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,!status,-1); + } +} + /**yon_main_window_complete(main_window *widgets) * [EN] * @@ -651,6 +778,7 @@ void yon_main_window_complete(main_window *widgets){ { gtk_builder_add_callback_symbol(builder,"yon_gtk_widget_set_sensitive_from_toggle_button_inversed",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed)); + } // Custom widgets configuration { @@ -704,6 +832,13 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->WebPublicationTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); g_signal_connect(G_OBJECT(widgets->MirrorTree),"cursor-changed",G_CALLBACK(on_selection_changed),widgets); } + { + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->MirrorTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UpdateRepoTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->PublicationTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->RepositoriesTree)); + yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->WebPublicationTree)); + } yon_load_proceed(YON_CONFIG_LOCAL); yon_interface_update(widgets); } diff --git a/source/ubl-settings-update.h b/source/ubl-settings-update.h index faafbbc..f21640b 100644 --- a/source/ubl-settings-update.h +++ b/source/ubl-settings-update.h @@ -162,6 +162,7 @@ typedef struct { GtkWidget *AcceptButton; GtkWidget *CancelButton; GtkListStore *list; + GtkCellRenderer *SelectionCellRenderer; } web_publication_add_window; typedef struct { @@ -226,13 +227,19 @@ void on_repo_accept_clicked(GtkWidget *, dictionary *dict); void on_web_publish_accept(GtkWidget *, dictionary *dict); void on_mirror_accept(GtkWidget *,dictionary *dict); void on_repo_remove(GtkWidget *self, main_window *widgets); -void on_remove_accept(GtkWidget *, GtkWidget *target); +void on_web_publish_remove_accept(GtkWidget *, main_window *widgets); +void on_mirror_remove_accept(GtkWidget *, main_window *widgets); +void on_repositories_remove_accept(GtkWidget *, main_window *widgets); repo_add_window *yon_repo_add_window_new(); web_publication_add_window *yon_web_publication_add_window_new(); mirror_add_window *yon_mirror_add_window_new(); mirror_configure_window *yon_mirror_configure_window_new(); +void on_file_chooser_open(GtkWidget *self, GtkEntry *target); + +void on_web_publish_path_changed(GtkWidget *, web_publication_add_window *window); + void on_repo_add(GtkWidget *, main_window *widgets); void on_mirror_add(GtkWidget *,main_window *widgets); void on_web_publish_add(GtkWidget *,main_window *widgets); @@ -240,6 +247,7 @@ void on_web_publish_add(GtkWidget *,main_window *widgets); void on_web_publish_remove(GtkWidget *self,main_window *widgets); void on_mirror_remove(GtkWidget *,main_window *widgets); +void on_repo_edit(GtkWidget *,main_window *widgets); void on_web_publish_edit(GtkWidget *,main_window *widgets); void on_mirror_edit(GtkWidget *,main_window *widgets); @@ -253,4 +261,6 @@ void on_mirror_path_add(GtkWidget *, mirror_add_window *window); void on_mirror_path_removed(GtkWidget *, GtkWidget *target); void on_mirror_path_edit(GtkWidget*,GtkWidget *target); void on_repo_source_add(GtkWidget *, repo_add_window *window); + +void on_cell_renderer_toggle_toggled(GtkWidget *self, gchar* path, GtkWidget *table); #endif \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index e3c2683..e4890d0 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -7,5 +7,6 @@ #define EMPTY_IMPORTANT_LABEL _("Empty important field!") #define ADD_REPO_LABEL _("Add repository") #define REMOVE_REPO_WARNING_LABEL _("Are you sure want to remove repository?") + #define NO_SHARED_REPOS_LABEL _("No repositories were chosen to share") #endif \ No newline at end of file diff --git a/ubl-settings-update-mirror-path-add.glade b/ubl-settings-update-mirror-path-add.glade index 13c785d..93d25ea 100644 --- a/ubl-settings-update-mirror-path-add.glade +++ b/ubl-settings-update-mirror-path-add.glade @@ -47,7 +47,7 @@ - False + True True 1 diff --git a/ubl-settings-update-web-publication-add.glade b/ubl-settings-update-web-publication-add.glade index 742d47b..a223689 100644 --- a/ubl-settings-update-web-publication-add.glade +++ b/ubl-settings-update-web-publication-add.glade @@ -8,7 +8,14 @@ False com.ublinux.libublsettingsui-gtk3.zoom-symbolic - + + + + + + + + 500 False @@ -122,13 +129,18 @@ True liststore1 - + + none + Chosen - + + + 0 + @@ -137,6 +149,9 @@ Repository name + + 1 + @@ -144,7 +159,7 @@ - False + True True 2 @@ -379,7 +394,7 @@ - False + True True 1 diff --git a/ubl-settings-update.glade b/ubl-settings-update.glade index 36b38ed..0b262c0 100644 --- a/ubl-settings-update.glade +++ b/ubl-settings-update.glade @@ -396,6 +396,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Chosen @@ -406,7 +408,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Repository - + + end + @@ -685,6 +689,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Enabled @@ -696,9 +702,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Reposiory - + + end + 1 @@ -707,9 +717,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Source - + + end + 2 @@ -718,9 +732,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Signature level + end 125 @@ -733,7 +750,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Usage level - + + end + 4 @@ -877,6 +896,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Chosen @@ -890,7 +911,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Repository name - + + end + 1 @@ -1085,6 +1108,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Enabled @@ -1096,9 +1121,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Storage - + + end + 1 @@ -1107,9 +1136,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Chosen repositories - + + end + 2 @@ -1118,6 +1151,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Reviewer @@ -1129,9 +1164,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Port - + + end + 4 @@ -1140,9 +1179,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Name - + + end + 5 @@ -1151,9 +1194,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Password/Hash type - + + end + 6 @@ -1164,7 +1211,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Password/Password hash - + + end + 7 @@ -1369,9 +1418,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Repository - + + end + 0 @@ -1380,9 +1433,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + True + fixed Type - + + end + 1 @@ -1393,7 +1450,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Resource URL - + + end + 2