From 2ab055522039cf82d1c97f1971f6c291ec70e377 Mon Sep 17 00:00:00 2001 From: Igor Belitskiy Date: Fri, 7 Jul 2023 17:59:29 +0600 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=B4=20=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- com.ublinux.ubl-settings-diskquota.svg | 1238 +++++++++++++++-- source/CMakeLists.txt | 19 +- source/controler.c | 118 ++ source/controler.h | 7 + source/model/load.c | 25 + source/model/load.h | 2 + source/model/model.c | 156 +++ source/model/model.h | 43 + source/model/my_device.c | 50 + source/model/my_device.h | 24 + source/model/philos_utils.c | 1138 +++++++++++++++ source/model/philos_utils.h | 120 ++ .../model/ubl-utils.cc => model/ubl-utils.c} | 486 ++++--- source/{view => }/model/ubl-utils.h | 57 +- ...-diskquota.cc => ubl-settings-diskquota.c} | 140 +- source/ubl-settings-diskquota.h | 20 +- source/ubl-strings.h | 24 +- source/view/model/load.cc | 34 - source/view/model/load.h | 20 - source/view/model/my_process.cc | 84 -- source/view/model/my_process.h | 32 - source/view/model/save.cc | 151 -- source/view/model/save.h | 33 - source/view/model/util.cc | 252 ---- source/view/model/util.h | 35 - source/view/model/wrapper_load_save.cc | 133 -- source/view/model/wrapper_load_save.h | 55 - source/view/view_add_project.cc | 141 -- source/view/view_add_project.h | 69 - source/view/view_add_user_group.cc | 118 -- source/view/view_add_user_group.h | 63 - source/view/view_edit_project.cc | 116 -- source/view/view_edit_project.h | 58 - source/view/view_edit_user_group.cc | 107 -- source/view/view_edit_user_group.h | 60 - source/view_add_p.c | 0 source/view_add_p.h | 0 source/view_add_u_g.c | 0 source/view_add_u_g.h | 0 source/view_edit_p.c | 0 source/view_edit_p.h | 0 source/view_edit_u_g.c | 0 source/view_edit_u_g.h | 0 .../{view/view_filters.cc => view_filters.c} | 0 source/{view => }/view_filters.h | 0 ubl-settings-diskquota | Bin 0 -> 580000 bytes ubl-settings-diskquota.glade | 164 ++- ubl-settings-diskquota_ru.po | 119 ++ 49 files changed, 3350 insertions(+), 2163 deletions(-) create mode 100644 source/controler.c create mode 100644 source/controler.h create mode 100644 source/model/load.c create mode 100644 source/model/load.h create mode 100644 source/model/model.c create mode 100644 source/model/model.h create mode 100644 source/model/my_device.c create mode 100644 source/model/my_device.h create mode 100644 source/model/philos_utils.c create mode 100644 source/model/philos_utils.h rename source/{view/model/ubl-utils.cc => model/ubl-utils.c} (79%) rename source/{view => }/model/ubl-utils.h (90%) rename source/{ubl-settings-diskquota.cc => ubl-settings-diskquota.c} (60%) delete mode 100644 source/view/model/load.cc delete mode 100644 source/view/model/load.h delete mode 100644 source/view/model/my_process.cc delete mode 100644 source/view/model/my_process.h delete mode 100644 source/view/model/save.cc delete mode 100644 source/view/model/save.h delete mode 100644 source/view/model/util.cc delete mode 100644 source/view/model/util.h delete mode 100644 source/view/model/wrapper_load_save.cc delete mode 100644 source/view/model/wrapper_load_save.h delete mode 100644 source/view/view_add_project.cc delete mode 100644 source/view/view_add_project.h delete mode 100644 source/view/view_add_user_group.cc delete mode 100644 source/view/view_add_user_group.h delete mode 100644 source/view/view_edit_project.cc delete mode 100644 source/view/view_edit_project.h delete mode 100644 source/view/view_edit_user_group.cc delete mode 100644 source/view/view_edit_user_group.h create mode 100644 source/view_add_p.c create mode 100644 source/view_add_p.h create mode 100644 source/view_add_u_g.c create mode 100644 source/view_add_u_g.h create mode 100644 source/view_edit_p.c create mode 100644 source/view_edit_p.h create mode 100644 source/view_edit_u_g.c create mode 100644 source/view_edit_u_g.h rename source/{view/view_filters.cc => view_filters.c} (100%) rename source/{view => }/view_filters.h (100%) create mode 100755 ubl-settings-diskquota diff --git a/Makefile b/Makefile index 838b50f..d440bec 100644 --- a/Makefile +++ b/Makefile @@ -105,7 +105,7 @@ uninstall: install: check uninstall @echo "Install ..." #################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ -# @g++ source/ubl-cmake.h compile/resources.cc compile/ubl-cmake.h source/ubl-settings-diskquota.cc source/ubl-settings-diskquota.h source/ubl-strings.h source/view/model/ubl-utils.cc source/view/model/ubl-utils.h -o ubl-settings-diskquota `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g + @gcc source/ubl-cmake.h compile/resources.c compile/ubl-cmake.h source/ubl-settings-diskquota.c source/ubl-settings-diskquota.h source/ubl-strings.h source/model/ubl-utils.c source/model/ubl-utils.h -o ubl-settings-diskquota `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g #################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ @for FILE_PO in $(wildcard *.po); do \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ diff --git a/com.ublinux.ubl-settings-diskquota.svg b/com.ublinux.ubl-settings-diskquota.svg index f636c26..708bd05 100644 --- a/com.ublinux.ubl-settings-diskquota.svg +++ b/com.ublinux.ubl-settings-diskquota.svg @@ -4,8 +4,8 @@ height="180" version="1.0" id="svg8" - sodipodi:docname="ublinux-ubconfig.svg" - inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + sodipodi:docname="ubl-settings-quotas.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" inkscape:export-filename="/media/Data/ShareMX/temp/archtoub_icons/ublinux-logo.png" inkscape:export-xdpi="136.53334" inkscape:export-ydpi="136.53334" @@ -16,6 +16,24 @@ xmlns:svg="http://www.w3.org/2000/svg"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + xlink:href="#linearGradient2580-3" /> + id="linearGradient2580-3" + x1="-183.25999" + x2="-133.33" + y1="-122.79" + y2="-134.57001" + gradientTransform="matrix(0.25137,0,0,0.25137,-7.3652,-24.336)" + gradientUnits="userSpaceOnUse"> + id="stop93" /> + id="stop95" /> + + + + + stdDeviation="0.43959997" + id="feGaussianBlur1137" /> + + xlink:href="#linearGradient2580-3" /> + + + + id="linearGradient6296" + x1="-183.25999" + x2="-133.33" + y1="-122.79" + y2="-134.57001" + gradientTransform="matrix(0.080474,0,0,0.080474,9.3119,27.811)" + gradientUnits="userSpaceOnUse" + xlink:href="#linearGradient2586" /> + + id="stop43" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="stop11-9" /> + + + + + color-interpolation-filters="sRGB" + height="1.12" + width="1.12" + y="-0.060000001" + x="-0.060000001" + id="m-5"> + + + + + + + + + + + + + + id="feGaussianBlur903" + stdDeviation="0.14999813" /> + y2="36" + y1="20" + x2="23.5" + x1="23.5" + id="k-2" + gradientTransform="translate(-3.4889408e-4,-3.4889408e-4)" /> + id="b"> + id="stop2-7" /> + id="stop4-9" /> + xlink:href="#b" + gradientUnits="userSpaceOnUse" + y2="36" + y1="30" + x2="32" + x1="32" + id="j-9" + gradientTransform="translate(-3.4889408e-4,-3.4889408e-4)" /> + + stop-color="#0ef1c9" /> + stop-color="#0e95f1" /> + xlink:href="#a" /> + + id="stop7-2" /> + + + + + + + + id="stop734" /> + + + + + + id="stop725" /> + id="stop727" /> + + + id="filter4227" + x="-0.135" + y="-0.135" + width="1.27" + height="1.27"> + id="feFlood4217" /> + id="feComposite4219" /> + id="feGaussianBlur4221" /> + id="feOffset4223" /> + id="feComposite4225" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4927,31 +5741,163 @@ id="circle1671" /> - - + id="g912" + transform="matrix(2.0912263,0,0,2.0912263,23.080754,23.080758)" + style="filter:url(#filter4565)"> + + + + + + + + + + + + + + + + + + cx="32" + cy="32" + fill="url(#k)" + r="3" + id="circle71" + style="fill:url(#k)" /> + + + + + + + + + + + + + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index e8b8f28..7089e00 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,10 +8,10 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) -pkg_check_modules(VTE291 REQUIRED vte-2.91) -include_directories(${VTE291_INCLUDE_DIRS}) -link_directories(${VTE291_LIBRARY_DIRS}) -add_definitions(${VTE291_CFLAGS_OTHER}) +#pkg_check_modules(VTE291 REQUIRED vte-2.91) +#include_directories(${VTE291_INCLUDE_DIRS}) +#link_directories(${VTE291_LIBRARY_DIRS}) +#add_definitions(${VTE291_CFLAGS_OTHER}) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) @@ -66,18 +66,15 @@ add_custom_target( set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ -O2 -pipe -fno-plt -fexceptions \ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ - -fstack-clash-protection -fcf-protection -g") + -fstack-clash-protection -fcf-protection") set(SOURCE_FILES - view/model/ubl-utils.h - view/model/ubl-utils.cc - ubl-settings-diskquota.cc + ubl-settings-diskquota.c ubl-settings-diskquota.h ubl-strings.h - - - + model/ubl-utils.h + model/ubl-utils.c ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ) diff --git a/source/controler.c b/source/controler.c new file mode 100644 index 0000000..30662ff --- /dev/null +++ b/source/controler.c @@ -0,0 +1,118 @@ +#include "controler.h" + +struct model_cfg_u_g_p* cfg_user = NULL; +struct model_cfg_u_g_p* cfg_group = NULL; +struct model_cfg_u_g_p* cfg_project = NULL; +struct model_cfg_general* cfg_general = NULL; +struct struct_gui* cfg_gui = NULL; + + +void load_system_cfg() { + cfg_gui->flag_load = 0; + template_load_cfg(CMD_LOAD_SYSTEM); + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS, BACKGROUND_IMAGE_SUCCESS_TYPE); +} + +void load_global_cfg() { + cfg_gui->flag_load = 1; + template_load_cfg(CMD_LOAD_GLOBAL); + yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS,BACKGROUND_IMAGE_SUCCESS_TYPE); +} + + + +int main(int argc, char *argv[]){ + local=setlocale(LC_ALL, ""); + textdomain (LocaleName); + config_init(); + int option_index=0; + int show_help=0; + int debug_mode=0; + { + struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, + {"lock-help", 0,0, 1}, + {"lock-save", 0,0, 2}, + {"lock-save-local", 0,0, 3}, + {"lock-save-global", 0,0, 4}, + {"lock-load-global", 0,0, 5}, + {"socket-id", 1, 0, 's'}, + {"socket-ext-id", 1,0, 'e'}, + {"socket-trd-id", 1,0, 't'}, + {"debug", 0,0, 'd'}, + { NULL, 0, NULL, 0 } + }; + for (int i=0;iHeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); + + yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); + if (getuid()!=0) + yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); + else + yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); + yon_window_config_setup(GTK_WINDOW(widgets->Window)); + yon_window_config_load(config_path); + GtkCssProvider *css=gtk_css_provider_new(); + gtk_css_provider_load_from_resource(css,CssPath); + gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), + GTK_STYLE_PROVIDER(css), + -1); + gtk_main(); +} \ No newline at end of file diff --git a/source/controler.h b/source/controler.h new file mode 100644 index 0000000..3e50ac1 --- /dev/null +++ b/source/controler.h @@ -0,0 +1,7 @@ +#include "ubl-settings-diskquota.h" +#include "model.h" +#include "load.h" +#include "ubl-strings.h" + + +int main(int argc, char *argv[]); \ No newline at end of file diff --git a/source/model/load.c b/source/model/load.c new file mode 100644 index 0000000..efb064f --- /dev/null +++ b/source/model/load.c @@ -0,0 +1,25 @@ +#include "load.h" + + +void template_load_cfg(model_cfg_general* config, char* cmd) { + clear_array(); + int size = 0; + char** cfg = yon_config_load(cmd, &size); + philos_array_string_remove_char(&cfg, "\n", size); + for (int index = 0; index < size; index++) { + char* str_key_value = yon_char_new(cfg[index]); + char* str_key = yon_char_divide_search(str_key_value, "=",-1); + if (yon_char_find_count(str_key, "CGROUP_QUOTA") != 0) { + if (str_key_value[0] == '\"') { + yon_char_divide(str_key_value, 0); + size_t length = strlen(str_key_value); + str_key_value = yon_char_divide(str_key_value, length-1); + } + str_split_value(str_key_value, config->size); + str_split_key(str_key, config->size); + config->size++; + } + } + + config->flag_set_data = 0; +} \ No newline at end of file diff --git a/source/model/load.h b/source/model/load.h new file mode 100644 index 0000000..7e157bd --- /dev/null +++ b/source/model/load.h @@ -0,0 +1,2 @@ +#include "ubl-utils.h" +#include "ubl-strings.h" \ No newline at end of file diff --git a/source/model/model.c b/source/model/model.c new file mode 100644 index 0000000..0caee63 --- /dev/null +++ b/source/model/model.c @@ -0,0 +1,156 @@ +#include "model.h" + + +void model_clear_cfg(model_cfg_u_g_p* config) { + philos_free_int_array(config->id, config->size); + philos_free_string_array(config->name, config->size); + philos_free_string_array(config->quota, config->size); + philos_free_string_array(config->quota, config->size); + philos_free_string_array(config->size_memory, config->size); + philos_free_int_array(config->soft_restriction_size, config->size); + philos_free_int_array(config->soft_restriction_file, config->size); + philos_free_int_array(config->severe_limitation_size, config->size); + philos_free_int_array(config->severe_limitation_file, config->size); + philos_free_int_array(config->deferring_size, config->size); + philos_free_int_array(config->deferring_file, config->size); + philos_free_int_array(config->size_memory_pow, config->size); + philos_free_int_array(config->soft_restriction_size_pow, config->size); + philos_free_int_array(config->soft_restriction_file_pow, config->size); + philos_free_int_array(config->severe_limitation_size_pow, config->size); + philos_free_int_array(config->severe_limitation_file_pow, config->size); + philos_free_int_array(config->deferring_size_pow, config->size); + philos_free_int_array(config->deferring_file_pow, config->size); + philos_free_string_array(config->device, config->size); + + config->size = 0; +} + +void model_null_cfg(model_cfg_u_g_p* config) { + if (config->size == 0) { + config->id = NULL; + config->name = NULL; + config->quota = NULL; + config->size_memory = NULL; + config->files = NULL; + config->soft_restriction_size = NULL; + config->soft_restriction_file = NULL; + config->severe_limitation_size = NULL; + config->severe_limitation_file = NULL; + config->deferring_size = NULL; + config->deferring_file = NULL; + config->size_memory_pow = NULL; + config->soft_restriction_size_pow = NULL; + config->soft_restriction_file_pow = NULL; + config->severe_limitation_size_pow = NULL; + config->severe_limitation_file_pow = NULL; + config->deferring_size_pow = NULL; + config->deferring_file_pow = NULL; + config->device = NULL; + } +} + +void model_clear_general(model_cfg_general* config) { + philos_free_int_array(config->flag_status, config->size); + + config->size = 0; +} + +void model_null_general(model_cfg_general* config) { + if (config->size == 0) { + config->flag_status = NULL; + } +} + +void model_tree_view_add(model_cfg_general* config) { + model_null_str_writing(config, config->size); +} + +void model_null_str_writing(model_cfg_general* config, int index) { + philos_set_size_memory_integer_char("-", config->name, index); + philos_set_size_memory_integer_char("-", config->quota, index); + philos_set_size_memory_integer_char("-", config->size_memory, index); + philos_set_size_memory_integer_char("-", config->files, index); + philos_set_size_memory_integer_char("-", config->device, index); + philos_set_pow_size_memory("-", config->soft_restriction_size, index, array_size_pow); + philos_set_pow_size_memory("-", config->soft_restriction_file, index, array_size_pow); + philos_set_pow_size_memory("-", config->severe_limitation_size, index, array_size_pow); + philos_set_pow_size_memory("-", config->severe_limitation_file, index, array_size_pow); + philos_set_pow_size_memory("-", config->deferring_size, index, array_size_pow); + philos_set_pow_size_memory("-", config->deferring_file, index, array_size_pow); + philos_set_pow_size_memory("-", config->size_memory_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->soft_restriction_size_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->soft_restriction_file_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->severe_limitation_size_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->severe_limitation_file_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->deferring_size_pow, index, array_size_pow); + philos_set_pow_size_memory("-", config->deferring_file_pow, index, array_size_pow); + +} + + +void model_array_size_memory() { + int size_array_size_pow = 0; + array_size_pow = yon_char_parsed_append(array_size_pow,&size_array_size_pow, STR_KB); + array_size_pow = yon_char_parsed_append(array_size_pow,&size_array_size_pow, STR_MB); + array_size_pow = yon_char_parsed_append(array_size_pow,&size_array_size_pow, STR_GB); + array_size_pow = yon_char_parsed_append(array_size_pow,&size_array_size_pow, STR_TB); +} + +void fill_tree_view_u_g_p(struct_gui* config_gui, model_cfg_general* config, int start, int flag_gui_add) { + GtkTreeModel *model = GTK_TREE_MODEL(config_gui->list); + if (flag_gui_add == 0) { + g_object_ref(config_gui->list); + gtk_list_store_clear(config_gui->list); + } + for (int index = start; index < config->size; index++) { + GtkTreeIter iter; + gtk_list_store_append(config_gui->list,&iter); + if (strcmp(config->type_arr, "project") != 0) { + gtk_list_store_set(config_gui->list,&iter, + 0,config->name[index], + 1,config->quota[index], + 2,config->files[index], + 3,philos_format_cfg_str_size_memory("", config->soft_restriction_size[index],config->soft_restriction_size_pow[index]), + 4,philos_format_cfg_str_size_memory("", config->soft_restriction_file[index],config->soft_restriction_file_pow[index]), + 5,philos_format_cfg_str_size_memory("", config->severe_limitation_size[index],config->severe_limitation_size_pow[index]), + 6,philos_format_cfg_str_size_memory("", config->severe_limitation_file[index], config->severe_limitation_file_pow[index]), + 7,philos_format_cfg_str_size_memory("", config->deferring_size[index], config->deferring_size_pow[index]), + 8,philos_format_cfg_str_size_memory("", config->deferring_file[index], config->deferring_file_pow[index]), + -1); + } + else { + gtk_list_store_set(config_gui->list,&iter, + 0,config->id[index] + 1,config->name[index], + 2,config->quota[index], + 3,config->files[index], + 4,philos_format_cfg_str_size_memory("", config->soft_restriction_size[index],config->soft_restriction_size_pow[index]), + 5,philos_format_cfg_str_size_memory("", config->soft_restriction_file[index],config->soft_restriction_file_pow[index]), + 6,philos_format_cfg_str_size_memory("", config->severe_limitation_size[index],config->severe_limitation_size_pow[index]), + 7,philos_format_cfg_str_size_memory("", config->severe_limitation_file[index], config->severe_limitation_file_pow[index]), + 8,philos_format_cfg_str_size_memory("", config->deferring_size[index], config->deferring_size_pow[index]), + 9,philos_format_cfg_str_size_memory("", config->deferring_file[index], config->deferring_file_pow[index]), + -1); + } + } + if (flag_gui_add != 0) { + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->treeViewMain), model); + } +} +void fill_tree_view_u_g_p(struct_gui* config_gui, model_cfg_general* config, int start,int flag_gui_add) { + GtkTreeModel *model = GTK_TREE_MODEL(config_gui->list); + if (flag_gui_add == 0) { + g_object_ref(config_gui->list); + gtk_list_store_clear(config_gui->list); + } + for (int index = start; index < config->size; index++) { + GtkTreeIter iter; + gtk_list_store_append(config_gui->list,&iter); + if (strcmp(config->type_arr, "project") != 0) { + gtk_list_store_set(config_gui->list,&iter, -1); + } + } + if (flag_gui_add != 0) { + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->treeViewMain), model); + } +} \ No newline at end of file diff --git a/source/model/model.h b/source/model/model.h new file mode 100644 index 0000000..8db5284 --- /dev/null +++ b/source/model/model.h @@ -0,0 +1,43 @@ +#include "ubl-utils.h" +#include "ubl-strings.h" +#include "model.h" + +static char** array_size_pow = NULL; + +struct model_cfg_u_g_p { + char* type_arr; + int* id; + char** name; + char** quota; + char** size_memory; + char** files; + + int* soft_restriction_size; + int* soft_restriction_file; + int* severe_limitation_size; + int* severe_limitation_file; + int* deferring_size; + int* deferring_file; + + int* size_memory_pow; + int* soft_restriction_size_pow; + int* soft_restriction_file_pow; + int* severe_limitation_size_pow; + int* severe_limitation_file_pow; + int* deferring_size_pow; + int* deferring_file_pow; + char** device; + size_t size; + int flag_set_data; + int flag_save; + int flag_load; +}; + + +struct model_cfg_general{ + int *flag_status; +} + +struct struct_gui { + int flag_load; +} \ No newline at end of file diff --git a/source/model/my_device.c b/source/model/my_device.c new file mode 100644 index 0000000..614a3ff --- /dev/null +++ b/source/model/my_device.c @@ -0,0 +1,50 @@ +#include "my_device.h" + +device_config obj_device_config; + +device_config* get_device_cfg() { + return &obj_device_config; +} + +void device_disk_parsed() { + char* cmd = "lsblk --fs --raw --output PATH,FSTYPE --exclude 7,11,253"; + int size = 0; + char** responce = yon_config_load(cmd, &size); + obj_device_config.size_disk = 0; + char* split_simvol = " "; + for (int index = 1; index < size; index++ ) { + char* disk = yon_char_divide_search(responce[index], "\n", -1); + if (yon_char_find_count(disk, " ") != 0) { + char* name_disk = yon_char_divide_search(disk, " ", -1); + obj_device_config.name_disk = yon_char_parsed_append(obj_device_config.name_disk, &obj_device_config.size_disk, name_disk); + obj_device_config.size_disk--; + obj_device_config.file_system = yon_char_parsed_append(obj_device_config.file_system, &obj_device_config.size_disk, disk); + obj_device_config.size_disk--; + obj_device_config.mounted = yon_char_parsed_append(obj_device_config.mounted, &obj_device_config.size_disk, ""); + obj_device_config.size_disk--; + obj_device_config.type_dick = yon_char_parsed_append(obj_device_config.type_dick, &obj_device_config.size_disk, ""); + obj_device_config.size_disk--; + disk = yon_char_replace(disk," ", ""); + if (strlen(disk)!=0) { + char* description_disk = yon_char_unite(name_disk, + split_simvol, + disk, + NULL); + obj_device_config.description_disk = yon_char_parsed_append(obj_device_config.description_disk, &obj_device_config.size_disk, description_disk); + free(description_disk); + + } + free(name_disk); + } + free(disk); + } + philos_free_string_array(&responce, size); + +} +void device_fill_disk(GtkWidget* combo_box_text) { + for (int index = 0; index < obj_device_config.size_disk; index++) { + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box_text), obj_device_config.description_disk[index]); + } +} + + diff --git a/source/model/my_device.h b/source/model/my_device.h new file mode 100644 index 0000000..c2ef0e6 --- /dev/null +++ b/source/model/my_device.h @@ -0,0 +1,24 @@ +#ifndef MY_DEVICE_H +#define MY_DEVICE_H +#include "ubl-utils.h" +#include +#include +#include +#include "philos_utils.h" +typedef struct { + char** name_disk; + char** file_system; + char** mounted; + char** type_dick; + char** description_disk; + int size_disk; +} device_config; + +void device_disk_parsed(); +device_config* get_device_cfg(); +void device_fill_disk(GtkWidget* combo_box_text); +size_t get_mem_total(); +float get_size_pow_memory(size_t size_memory, int size); +size_t get_resurs_total(char* cmd); + +#endif \ No newline at end of file diff --git a/source/model/philos_utils.c b/source/model/philos_utils.c new file mode 100644 index 0000000..b32822e --- /dev/null +++ b/source/model/philos_utils.c @@ -0,0 +1,1138 @@ +#include "philos_utils.h" + +void philos_array_string_remove_char(char*** array, char* str_remove, int size) { + for (int index = 0; index < size; index++) { + (*array)[index] = yon_char_divide_search((*array)[index], str_remove, -1); + } + +} + +void philos_set_pow_size_memory(char* str_find, int** array_size,int index, char** array_size_pow) { + char* STR_KB = array_size_pow[0]; + char* STR_MB = array_size_pow[1]; + char* STR_GB = array_size_pow[2]; + char* STR_TB = array_size_pow[3]; + size_t length = strlen(str_find); + if (strstr(str_find,"K") != NULL) { + *array_size = philos_int_append(*array_size, &index, 0); + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find, " ", STR_KB, NULL); + index--; + } + else if (strstr(str_find,"M") != NULL) { + *array_size = philos_int_append(*array_size, &index, 1); + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find," ", STR_MB, NULL); + index--; + } + else if (strstr(str_find,"G") != NULL) { + *array_size = philos_int_append(*array_size, &index, 2); + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find," ", STR_GB, NULL); + index--; + } + else if (strstr(str_find,"T") != NULL) { + *array_size = philos_int_append(*array_size, &index, 3); + str_find = yon_char_divide(str_find, length-1); + + str_find = yon_char_unite(str_find," ", STR_TB, NULL); + index--; + } + else if (strstr(str_find,"%%") != NULL) { + *array_size = philos_int_append(*array_size, &index, -1); + str_find = yon_char_divide(str_find, length-1); + index--; + } + else if (strstr(str_find,"-") != NULL) { + *array_size = philos_int_append(*array_size, &index, -1); + index--; + } + +} +void philos_set_pow_size_memory_device(char* str_find, int** array_size,int index, char** array_size_pow) { + char* STR_KB = array_size_pow[0]; + char* STR_MB = array_size_pow[1]; + char* STR_GB = array_size_pow[2]; + char* STR_TB = array_size_pow[3]; + size_t length = strlen(str_find); + if (strstr(str_find,"K") != NULL) { + (*array_size)[index] = 0; + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find, " ", STR_KB, NULL); + index--; + } + else if (strstr(str_find,"M") != NULL) { + (*array_size)[index] = 1; + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find," ", STR_MB, NULL); + index--; + } + else if (strstr(str_find,"G") != NULL) { + (*array_size)[index] = 2; + str_find = yon_char_divide(str_find, length-1); + str_find = yon_char_unite(str_find," ", STR_GB, NULL); + index--; + } + else if (strstr(str_find,"T") != NULL) { + (*array_size)[index] = 3; + str_find = yon_char_divide(str_find, length-1); + + str_find = yon_char_unite(str_find," ", STR_TB, NULL); + index--; + } + else if (strstr(str_find,"%%") != NULL) { + (*array_size)[index] = -1; + str_find = yon_char_divide(str_find, length-1); + index--; + } + else if (strstr(str_find,"-") != NULL) { + (*array_size)[index] = -1; + index--; + } + +} +void philos_set_size_memory_integer_char(char* str_find, char*** array_data, int index) { + char* simv_del_array[10] = {"K","M","G","T","k","m","g","t"," ","%"}; + for (size_t i = 0; i < 10; i++) { + if (strstr(str_find, simv_del_array[i])) { + str_find = yon_char_divide_search(str_find, simv_del_array[i], -1); + } + } + if (strstr(str_find, " ") != NULL) { + char* mem_s = yon_char_new(str_find); + yon_char_divide_search(mem_s, " ", -1); + *array_data = yon_char_parsed_append(*array_data, &index, mem_s); + } + if (strstr(str_find, "-") != NULL) { + *array_data = yon_char_parsed_append(*array_data, &index, "-"); + } + else { + if (str_find[0] == '\"') { + yon_char_divide(str_find, 0); + size_t length = strlen(str_find); + str_find = yon_char_divide(str_find, length-2); + } + if (strstr(str_find, " ") == NULL) { + *array_data = yon_char_parsed_append(*array_data, &index, str_find); + } + + } +} + +void philos_free_string_array(char ***array, int size) { + if ((*array) == NULL) { + return; + } + for (int i = 0; i < size; i++){ + free((*array)[i]); + } + if (size!= 0) { + free(*array); + (*array) = NULL; + } +} + +void philos_free_string_array_n3(char ****array, int size) { + if ((*array) == NULL || size == 0) { + return; + } + int index_to_l2 = 0; + for (int i = 0; i < size; i++){ + index_to_l2 = 0; + if ((*array)[i]!=NULL) { + while ((*array)[i][index_to_l2] != NULL) { + if ((*array)[i][index_to_l2] != NULL) { + free((*array)[i][index_to_l2]); + index_to_l2++; + } + + } + } + free((*array)[i]); + + } + if (size!= 0) { + free(*array); + (*array) = NULL; + } +} + +void philos_free_int_array(int **array, int size) { + if (size!= 0) { + free(*array); + *array = NULL; + } +} +void philos_free_int_array_n2(int ***array, int size) { + if ((*array) == NULL || size == 0) { + return; + } + for (int i = 0; i < size; i++){ + free((*array)[i]); + } + if (size!= 0) { + free(*array); + (*array) = NULL; + } +} + +config_str philos_list_group(int* size) { + char* str_uid_min = "UID_MIN"; + char* str_uid_max = "UID_MAX"; + unsigned short uid_min = philos_read_uid_min_max(file_source_login_min_max, str_uid_min); + unsigned short uid_max = philos_read_uid_min_max(file_source_login_min_max, str_uid_max); + config_str str_users = malloc(1); + while (1) { + errno = 0; + struct passwd* entry = getpwent(); + if (!entry) { + if (errno) { + return str_users; + } + break; + } + if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) { + str_users = yon_char_parsed_append(str_users, size, entry->pw_name); + } + } + endpwent(); + return str_users; +} + +unsigned short philos_read_uid_min_max(char* filename, char* search) { + int uid = 0; + char* remove_tab = "\t"; + char* remove_space = " "; + char* search_uid_min = "UID_MIN"; + int buff_size = 255; + char* line = g_malloc0(buff_size); + char* search_true = yon_char_get_augumented("SYS_", search); + FILE *fp = fopen(filename, "r"); + if(fp) { + while((fgets(line, buff_size, fp)) != NULL) { + try{ + if (yon_char_find_count(line, search) != 0 && yon_char_find_count(line, search_true) == 0) { + line = philos_str_remove(line, search); + line = philos_str_remove(line, remove_space); + line = philos_str_remove(line, remove_tab); + uid = atoi(line); + + } + } + catch (...) { + if (yon_char_find_count(search, search_uid_min) != 0){ + uid = 1000; + } + else{ + uid = 65534; + } + } + } + } + else{ + if (yon_char_find_count(search, search_uid_min) != 0) { + uid = 1000; + } + else{ + uid = 65534; + } + } + fclose(fp); + free(line); + free(search_true); + return uid; + +} + + +config_str philos_list_user(int* size) { + char* str_uid_min = "UID_MIN"; + char* str_uid_max = "UID_MAX"; + unsigned short uid_min = philos_read_uid_min_max(file_source_login_min_max, str_uid_min); + unsigned short uid_max = philos_read_uid_min_max(file_source_login_min_max, str_uid_max); + config_str str_users = malloc(1); + while (1) { + errno = 0; + struct passwd* entry = getpwent(); + if (!entry) { + if (errno) { + return str_users; + } + break; + } + str_users = yon_char_parsed_append(str_users, size, entry->pw_name); + } + endpwent(); + return str_users; +} + +char* philos_str_size_pow_byte(GtkWidget *combo_box_text) { + int menu_id = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box_text)); + if (menu_id == 0) { + return "K"; + } + else if (menu_id == 1) { + return "M"; + } + else if (menu_id == 2) { + return "G"; + } + else if (menu_id == 3) { + return "T"; + } + else { + return " "; + } +} + +char* philos_str_remove(char *str, const char *sub) { + size_t len = strlen(sub); + if (len > 0) { + char *p = str; + size_t size = 0; + while ((p = strstr(p, sub)) != NULL) { + size = (size == 0) ? (p - str) + strlen(p + len) + 1 : size - len; + memmove(p, p + len, size - (p - str)); + } + } + return str; +} + + +void philos_split_size_memory(char* str_value, int* size, char* pow_memory) { + (*size) = atoi(yon_char_divide_search(pow_memory, " ", -1)); +} + +char* philos_format_cfg_str_size_memory(char* str_key, int value, int pow_size_memory) { + if (value == -1 || value == -3 || pow_size_memory == -3) { + return yon_char_new("-"); + } + char* str_value = yon_char_from_int(value); + if (pow_size_memory==0) { + return yon_char_unite(str_key, str_value, "K" ,NULL); + } + else if (pow_size_memory==1) { + return yon_char_unite(str_key, str_value, "M" ,NULL); + } + else if (pow_size_memory==2){ + return yon_char_unite(str_key, str_value, "G" ,NULL); + } + else if (pow_size_memory== 3) { + return yon_char_unite(str_key, str_value, "T" ,NULL); + } + else if (pow_size_memory== -1) { + return yon_char_unite(str_key, str_value, "%" ,NULL); + } + else if (pow_size_memory== -3) { + return yon_char_new("-"); + } + else { + return yon_char_new("-"); + } +} + +char** philos_str_split(char *parameters, int *size, char *divider) { + char** array_split = NULL; + char* ch= NULL; + ch = strtok(parameters, divider); + if (ch != NULL) { + array_split = yon_char_parsed_append(array_split, size, ch); + while (ch != NULL) { + ch = strtok(NULL, divider); + array_split = yon_char_parsed_append(array_split, size, ch); + } + } + (*size) -= 1; + return array_split; +} + +void philos_array_str_copy(char*** source, char*** copy) { + int index = 0; + if (copy == NULL || source == NULL) { + return; + } + while (1) { + if ((*copy)[index] != NULL) { + (*source) = yon_char_parsed_append((*source), &index, yon_char_new((*copy)[index])); + } + else { + break; + } + } +} +void philos_array_int_copy(int** source, int** copy) { + int * new_int = g_malloc0(sizeof(int)*2); + if ((*copy)[0] != -2) { + new_int[0] = (*copy)[0]; + new_int[1] = -2; + int i = 2; + for (i=1;(*copy)[i]!=-2;i++) { + yon_int_array_append(&new_int,(*copy)[i]); + } + *source=new_int; + } + else { + new_int[0] = (*copy)[0]; + *source=new_int; + } + +} +char** philos_pars_terminal_systemd_cgls(char* CMD_GET_SLICE_SERVICE, char* str_find, int* size_array_data) { + int size = 0; + char** terminal_print = yon_config_load(CMD_GET_SLICE_SERVICE, &size); + char** array_data = NULL; + for (int index = 0; index < size; index++) { + if (strstr(terminal_print[index], str_find) != NULL) { + yon_char_divide_search(terminal_print[index],"─",-1); + terminal_print[index] = yon_char_divide_search(terminal_print[index]," ", -1); + yon_char_divide(terminal_print[index],1); + array_data = yon_char_parsed_append(array_data, size_array_data, terminal_print[index]); + + } + } + return array_data; +} +char* philos_pard_array_add_cmd(char* cmd, temp_config* _config, char* key, int* array_io, int* array_io_pow_size, char** disk, int size) { + char* split_simvol = g_malloc0(sizeof(char)*2); + int flag_format = 0; + char* cmd_old = yon_char_new(cmd); + char* cmd_new = ""; + if (disk && size && array_io && array_io_pow_size) { + int index_find = 0; + for (int index = 0; index < size; index++) { + if (array_io_pow_size[index] >= 0 && array_io[index]>= 0 && !strstr(disk[index], "-")) { + char* num_and_pow_size = philos_format_cfg_str_size_memory(" ", array_io[index], array_io_pow_size[index]); + if (!strstr(num_and_pow_size, "-")) { + cmd_new = yon_char_unite(cmd_new, + split_simvol, + disk[index], + num_and_pow_size, NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + flag_format = 1; + } + free(num_and_pow_size); + } + } + } + free(split_simvol); + if (flag_format) { + if (strlen(cmd_new)>2) { + if (strlen(cmd_old) > 3) { + cmd = yon_char_unite(cmd_old, ",", key, cmd_new, NULL); + } + else { + cmd = yon_char_unite(key, cmd_new, NULL); + } + + } + return cmd; + } + else { + return cmd_old; + } + +} +int philos_check_activ_disk(temp_set_window *widgets, temp_config* _config) { + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->cbtTempDevice)); + disk = yon_char_divide_search(disk," ", -1); + if (disk == NULL) { + return 0; + } + return 1; +} + +void philos_temp_generate_cmd(temp_set_window *widgets, temp_config* _config) { + char* str_cmd = ""; + char* split_simvol = g_malloc0(sizeof(char)*2); + int size_bite = 0; + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chkSoftRestrictionTemp))) { + size_bite = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spiSevereRestrictionTemp)); + str_cmd = yon_char_unite(str_cmd, + "MemoryHigh=", + yon_char_from_int(size_bite), + philos_str_size_pow_byte(widgets->cmSevereRestrictionTemp), NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + } + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chkSevereRestrictionTemp))) { + size_bite = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinSevereRestrictionTemp)); + str_cmd = yon_char_unite(str_cmd, split_simvol, + "MemoryMax=", + yon_char_from_int(size_bite), + philos_str_size_pow_byte(widgets->cmbSevereRestrictionTemp), NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + } + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chkPaddingFLTemp))) { + size_bite = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinPaddingFLTemp)); + str_cmd = yon_char_unite(str_cmd, split_simvol, + "MemorySwapMax=", + yon_char_from_int(size_bite), + philos_str_size_pow_byte(widgets->cmbPaddingFLTemp), NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + } + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chkCPULimitTemp))) { + size_bite = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinCPULimitTemp)); + str_cmd = yon_char_unite(str_cmd, split_simvol, + "CPUQuota=", + yon_char_from_int(size_bite), + "%", NULL); + split_simvol[0] = ','; + split_simvol[1] = '\0'; + } + if (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempDevice))!=-1) { + if (_config->size_disk!=0) { + str_cmd = philos_pard_array_add_cmd(str_cmd, _config, "IOReadBandwidthMax=", _config->i_o_limit_read, _config->i_o_limit_read_size, _config->disk_read, _config->size_disk); + + } + if (_config->size_disk!=0) { + str_cmd = philos_pard_array_add_cmd(str_cmd, _config, "IOWriteBandwidthMax=", _config->i_o_limit_write, _config->i_o_limit_write_size, _config->disk_write, _config->size_disk); + } + + } + gtk_entry_set_text(GTK_ENTRY(widgets->entryTempCmd), str_cmd); + free(split_simvol); +} +// flag_check_array = 0 READ +// flag_check_array = 1 WRITE +void philos_temp_del_disk(temp_set_window *widgets, temp_config* _config, int flag_check_array) { + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->cbtTempDevice)); + disk = yon_char_divide_search(disk, " ", -1); + int bool_read = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead)); + int bool_write = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite)); + char** ptr_disk = NULL; + int size = 0; + + if (flag_check_array == 0) { + size = _config->size_disk; + if (philos_check_activ_disk(widgets, _config) == 0) { + return; + } + ptr_disk = _config->disk_read; + } + else if (flag_check_array == 1) { + size = _config->size_disk; + if (philos_check_activ_disk(widgets, _config) == 0) { + return; + } + ptr_disk = _config->disk_write; + } + int index_find = -1; + if (ptr_disk) { + for (int index = 0; index < size; index++) { + char* disk_cfg = ptr_disk[index]; + if (disk_cfg) { + if (strstr(disk_cfg, disk) != NULL) { + index_find = index; + break; + } + } + } + } + + if ((bool_read == 0 && bool_write == 0 && index_find != -1)) { + ptr_disk[index_find] = yon_char_new("-"); + _config->i_o_limit_read_size[index_find] = -3; + _config->i_o_limit_write_size[index_find] = -3; + _config->i_o_limit_read[index_find] = -3; + _config->i_o_limit_write[index_find] = -3; + } + if (flag_check_array == 0) { + if (ptr_disk) { + yon_char_parsed_copy(&_config->disk_read, &ptr_disk); + } + } + else if (flag_check_array == 1) { + if (ptr_disk) { + yon_char_parsed_copy(&_config->disk_write, &ptr_disk); + } + } +} + +void philos_temp_config_init(temp_config* _config) { + if (_config->size_disk != 0) { + philos_free_string_array(&_config->disk_read, _config->size_disk); + philos_free_int_array(&_config->i_o_limit_read, _config->size_disk); + philos_free_int_array(&_config->i_o_limit_read_size, _config->size_disk); + } + else if (_config->size_disk != 0) { + philos_free_string_array(&_config->disk_write, _config->size_disk); + philos_free_int_array(&_config->i_o_limit_write, _config->size_disk); + philos_free_int_array(&_config->i_o_limit_write_size, _config->size_disk); + } + _config->disk_read = NULL; + _config->disk_write = NULL; + _config->i_o_limit_read = NULL; + _config->i_o_limit_write = NULL; + _config->i_o_limit_read_size = NULL; + _config->i_o_limit_write_size = NULL; + _config->size_disk = 0; + _config->size_disk = 0; +} + +// flag_check_array = 0 READ +// flag_check_array = 1 WRITE +void philos_update_device_to_entry(temp_set_window *widgets, temp_config* _config, int flag_check_array) { + int disk_id = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempDevice)); + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->cbtTempDevice)); + disk = yon_char_divide_search(disk, " ", -1); + if (disk_id != -1) { + int index_find = -1; + if (flag_check_array == 0) { + if (_config->disk_read) { + for (int index = 0; index < _config->size_disk; index++) { + char* disk_cfg = _config->disk_read[index]; + if (disk_cfg) { + if (strstr(disk_cfg, disk)) { + index_find = index; + break; + } + } + } + } + } + else if (flag_check_array == 1) { + if (_config->disk_write) { + for (int index = 0; index < _config->size_disk; index++) { + char* disk_cfg = _config->disk_write[index]; + if (disk_cfg) { + if (strstr(disk_cfg, disk)) { + index_find = index; + break; + } + } + } + } + } + if (index_find != -1) { + if (flag_check_array==0) { + if (_config->i_o_limit_read[index_find]<0 || _config->i_o_limit_read_size[index_find]<0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempRead), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempRead), 0); + } + else { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempRead), _config->i_o_limit_read[index_find]); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead), 1); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempRead), _config->i_o_limit_read_size[index_find]); + + } + } + else if (flag_check_array==1) { + if (_config->i_o_limit_write[index_find]<0 || _config->i_o_limit_write_size[index_find]<0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempWrite), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempWrite), 0); + } + else { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempWrite), _config->i_o_limit_write[index_find]); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite), 1); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempWrite), _config->i_o_limit_write_size[index_find]); + } + } + else { + if (flag_check_array==0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempRead), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempRead), 0); + } + else if (flag_check_array==1) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempWrite), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempWrite), 0); + } + } + } + else { + if (flag_check_array==0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempRead), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempRead), 0); + } + else if (flag_check_array==1) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempWrite), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempWrite), 0); + } + } + } + else { + if (flag_check_array==0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempRead), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempRead), 0); + } + else if (flag_check_array==1) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite), 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(widgets->spinTempWrite), 0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->cbtTempWrite), 0); + } + } +} +// flag_check_array = 0 READ +// flag_check_array = 1 WRITE +void philos_temp_add_disk(temp_set_window *widgets, temp_config* _config, int flag_check_array) { + char* disk = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->cbtTempDevice)); + disk = yon_char_divide_search(disk, " ", -1); + int disk_id = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempDevice)); + int bool_read = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead)); + int bool_write = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite)); + char** ptr_disk = NULL; + int size = 0; + if (flag_check_array == 0) { + ptr_disk = _config->disk_read; + size = _config->size_disk; + } + else if (flag_check_array == 1) { + ptr_disk = _config->disk_write; + size = _config->size_disk; + } + if (disk_id >= 0 && size !=0) { + int index_find = -1; + if (ptr_disk){ + for (int index = 0; index < size; index++) { + char* disk_cfg = ptr_disk[index]; + if (disk_cfg) { + if (strstr(disk_cfg, disk) != NULL) { + index_find = index; + break; + } + } + } + } + + if (index_find == -1 || index_find>=0) { + if (index_find == -1) { + index_find = find_null_array(_config); + } + // Редактирование + if (flag_check_array == 0) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead))) { + ptr_disk[index_find] = yon_char_new(disk); + _config->i_o_limit_read_size[index_find] = (int)gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempRead)); + _config->i_o_limit_read[index_find] = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinTempRead)); + } + else { + ptr_disk[index_find] = yon_char_new("-"); + _config->i_o_limit_read_size[index_find] = -3; + _config->i_o_limit_read[index_find] = -3; + } + } + if (flag_check_array == 1) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite))) { + ptr_disk[index_find] = yon_char_new(disk); + _config->i_o_limit_write_size[index_find] = (int)gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempWrite)); + _config->i_o_limit_write[index_find] = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinTempWrite)); + } + else { + _config->i_o_limit_write_size[index_find] = -3; + _config->i_o_limit_write[index_find] = -3; + ptr_disk[index_find] = yon_char_new("-"); + } + } + } + } + else { + if (bool_read == 1 || bool_write == 1) { + int index_find = find_null_array(_config); + if (flag_check_array == 0) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempRead))) { + ptr_disk[index_find] = yon_char_new(disk); + _config->i_o_limit_read_size[index_find] = (int)gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempRead)); + _config->i_o_limit_read[index_find] = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinTempRead)); + + } + } + if (flag_check_array == 1) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widgets->chbTempWrite))) { + ptr_disk[index_find] = yon_char_new(disk); + _config->i_o_limit_write_size[index_find] = (int)gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->cbtTempWrite)); + _config->i_o_limit_write[index_find] = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widgets->spinTempWrite)); + } + } + } + } + if (flag_check_array == 0) { + if (ptr_disk) { + yon_char_parsed_copy(&_config->disk_read, &ptr_disk); + + } + } + else if (flag_check_array == 1) { + if (ptr_disk) { + yon_char_parsed_copy(&_config->disk_write, &ptr_disk); + } + } +} +int find_null_array(temp_config* _config) { + int index = 0; + for (index = 0; (_config->disk_read[index]!=NULL && _config->disk_write[index]!=NULL); index++) { + if (strcmp(_config->disk_read[index], "-") == 0 && strcmp(_config->disk_write[index], "-") == 0) { + break; + } + } + return index; + + +} +int* philos_int_append(int* array, int* size, int value) { + array = yon_remalloc(array, (*size+1)*sizeof(int)); + array[(*size)] = value; + (*size)++; + return array; + +} + +int* remove_element_int_array(int* array, int* size, int item_to_delete) { + int *new_int_parsed=NULL; + new_int_parsed=malloc(sizeof(int)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + memcpy(&(new_int_parsed[i]),&(array[i]),sizeof(int)); + } + else if (flag == 1 && i!=item_to_delete) { + memcpy(&(new_int_parsed[i-1]),&(array[i]),sizeof(int)); + } + } + (*size)=(*size)-1; + return new_int_parsed; +} + +int** remove_element_int_array_n3(int** array, int* size, int item_to_delete) { + int **new_int_parsed=NULL; + new_int_parsed=malloc(sizeof(int*)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + philos_array_int_copy(&new_int_parsed[i],&array[i]); + } + else if (flag == 1 && i!=item_to_delete) { + philos_array_int_copy(&new_int_parsed[i-1],&array[i]); + } + } + (*size)=(*size)-1; + return new_int_parsed; +} +char* philos_get_size_bite(GtkWidget* chk_button, GtkWidget* spin, GtkWidget* combo_box_text) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_button))) { + char* size_prifics = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box_text)); + int size_bite = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); + char* str_size_bute = yon_char_unite(yon_char_from_int(size_bite), " ", size_prifics, NULL); + return str_size_bute; + } + else { + char* str = (char*)malloc(sizeof(char*)*2); + str[0] = '-'; + str[1] = '\0'; + return str; + } +} +void philos_fill_combo_box_text(GtkWidget *cbt, config_str list_data, int size) { + for (int index = 0; index < size; index++) { + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(cbt), list_data[index]); + } +} + +void philos_set_spin_adjustment(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, size_t value) { + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)); + guint value_spin = gtk_spin_button_get_digits(GTK_SPIN_BUTTON(spin)); + if (active != -1) { + GtkAdjustment* adjustment = NULL; + adjustment = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin)); + gtk_adjustment_set_lower(adjustment, 0.0); + gtk_adjustment_set_page_increment(adjustment, 1.0); + if (combo == NULL) { + gtk_adjustment_set_upper(adjustment, (gdouble)(value*100)); + if ((value*100)0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),1); + } + else if (active == 0) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 0); + } + if (flag_cpu == 0) { + philos_set_spin_adjustment(check, spin, combo, resurs); + if (value_spin>resurs) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), resurs); + } + } + else { + philos_set_spin_adjustment(check, spin, NULL, resurs); + } + +} + +size_t get_resurs_total(char* cmd) { + int size = 0; + size_t size_memory = 0; + char **responce = yon_config_load(cmd, &size); + for (int index = 0; index < size; index++ ) { + char* mem_size_kb = yon_char_divide_search(responce[index], "\n", -1); + size_memory = atoll(mem_size_kb); + free(mem_size_kb); + } + philos_free_string_array(&responce, size); + return size_memory; +} + +float get_size_pow_memory(size_t size_memory, int size) { + float res = size_memory; + for (size_t index = 0; index < size; index++) { + res = res/1024; + } + return res; +} + +void philos_set_active_widgets_device_io(GtkWidget* combo_to_l2,GtkWidget *check, GtkWidget *spin, GtkWidget *combo) { + int menu_id = gtk_combo_box_get_active(GTK_COMBO_BOX(combo_to_l2)); + if (menu_id != -1) { + gboolean active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check)); + if (active == 0) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 0); + } + else if (gtk_spin_button_get_digits(GTK_SPIN_BUTTON(spin))>0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),1); + } + gtk_widget_set_sensitive(spin, active); + gtk_widget_set_sensitive(combo, active); + } + else { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), 0); + gtk_widget_set_sensitive(spin, 0); + gtk_widget_set_sensitive(combo, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), 0); + } + philos_set_spin_adjustment(check, spin, combo, 12582912); +} +char *yon_char_get_augumented(char *source, char *append) +{ + if (source && append) + { + int size = strlen(source) + strlen(append) + 1; + char *final = malloc(size); + memset(final, 0, size); + if (strstr(source, "%%")) + sprintf(final, source, append); + else + sprintf(final, "%s%s", source, append); + return final; + } + else + return NULL; +} +dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) { + dictionary *dct = yon_dictionary_create_conneced(dict); + dct->key = yon_char_new(key); + dct->data = data; + dct->data_type = DICTIONARY_OTHER_TYPE; + return dct; +} +char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete) { + char **new_char_parsed=NULL; + new_char_parsed=malloc(sizeof(char*)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + new_char_parsed[i]=yon_char_new(char_string[i]); + } + else if (flag == 1 && i!=item_to_delete) { + new_char_parsed[i-1]=yon_char_new(char_string[i]); + } + } + (*size)=(*size)-1; + return new_char_parsed; +} +char*** yon_char_parsed_shrink_n3(char ***char_string, int *size, int item_to_delete) { + char ***new_char_parsed=NULL; + new_char_parsed=malloc(sizeof(char**)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + yon_char_parsed_copy(&new_char_parsed[i],&char_string[i]); + } + else if (flag == 1 && i!=item_to_delete) { + yon_char_parsed_copy(&new_char_parsed[i-1], &char_string[i]); + } + } + (*size)=(*size)-1; + return new_char_parsed; +} +dictionary *yon_dictionary_create_empty() { + dictionary *dict = malloc(sizeof(dictionary)); + dict->data = NULL; + dict->key = NULL; + dict->next = NULL; + dict->prev = NULL; + dict->first = dict; + dict->data_type = DICTIONARY_OTHER_TYPE; + return dict; +} +void yon_terminal_integrated_launch(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){ + char **commands=new_arr(char*,2); + gchar **envp = g_get_environ(); + commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); + commands[1]=NULL; + char **env=new_arr(char*,2); + env[0]=""; + env[1]=NULL; + vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); + VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); + vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); + char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command, "; exit 0\n",NULL); + if(endwork_function) + g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); + vte_terminal_spawn_async(VTE_TERMINAL(terminal), + VTE_PTY_DEFAULT, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + child_ready, + install_command); + vte_pty_spawn_async(pty, + NULL, + commands, + NULL, + 0, + NULL, NULL, + NULL, + -1, + NULL, + NULL, + NULL); + vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1); + vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); + vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); + gtk_widget_show_all(terminal); +} +dictionary *yon_dictionary_create_conneced(dictionary *targetdict) +{ + targetdict = yon_dictionary_get_last(targetdict); + targetdict->next = yon_dictionary_create_empty(); + targetdict->next->prev = targetdict; + targetdict->next->first = targetdict->first; + targetdict->next->data_type = DICTIONARY_OTHER_TYPE; + return targetdict->next; +} +void yon_int_array_append(int **source, int append){ + int size=0; + for (size=0;(*source)[size]!=-2;size++); + *source = realloc(*source,(size+2)*sizeof(int)); + (*source)[size] = append; + (*source)[size+1] = -2; +} +static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) +{ + if (!terminal) return; + if (pid == -1) printf("Error\n\n\n"); + else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); +} +/**[EN] + * int yon_config_save(char *command) + * Saves config with [command] + * [RU] +*/ +int philos_config_save(char *command) +{ + FILE *output = popen(command, "r"); + return 1; +} + +void philos_array_int_pars_to(int** array, int to) { + int flag = 0; + int i = 0; + for (i = 0; (*array)[i] != -2; i++) { + if ((*array)[i]==-3) { + (*array)[i] = to; + flag = 1; + break; + } + } +} + +void philos_array_char_pars_to(char*** array, char* to) { + int flag = 0; + int i = 0; + for (i = 0; (*array)[i] != NULL; i++) { + if (strcmp((*array)[i], "-") == 0) { + (*array)[i] = yon_char_new(to); + flag = 1; + break; + } + } +} +void init_device_disk(temp_config* _config) { + for (int index = 0;index< (get_device_cfg()->size_disk*2);index++){ + _config->disk_read = yon_char_parsed_append(_config->disk_read,&_config->size_disk, "-"); + _config->size_disk--; + _config->i_o_limit_write_size = philos_int_append(_config->i_o_limit_write_size, &_config->size_disk, -3); + _config->size_disk--; + _config->i_o_limit_write = philos_int_append(_config->i_o_limit_write, &_config->size_disk, -3); + _config->size_disk--; + _config->i_o_limit_read_size = philos_int_append(_config->i_o_limit_read_size, &_config->size_disk, -3); + _config->size_disk--; + _config->disk_write = yon_char_parsed_append(_config->disk_write,&_config->size_disk, "-"); + _config->size_disk--; + _config->i_o_limit_read = philos_int_append(_config->i_o_limit_read, &_config->size_disk, -3); + } + _config->i_o_limit_write_size = philos_int_append(_config->i_o_limit_write_size, &_config->size_disk, -2); + _config->size_disk--; + _config->disk_write = yon_char_parsed_append(_config->disk_write, &_config->size_disk, NULL); + _config->size_disk--; + _config->disk_read = yon_char_parsed_append(_config->disk_read, &_config->size_disk, NULL); + _config->size_disk--; + _config->i_o_limit_write = philos_int_append(_config->i_o_limit_write, &_config->size_disk, -2); + _config->size_disk--; + _config->i_o_limit_read = philos_int_append(_config->i_o_limit_read, &_config->size_disk, -2); + _config->size_disk--; + _config->i_o_limit_read_size = philos_int_append(_config->i_o_limit_read_size, &_config->size_disk, -2); +} \ No newline at end of file diff --git a/source/model/philos_utils.h b/source/model/philos_utils.h new file mode 100644 index 0000000..8ec5af6 --- /dev/null +++ b/source/model/philos_utils.h @@ -0,0 +1,120 @@ +#ifndef PHILOS_UTILS_H +#define PHILOS_UTILS_H +#include "ubl-utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "my_device.h" + +#define catch(x) ExitJmp:if(__HadError) +#define throw(x) {__HadError=true;goto ExitJmp;} +#define file_source_login_min_max "/etc/login.defs" +static char** array_size_pow; +typedef struct { + char** disk_read; + char** disk_write; + int* i_o_limit_read; + int* i_o_limit_write; + int* i_o_limit_read_size; + int* i_o_limit_write_size; + int size; + int size_disk; +} temp_config; + +typedef struct { + + GtkWidget* Window; + GtkWidget* btnSaveTempSave; + GtkWidget* btnTempCancel; + + GtkWidget* entryTempCmd; + GtkWidget* chbTempRead; + GtkWidget* spinTempRead; + GtkWidget* cbtTempRead; + + GtkWidget* chbTempWrite; + GtkWidget* spinTempWrite; + GtkWidget* cbtTempWrite; + + GtkWidget* chkSoftRestrictionTemp; + GtkWidget* spiSevereRestrictionTemp; + GtkWidget* cmSevereRestrictionTemp; + + GtkWidget* chkSevereRestrictionTemp; + GtkWidget* spinSevereRestrictionTemp; + GtkWidget* cmbSevereRestrictionTemp; + + GtkWidget* chkPaddingFLTemp; + GtkWidget* spinPaddingFLTemp; + GtkWidget* cmbPaddingFLTemp; + + GtkWidget* chkCPULimitTemp; + GtkWidget* spinCPULimitTemp; + GtkWidget* lblCPULimitTemp; + + GtkWidget* cbtTempDevice; + GtkWidget* cbxTempQuotaObj; + GtkWidget* cbxTempQuotaLevel2; + GtkWidget* boxBlockGui; +} temp_set_window; +void philos_array_string_remove_char(char*** array, char* str_remove, int size); +void philos_set_pow_size_memory(char* str_find, int** array_size,int index, char** array_size_pow); +void philos_set_size_memory_integer_char(char* str_find, char*** array_data, int index); +void philos_free_string_array(char ***array, int size); +void philos_free_string_array_n3(char ****array, int size); +void philos_free_int_array(int **array, int size); +void philos_free_int_array_n2(int ***array, int size); +config_str philos_list_group(int* size); +unsigned short philos_read_uid_min_max(char* filename, char* search); +config_str philos_list_user(int* size); +char* philos_str_size_pow_byte(GtkWidget *combo_box_text); +char* philos_str_remove(char *str, const char *sub); +void philos_split_size_memory(char* str_value, int* size, char* pow_memory); +char* philos_format_cfg_str_size_memory(char* str_key, int value, int pow_size_memory); +char** philos_str_split(char *parameters, int *size, char *divider); +void philos_array_str_copy(char*** source, char*** copy); +void philos_set_pow_size_memory_device(char* str_find, int** array_size,int index, char** array_size_pow); +void philos_array_int_copy(int** source, int** copy); +char** philos_pars_terminal_systemd_cgls(char* CMD_GET_SLICE_SERVICE, char* str_find, int* size_array_data); +char* philos_pard_array_add_cmd(char* cmd, temp_config* _config, char* key, int* array_io, int* array_io_pow_size, char** disk, int size); +int philos_check_activ_disk(temp_set_window *widgets, temp_config* _config); +void philos_temp_generate_cmd(temp_set_window *widgets, temp_config* _config); +void philos_temp_del_disk(temp_set_window *widgets, temp_config* _config, int flag_check_array); +void philos_temp_config_init(temp_config* _config); +void philos_update_device_to_entry(temp_set_window *widgets, temp_config* _config, int flag_check_array); +void philos_temp_add_disk(temp_set_window *widgets, temp_config* _config, int flag_check_array); +int* philos_int_append(int* array, int* size, int value); +int* remove_element_int_array(int* array, int* size, int item_to_delete); +int** remove_element_int_array_n3(int** array, int* size, int item_to_delete); +char* philos_get_size_bite(GtkWidget* chk_button, GtkWidget* spin, GtkWidget* combo_box_text); +void philos_fill_combo_box_text(GtkWidget *cbt, config_str list_data, int size); +void philos_set_spin_adjustment(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, size_t value); +void philos_set_active_widgets(GtkWidget *check, GtkWidget *spin, GtkWidget *combo, int flag_cpu, char* cmd); +size_t get_resurs_total(char* cmd); +float get_size_pow_memory(size_t size_memory, int size); +void philos_set_active_widgets_device_io(GtkWidget* combo_to_l2,GtkWidget *check, GtkWidget *spin, GtkWidget *combo); +char *yon_char_get_augumented(char *source, char *append); +dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data); +char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete); +char*** yon_char_parsed_shrink_n3(char ***char_string, int *size, int item_to_delete); +dictionary *yon_dictionary_create_empty(); +void yon_terminal_integrated_launch(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument); +dictionary *yon_dictionary_create_conneced(dictionary *targetdict); +void yon_int_array_append(int **source, int append); +static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data); +int philos_config_save(char *command); +void philos_array_int_pars_to(int** array, int to); +void philos_array_char_pars_to(char*** array, char* to); +int find_null_array(temp_config* _config); +void init_device_disk(temp_config* _config); +#endif \ No newline at end of file diff --git a/source/view/model/ubl-utils.cc b/source/model/ubl-utils.c similarity index 79% rename from source/view/model/ubl-utils.cc rename to source/model/ubl-utils.c index 6768f9e..0688bf4 100644 --- a/source/view/model/ubl-utils.cc +++ b/source/model/ubl-utils.c @@ -1,7 +1,4 @@ - #include "ubl-utils.h" -static dictionary* __yon__config__strings = NULL; -#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) // dictionary functions @@ -11,12 +8,9 @@ static dictionary* __yon__config__strings = NULL; * [RU] * Создаёт и возвращает пустой словарь. */ - - - dictionary *yon_dictionary_new() { - dictionary *dict = (dictionary *)malloc(sizeof(dictionary)); + dictionary *dict = malloc(sizeof(dictionary)); dict->data = NULL; dict->key = NULL; dict->next = NULL; @@ -26,7 +20,7 @@ dictionary *yon_dictionary_new() return dict; } -/**yon_dictionary_copy_deep(dictionary *dict) +/**yon_dictionary_copy(dictionary *dict) * [EN] * * [RU] @@ -35,7 +29,6 @@ dictionary *yon_dictionary_new() dictionary *yon_dictinoary_copy(dictionary *dict){ dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); dct->data_type= dict->data_type; - return dct; } /**yon_dictionary_copy_deep(dictionary *dict) @@ -54,20 +47,44 @@ dictionary *yon_dictionary_copy_deep(dictionary *dict){ return newone->first; } -void yon_dictionary_set_data(dictionary *dict, void *data){ +/**int yon_dictionary_set_data(dictionary *dict, void *data) + * [EN] + * + * [RU] + * Установить элементу словаря [dict] значение [data] +*/ +int yon_dictionary_set_data(dictionary *dict, void *data){ dict->data=data; } -void yon_dictionary_set_key(dictionary *dict, char *key){ +/**int yon_dictionary_set_key(dictionary *dict, char *key) + * [EN] + * + * [RU] + * Изменяет ключ элемента словаря [dict] на [key] +*/ +int yon_dictionary_set_key(dictionary *dict, char *key){ dict->key=key; } -void yon_dictionary_set(dictionary *dict, char *key, void *data){ +/** int yon_dictionary_set(dictionary *dict, char *key, void *data) + * [EN] + * + * [RU] +* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] +*/ +int yon_dictionary_set(dictionary *dict, char *key, void *data){ dict->key=key; dict->data=data; } -void yon_dictionary_empty(dictionary *dict){ +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ +int yon_dictionary_empty(dictionary *dict){ dict->data=NULL; dict->data_type=DICTIONARY_OTHER_TYPE; } @@ -224,7 +241,6 @@ dictionary *yon_dictionary_swap(dictionary *dict, int aim) } } } - return dict; } /**yon_dictionary_make_first(dictionary *dict) @@ -426,7 +442,7 @@ char *yon_char_append(char *source, char *append) if (source && append) { int size = strlen(source) + strlen(append) + 1; - char *final = (char*)malloc(size); + char *final = malloc(size); memset(final, 0, size); if (strstr(source, "%%")) sprintf(final, source, append); @@ -445,7 +461,7 @@ char *yon_char_append(char *source, char *append) char *yon_char_new(char *chr) { if (chr){ - char *newchar = (char*)malloc(strlen(chr) + 1); + char *newchar = malloc(strlen(chr) + 1); memset(newchar, 0, strlen(chr) + 1); memcpy(newchar, chr, strlen(chr)); return newchar; @@ -453,8 +469,12 @@ char *yon_char_new(char *chr) return NULL; } -// char *yon_char_unite(char *source, ...) - +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ char *yon_char_unite(char *source, ...){ va_list arglist; char *new_char=NULL; @@ -477,7 +497,7 @@ char *yon_char_unite(char *source, ...){ char *yon_cut(char *source, int size, int startpos) { char *cut = NULL; - cut = (char*)malloc(size + 1); + cut = malloc(size + 1); memset(cut, 0, size + 1); memcpy(cut, source + startpos, size); return cut; @@ -491,10 +511,10 @@ char *yon_cut(char *source, int size, int startpos) */ char *yon_char_divide(char *source, int dividepos) { - char *cut = (char*)malloc(dividepos + 1); + char *cut = malloc(dividepos + 1); memset(cut, 0, dividepos + 1); memcpy(cut, source, dividepos); - char *left = (char*)malloc(strlen(source) - strlen(cut)); + char *left = malloc(strlen(source) - strlen(cut)); memset(left, 0, strlen(source) - strlen(cut)); memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); memset(source, 0, strlen(source)); @@ -502,11 +522,18 @@ char *yon_char_divide(char *source, int dividepos) return cut; } +/**yon_char_find_count(char *source, char *find) + * [EN] + * + * [RU] + * Считает количество символов [find] в строке [source] +*/ int yon_char_find_count(char *source, char *find){ char *working_string=yon_char_new(source); int i=0; int size=0; - config_str rtn = yon_char_parse(working_string,&size,(char*)"\n"); + int pos=0; + config_str rtn = yon_char_parse(working_string,&size,"\n"); for (int j=0;jd_name); -// if (strlen(de->d_name) > 9) -// { -// char *extension = strstr(path, "."); -// if (extension != NULL) -// { -// if (strcmp(extension, ".desktop") == 0) -// { -// apps tempapp; -// GKeyFile *gfile = g_key_file_new(); -// GError *err = NULL; -// g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); -// char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err); -// if (err) -// { -// printf("%s\n", err->message); -// } -// if (strcmp(Type, "Application") == 0) -// tempapp.Type = 1; -// else if (strcmp(Type, "pyApplication") == 0) -// tempapp.Type = 2; -// else -// continue; -// tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); -// if (tempapp.Name == NULL) -// continue; -// tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL); -// if (tempapp.Categories == NULL) -// continue; -// tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); -// if (tempapp.Exec == NULL) -// continue; -// tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); -// if (tempapp.Icon == NULL) -// continue; -// tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL); -// if (!tempapp.Pluggable) -// tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL); -// if (tempapp.Pluggable) -// tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL); -// if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0){ -// if (size == 0) -// { -// applist = (apps *)malloc(size + 1 * sizeof(apps)); -// applist[0].Name = yon_char_new(tempapp.Name); -// applist[0].Categories = yon_char_new(tempapp.Categories); -// applist[0].Exec = yon_char_new(tempapp.Exec); -// applist[0].Icon = yon_char_new(tempapp.Icon); -// applist[0].Type = tempapp.Type; -// applist[0].Pluggable = tempapp.Pluggable; -// applist[0].DualPluggable = tempapp.DualPluggable; -// size++; -// } -// else -// { -// applist = (apps *)realloc(applist, (size + 1) * sizeof(apps)); -// applist[size].Name = yon_char_new(tempapp.Name); -// applist[size].Categories = yon_char_new(tempapp.Categories); -// applist[size].Exec = yon_char_new(tempapp.Exec); -// applist[size].Icon = yon_char_new(tempapp.Icon); -// applist[size].Pluggable = tempapp.Pluggable; -// applist[size].DualPluggable = tempapp.DualPluggable; -// applist[size].Type = tempapp.Type; -// size++; -// } -// } -// } -// } -// } -// } -// } -// *sizef = size; -// return applist; -// }; +apps *yon_apps_scan_and_parse_desktops(int *sizef) +{ + int size = 0; + struct apps *applist; + { + DIR *directory = opendir(DesktopPath); + struct dirent *de; + while ((de = readdir(directory))) + { + FILE *file; + char *path = yon_char_append(DesktopPath, de->d_name); + file = fopen(path, "r"); + if (strlen(de->d_name) > 9) + { + char *extension = strstr(path, "."); + if (extension != NULL) + { + if (strcmp(extension, ".desktop") == 0) + { + apps tempapp; + GKeyFile *gfile = g_key_file_new(); + GError *err = NULL; + g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err); + if (err) + { + printf("%s\n", err->message); + } + if (strcmp(Type, "Application") == 0) + tempapp.Type = 1; + else if (strcmp(Type, "pyApplication") == 0) + tempapp.Type = 2; + else + continue; + tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); + if (tempapp.Name == NULL) + continue; + tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL); + if (tempapp.Categories == NULL) + continue; + tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); + if (tempapp.Exec == NULL) + continue; + tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); + if (tempapp.Icon == NULL) + continue; + tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL); + if (!tempapp.Pluggable) + tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL); + if (tempapp.Pluggable) + tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL); + if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0) + if (size == 0) + { + applist = (apps *)malloc(size + 1 * sizeof(apps)); + applist[0].Name = yon_char_new(tempapp.Name); + applist[0].Categories = yon_char_new(tempapp.Categories); + applist[0].Exec = yon_char_new(tempapp.Exec); + applist[0].Icon = yon_char_new(tempapp.Icon); + applist[0].Type = tempapp.Type; + applist[0].Pluggable = tempapp.Pluggable; + applist[0].DualPluggable = tempapp.DualPluggable; + size++; + } + else + { + applist = (apps *)realloc(applist, (size + 1) * sizeof(apps)); + applist[size].Name = yon_char_new(tempapp.Name); + applist[size].Categories = yon_char_new(tempapp.Categories); + applist[size].Exec = yon_char_new(tempapp.Exec); + applist[size].Icon = yon_char_new(tempapp.Icon); + applist[size].Pluggable = tempapp.Pluggable; + applist[size].DualPluggable = tempapp.DualPluggable; + applist[size].Type = tempapp.Type; + size++; + } + } + } + } + } + } + *sizef = size; + return applist; +}; void yon_apps_sort(apps *applist, int size) { @@ -885,21 +928,21 @@ apps *yon_apps_get_by_name(apps *applist, char *name, int size) * Выполняет команду [command]. * Полученные данные парсятся и регистрируются в конфиг. */ - int yon_config_load_register(char *command){ if (__yon__config__strings){ - __yon__config__strings = (dictionary *)yon_dictionary_free_all(__yon__config__strings,NULL); + __yon__config__strings = yon_dictionary_free_all(__yon__config__strings,NULL); } FILE *output = popen(command, "r"); - //char **output_strings = (char **)malloc(sizeof(char)); - // int i = 0; + char **output_strings = NULL; + output_strings = malloc(sizeof(char)); + int i = 0; char str[4096]; memset(str, 0, 4096); while (fgets(str, 4096, output)) { if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0) { - char *key = yon_char_divide_search(str,(char*)"=",-1); + char *key = yon_char_divide_search(str,"=",-1); yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,str); __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; } @@ -958,7 +1001,7 @@ int yon_config_remove_element(char *key, char *deleted){ char *data = (char*)dict->data; char *found = strstr(data,deleted); int size=strlen(data)-strlen(found)+1; - char *new_data = (char*)malloc(size); + char *new_data = malloc(size); memset(new_data,0,size); if (strlen(found)!=strlen(deleted)){ memcpy(new_data,data,size-1); @@ -1033,7 +1076,7 @@ int yon_config_set(char *key, void *data){ */ int yon_config_clean(){ check_config{ - __yon__config__strings = (dictionary *)yon_dictionary_free_all(__yon__config__strings, NULL); + __yon__config__strings = yon_dictionary_free_all(__yon__config__strings, NULL); return 1; } else return 0; @@ -1062,7 +1105,7 @@ void yon_config_register(char *key, void *data){ config_str yon_config_load(char *command, int *str_len){ FILE *output = popen(command, "r"); char **output_strings = NULL; - output_strings = (char**)malloc(sizeof(char)); + output_strings = malloc(sizeof(char)); int i = 0; char str[4096]; memset(str, 0, 4096); @@ -1070,7 +1113,7 @@ config_str yon_config_load(char *command, int *str_len){ { if (strcmp(str, "") != 0) { - output_strings = (char**)realloc(output_strings, sizeof(char *) * (i + 1)); + output_strings = realloc(output_strings, sizeof(char *) * (i + 1)); // printf("%s\n", str); output_strings[i] = NULL; output_strings[i] = yon_char_new(str); @@ -1094,54 +1137,41 @@ config_str yon_config_load(char *command, int *str_len){ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save(char *command){ +int yon_config_save_registered(char *command){ check_config{ dictionary *dict = NULL; for_dictionaries(dict,__yon__config__strings){ - command = yon_char_unite(command, (char*)" ", yon_dictionary_get_data(dict,char*), NULL); + command = yon_char_unite(command, " ", yon_dictionary_get_data(dict,char*), NULL); } if (popen(command, "r")) return 1; else return 0; } else return 0; } -// /**yon_config_get_all(int *size) -// * [EN] -// * -// * [RU] -// * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL -// * [size] - указатель, в который выгружается длина массива -// */ -// config_str yon_config_get_all(int *size){ -// if (size) {} -// check_config{ -// *size = 1; -// config_str conf = NULL; -// dictionary *dict = NULL; -// for_dictionaries(dict,__yon__config__strings){ -// conf = yon_remalloc(conf,sizeof(char*)*(*size)); -// conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL); -// size++; -// } -// conf = yon_remalloc(conf,sizeof(char*)*(*size+1)); -// conf[*size] = NULL; -// return conf; -// } else return NULL; -// } - -/**[EN] - * int yon_config_save(char *command) - * Saves config with [command] +/**yon_config_get_all(int *size) + * [EN] + * * [RU] - * Выполняет команду [command] + * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL + * [size] - указатель, в который выгружается длина массива */ -// int yon_config_save(char *command) -// { -// FILE *output = popen(command, "r"); -// return 1; -// } +config_str yon_config_get_all(int *size){ + check_config{ + *size = 1; + config_str conf = NULL; + dictionary *dict = NULL; + for_dictionaries(dict,__yon__config__strings){ + conf = yon_remalloc(conf,sizeof(char*)*(*size)); + conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL); + size++; + } + conf = yon_remalloc(conf,sizeof(char*)*(*size+1)); + conf[*size] = NULL; + return conf; + } else return NULL; +} -/**char *yon_config_get_parameter(config parameter" "s, int size, char *param) +/**char *yon_config_get_parameter(config parameters, int size, char *param) * [EN] * Gets parameter [param] from parameter list [parameters] of size [size]; * or NULL if nothing were found @@ -1152,19 +1182,19 @@ int yon_config_save(char *command){ char *yon_config_get_parameter(config_str parameters, int size, char *param) { if (param[0]==' ') - yon_char_divide_search(param,(char*)" ",-1); - param=yon_char_divide_search(yon_char_new(param),(char*)" ",-1); + yon_char_divide_search(param," ",-1); + param=yon_char_divide_search(yon_char_new(param)," ",-1); char *str = NULL; for (int j = 0; j < size; j++) { - char *name = yon_char_divide_search(yon_char_new(parameters[j]), (char*)"=", 1); + char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); if (name) { if (strcmp(name, param) == 0) { - str = yon_char_divide_search(yon_char_new(parameters[j]), (char*)"\n", 1); - if (strcmp(str, "") != 0 && strcmp(str, (char*)"(null)") != 0) + str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); + if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) return str; else return NULL; @@ -1184,13 +1214,13 @@ char *yon_config_get_parameter(config_str parameters, int size, char *param) * [RU] * Выполнить команду [command] в отдельном потоке; */ -void yon_launch_app_with_arguments(char *name, char *args) +int yon_launch_app_with_arguments(char *name, char *args) { - char *path = yon_char_unite((char*)"/usr/bin/", name, (char*)" ", args,NULL); + char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); pthread_t thread_id; char *command = NULL; command = path; - pthread_create(&thread_id, NULL, (void* (*)(void *))yon_launch, command); + pthread_create(&thread_id, NULL, (void *)yon_launch, command); }; /**yon_launch(char *command) @@ -1199,10 +1229,9 @@ void yon_launch_app_with_arguments(char *name, char *args) * [RU] * Выполнить команду [command] */ -void* yon_launch(void *command) +void yon_launch(char *command) { - if (system((char*)command)){} - return NULL; + system(command); } // Gtk functions @@ -1332,8 +1361,11 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end gtk_widget_show_all(terminal); } #endif + // Window config functions + #define check_window_config_setup if(__yon_window_config_target_window) + struct { int x; int y; @@ -1341,6 +1373,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end int height; int fullscreen; } __yon_main_window_config; + static GtkWindow *__yon_window_config_target_window = NULL; static GKeyFile *__yon_window_config_file = NULL; static char *__yon_window_config_path = NULL; @@ -1359,9 +1392,13 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window); } - + /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) + * [EN] + * + * [RU] + * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. + */ void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ - if (self && event){} check_window_config_setup{ yon_get_is_fullscreen(); yon_window_config_save(); @@ -1378,26 +1415,36 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end } } + /**yon_window_config_setup(GtkWindow *window) + * [EN] + * + * [RU] + * Устанавливает указатель на окно для отслеживания его положения и размера + */ void yon_window_config_setup(GtkWindow *window){ __yon_window_config_target_window = window; g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); } - void* _yon_maximize(void *data){ - if (data){} + void _yon_maximize(void *data){ g_usleep(G_USEC_PER_SEC/10); if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); - return NULL; } + /**yon_window_config_load(char *path) + * [EN] + * + * [RU] + * Загружает конфиг окна и инициализирует отслеживание его параметров + */ int yon_window_config_load(char *path){ __yon_window_config_file = g_key_file_new(); __yon_window_config_path=yon_char_new(path); if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ struct stat st; int size; - config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,(char*)"/"); + config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); if (stat(path, &st) == -1) { mkdir(path, 0777); @@ -1417,16 +1464,53 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); pthread_t tid; - pthread_create(&tid,NULL,&_yon_maximize,NULL); + pthread_create(&tid,NULL,(void *)_yon_maximize,NULL); return 1; } void yon_window_config_apply(){ - // dictionary *dict=NULL; + dictionary *dict=NULL; gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); } +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + + +// other Gtk functions + +/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) + * [EN] + * + * [RU] + * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] +*/ int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ if (combo&¶meters){ for (int i=0;i - #include - +#include #include #include #include @@ -16,8 +13,7 @@ #include #include - -#include "../../ubl-cmake.h" +#include "../ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -25,7 +21,7 @@ #define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) -//#define new(type) malloc(sizeof(type)) +#define new(type) malloc(sizeof(type)) #define new_arr(type,size) malloc(sizeof(type)*size) @@ -65,6 +61,8 @@ typedef struct apps typedef char** config_str; +static dictionary *__yon__config__strings = NULL; +#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) #define config(key) yon_config_get_by_key(key) @@ -97,20 +95,6 @@ typedef char** config_str; dictionary *yon_dictionary_new(); -dictionary *yon_dictinoary_copy(dictionary *dict); - -dictionary *yon_dictionary_copy_deep(dictionary *dict); - -void yon_dictionary_set_data(dictionary *dict, void *data); - -void yon_dictionary_set_key(dictionary *dict, char *key); - -void yon_dictionary_set(dictionary *dict, char *key, void *data); - -void yon_dictionary_empty(dictionary *dict); - -void yon_dictionary_switch_to_last(dictionary **dict); - dictionary *yon_dictionary_append(dictionary *targetdict); dictionary *yon_dictionary_get_last(dictionary *dict); @@ -185,7 +169,7 @@ apps *yon_apps_get_by_name(apps *applist, char *name, int size); config_str yon_config_load(char *command, int *str_len); -int yon_config_save(char *command); +int yon_config_save_registered(char *command); char *yon_config_get_parameter(config_str parameters, int size, char *param); @@ -211,9 +195,9 @@ config_str yon_config_get_all(); // terminal-using functions -void yon_launch_app_with_arguments(char *name, char *args); +int yon_launch_app_with_arguments(char *name, char *args); -void* yon_launch(void *command); +void yon_launch(char *command); // Gtk functions @@ -223,19 +207,11 @@ void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, voi void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument); +#endif +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); -void __yon_window_config_on_resize(); - -void yon_get_is_fullscreen(); - - -void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event); -#endif -void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event); -void yon_window_config_save(); -void __yon_window_config_on_resize(); -void yon_get_is_fullscreen(); /**yon_gtk_builder_get_widget(builder, widget_name) * [EN] * Returns GtkWidget from GtkBuilder *[builder]. @@ -254,14 +230,8 @@ typedef struct void yon_window_config_setup(GtkWindow *window); -void* _yon_maximize(void *data); - -void yon_window_config_apply(); - int yon_window_config_load(char *path); -int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size); - int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); @@ -318,9 +288,6 @@ int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label); * или * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка) */ - -void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); - void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); #ifdef __cplusplus @@ -372,4 +339,4 @@ void yon_ubl_browser_window_open(char *link, char *browser_window_name); void yon_ubl_browser_window_open(char *link, char *browser_window_name); #endif #endif -#endif +#endif \ No newline at end of file diff --git a/source/ubl-settings-diskquota.cc b/source/ubl-settings-diskquota.c similarity index 60% rename from source/ubl-settings-diskquota.cc rename to source/ubl-settings-diskquota.c index 76e5942..33f788f 100644 --- a/source/ubl-settings-diskquota.cc +++ b/source/ubl-settings-diskquota.c @@ -20,7 +20,7 @@ void on_close_subwindow(GtkWidget *self){ * [RU] * Открывает браузер с [link] ссылкой. */ -void yon_open_browser(GtkWidget *, char *link){ +void yon_open_browser(GtkWidget *self, char *link){ yon_ubl_browser_window_open(link,TITLE_LABEL); } @@ -33,7 +33,7 @@ void yon_open_browser(GtkWidget *, char *link){ void on_open_documentation_confirmation(GtkWidget *self, char *link){ if (main_config.always_open_documentation==0){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); - documentation_confirmation_window *widgets = (documentation_confirmation_window*)malloc(sizeof(documentation_confirmation_window)); + documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window)); widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow"); widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton"); widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton"); @@ -72,7 +72,7 @@ void on_open_documentation_confirmation(GtkWidget *self, char *link){ * [uri] - ссылка, по которой совершается переход; * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике; */ -void on_link(GtkWidget *self, char* uri, gpointer){ +void on_link(GtkWidget *self, char* uri, gpointer user_data){ gtk_widget_destroy(self); on_open_documentation_confirmation(self,uri); } @@ -130,7 +130,7 @@ void config_init(){ main_window *setup_window(){ /* Widgets getting | Получение виджетов */ - main_window *widgets = (main_window*)malloc(sizeof(main_window)); + main_window *widgets = malloc(sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); @@ -157,9 +157,13 @@ main_window *setup_window(){ widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); - widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); + GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); + if (main_config.lock_load_global == 1){ gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0); } @@ -173,128 +177,12 @@ main_window *setup_window(){ } /* Signal connection | Присоединение сигналов */ - - event(widgets); - gtk_widget_show(widgets->Window); - return widgets; -} - -void event(main_window *widgets) { g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); - g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),(char*)WIKI_LINK); + g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); - //g_signal_connect(G_OBJECT(widgets->btnShowFilters),"clicked",G_CALLBACK(wrapper_filters_show), NULL); -} -/* -void main_visible_columns(main_window *widgets) { - gboolean *flags_filters = filters_get_flag(); - gtk_tree_view_column_set_visible(widgets->tvc0, flags_filters[0]); - gtk_tree_view_column_set_visible(widgets->tvc1, flags_filters[1]); - gtk_tree_view_column_set_visible(widgets->tvc2, flags_filters[2]); - gtk_tree_view_column_set_visible(widgets->tvc3, flags_filters[3]); - gtk_tree_view_column_set_visible(widgets->tvc4, flags_filters[4]); - gtk_tree_view_column_set_visible(widgets->tvc5, flags_filters[5]); - gtk_tree_view_column_set_visible(widgets->tvc6, flags_filters[6]); - gtk_tree_view_column_set_visible(widgets->tvc7, flags_filters[7]); - filters_on_hide_subwindow(self); -} -void wrapper_filters_show(GtkWidget *self) { - filters_show(self, glade_path); - g_signal_connect(G_OBJECT(get_widget_filters()->btnFiltersSave),"clicked",G_CALLBACK(main_visible_columns), NULL); -} -*/ -int main(int argc, char *argv[]){ - config_path = yon_char_unite((char*)"/home",yon_ubl_root_user_get(),(char*)"/.config/",LocaleName,(char*)"/",LocaleName,(char*)".conf",NULL); - local=setlocale(LC_ALL, ""); - textdomain (LocaleName); - config_init(); - int option_index=0; - int show_help=0; - { - struct option long_options[] = { - {"help", 0, 0, 'h'}, - {"version", 0, 0, 'V'}, - {"lock-help", 0,0, 1}, - {"lock-save", 0,0, 2}, - {"lock-save-local", 0,0, 3}, - {"lock-save-global", 0,0, 4}, - {"lock-load-global", 0,0, 5}, - {"socket-id", 1, 0, 's'}, - {"socket-ext-id", 1,0, 'e'}, - {"socket-trd-id", 1,0, 't'}, - {"debug", 0,0, 'd'}, - { NULL, 0, NULL, 0 } - }; - for (int i=0;iHeadOverlay),GTK_WIDGET(widgets->HeadBox),GTK_WIDGET(widgets->HeadImage),(char*)banner_path); - - yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); - if (getuid()!=0) - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - else - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); - yon_window_config_setup(GTK_WINDOW(widgets->Window)); - yon_window_config_load((char*)config_path.c_str()); - GtkCssProvider *css=gtk_css_provider_new(); - gtk_css_provider_load_from_resource(css,CssPath); - gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), - GTK_STYLE_PROVIDER(css), - -1); - gtk_main(); + gtk_widget_show(widgets->Window); + return widgets; } + diff --git a/source/ubl-settings-diskquota.h b/source/ubl-settings-diskquota.h index 4462d2d..915dc53 100644 --- a/source/ubl-settings-diskquota.h +++ b/source/ubl-settings-diskquota.h @@ -1,9 +1,6 @@ - - #include #include -#include -#include "view/model/ubl-utils.h" +#include "model/ubl-utils.h" #include #include #include @@ -11,10 +8,7 @@ #include #include #include -#include -#include #include "ubl-cmake.h" -using namespace std; #ifdef WEBKIT_FOUND #include #endif @@ -27,13 +21,12 @@ using namespace std; #define glade_path "/com/ublinux/ui/ubl-settings-diskquota.glade" #define banner_path "/com/ublinux/images/ubl-settings-diskquota-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-diskquota.css" -static string config_path; - +#define config_path yon_char_unite("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-diskquota" - -char const* version_application=""; +typedef char* string; +string version_application; char *local; @@ -55,6 +48,7 @@ typedef struct { } config; typedef struct { + //Standard GtkWidget *Window; GtkWidget *HatLabel; GtkWidget *PlugBox; @@ -82,6 +76,7 @@ typedef struct { GtkWidget *DocumentationMenuItem; GtkWidget *AboutMenuItem; + // Custom } main_window; @@ -97,7 +92,6 @@ typedef struct { GtkWidget *AcceptButton; } documentation_confirmation_window; - main_window *setup_window(); void on_about(); void yon_open_browser(GtkWidget *self, char *link); @@ -106,6 +100,6 @@ void on_link(GtkWidget *self, char* uri, gpointer user_data); void on_open_documentation_confirmation(GtkWidget *self, char *link); void yon_load_proceed(char *command); void event(main_window *widgets); -int main(int argc, char *argv[]); + void on_link(GtkWidget *self, char* uri, gpointer user_data); void config_init(); diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 87d311e..cc9a345 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,8 +1,8 @@ #define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-diskquota version:")," ", version_application,"\n",_("TEMPLATE settings"),"\n",_("Usage:"), " ubl-settings-diskquota ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) +#define HELP_LABEL yon_char_unite(_("ubl-settings-diskquota version:")," ", version_application,"\n",_(""),"\n",_("Usage:"), " ubl-settings-diskquota ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) -#define TITLE_LABEL _("TEMPLATE Manager") -#define TITLE_INFO_LABEL _("System TEMPLATE settings management") +#define TITLE_LABEL _("") +#define TITLE_INFO_LABEL _("") #define SUCCESS_LABEL _("Operation succeeded") #define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") @@ -36,4 +36,20 @@ #define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.") #define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.") #define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") -#define SAVE_FAILED_LABEL \ No newline at end of file +#define SAVE_FAILED_LABEL + +#define STR_KB _("Kb") +#define STR_MB _("Mb") +#define STR_GB _("Gb") +#define STR_TB _("Tb") + + +#define CMD_LOAD_GLOBAL "ubconfig --default --source global get security DISK_QUOTA[*]" +#define CMD_LOAD_SYSTEM "ubconfig --default --source system get security DISK_QUOTA[*]" +#define CMD_SAVE_GLOBAL "ubconfig --default --target global set security" +#define CMD_SAVE_SYSTEM "ubconfig --default --target system set security" +#define CMD_ALL_SAVE "ubconfig set security " +#define CMD_ALL_REMOVE "ubconfig remove security " +#define CMD_REMOVE_GLOBAL "ubconfig --target global --noexecute remove security " +#define CMD_REMOVE_SYSTEM "ubconfig --target system remove security " +#define CMD_GET_SLICE_SERVICE "systemd-cgls --no-page" \ No newline at end of file diff --git a/source/view/model/load.cc b/source/view/model/load.cc deleted file mode 100644 index 77873dc..0000000 --- a/source/view/model/load.cc +++ /dev/null @@ -1,34 +0,0 @@ -#include "load.h" - -namespace Lib_Load{ - void Load::set_count_error(int count_error) { - process.set_count_error(count_error); - } - string Load::get_cmd_error() { - return process.get_cmd_error(); - } - map& Load::get_load_data(std::map &map_temp, string cmd) { - string response = ""; - string key = ""; - string value = ""; - response = process.call_all_sections(cmd); - vector vec_str_key_value = Utils::split(response, '\n'); - for (const string ¶m: vec_str_key_value) { - if ((param.find("(null)") == std::string::npos) && (param.length() != 0 )) { - if (param.find("=") != std::string::npos) { - size_t index = param.find("="); - key = param.substr(0, index); - value = param.substr(index + 1, param.length()); - Utils::str_replace_all(value, " \"",""); - Utils::str_replace_all(value, "\"",""); - map_temp[key] = value; - } - } - } - return map_temp; - } - int Load::get_count_error() { - return process.get_count_error(); - } - -} \ No newline at end of file diff --git a/source/view/model/load.h b/source/view/model/load.h deleted file mode 100644 index b4d4a38..0000000 --- a/source/view/model/load.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef LOAD_H -#define LOAD_H - -#include "my_process.h" -namespace Lib_Load{ - class Load { - - private: - string sections; - My_Process::My_Process_call process = My_Process::My_Process_call(); - public: - int get_count_error(); - void set_count_error(int count_error); - string get_cmd_error(); - map& get_load_data(std::map &map_temp, string str_flag_load); - }; - - -} -#endif \ No newline at end of file diff --git a/source/view/model/my_process.cc b/source/view/model/my_process.cc deleted file mode 100644 index 658afd5..0000000 --- a/source/view/model/my_process.cc +++ /dev/null @@ -1,84 +0,0 @@ -#include "my_process.h" -#include "util.h" - -namespace My_Process { -#define debug false -struct Utils::Result My_Process_call::call(string cmd) { - this->i_error_old = this->i_error; - struct Utils::Result obj_result; - string response = Utils::call(cmd); - obj_result.response = response; - if ((response.find("(null)") == std::string::npos) && (response.length() != 0 )) { - if (response.find("=") != std::string::npos) { - if (response.find("\n") != std::string::npos) { - response = response.substr(response.find("=")+1,response.length()); - response = response.substr(0,response.find("\n")); - obj_result.response = response; - obj_result.error = 0; - } - else { - obj_result.error = 1; - this->i_error += 1; - this->log_mess_error(cmd); - } - } - else { - obj_result.error = 2; - this->i_error += 1; - str_cmd_error = cmd; - this->log_mess_error(cmd); - } - } - else { - obj_result.error = 3; - this->i_error += 1; - str_cmd_error = cmd; - this->log_mess_error(cmd); - } - return obj_result; -} - -int My_Process::get_count_error() { - return this->i_error; -} - -void My_Process::set_back_count_error() { - this->i_error = this->i_error_old; -} - -void My_Process_system::call(string cmd, string thread_str = "") { - string cmd_new = cmd + " " + thread_str; - int response_cmd = system(cmd_new.c_str()); - if (response_cmd != 0) { - this->i_error += 1; - } -} - -void My_Process::set_count_error(int count_error) { - this->i_error = count_error; - this->str_cmd_error = ""; -} - -void My_Process::log_mess_error(string) { -} - -string My_Process::get_cmd_error() { - return this->str_cmd_error; -} -string My_Process_call::call_all_sections(string cmd) { - char buffer[PATH_MAX] = {0}; - std::string result = ""; - FILE* pipe = popen(cmd.c_str(), "r"); - if (!pipe) throw std::runtime_error("popen() failed!"); - try { - while (fgets(buffer, sizeof buffer, pipe) != NULL) { - result += buffer; - } - } catch (...) { - pclose(pipe); - throw; - } - pclose(pipe); - return result; -} -} \ No newline at end of file diff --git a/source/view/model/my_process.h b/source/view/model/my_process.h deleted file mode 100644 index 3cc6f81..0000000 --- a/source/view/model/my_process.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef MY_PROCESS_H -#define MY_PROCESS_H - -#include "util.h" -namespace My_Process { -class My_Process { - public: - int i_error = 0; - int i_error_old = 0; - string str_cmd_error = ""; - int get_count_error(); - void set_count_error(int count_error); - void set_back_count_error(); - void log_mess_error(string); - string get_cmd_error(); -}; - - -class My_Process_call: public My_Process { - public: - struct Utils::Result call(string cmd); - string call_all_sections(string cmd); - -}; - -class My_Process_system: public My_Process { - public: - void call(string cmd, string thread_str); - -}; -} -#endif \ No newline at end of file diff --git a/source/view/model/save.cc b/source/view/model/save.cc deleted file mode 100644 index c824093..0000000 --- a/source/view/model/save.cc +++ /dev/null @@ -1,151 +0,0 @@ -#include "save.h" - -namespace Lib_save { - -vector Save::get_error() { - return this->vec_errors; -} - -bool Save::get_state_save() { - return this->flag_no_save; -} - -void Save::set_data_global(std::map &map_global) { - this->map_global = &map_global; -} - -void Save::set_data_local(std::map &map_local) { - this->map_local = &map_local; -} - -void Save::set_data_gui(std::map &map_gui) { - this->map_gui = &map_gui; -} - -bool Save::check_save(string flag_save, string key_name) { - std::map :: iterator iter_map_data; - std::map :: iterator iter_map_data_old; - std::map *map_data_old; - if (flag_save == "system") { - map_data_old = map_local; - } - else if (flag_save == "global") { - map_data_old = map_global; - } - iter_map_data = (*map_gui).find(key_name); - iter_map_data_old = (*map_data_old).find(key_name); - if ((*map_local).find(key_name) != (*map_local).end() && (*map_global).find(key_name) != (*map_global).end()) { - if ((*map_local)[key_name] != (*map_global)[key_name]) { - return true; - } - } - if (iter_map_data_old == (*map_data_old).end() && iter_map_data != (*map_gui).end()) { - return true; - } - else if (iter_map_data->second != iter_map_data_old->second) { - return true; - } - else if (iter_map_data->second.length() == 0 && iter_map_data_old->second.length() == 0) { - return false; - } - else if (iter_map_data->second == iter_map_data_old->second) { - return false; - } - else { - return true; - } - return true; -} - -int Save::get_count_error() { - return process.get_count_error(); -} - -string Save::get_cmd_error() { - return process.get_cmd_error(); -} - -void Save::set_count_error(int count_error) { - process.set_count_error(count_error); -} - -void Save::set_vec_params(vector& vec_param_names) { - this->vec_param_names = &vec_param_names; -} - -void Save::save(string sections, string str_flag_save) { - string key = ""; - string value = ""; - string cmd = ""; - string str_error = ""; - this->flag_no_save = true; - for (const auto &key: *vec_param_names) { - if (map_gui->find(key) != map_gui->end()) { - value = (*map_gui)[key]; - if (this->check_save(str_flag_save, key)) { - if (value.length() != 0) { - cmd = "ubconfig --target " + str_flag_save + " set " + sections + " " + - key + "=\"" + value + "\""; - } - else if (value.length() == 0) { - cmd = "ubconfig --target " + str_flag_save + " remove " + sections + " " + key; - } - else { - cmd = ""; - } - if (cmd.length() != 0) { - process.call(cmd, ""); - this->flag_no_save = false; - str_error = process.get_cmd_error(); - if (str_error.length() != 0) { - this->vec_errors.push_back(str_error); - str_error = ""; - } - } - } - } - - } -} -void Save::save_one_cmd(string cmd1, string cmd_remove, string str_flag_save) { - string key = ""; - string value = ""; - string cmd = ""; - this->flag_no_save = true; - cmd = cmd1; - string remove = cmd_remove; - for (const auto &key: *vec_param_names) { - if (map_gui->find(key) != map_gui->end()) { - value = (*map_gui)[key]; - if (this->check_save(str_flag_save, key)) { - if (value.length() != 0) { - cmd = cmd + key + "=\"" + value + "\" "; - } - else if (value.length() == 0) { - remove = remove + key + " "; - } - - } - } - } - if (cmd.length() != cmd1.length()) { - this->template_save(cmd); - } - if (cmd_remove.length() != remove.length()) { - this->template_save(remove); - } -} - -void Save::template_save(string cmd) { - string str_error = ""; - process.call(cmd, ""); - this->flag_no_save = false; - str_error = process.get_cmd_error(); - if (str_error.length() != 0) { - this->vec_errors.push_back(str_error); - str_error = ""; - } - -} - -} diff --git a/source/view/model/save.h b/source/view/model/save.h deleted file mode 100644 index d6c8c04..0000000 --- a/source/view/model/save.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef MY_SAVE_H -#define MY_SAVE_H - -#include "my_process.h" -namespace Lib_save { - -class Save { -private: - std::map *map_global; - std::map *map_local; - std::map *map_gui; - vector vec_errors; - vector* vec_param_names; - My_Process::My_Process_system process = My_Process::My_Process_system(); - bool flag_no_save; - void template_save(string cmd); -public: - void set_data_global(std::map &map_global); - void set_data_local(std::map &map_local); - void set_data_gui(std::map &map_gui); - bool check_save(string flag_save, string key_name); - bool get_state_save(); - - void save_one_cmd(string cmd1, string cmd_remove, string str_flag_save); - int get_count_error(); - string get_cmd_error(); - void set_count_error(int count_error); - void set_vec_params(vector& vec_param_names); - void save(string sections, string str_flag_save) ; - vector get_error(); -}; -} -#endif \ No newline at end of file diff --git a/source/view/model/util.cc b/source/view/model/util.cc deleted file mode 100644 index c3cd4c6..0000000 --- a/source/view/model/util.cc +++ /dev/null @@ -1,252 +0,0 @@ -#include "util.h" -#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) -namespace Utils { - -string format_str_size(int num, int index) { - string value = ""; - value = to_string(num); - if (num == 0) { - return value; - } - if (index == 1) { - value += "M"; - } - else if (index == 2) { - value += "G"; - } - else if (index == 3) { - value += "T"; - } - return value; -} - -array, 5> read_csv(const string& filename) { - array, 5> array_vectors; - vector vec_option; - vector vec_opcision; - ifstream file(filename); - string line; - char delimiter = ','; - getline(file, line); - while (getline(file, line)) { - stringstream stream(line); - string option; - string opcision; - getline(stream, option, delimiter); - string line_local = stream.str(); - if (line_local.find("\"") != string::npos) { - string str_delimiter = "\""; - vector point = find_all(line_local, str_delimiter); - size_t len = point.size(); - if (len >= 2) { - int index_start = point[len-2]; - int index_end = point[len-1]; - opcision = line_local.substr(index_start, index_end); - index_end = opcision.find("\""); - if (opcision.find("\"") != string::npos) { - opcision.replace(index_end, opcision.length(), ""); - } - - } - else { - opcision = "error"; - } - - - } - else{ - getline(stream, opcision, delimiter); - } - - - vec_option.push_back(option); - vec_opcision.push_back(opcision); - } - - array_vectors[0] = vec_option; - array_vectors[1] = vec_opcision; - return array_vectors; -} - -string call(string cmd) { - FILE *fp; - int status; - char path[PATH_MAX] = {0}; - fp = popen(cmd.c_str(), "r"); - if (fp == NULL) { - exit(1); - } - while (fgets(path, PATH_MAX, fp) != NULL) { - break; - } - status = pclose(fp); - if (status == -1) { - exit(1); - } - return path; -} - -vector find_all(string &str_ntp, string substr) { - size_t index = 0; - vector sub_index; - while ((index = str_ntp.find(substr, index)) != std::string::npos) { - index += substr.length(); - sub_index.push_back(index); - } - return sub_index; -} - -void str_remove(std::string& source, std::string to_remove) { - string::size_type n = to_remove.length(); - for (string::size_type i = source.find(to_remove); - i != string::npos; - i = source.find(to_remove)) - source.erase(i, n); -} - -void str_replace_all(std::string& str_base, string str_find, string sReplacement) -{ - size_t pos = 0, fpos; - while ((fpos = str_base.find(str_find, pos)) != std::string::npos) - { - str_base.replace(fpos, str_find.size(), sReplacement); - pos = fpos + sReplacement.size(); - } -} -std::vector split(std::string text, char delim) { - std::string line; - std::vector vec; - std::stringstream ss(text); - while(std::getline(ss, line, delim)) { - vec.push_back(line); - } - return vec; -} - -int synopsis_show(string str_link) { - // gettext("https://wiki.ublinux.com/ru/Программное_обеспечение/Программы_и_утилиты/Все/") - string cmd = "xdg-open " + str_link; - if (geteuid() == 0) { - string response_user = getlogin(); - cmd = "su -l " + response_user + " -c \" DISPLAY=$DISPLAY " + cmd + " \""; - } - return system(cmd.c_str()); -} - -string file_read(string filename) { - string line; - string buffer; - std::ifstream in(filename); // окрываем файл для чтения - if (in.is_open()) - { - while (getline(in, line)) - { - buffer += line; - } - } - return buffer; -} - -unsigned short read_uid_min_max(string filename, string search) { - std::string line; - int uid = 0; - string remove_tab = "\t"; - string remove_space = " "; - std::ifstream in(filename); // окрываем файл для чтения - if (in.is_open()){ - while (getline(in, line)){ - try{ - if (line.find(search) != string::npos && (line.find("SYS_"+search) == string::npos)) { - Utils::str_remove(line, search); - Utils::str_remove(line, remove_space); - Utils::str_remove(line, remove_tab); - uid = atoi(line.c_str()); - } - } - catch (int x) { - if (search == "UID_MIN"){ - uid = 1000; - } - else{ - uid = 65534; - } - - } - - } - } - else{ - if (search == "UID_MIN") { - uid = 1000; - } - else{ - uid = 65534; - } - } - in.close(); - return uid; - -} - -vector pars_users() { - unsigned short uid_min = Utils::read_uid_min_max(file_source_login_min_max, "UID_MIN"); - unsigned short uid_max = Utils::read_uid_min_max(file_source_login_min_max, "UID_MAX"); - vector vec_user; - while (true) { - errno = 0; - passwd* entry = getpwent(); - if (!entry) { - if (errno) { - break; - } - break; - } - if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) { - vec_user.push_back(entry->pw_name); - } - } - endpwent(); - return vec_user; -} - -vector list_groups() { - string str_uid_min = "UID_MIN"; - string str_uid_max = "UID_MAX"; - unsigned short uid_min = Utils::read_uid_min_max(file_source_login_min_max, "UID_MIN"); - unsigned short uid_max = Utils::read_uid_min_max(file_source_login_min_max, "UID_MAX"); - vector str_users; - while (1) { - errno = 0; - struct passwd* entry = getpwent(); - if (!entry) { - if (errno) { - return str_users; - } - break; - } - if ((entry->pw_uid >= uid_min && entry->pw_uid < uid_max) || entry->pw_uid == 0) { - str_users.push_back(entry->pw_name); - } - } - endpwent(); - return str_users; -} - -vector pars_group() { - vector vec_group; - while (true) { - errno = 0; // so we can distinguish errors from no more entries - passwd* entry = getpwent(); - if (!entry) { - if (errno) { - std::cerr << "Error reading password database\n"; - break; - } - break; - } - vec_group.push_back(entry->pw_name); - } - endpwent(); - return vec_group; -} -} \ No newline at end of file diff --git a/source/view/model/util.h b/source/view/model/util.h deleted file mode 100644 index b93db49..0000000 --- a/source/view/model/util.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef UTIL_H -#define UTIL_H -#include "../../project_lib.h" - -using namespace std; - -namespace Utils { -#define file_source_login_min_max "/etc/login.defs" -template -struct Result{ - Type response; - int error; -}; - -struct Passwd { - string user; - int uid; -}; - -string format_str_size(int num, int index); -std::array, 5> read_csv(const std::string& filename); -std::string call(std::string cmd); -vector find_all(string &str_ntp, string substr); -void str_remove(std::string& source, std::string to_remove); -void str_replace_all(string &str_base, string str_find, string str_replace); -std::vector split(std::string text, char delim); -vector pars_users(); -int synopsis_show(string str_link); -string file_read(string filename); -unsigned short read_uid_min_max(string filename, string search); -vector pars_users(); -vector pars_group(); -vector list_groups(); -} -#endif \ No newline at end of file diff --git a/source/view/model/wrapper_load_save.cc b/source/view/model/wrapper_load_save.cc deleted file mode 100644 index 5988735..0000000 --- a/source/view/model/wrapper_load_save.cc +++ /dev/null @@ -1,133 +0,0 @@ -#include "wrapper_load_save.h" - - - -Wrapper_load_save::Wrapper_load_save(/* args */) { - //obj_quotas_sys.set_map_gui(map_gui_cfg); - //obj_quotas_ubconfig.set_map_gui(map_gui_cfg); -} - -Wrapper_load_save::~Wrapper_load_save() -{ -} - -void Wrapper_load_save::set_map_gui(map_str_str* map_gui_cfg) { - this->map_gui_cfg = map_gui_cfg; -} - -void Wrapper_load_save::set_map_global(map_str_str* map_global_cfg) { - this->map_global_cfg = map_global_cfg; -} - -void Wrapper_load_save::set_map_local(map_str_str* map_system_cfg) { - this->map_system_cfg = map_system_cfg; -} - -void Wrapper_load_save::set_vec_key(vector vec_param_names) { - this->vec_param_names = vec_param_names; -} - -int Wrapper_load_save::load_global_cfg() { - this->load_template(map_global_cfg, global_load); - *map_gui_cfg = *map_global_cfg; - return 1; - -} - -int Wrapper_load_save::load_system_cfg() { - this->load_template(map_system_cfg, system_load); - *map_gui_cfg = *map_system_cfg; - return 0; - -} - -void Wrapper_load_save::load_template(map_str_str* map_temp, string cmd) { - if (cmd.find("system") != string::npos) { - this->init_dict("system"); - } - else { - this->init_dict("global"); - } - *map_temp = obj_load.get_load_data(*map_temp, cmd); -} - -int Wrapper_load_save::wrapper_save_global_cfg() { - this->set_data_cfg(); - if (this->save_template("boot", "global")) { - *map_global_cfg = *map_gui_cfg; - return 5; - } - else { - *map_global_cfg = *map_gui_cfg; - return 3; - } -} - -int Wrapper_load_save::wrapper_save_system_cfg() { - this->set_data_cfg(); - if (this->save_template("boot", "system")) { - *map_system_cfg = *map_gui_cfg; - return 5; - } - else { - *map_system_cfg = *map_gui_cfg; - return 2; - } - -} - - -int Wrapper_load_save::wrapper_save_all_cfg() { - this->set_data_cfg(); - bool _flag_save_global = this->save_template("boot", "global");; - bool _flag_save_local = this->save_template("boot", "system"); - if (_flag_save_global && _flag_save_local) { - *map_global_cfg = *map_gui_cfg; - *map_system_cfg = *map_gui_cfg; - return 5; - } - else { - *map_global_cfg = *map_gui_cfg; - *map_system_cfg = *map_gui_cfg; - return 4; - } - - -} - -int Wrapper_load_save::get_error_load() { - return obj_load.get_count_error(); -} -int Wrapper_load_save::get_error_save() { - return obj_save.get_count_error(); -} - -bool Wrapper_load_save::save_template(string section, string flag_save) { - bool flag_no_save = true; - obj_save.set_data_local(*map_system_cfg); - obj_save.set_data_global(*map_global_cfg); - obj_save.set_data_gui(*map_gui_cfg); - obj_save.set_vec_params(vec_param_names); - obj_save.save(section, flag_save); - vector obj_vec_error = obj_save.get_error(); - flag_no_save = obj_save.get_state_save(); - return flag_no_save; -} - -void Wrapper_load_save::init_dict(string flag_load) { - map_str_str map_gui_cfg_n; - map_gui_cfg_n[""] = ""; - - *map_gui_cfg = map_gui_cfg_n; - if (flag_load == "global") { - *map_global_cfg = *map_gui_cfg; - } - else if (flag_load == "system") { - *map_system_cfg = *map_gui_cfg; - } -} - -void Wrapper_load_save::set_data_cfg() { - // TODO: - // Написать функцию -} \ No newline at end of file diff --git a/source/view/model/wrapper_load_save.h b/source/view/model/wrapper_load_save.h deleted file mode 100644 index 5562ff4..0000000 --- a/source/view/model/wrapper_load_save.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef WRAPPER_LOAD_SAVE_H -#define WRAPPER_LOAD_SAVE_H -#include "../../my_type.h" -#include "../../project_lib.h" -#include "load.h" -#include "save.h" -#include "my_process.h" -#include "util.h" -#define global_load "ubconfig --default --source global get boot" -#define system_load "ubconfig --default --source system get boot" -#define global_save "ubconfig --target global --noexecute set boot " -#define system_save "ubconfig --target system set boot " -#define all_save "ubconfig set boot " -#define all_remove "ubconfig set/remove boot " -#define global_remove "ubconfig --target global --noexecute set/remove boot " -#define system_remove "ubconfig --target system --noexecute set/remove boot " - - - -class Wrapper_load_save { -private: - string str_cmd_error; -private: - map_str_str* map_gui_cfg = NULL; - map_str_str* map_global_cfg = NULL; - map_str_str* map_system_cfg = NULL; - vector vec_param_names; - My_Process::My_Process_system obj_process_system = My_Process::My_Process_system(); - My_Process::My_Process_call obj_process_call = My_Process::My_Process_call(); - Lib_save::Save obj_save = Lib_save::Save(); - Lib_Load::Load obj_load = Lib_Load::Load(); -public: - Wrapper_load_save(/* args */); - ~Wrapper_load_save(); - int load_global_cfg(); - int load_system_cfg(); - int wrapper_save_system_cfg(); - int wrapper_save_global_cfg(); - int wrapper_save_all_cfg(); - int get_error_load(); - int get_error_save(); - void set_map_gui(map_str_str* map_gui_cfg); - void set_map_global(map_str_str* map_global_cfg); - void set_map_local(map_str_str* map_system_cfg); - void set_vec_key(vector vec_param_names); -private: - void load_template(map_str_str* map_temp, string cmd); - void init_dict(string flag_load); - void set_data_cfg(); - bool save_template(string section, string flag_save); - -}; - - -#endif \ No newline at end of file diff --git a/source/view/view_add_project.cc b/source/view/view_add_project.cc deleted file mode 100644 index b0a08e1..0000000 --- a/source/view/view_add_project.cc +++ /dev/null @@ -1,141 +0,0 @@ -#include "view_add_project.h" -#include - -View_add_project::View_add_project(/* args */) { - builder = Gtk::Builder::create_from_file(path_glade); - this->setting(); -} - -View_add_project::~View_add_project() -{ -} - -void View_add_project::setting() { - this->get_builder(); - this->lacalization(); - check_limit(quotegroupSizeSoftLimitCheckProject - ,quotegroupSizeSoftLimitSpinProject - ,quotegroupSizeSoftLimitComboProject); - check_limit(quotegroupSizeHardLimitCheckProject - ,quotegroupSizeHardLimitSpin1 - ,quotegroupSizeHardLimitComboProject); - check_limit(quotegroupFilesSoftLimitCheckProject - ,quotegroupFilesSoftLimitSpinProject - ,quotegroupFilesSoftLimitlabelProject); - check_limit(quotegroupFilesHardLimitCheckProject - ,quotegroupFilesHardLimitSpinProject - ,quotegroupFilesHarLimitLabelProject); - this->event(); - // ector vec_user = pars_users(); - -} - -void View_add_project::load_combo_box_UGP(vector vec_UGP) { - cmbSetNameUGP->remove_all(); - for (auto& iter: vec_UGP) { - cmbSetNameUGP->append(iter); - } -} - -void View_add_project::event() { - quotegroupSizeSoftLimitCheckProject->signal_toggled().connect([&]() { - check_limit(quotegroupSizeSoftLimitCheckProject - ,quotegroupSizeSoftLimitSpinProject - ,quotegroupSizeSoftLimitComboProject); - }); - quotegroupSizeHardLimitCheckProject->signal_toggled().connect([&]() { - check_limit(quotegroupSizeHardLimitCheckProject - ,quotegroupSizeHardLimitSpin1 - ,quotegroupSizeHardLimitComboProject); - }); - quotegroupFilesSoftLimitCheckProject->signal_toggled().connect([&]() { - check_limit(quotegroupFilesSoftLimitCheckProject - ,quotegroupFilesSoftLimitSpinProject - ,quotegroupFilesSoftLimitlabelProject); - }); - quotegroupFilesHardLimitCheckProject->signal_toggled().connect([&]() { - check_limit(quotegroupFilesHardLimitCheckProject - ,quotegroupFilesHardLimitSpinProject - ,quotegroupFilesHarLimitLabelProject); - }); - quotegroupCancelButtonAdd->signal_clicked().connect([&]() {this->close_wnd();}); - quotegroupSaveButtonAdd->signal_clicked().connect([&]() {this->save();}); - btnReviewProject->signal_clicked().connect([&]() {show_file_manager();}); - btnFilemangerOk->signal_clicked().connect([&]() {save_file_manager();}); - btnFilemangerExit->signal_clicked().connect([&]() {wndChooseFileWallpaper->hide();}); -} - -void View_add_project::show_file_manager() { - wndChooseFileWallpaper->set_current_folder(open_dir_file_manager); - wndChooseFileWallpaper->show(); -} - -void View_add_project::save_file_manager() { - entryCatalogProject->set_text(wndChooseFileWallpaper->get_filename()); - wndChooseFileWallpaper->hide(); -} -void View_add_project::close_wnd() { - wndQuotasAddProject->hide(); -} - -void View_add_project::save() { - wndQuotasAddProject->hide(); -} - -void View_add_project::show() { - wndQuotasAddProject->show(); -} - -void View_add_project::lacalization() { - -} - -void View_add_project::get_builder() { - builder->get_widget("wndQuotasAddProject", wndQuotasAddProject); - builder->get_widget("quotegroupSizeFrameLabelProject", quotegroupSizeFrameLabelProject); - builder->get_widget("quotegroupFilesFrameLabelProject", quotegroupFilesFrameLabelProject); - builder->get_widget("quotegroupSizeCurrentlyLabelProject", quotegroupSizeCurrentlyLabelProject); - builder->get_widget("quotegroupFilesCurrentlyLabelProject", quotegroupFilesCurrentlyLabelProject); - builder->get_widget("quotegroupSizeSoftLimitLabelProject", quotegroupSizeSoftLimitLabelProject); - builder->get_widget("quotegroupFilesSoftLimitLabelProject", quotegroupFilesSoftLimitLabelProject); - builder->get_widget("quoteSizeHardLimitLabelProject", quoteSizeHardLimitLabelProject); - builder->get_widget("quoteFilesHardLimitLabelProject", quoteFilesHardLimitLabelProject); - builder->get_widget("quotegroupFilesSoftLimitlabelProject", quotegroupFilesSoftLimitlabelProject); - builder->get_widget("quotegroupFilesHarLimitLabelProject", quotegroupFilesHarLimitLabelProject); - builder->get_widget("quotegroupCancelButtonAdd", quotegroupCancelButtonAdd); - builder->get_widget("quotegroupSaveButtonAdd", quotegroupSaveButtonAdd); - builder->get_widget("lblDeviceProject", lblDeviceProject); - builder->get_widget("lblStatusQuotaProject", lblStatusQuotaProject); - builder->get_widget("lblCatalogProject", lblCatalogProject); - builder->get_widget("lblProjectId", lblProjectId); - builder->get_widget("lblProjectName", lblProjectName); - builder->get_widget("btnReviewProject", btnReviewProject); - builder->get_widget("btnGenerateProject", btnGenerateProject); - builder->get_widget("chbAuto", chbAuto); - builder->get_widget("entryCatalogProject", entryCatalogProject); - builder->get_widget("entryProjectId", entryProjectId); - builder->get_widget("entryProjectName", entryProjectName); - builder->get_widget("quotegroupSizeSoftLimitCheckProject", quotegroupSizeSoftLimitCheckProject); - builder->get_widget("quotegroupSizeHardLimitCheckProject", quotegroupSizeHardLimitCheckProject); - builder->get_widget("quotegroupFilesSoftLimitCheckProject", quotegroupFilesSoftLimitCheckProject); - builder->get_widget("quotegroupFilesHardLimitCheckProject", quotegroupFilesHardLimitCheckProject); - builder->get_widget("quotegroupSizeSoftLimitSpinProject", quotegroupSizeSoftLimitSpinProject); - builder->get_widget("quotegroupSizeHardLimitSpin1", quotegroupSizeHardLimitSpin1); - builder->get_widget("quotegroupFilesSoftLimitSpinProject", quotegroupFilesSoftLimitSpinProject); - builder->get_widget("quotegroupFilesHardLimitSpinProject", quotegroupFilesHardLimitSpinProject); - builder->get_widget("quotegroupSizeSoftLimitComboProject", quotegroupSizeSoftLimitComboProject); - builder->get_widget("quotegroupSizeHardLimitComboProject", quotegroupSizeHardLimitComboProject); - builder->get_widget("wndChooseFileWallpaper", wndChooseFileWallpaper); - builder->get_widget("btnFilemangerExit", btnFilemangerExit); - builder->get_widget("btnFilemangerOk", btnFilemangerOk); -} - -void View_add_project::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} -void View_add_project::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} - diff --git a/source/view/view_add_project.h b/source/view/view_add_project.h deleted file mode 100644 index ae8a079..0000000 --- a/source/view/view_add_project.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef VIEW_ADD_PROJECT_H -#define VIEW_ADD_PROJECT_H -#include "../project_lib.h" -#include "model/util.h" -#include "../var.h" -class View_add_project -{ -private: - Glib::RefPtr builder; - Gtk::Window* wndQuotasAddProject; - Gtk::Label* quotegroupSizeFrameLabelProject; - Gtk::Label* quotegroupFilesFrameLabelProject; - Gtk::Label* quotegroupSizeCurrentlyLabelProject; - Gtk::Label* quotegroupFilesCurrentlyLabelProject; - Gtk::Label* quotegroupSizeSoftLimitLabelProject; - Gtk::Label* quotegroupFilesSoftLimitLabelProject; - Gtk::Label* quoteSizeHardLimitLabelProject; - Gtk::Label* quoteFilesHardLimitLabelProject; - Gtk::Label* quotegroupFilesSoftLimitlabelProject; - Gtk::Label* quotegroupFilesHarLimitLabelProject; - Gtk::Label* lblDeviceProject; - Gtk::Label* lblStatusQuotaProject; - Gtk::Label* lblCatalogProject; - Gtk::Label* lblProjectId; - Gtk::Label* lblProjectName; - Gtk::Button* quotegroupCancelButtonAdd; - Gtk::Button* quotegroupSaveButtonAdd; - Gtk::Button* btnReviewProject; - Gtk::Button* btnGenerateProject; - Gtk::Entry* entryCatalogProject; - Gtk::Entry* entryProjectId; - Gtk::Entry* entryProjectName; - Gtk::CheckButton* chbAuto; - Gtk::CheckButton* quotegroupSizeSoftLimitCheckProject; - Gtk::CheckButton* quotegroupSizeHardLimitCheckProject; - Gtk::CheckButton* quotegroupFilesSoftLimitCheckProject; - Gtk::CheckButton* quotegroupFilesHardLimitCheckProject; - Gtk::SpinButton* quotegroupSizeSoftLimitSpinProject; - Gtk::SpinButton* quotegroupSizeHardLimitSpin1; - Gtk::SpinButton* quotegroupFilesSoftLimitSpinProject; - Gtk::SpinButton* quotegroupFilesHardLimitSpinProject; - Gtk::ComboBoxText* quotegroupSizeSoftLimitComboProject; - Gtk::ComboBoxText* quotegroupSizeHardLimitComboProject; - Gtk::FileChooserDialog* wndChooseFileWallpaper; - Gtk::Button* btnFilemangerOk; - Gtk::Button* btnFilemangerExit; - Gtk::ComboBoxText* cmbSetNameUGP; - -public: - View_add_project(/* args */); - ~View_add_project(); - void setting(); - void lacalization(); - void event(); - void show(); - void close_wnd(); - void save(); - void get_builder(); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box); - void show_file_manager(); - void save_file_manager(); - void load_combo_box_UGP(vector vec_UGP); -}; - - - - -#endif \ No newline at end of file diff --git a/source/view/view_add_user_group.cc b/source/view/view_add_user_group.cc deleted file mode 100644 index c70f838..0000000 --- a/source/view/view_add_user_group.cc +++ /dev/null @@ -1,118 +0,0 @@ -#include "view_add_user_group.h" - - -View_add_user_group::View_add_user_group(/* args */) { - builder = Gtk::Builder::create_from_file(path_glade); - this->settings(); -} - -View_add_user_group::~View_add_user_group() { -} - -void View_add_user_group::settings() { - this->get_builder(); - this->lacalization(); - check_limit(quotegroupSizeSoftLimitCheck - ,quotegroupSizeSoftLimitSpin - ,quotegroupSizeSoftLimitCombo); - check_limit(quotegroupSizeHardLimitCheck - ,quotegroupSizeHardLimitSpin - ,quotegroupSizeHardLimitCombo); - check_limit(quotegroupFilesSoftLimitCheck - ,quotegroupFilesSoftLimitSpin - ,quotegroupFilesSoftLimitlabel); - check_limit(quotegroupFilesHardLimitCheck - ,quotegroupFilesHardLimitSpin - ,quotegroupFilesHarLimitLabel); - this->event(); -} - -void View_add_user_group::event() { - quotegroupCancelButton->signal_clicked().connect([&]() {QuotasEditWindow->hide();}); - quotegroupSaveButton->signal_clicked().connect([&]() {}); - quotegroupSizeSoftLimitCheck->signal_toggled().connect([&]() { - check_limit(quotegroupSizeSoftLimitCheck - ,quotegroupSizeSoftLimitSpin - ,quotegroupSizeSoftLimitCombo); - }); - quotegroupSizeHardLimitCheck->signal_toggled().connect([&]() { - check_limit(quotegroupSizeHardLimitCheck - ,quotegroupSizeHardLimitSpin - ,quotegroupSizeHardLimitCombo); - }); - quotegroupFilesSoftLimitCheck->signal_toggled().connect([&]() { - check_limit(quotegroupFilesSoftLimitCheck - ,quotegroupFilesSoftLimitSpin - ,quotegroupFilesSoftLimitlabel); - }); - quotegroupFilesHardLimitCheck->signal_toggled().connect([&]() { - check_limit(quotegroupFilesHardLimitCheck - ,quotegroupFilesHardLimitSpin - ,quotegroupFilesHarLimitLabel); - }); - -} - -void View_add_user_group::get_builder() { - builder->get_widget("lblSetDevice", lblSetDevice); - builder->get_widget("lblQuotasStatus", lblQuotasStatus); - builder->get_widget("lblSetUGP", lblSetUGP); - builder->get_widget("lblSetNameDevice", lblSetNameDevice); - builder->get_widget("lblSetQuotasStatus", lblSetQuotasStatus); - builder->get_widget("cmbSetNameUGP", cmbSetNameUGP); - builder->get_widget("quotegroupSizeFrameLabel", quotegroupSizeFrameLabel); - builder->get_widget("quotegroupFilesFrameLabel", quotegroupFilesFrameLabel); - builder->get_widget("quotegroupSizeCurrentlyLabel", quotegroupSizeCurrentlyLabel); - builder->get_widget("quotegroupFilesCurrentlyLabel", quotegroupFilesCurrentlyLabel); - builder->get_widget("quotegroupSizeSoftLimitLabel", quotegroupSizeSoftLimitLabel); - builder->get_widget("quoteSizeHardLimitLabel", quoteSizeHardLimitLabel); - builder->get_widget("quotegroupFilesSoftLimitLabel", quotegroupFilesSoftLimitLabel); - builder->get_widget("quoteFilesHardLimitLabel", quoteFilesHardLimitLabel); - builder->get_widget("quotegroupFilesHarLimitLabel", quotegroupFilesHarLimitLabel); - builder->get_widget("QuotasEditWindow", QuotasEditWindow); - builder->get_widget("lblHeadQuotasEditWindow", lblHeadQuotasEditWindow); - builder->get_widget("quotegroupCancelButton", quotegroupCancelButton); - builder->get_widget("quotegroupSaveButton", quotegroupSaveButton); - builder->get_widget("quotegroupSizeSoftLimitSpin", quotegroupSizeSoftLimitSpin); - builder->get_widget("quotegroupSizeHardLimitSpin", quotegroupSizeHardLimitSpin); - builder->get_widget("quotegroupFilesSoftLimitSpin", quotegroupFilesSoftLimitSpin); - builder->get_widget("quotegroupFilesHardLimitSpin", quotegroupFilesHardLimitSpin); - builder->get_widget("quotegroupFilesSoftLimitlabel", quotegroupFilesSoftLimitlabel); - builder->get_widget("quotegroupSizeSoftLimitCombo", quotegroupSizeSoftLimitCombo); - builder->get_widget("quotegroupSizeHardLimitCombo", quotegroupSizeHardLimitCombo); - builder->get_widget("quotegroupSizeSoftLimitCheck", quotegroupSizeSoftLimitCheck); - builder->get_widget("quotegroupSizeHardLimitCheck", quotegroupSizeHardLimitCheck); - builder->get_widget("quotegroupFilesSoftLimitCheck", quotegroupFilesSoftLimitCheck); - builder->get_widget("quotegroupFilesHardLimitCheck", quotegroupFilesHardLimitCheck); - -} - -void View_add_user_group::show() { - QuotasEditWindow->show(); -} - -void View_add_user_group::lacalization() { - this->fill_in_pow_memory(quotegroupSizeSoftLimitCombo); - this->fill_in_pow_memory(quotegroupSizeHardLimitCombo); - -} - -void View_add_user_group::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} -void View_add_user_group::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} - -void View_add_user_group::fill_in_pow_memory(Gtk::ComboBoxText *cb_text) { - cb_text->append(str_prefix_KB); - cb_text->append(str_prefix_MB); - cb_text->append(str_prefix_GB); - cb_text->append(str_prefix_TB); -} - -void View_add_user_group::set_label_type_quota(string name) { - lblSetUGP->set_text(name); -} diff --git a/source/view/view_add_user_group.h b/source/view/view_add_user_group.h deleted file mode 100644 index 27a4b99..0000000 --- a/source/view/view_add_user_group.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef VIEW_SET_USER_GROUP_H -#define VIEW_SET_USER_GROUP_H -#include "../project_lib.h" -#include "../var.h" - -using namespace std; -class View_add_user_group -{ -private: - string str_path_glade; -private: - Glib::RefPtr builder; - Gtk::Label* lblSetDevice; - Gtk::Label* lblQuotasStatus; - Gtk::Label* lblSetUGP; - Gtk::Label* lblSetNameDevice; - Gtk::Label* lblSetQuotasStatus; - Gtk::ComboBoxText* cmbSetNameUGP; - Gtk::Label *quotegroupSizeFrameLabel; - Gtk::Label *quotegroupSizeCurrentlyLabel; - Gtk::Label *quoteSizeHardLimitLabel; - Gtk::Label *quotegroupFilesFrameLabel; - Gtk::Label *quotegroupFilesCurrentlyLabel; - Gtk::Label *quotegroupFilesSoftLimitLabel; - Gtk::Label *quoteFilesHardLimitLabel; - Gtk::Label *quotegroupFilesHarLimitLabel; - Gtk::Label *quotegroupSizeSoftLimitLabel; - Gtk::Window *QuotasEditWindow; - Gtk::Label *lblHeadQuotasEditWindow; - Gtk::Button *quotegroupCancelButton; - Gtk::Button *quotegroupSaveButton; - Gtk::SpinButton *quotegroupSizeSoftLimitSpin; - Gtk::SpinButton *quotegroupSizeHardLimitSpin; - Gtk::SpinButton *quotegroupFilesSoftLimitSpin; - Gtk::SpinButton *quotegroupFilesHardLimitSpin; - Gtk::Label *quotegroupFilesSoftLimitlabel; - Gtk::ComboBoxText *quotegroupSizeSoftLimitCombo; - Gtk::ComboBoxText *quotegroupSizeHardLimitCombo; - Gtk::CheckButton *quotegroupSizeSoftLimitCheck; - Gtk::CheckButton *quotegroupSizeHardLimitCheck; - Gtk::CheckButton *quotegroupFilesSoftLimitCheck; - Gtk::CheckButton *quotegroupFilesHardLimitCheck; -public: - View_add_user_group(/* args */); - ~View_add_user_group(); - void lacalization(); - void event(); - void get_builder(); - void settings(); - void show(); - void set_path_glade(string str_path_glade); - void set_label_type_quota(string name); -private: - void set_change_gui(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate, Gtk::ComboBoxText *combo_box); - void fill_in_pow_memory(Gtk::ComboBoxText *cb_text); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box); - void edit_tree_view_U(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate); - void edit_tree_view_G(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate); - void edit_tree_view_P(Glib::RefPtr* list_store, const Gtk::TreeModel::iterator* iter, bool& flag_validate); -}; - -#endif \ No newline at end of file diff --git a/source/view/view_edit_project.cc b/source/view/view_edit_project.cc deleted file mode 100644 index 5d7d579..0000000 --- a/source/view/view_edit_project.cc +++ /dev/null @@ -1,116 +0,0 @@ -#include "view_edit_project.h" - -View_edit_project::View_edit_project(/* args */) { - builder = Gtk::Builder::create_from_file(path_glade); - this->setting(); -} - -View_edit_project::~View_edit_project() -{ -} - -void View_edit_project::setting() { - this->get_builder(); - this->lacalization(); - check_limit(quoteSizeSoftLimitCheckProjectEdit - ,quoteSizeSoftLimitSpinProjectEdit - ,quoteSizeSoftLimitComboProjectEdit); - check_limit(quoteSizeHardLimitCheckProjectEdit - ,quoteSizeHardLimitSpinEdit - ,quoteSizeHardLimitComboProjectEdit); - check_limit(quoteFilesSoftLimitCheckProjectEdit - ,quoteFilesSoftLimitSpinProjectEdit - ,quoteFilesProjectEdit); - check_limit(quoteFilesHardLimitCheckProjectEdit - ,quoteFilesHardLimitSpinProjectEdit - ,quoteFiles1ProjectEdit); - this->event(); -} - -void View_edit_project::event() { - - quoteCancelButtonEdit->signal_clicked().connect([&]() {this->close_wnd();}); - quoteSaveButtonEdit->signal_clicked().connect([&]() {this->save();}); - quoteSizeSoftLimitCheckProjectEdit->signal_toggled().connect([&]() { - check_limit(quoteSizeSoftLimitCheckProjectEdit - ,quoteSizeSoftLimitSpinProjectEdit - ,quoteSizeSoftLimitComboProjectEdit); - }); - quoteSizeHardLimitCheckProjectEdit->signal_toggled().connect([&]() { - check_limit(quoteSizeHardLimitCheckProjectEdit - ,quoteSizeHardLimitSpinEdit - ,quoteSizeHardLimitComboProjectEdit); - }); - quoteFilesSoftLimitCheckProjectEdit->signal_toggled().connect([&]() { - check_limit(quoteFilesSoftLimitCheckProjectEdit - ,quoteFilesSoftLimitSpinProjectEdit - ,quoteFilesProjectEdit); - }); - quoteFilesSoftLimitCheckProjectEdit->signal_toggled().connect([&]() { - check_limit(quoteFilesSoftLimitCheckProjectEdit - ,quoteFilesHardLimitSpinProjectEdit - ,quoteFiles1ProjectEdit); - }); -} - -void View_edit_project::close_wnd() { - wndQuotasEditProject->hide(); -} - -void View_edit_project::save() { - wndQuotasEditProject->hide(); -} - -void View_edit_project::show() { - wndQuotasEditProject->show(); -} - -void View_edit_project::get_builder() { - builder->get_widget("lblDeviceProjectEdit", lblDeviceProjectEdit); - builder->get_widget("lblEditDeviceProjectValue", lblEditDeviceProjectValue); - builder->get_widget("lblStatusQuotaProjectEdit", lblStatusQuotaProjectEdit); - builder->get_widget("lblStatusQuotaProjectValueEdit", lblStatusQuotaProjectValueEdit); - builder->get_widget("lblCatalogProjectEdit", lblCatalogProjectEdit); - builder->get_widget("lblCatalogProjectEdit", lblCatalogProjectEdit); - builder->get_widget("lblProjectIdEdit", lblProjectIdEdit); - builder->get_widget("lblProjectIdValueEdit", lblProjectIdValueEdit); - builder->get_widget("lblProjectNameEdit", lblProjectNameEdit); - builder->get_widget("entryProjectNameEditValue", entryProjectNameEditValue); - builder->get_widget("quoteSizeFrameLabelProjectEdit", quoteSizeFrameLabelProjectEdit); - builder->get_widget("quoteSizeCurrentlyLabelProjectEdit", quoteSizeCurrentlyLabelProjectEdit); - builder->get_widget("quoteSizeSoftLimitLabelProjectEdit", quoteSizeSoftLimitLabelProjectEdit); - builder->get_widget("quoteSizeSoftLimitCheckProjectEdit", quoteSizeSoftLimitCheckProjectEdit); - builder->get_widget("quoteSizeSoftLimitSpinProjectEdit", quoteSizeSoftLimitSpinProjectEdit); - builder->get_widget("quoteSizeSoftLimitComboProjectEdit", quoteSizeSoftLimitComboProjectEdit); - builder->get_widget("quoteSizeHardLimitLabelProjectEdit", quoteSizeHardLimitLabelProjectEdit); - builder->get_widget("quoteSizeHardLimitCheckProjectEdit", quoteSizeHardLimitCheckProjectEdit); - builder->get_widget("quoteSizeHardLimitSpinEdit", quoteSizeHardLimitSpinEdit); - builder->get_widget("quoteSizeHardLimitComboProjectEdit", quoteSizeHardLimitComboProjectEdit); - builder->get_widget("quoteFilesFrameLabelProjectEdit", quoteFilesFrameLabelProjectEdit); - builder->get_widget("quoteFilesCurrentlyLabelProjectEdit", quoteFilesCurrentlyLabelProjectEdit); - builder->get_widget("quoteFilesSoftLimitLabelProjectEdit", quoteFilesSoftLimitLabelProjectEdit); - builder->get_widget("quoteFilesSoftLimitCheckProjectEdit", quoteFilesSoftLimitCheckProjectEdit); - builder->get_widget("quoteFilesSoftLimitSpinProjectEdit", quoteFilesSoftLimitSpinProjectEdit); - builder->get_widget("quoteFilesHardLimitCheckProjectEdit", quoteFilesHardLimitCheckProjectEdit); - builder->get_widget("quoteFilesHardLimitSpinProjectEdit", quoteFilesHardLimitSpinProjectEdit); - builder->get_widget("quoteCancelButtonEdit", quoteCancelButtonEdit); - builder->get_widget("quoteSaveButtonEdit", quoteSaveButtonEdit); - builder->get_widget("quoteFilesProjectEdit", quoteFilesProjectEdit); - builder->get_widget("quoteFiles1ProjectEdit", quoteFiles1ProjectEdit); - builder->get_widget("wndQuotasEditProject", wndQuotasEditProject); - builder->get_widget("quoteFilesHardLimitLabelProject1", quoteFilesHardLimitLabelProject1); -} - -void View_edit_project::lacalization() { - -} - - -void View_edit_project::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} -void View_edit_project::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} \ No newline at end of file diff --git a/source/view/view_edit_project.h b/source/view/view_edit_project.h deleted file mode 100644 index 239a999..0000000 --- a/source/view/view_edit_project.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef VIEW_EDIT_PROJECT_H -#define VIEW_EDIT_PROJECT_H -#include "../project_lib.h" -#include "../var.h" -class View_edit_project -{ -private: - Glib::RefPtr builder; - Gtk::Window* wndQuotasEditProject; - Gtk::Label* lblDeviceProjectEdit; - Gtk::Label* lblEditDeviceProjectValue; - Gtk::Label* lblStatusQuotaProjectEdit; - Gtk::Label* lblStatusQuotaProjectValueEdit; - Gtk::Label* lblCatalogProjectEdit; - Gtk::Label* lblProjectIdEdit; - Gtk::Label* lblProjectIdValueEdit; - Gtk::Label* lblProjectNameEdit; - Gtk::Label* quoteSizeFrameLabelProjectEdit; - Gtk::Label* quoteFilesFrameLabelProjectEdit; - Gtk::Label* quoteSizeCurrentlyLabelProjectEdit; - Gtk::Label* quoteSizeSoftLimitLabelProjectEdit; - Gtk::Label* quoteSizeHardLimitLabelProjectEdit; - Gtk::Label* quoteFilesCurrentlyLabelProjectEdit; - Gtk::Label* quoteFilesSoftLimitLabelProjectEdit; - Gtk::Label* quoteFilesHardLimitLabelProject1; - Gtk::Label* quoteFilesProjectEdit; - Gtk::Label* quoteFiles1ProjectEdit; - Gtk::CheckButton* quoteSizeSoftLimitCheckProjectEdit; - Gtk::CheckButton* quoteSizeHardLimitCheckProjectEdit; - Gtk::CheckButton* quoteFilesSoftLimitCheckProjectEdit; - Gtk::CheckButton* quoteFilesHardLimitCheckProjectEdit; - Gtk::SpinButton* quoteSizeSoftLimitSpinProjectEdit; - Gtk::SpinButton* quoteSizeHardLimitSpinEdit; - Gtk::SpinButton* quoteFilesSoftLimitSpinProjectEdit; - Gtk::SpinButton* quoteFilesHardLimitSpinProjectEdit; - Gtk::ComboBoxText* quoteSizeSoftLimitComboProjectEdit; - Gtk::ComboBoxText* quoteSizeHardLimitComboProjectEdit; - Gtk::Button* quoteSaveButtonEdit; - Gtk::Button* quoteCancelButtonEdit; - Gtk::Entry* entryProjectNameEditValue; -public: - View_edit_project(/* args */); - ~View_edit_project(); - void setting(); - void event(); - void show(); - void get_builder(); - void lacalization(); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box); - void close_wnd(); - void save(); -}; - - - - -#endif \ No newline at end of file diff --git a/source/view/view_edit_user_group.cc b/source/view/view_edit_user_group.cc deleted file mode 100644 index 3ce3b1c..0000000 --- a/source/view/view_edit_user_group.cc +++ /dev/null @@ -1,107 +0,0 @@ -#include "view_edit_user_group.h" - -View_edit_user_group::View_edit_user_group(/* args */) { - builder = Gtk::Builder::create_from_file(path_glade); - this->setting(); -} - -View_edit_user_group::~View_edit_user_group() -{ -} - -void View_edit_user_group::setting() { - this->get_builder(); - this->lacalization(); - check_limit(quotegroupSizeSoftLimitCheckUser - ,quotegroupSizeSoftLimitSpinUser - ,quotegroupSizeSoftLimitComboUser); - check_limit(quotegroupSizeHardLimitCheckUser - ,quotegroupSizeHardLimitSpinUser - ,quotegroupSizeHardLimitComboUser); - check_limit(quotegroupFilesSoftLimitCheckUser - ,quotegroupFilesSoftLimitSpinUser - ,quotegroupFilesSoftLimitlabelUser); - check_limit(quotegroupFilesHardLimitCheckUser - ,quotegroupFilesHardLimitSpinUser - ,quotegroupFilesHarLimitLabelUser); - this->event(); -} - -void View_edit_user_group::event() { - btnCancelEditUser->signal_clicked().connect([&]() {wndQuotasEditUser->hide();}); - btnSaveEditUser->signal_clicked().connect([&]() {}); - quotegroupSizeSoftLimitCheckUser->signal_toggled().connect([&]() { - check_limit(quotegroupSizeSoftLimitCheckUser - ,quotegroupSizeSoftLimitSpinUser - ,quotegroupSizeSoftLimitComboUser); - }); - quotegroupSizeHardLimitCheckUser->signal_toggled().connect([&]() { - check_limit(quotegroupSizeHardLimitCheckUser - ,quotegroupSizeHardLimitSpinUser - ,quotegroupSizeHardLimitComboUser); - }); - quotegroupFilesSoftLimitCheckUser->signal_toggled().connect([&]() { - check_limit(quotegroupFilesSoftLimitCheckUser - ,quotegroupFilesSoftLimitSpinUser - ,quotegroupFilesSoftLimitlabelUser); - }); - quotegroupFilesHardLimitCheckUser->signal_toggled().connect([&]() { - check_limit(quotegroupFilesHardLimitCheckUser - ,quotegroupFilesHardLimitSpinUser - ,quotegroupFilesHarLimitLabelUser); - }); -} - -void View_edit_user_group::get_builder() { - builder->get_widget("wndQuotasEditUser", wndQuotasEditUser); - builder->get_widget("btnCancelEditUser", btnCancelEditUser); - builder->get_widget("btnSaveEditUser", btnSaveEditUser); - builder->get_widget("quotegroupSizeSoftLimitCheckUser", quotegroupSizeSoftLimitCheckUser); - builder->get_widget("quotegroupSizeHardLimitCheckUser", quotegroupSizeHardLimitCheckUser); - builder->get_widget("quotegroupFilesSoftLimitCheckUser", quotegroupFilesSoftLimitCheckUser); - builder->get_widget("quotegroupFilesHardLimitCheckUser", quotegroupFilesHardLimitCheckUser); - builder->get_widget("quotegroupSizeSoftLimitSpinUser", quotegroupSizeSoftLimitSpinUser); - builder->get_widget("quotegroupSizeHardLimitSpinUser", quotegroupSizeHardLimitSpinUser); - builder->get_widget("quotegroupFilesSoftLimitSpinUser", quotegroupFilesSoftLimitSpinUser); - builder->get_widget("quotegroupFilesHardLimitSpinUser", quotegroupFilesHardLimitSpinUser); - builder->get_widget("quotegroupSizeSoftLimitComboUser", quotegroupSizeSoftLimitComboUser); - builder->get_widget("quotegroupSizeHardLimitComboUser", quotegroupSizeHardLimitComboUser); - builder->get_widget("quotegroupFilesSoftLimitlabelUser", quotegroupFilesSoftLimitlabelUser); - builder->get_widget("quotegroupFilesHarLimitLabelUser", quotegroupFilesHarLimitLabelUser); - builder->get_widget("quotegroupSizeSoftLimitLabelUser", quotegroupSizeSoftLimitLabelUser); - builder->get_widget("quotegroupFilesSoftLimitLabelUser", quotegroupFilesSoftLimitLabelUser); - builder->get_widget("quotegroupSizeCurrentlyLabelUser", quotegroupSizeCurrentlyLabelUser); - builder->get_widget("quotegroupFilesCurrentlyLabelUser", quotegroupFilesCurrentlyLabelUser); - builder->get_widget("quotegroupSizeFrameLabelUser", quotegroupSizeFrameLabelUser); - builder->get_widget("quotegroupFilesFrameLabelUser", quotegroupFilesFrameLabelUser); - builder->get_widget("lblSetDeviceUser", lblSetDeviceUser); - builder->get_widget("lblQuotasStatusUser", lblQuotasStatusUser); - builder->get_widget("lblSetUGPUser", lblSetUGPUser); - builder->get_widget("lblSetNameDeviceUser", lblSetNameDeviceUser); - builder->get_widget("lblSetQuotasStatusUser", lblSetQuotasStatusUser); - builder->get_widget("lblSetUGPUserValue", lblSetUGPUserValue); - builder->get_widget("lblHeadQuotasEditWindowUser", lblHeadQuotasEditWindowUser); - builder->get_widget("quoteSizeHardLimitLabel1", quoteSizeHardLimitLabel1); - builder->get_widget("quoteFilesHardLimitLabelUser", quoteFilesHardLimitLabelUser); -} - -void View_edit_user_group::lacalization() { - -} - - -void View_edit_user_group::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} -void View_edit_user_group::check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box) { - spin->set_sensitive(check_button->get_active()); - combo_box->set_sensitive(check_button->get_active()); -} - -void View_edit_user_group::set_label_type_quota(string name) { - lblSetUGPUser->set_text(name); -} -void View_edit_user_group::show() { - wndQuotasEditUser->show(); -} \ No newline at end of file diff --git a/source/view/view_edit_user_group.h b/source/view/view_edit_user_group.h deleted file mode 100644 index 3b9d82a..0000000 --- a/source/view/view_edit_user_group.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef VIEW_ADD_USER_GROUP_H -#define VIEW_ADD_USER_GROUP_H -#include "../project_lib.h" -#include "../var.h" -using namespace std; - -class View_edit_user_group -{ -private: - Glib::RefPtr builder; -private: - Gtk::Window* wndQuotasEditUser; - Gtk::Button* btnCancelEditUser; - Gtk::Button* btnSaveEditUser; - Gtk::CheckButton* quotegroupSizeSoftLimitCheckUser; - Gtk::CheckButton* quotegroupSizeHardLimitCheckUser; - Gtk::CheckButton* quotegroupFilesSoftLimitCheckUser; - Gtk::CheckButton* quotegroupFilesHardLimitCheckUser; - Gtk::SpinButton* quotegroupSizeSoftLimitSpinUser; - Gtk::SpinButton* quotegroupSizeHardLimitSpinUser; - Gtk::SpinButton* quotegroupFilesSoftLimitSpinUser; - Gtk::SpinButton* quotegroupFilesHardLimitSpinUser; - Gtk::ComboBoxText* quotegroupSizeSoftLimitComboUser; - Gtk::ComboBoxText* quotegroupSizeHardLimitComboUser; - Gtk::Label* quotegroupFilesSoftLimitlabelUser; - Gtk::Label* quotegroupFilesHarLimitLabelUser; - Gtk::Label* quotegroupSizeSoftLimitLabelUser; - Gtk::Label* quotegroupFilesSoftLimitLabelUser; - Gtk::Label* quotegroupSizeCurrentlyLabelUser; - Gtk::Label* quotegroupFilesCurrentlyLabelUser; - Gtk::Label* quotegroupSizeFrameLabelUser; - Gtk::Label* quotegroupFilesFrameLabelUser; - Gtk::Label* lblSetDeviceUser; - Gtk::Label* lblQuotasStatusUser; - Gtk::Label* lblSetUGPUser; - Gtk::Label* lblSetNameDeviceUser; - Gtk::Label* lblSetQuotasStatusUser; - Gtk::Label* lblSetUGPUserValue; - Gtk::Label* lblHeadQuotasEditWindowUser; - Gtk::Label* quoteSizeHardLimitLabel1; - Gtk::Label* quoteFilesHardLimitLabelUser; - - -public: - View_edit_user_group(/* args */); - ~View_edit_user_group(); - void setting(); - void event(); - void show(); - void get_builder(); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::ComboBoxText *combo_box); - void check_limit(Gtk::CheckButton *check_button, Gtk::SpinButton *spin, Gtk::Label *combo_box); - void set_label_type_quota(string name); - void lacalization(); -}; - - - - -#endif \ No newline at end of file diff --git a/source/view_add_p.c b/source/view_add_p.c new file mode 100644 index 0000000..e69de29 diff --git a/source/view_add_p.h b/source/view_add_p.h new file mode 100644 index 0000000..e69de29 diff --git a/source/view_add_u_g.c b/source/view_add_u_g.c new file mode 100644 index 0000000..e69de29 diff --git a/source/view_add_u_g.h b/source/view_add_u_g.h new file mode 100644 index 0000000..e69de29 diff --git a/source/view_edit_p.c b/source/view_edit_p.c new file mode 100644 index 0000000..e69de29 diff --git a/source/view_edit_p.h b/source/view_edit_p.h new file mode 100644 index 0000000..e69de29 diff --git a/source/view_edit_u_g.c b/source/view_edit_u_g.c new file mode 100644 index 0000000..e69de29 diff --git a/source/view_edit_u_g.h b/source/view_edit_u_g.h new file mode 100644 index 0000000..e69de29 diff --git a/source/view/view_filters.cc b/source/view_filters.c similarity index 100% rename from source/view/view_filters.cc rename to source/view_filters.c diff --git a/source/view/view_filters.h b/source/view_filters.h similarity index 100% rename from source/view/view_filters.h rename to source/view_filters.h diff --git a/ubl-settings-diskquota b/ubl-settings-diskquota new file mode 100755 index 0000000000000000000000000000000000000000..c5075ae176efaa60a763739d72129ac4ab9405ff GIT binary patch literal 580000 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 literal 0 HcmV?d00001 diff --git a/ubl-settings-diskquota.glade b/ubl-settings-diskquota.glade index 2108af7..d240446 100644 --- a/ubl-settings-diskquota.glade +++ b/ubl-settings-diskquota.glade @@ -53,7 +53,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. vertical 2 - + False end @@ -63,13 +63,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 1 + + + True False - True True @@ -79,7 +81,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 5 5 2 - TEMPLATE Manager @@ -550,6 +551,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True + 7 0 @@ -566,6 +568,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 5 5 5 + + KB + MB + GB + TB + False @@ -627,6 +635,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True + 7 0 @@ -643,6 +652,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 5 5 5 + + KB + MB + GB + TB + False @@ -765,6 +780,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True + 7 0 @@ -838,6 +854,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True True + 7 0 @@ -1127,6 +1144,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. True False + 5 + 5 5 5 5 @@ -1295,12 +1314,10 @@ translated and supported by community. True False - True True False - TEMPLATE Manager @@ -1339,28 +1356,6 @@ translated and supported by community. False False False - - - True - False - Documentation - True - - - - - - True - False - About - - - True @@ -1679,7 +1674,7 @@ limitation - False + True True 0 @@ -1841,6 +1836,7 @@ limitation 5 5 5 + 4 False @@ -1888,6 +1884,7 @@ limitation 5 5 5 + 4 False @@ -1948,6 +1945,7 @@ limitation 5 5 5 + 4 False @@ -1995,6 +1993,7 @@ limitation 5 5 5 + 4 False @@ -2055,6 +2054,7 @@ limitation 5 5 5 + 4 False @@ -2102,6 +2102,7 @@ limitation 5 5 5 + 4 False @@ -2162,6 +2163,7 @@ limitation 5 5 5 + 4 False @@ -2209,6 +2211,7 @@ limitation 5 5 5 + 4 False @@ -2380,7 +2383,7 @@ limitation - False + True True 2 @@ -2714,6 +2717,7 @@ limitation 5 5 5 + 4 False @@ -2761,6 +2765,7 @@ limitation 5 5 5 + 4 False @@ -2821,6 +2826,7 @@ limitation 5 5 5 + 4 False @@ -2868,6 +2874,7 @@ limitation 5 5 5 + 4 False @@ -2928,6 +2935,7 @@ limitation 5 5 5 + 4 False @@ -2975,6 +2983,7 @@ limitation 5 5 5 + 4 False @@ -3035,6 +3044,7 @@ limitation 5 5 5 + 4 False @@ -3082,6 +3092,7 @@ limitation 5 5 5 + 4 False @@ -3253,7 +3264,7 @@ limitation - False + True True 2 @@ -3587,6 +3598,7 @@ limitation 5 5 5 + 4 False @@ -3634,6 +3646,7 @@ limitation 5 5 5 + 4 False @@ -3694,6 +3707,7 @@ limitation 5 5 5 + 4 False @@ -3741,6 +3755,7 @@ limitation 5 5 5 + 4 False @@ -3801,6 +3816,7 @@ limitation 5 5 5 + 4 False @@ -3848,6 +3864,7 @@ limitation 5 5 5 + 4 False @@ -3908,6 +3925,7 @@ limitation 5 5 5 + 4 False @@ -3955,6 +3973,7 @@ limitation 5 5 5 + 4 False @@ -4016,7 +4035,7 @@ limitation True True - ListProject + ListGroups 0 @@ -4135,7 +4154,7 @@ limitation - False + True True 2 @@ -4564,35 +4583,6 @@ limitation 1 10 - - False - Please select File - True - center - 500 - 400 - True - com.ublinux.ublexec - dialog - True - True - select-folder - - - False - - - False - - - False - False - 0 - - - - - False start @@ -4810,6 +4800,7 @@ limitation True True False + start True @@ -5112,6 +5103,7 @@ limitation Generate + True True True @@ -5279,6 +5271,7 @@ limitation True True + 7 0 @@ -5295,6 +5288,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -5356,6 +5355,7 @@ limitation True True + 7 0 @@ -5372,6 +5372,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -5498,6 +5504,7 @@ limitation True True + 7 0 @@ -5558,7 +5565,9 @@ limitation True True False + 5 5 + 5 5 5 5 @@ -5575,6 +5584,7 @@ limitation True True + 7 0 @@ -6066,6 +6076,7 @@ limitation True True + 7 0 @@ -6082,6 +6093,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -6143,6 +6160,7 @@ limitation True True + 7 0 @@ -6159,6 +6177,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -6285,6 +6309,7 @@ limitation True True + 7 0 @@ -6364,6 +6389,7 @@ limitation True True + 7 0 @@ -6776,6 +6802,7 @@ limitation True True + 7 0 @@ -6792,6 +6819,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -6853,6 +6886,7 @@ limitation True True + 7 0 @@ -6869,6 +6903,12 @@ limitation 5 5 5 + + KB + MB + GB + TB + False @@ -6995,6 +7035,7 @@ limitation True True + 7 0 @@ -7074,6 +7115,7 @@ limitation True True + 7 0 diff --git a/ubl-settings-diskquota_ru.po b/ubl-settings-diskquota_ru.po index cfdb42b..814ebd0 100644 --- a/ubl-settings-diskquota_ru.po +++ b/ubl-settings-diskquota_ru.po @@ -16,6 +16,125 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" +#: source/ubl-strings.h:1 + +msgid "Version:" +msgstr "Версия:" + +#: source/ubl-strings.h:2 +msgid "ubl-settings-TEMPLATE version:" +msgstr "Версия ubl-settings-TEMPLATE: " + +#: source/ubl-strings.h:2 +msgid "TEMPLATE settings" +msgstr "Настройки TEMPLATE" + +#: source/ubl-strings.h:2 +msgid "Usage:" +msgstr "Использование:" + +#: source/ubl-strings.h:2 +msgid "[OPTIONS]" +msgstr "[АРГУМЕНТЫ]" + +#: source/ubl-strings.h:2 +msgid "Options:" +msgstr "Аргументы:" + +#: source/ubl-strings.h:2 +msgid "Show this help" +msgstr "Показать параметры справки" + +#: source/ubl-strings.h:2 +msgid "Show package version" +msgstr "Показать текущую версию" + +#: source/ubl-strings.h:2 +msgid "Lock this help menu" +msgstr "Блокировка вызова справки" + +#: source/ubl-strings.h:2 +#, fuzzy +msgid "Lock configuration saving" +msgstr "Блокировка сохранения локальной и глобальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock local configration saving" +msgstr "Блокировка сохранения локальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock global configration saving" +msgstr "Блокировка сохранения глобальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock global configration loading" +msgstr "Блокировка загрузки глобальной конфигурации" + +#: source/ubl-strings.h:4 +msgid "TEMPLATE Manager" +msgstr "Настройки TEMPLATE" + +#: source/ubl-strings.h:5 +msgid "System TEMPLATE settings management" +msgstr "Настройки TEMPLATE" + +#: source/ubl-strings.h:7 +msgid "Operation succeeded" +msgstr "Операция завершена" + +#: source/ubl-strings.h:8 +msgid "" +"Warning! Application was launched without root - root-dependent actions are " +"locked" +msgstr "Внимание! Приложение было запущено без прав суперпользователя - действия, требующие их наличия заблокированы" + +#: source/ubl-strings.h:11 +msgid "Documentation" +msgstr "Справка" + +#: source/ubl-strings.h:12 +msgid "Save to local configuration" +msgstr "Сохранить в локальную конфигурацию" + +#: source/ubl-strings.h:13 +msgid "Save to global configuration" +msgstr "Сохранить в глобальную конфигурацию" + +#: source/ubl-strings.h:14 +msgid "Save configuration" +msgstr "Сохранить конфигурацию" + +#: source/ubl-strings.h:24 +msgid "Always redirect to online documentation" +msgstr "Всегда перенаправлять" + +#: source/ubl-strings.h:25 +msgid "Open documentation" +msgstr "Прочитать справку" + +#: source/ubl-strings.h:27 +msgid "Nothing were chosen" +msgstr "Ничего не было выбрано" + +#: source/ubl-strings.h:30 +msgid "Global configuration loading succseeded." +msgstr "Успешно загружена глобальная конфигурация" + +#: source/ubl-strings.h:31 +msgid "Local configuration loading succseeded." +msgstr "Успешно загружена локальная конфигурация" + +#: source/ubl-strings.h:33 +msgid "Local and global configuration saving succseeded." +msgstr "Успешно записаны локальная и глобальная конфигурация" + +#: source/ubl-strings.h:34 +msgid "Global configuration saving succseeded." +msgstr "Успешно записана глобальная конфигурация" + +#: source/ubl-strings.h:35 +msgid "Local configuration saving succseeded." +msgstr "Успешно записана локальная конфигурация" msgid "Off" msgstr "Выключено"