diff --git a/.gitignore b/.gitignore
index d77f196..8879ccd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,9 @@
.vscode/
-ubl-settings-diskquota.glade~
-ubl-settings-diskquota_ru.po~
+ubl-settings-diskquota
+*~
+build/
+compile/
+*#
+terminal-commands/
+source/ubl-cmake.h
+vgcore*
\ No newline at end of file
diff --git a/.install.sh b/.install.sh
new file mode 100755
index 0000000..ad955f9
--- /dev/null
+++ b/.install.sh
@@ -0,0 +1,6 @@
+make
+gcc compile/resources.c compile/ubl-cmake.h source/view_set_disk.h source/view_set_disk.c source/view_check_user_table.c source/view_check_user_table.h source/view_filters.c source/model/vector.c source/model/vector.h source/view_filters.h source/view_temp_u_g_p.c source/view_temp_u_g_p.h source/controler.h source/controler.c source/model/philos_utils.h source/model/philos_utils.c source/model/my_device.h source/model/save.h source/model/save.c source/model/my_device.c source/model/model.h source/model/load.h source/model/load.c source/model/model.c 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
+sudo make install clean
+cd ./terminal-commands
+make
+cd ../
diff --git a/Makefile b/Makefile
index eae48d9..c0be6ef 100644
--- a/Makefile
+++ b/Makefile
@@ -21,11 +21,11 @@ all: init build
init:
@echo "Initialize ..."; \
if [ -d ".git" ]; then \
- LATEST_TAG=$$(git describe --tags | sed 's/^v//'); \
+ LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \
else \
LATEST_TAG="0.0"; \
fi; \
- sed -r "s/^(string version_application = ).*/\1\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.cc; \
+ sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \
echo "-- Build path: ${CMAKE_BUILD_DIR}"
depend:
@@ -43,6 +43,8 @@ debug:
@echo "Debug ..."
if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
$(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+ @gcc compile/resources.c compile/ubl-cmake.h source/view_set_disk.h source/view_set_disk.c source/view_check_user_table.c source/view_check_user_table.h source/view_filters.c source/model/vector.c source/model/vector.h source/view_filters.h source/view_temp_u_g_p.c source/view_temp_u_g_p.h source/controler.h source/controler.c source/model/philos_utils.h source/model/philos_utils.c source/model/my_device.h source/model/save.h source/model/save.c source/model/my_device.c source/model/model.h source/model/load.h source/model/load.c source/model/model.c 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
+
fi; \
echo "Debug: OK"
@@ -86,10 +88,10 @@ uninstall:
done
@$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
@$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop"
- @$(RM) "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/logo-background.png"
- @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy"
@$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg"
- @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}"
+ @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/com.ublinux.${PKGNAME}.checked.svg"
+ @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/com.ublinux.${PKGNAME}.warning.svg"
+ @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy"
@if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
update-desktop-database --quiet &>/dev/null || true; \
@@ -113,24 +115,23 @@ install: check uninstall
done
@install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
- @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
- @install -dm755 "${DESTDIR}${PREFIX}/share/applications"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
- @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy"
- @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images}
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css"
- @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "logo-background.png"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.funnel.svg"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "gdb.policy"
+ @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
+ @install -dm755 "${DESTDIR}/etc/xdg"
+ @install -dm755 "${DESTDIR}${PREFIX}/share/applications"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
@if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
update-desktop-database --quiet &>/dev/null || true; \
[ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
fi
@echo "Install: OK"
+ @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \
clean:
@echo "Clean ..."
@@ -151,3 +152,4 @@ help:
echo "... install"; \
echo "... uninstall"; \
echo "... clean"
+
diff --git a/README.md b/README.md
index 56811b5..85aef32 100644
--- a/README.md
+++ b/README.md
@@ -1,17 +1,12 @@
# ubl-settings-diskquota
-# Настройки квот
-[RU] Утилита для настройки дисковых квот
-
-Utility for setting the disk quotas
-
-
-
+# Выполнить
# Build
In order to build ubl-settings-diskquota you will need:
- CMake
- C compiler
- GTK+ 3 & dependencies
+- webkit2gtk (optional)
Once you have all the necessary dependencies, you can use:
```sh
@@ -29,21 +24,6 @@ After a successful build, just use:
```sh
$ sudo make uninstall
```
-# Usage
-```sh
-$ ubl-settings-diskquota --help
-GTK settings disk quota for UBLinux
-
-Usage: ubl-settings-diskquota [OPTIONS...]
-Options:
- -h, --help Show this help
- -V, --version Show package version
- --lock-help Lock utility help
- --lock-save Lock saving local and global configuration
- --lock-save-local Lock save global configuration
- --lock-save-global Lock load global configuration
- --lock-load-global Lock load global configuration
-$ ubl-settings-diskquota --version
-ubl-settings-diskquota version: x.xx
-```
+
+
diff --git a/com.ublinux.ubl-settings-diskquota.policy b/com.ublinux.ubl-settings-diskquota.policy
index 79dd276..de22da1 100644
--- a/com.ublinux.ubl-settings-diskquota.policy
+++ b/com.ublinux.ubl-settings-diskquota.policy
@@ -8,10 +8,10 @@
https://ublinux.ru
- Run "ubl-settings-diskquota" as root
- Запус ubl-settings-diskquota с правами root
+ Run ubl-settings-diskquota as root
+ Запуск утилиты ubl-settings-diskquota с правами root
Authentication is required to run ubl-settings-diskquota
- Требуется авторизация для запуска ubl-settings-diskquota с правами root
+ Требуется авторизация для запуска утилиты ubl-settings-diskquota с правами root
auth_admin
auth_admin
diff --git a/gdb.policy b/gdb.policy
new file mode 100644
index 0000000..c1a7da0
--- /dev/null
+++ b/gdb.policy
@@ -0,0 +1,24 @@
+
+
+
+
+ UBLinux
+ https://ublinux.ru
+
+
+ Run ubl-settings-diskquota as root
+ Запуск утилиты ubl-settings-diskquota с правами root
+ Authentication is required to run ubl-settings-diskquota
+ Требуется авторизация для запуска утилиты ubl-settings-diskquota с правами root
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/bin/gdb
+ true
+
+
+
diff --git a/gresource.xml b/gresource.xml
new file mode 100644
index 0000000..c640934
--- /dev/null
+++ b/gresource.xml
@@ -0,0 +1,12 @@
+
+
+
+ ubl-settings-diskquota.glade
+
+
+ ubl-settings-diskquota.css
+
+
+ ubl-settings-diskquota-banner.png
+
+
\ No newline at end of file
diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png
index 51bf4ab..fba0817 100644
Binary files a/screenshot/screenshot.png and b/screenshot/screenshot.png differ
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 4b3ebc2..49706e3 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -1,19 +1,21 @@
cmake_minimum_required(VERSION 3.7)
-find_package(PkgConfig REQUIRED)
project(ubl-settings-diskquota)
+find_package(PkgConfig REQUIRED)
-pkg_check_modules(GTK REQUIRED gtkmm-3.0)
+pkg_check_modules(GTK REQUIRED gtk+-3.0)
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})
find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
option(WEBKIT_FOUND "No" OFF)
-
-find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
if(WEBKIT_LIBRARIES_FOUND)
option(WEBKIT_FOUND "Yes" ON)
PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
@@ -21,64 +23,97 @@ if(WEBKIT_LIBRARIES_FOUND)
link_directories(${WEBKIT_LIBRARY_DIRS})
add_definitions(${WEBKIT_CFLAGS_OTHER})
endif()
-configure_file(ubl-settings-diskquota.h.in ubl-settings-diskquota-cm.h)
-#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a -g")
+configure_file(ubl-cmake.in ubl-cmake.h)
+
+file(COPY ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h DESTINATION ./)
+
+set(GRESOURCE_C resources.c)
+set(GRESOURCE_XML gresource.xml)
+
+find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED)
+add_custom_target(GLADE ubl-settings-diskquota.glade)
+
+set(DEPENDFILES
+ ../ubl-settings-diskquota.glade
+ ../gresource.xml
+ ../ubl-settings-diskquota-banner.png
+ ../ubl-settings-diskquota.css
+ )
+
+file(COPY ${DEPENDFILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
+
+add_custom_command(
+ OUTPUT ${GRESOURCE_C}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMAND ${GLIB_COMPILE_RESOURCES}
+ ARGS
+ --generate-source
+ --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+ ${GRESOURCE_XML}
+ VERBATIM
+ MAIN_DEPENDENCY ${GRESOURCE_XML}
+ DEPENDS
+ ${GLADE}
+)
+add_custom_target(
+ dummy-resource
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+)
+
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a")
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm")
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/view_edit_project.cc
- view/view_edit_project.h
- view/view_add_project.cc
- view/view_add_project.h
- view/view_edit_user_group.h
- view/view_edit_user_group.cc
- view/view_add_user_group.h
- view/view_add_user_group.cc
- view/view_edit_user_group.cc
- view/view_edit_user_group.h
- view/view_filters.cc
- view/view_filters.h
- view/ubl-settings-diskquota.h
- view/ubl-settings-diskquota.cc
- view/model/ubconfig_quota.cc
- view/model/ubconfig_quota.h
- view/model/save.h
- view/model/save.cc
- view/model/load.h
- view/model/load.cc
- view/model/my_process.h
- view/model/my_process.cc
- view/model/util.h
- view/model/util.cc
- view/ubl-util-standard.h
- view/ubl-util-standard.c
- view/model/wrapper_load_save.cc
- view/model/wrapper_load_save.h
- ubl-settings-diskquota-cm.h
- view/view_open_browser.cc
- view/view_open_browser.h
- view/view_about.h
- view/view_about.cc
- controller.cc
- controller.h
- main.cc
- var.h
- project_lib.h
- my_type.h)
+ view_set_disk.c
+ view_set_disk.h
+ controler.h
+ controler.c
+ view_check_user_table.c
+ view_check_user_table.h
+ model/model.h
+ model/model.c
+ model/save.h
+ model/save.c
+ model/load.h
+ model/load.c
+ model/vector.c
+ model/vector.h
+ ubl-strings.h
+ view_filters.c
+ view_filters.h
+ view_temp_u_g_p.c
+ view_temp_u_g_p.h
+ model/ubl-utils.h
+ model/ubl-utils.c
+ model/my_device.h
+ model/my_device.c
+ model/philos_utils.h
+ model/philos_utils.c
+
+ ubl-settings-diskquota.c
+ ubl-settings-diskquota.h
+ ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h
+ )
set(LIBRARIES
${GTK_LIBRARIES}
+ ${WEBKIT_LIBRARIES}
+# ${VTE291_LIBRARIES}
pthread)
-add_executable(ubl-settings-diskquota ${SOURCE_FILES})
-target_link_libraries(ubl-settings-diskquota PUBLIC ${WEBKIT_LIBRARIES} ${LIBRARIES})
-target_include_directories(ubl-settings-diskquota PUBLIC
- "${PROJECT_BINARY_DIR}"
- ${WEBKIT_INCLUDE_DIRS}
- )
-install(TARGETS ubl-settings-diskquota DESTINATION bin)
\ No newline at end of file
+add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C})
+target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES})
+target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR})
+set_source_files_properties(
+ ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}
+ PROPERTIES GENERATED TRUE
+)
+install(TARGETS ${PROJECT_NAME} DESTINATION bin)
+add_dependencies(${PROJECT_NAME} dummy-resource)
\ No newline at end of file
diff --git a/source/controler.c b/source/controler.c
new file mode 100644
index 0000000..d4ab4ad
--- /dev/null
+++ b/source/controler.c
@@ -0,0 +1,589 @@
+#include "controler.h"
+
+main_window cfg_main_gui;
+custom_window cfg_custom_gui;
+config_settings_gui main_config;
+config_all all_config;
+int index_selected = -1;
+int note_selected = -1;
+// note_selected = 0; user
+// note_selected = 1; group
+// note_selected = 2; project
+
+void update_time_table(vector* vec_temp) {
+ for (int index = 0; index < all_config.v_disk_status.vectorList.total; index++) {
+ disk_status* _config_device = (disk_status*)all_config.v_disk_status.pfVectorGet(&all_config.v_disk_status, index);
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ if (strstr(_config->UNIX_file, _config_device->device)) {
+ _config->deferring_size = _config_device->deferring_size;
+ _config->deferring_file = _config_device->deferring_file;
+ }
+ }
+ }
+}
+
+
+void entry_user_disk(GtkWidget *self, int* flag_update) {
+ update_time_table(&all_config.v_user);
+ if (flag_update) {
+ all_config.flag_set_data = 1;
+ all_config.flag_save = 3;
+ temp_on_destroy_subwindow(self);
+ }
+ int find = fill_tree_view_user_group(&all_config, &cfg_custom_gui.user, "usrquota", 0);
+ if (find == 0) {
+ g_object_ref(cfg_custom_gui.user.liststore);
+ gtk_list_store_clear(cfg_custom_gui.user.liststore);
+ }
+ wrapper_fill_tree_view_generate(&all_config, &cfg_custom_gui);
+}
+
+void entry_device_disk(GtkWidget *self, int* flag_update) {
+
+ if (flag_update) {
+ all_config.flag_set_data = 1;
+ all_config.flag_save = 3;
+ view_device_get_gui_data();
+ view_device_on_destroy_subwindow(self);
+ }
+ int find = fill_tree_view_device(&all_config.v_disk_status, &cfg_custom_gui.device, 0);
+ if (find == 0) {
+ g_object_ref(cfg_custom_gui.device.liststore);
+ gtk_list_store_clear(cfg_custom_gui.device.liststore);
+ }
+ entry_user_disk(0, 0);
+ entry_groups_disk(0, 0);
+ entry_project_disk(0, 0);
+ wrapper_fill_tree_view_generate(&all_config, &cfg_custom_gui);
+ tree_view_select_user(NULL);
+ tree_view_select_group(NULL);
+ tree_view_select_project(NULL);
+}
+
+void entry_groups_disk(GtkWidget *self,int* flag_update) {
+ update_time_table(&all_config.v_group);
+ if (flag_update) {
+ all_config.flag_set_data = 1;
+ all_config.flag_save = 3;
+ temp_on_destroy_subwindow(self);
+ }
+ int find = fill_tree_view_user_group(&all_config, &cfg_custom_gui.group,"grpquota", 0);
+ if (find == 0) {
+ g_object_ref(cfg_custom_gui.group.liststore);
+ gtk_list_store_clear(cfg_custom_gui.group.liststore);
+ }
+ wrapper_fill_tree_view_generate(&all_config, &cfg_custom_gui);
+}
+
+void entry_project_disk(GtkWidget *self,int* flag_update) {
+ update_time_table(&all_config.v_project);
+ if (flag_update) {
+ all_config.flag_set_data = 1;
+ all_config.flag_save = 3;
+ temp_on_destroy_subwindow(self);
+ }
+ int find = fill_tree_view_project(&all_config, &cfg_custom_gui.project,"prjquota", 0);
+ if (find == 0) {
+ g_object_ref(cfg_custom_gui.project.liststore);
+ gtk_list_store_clear(cfg_custom_gui.project.liststore);
+ }
+ wrapper_fill_tree_view_generate(&all_config, &cfg_custom_gui);
+}
+
+void wrapper_filters_user_show() {
+ filters_get_tree_view(cfg_custom_gui.user.tree_view);
+ filters_set_name("usrquota");
+ filters_show(NULL, glade_path);
+}
+void wrapper_filters_group_show() {
+ filters_get_tree_view(cfg_custom_gui.group.tree_view);
+ filters_set_name("grpquota");
+ filters_show(NULL, glade_path);
+}
+void wrapper_filters_project_show() {
+ filters_get_tree_view(cfg_custom_gui.project.tree_view);
+ filters_set_name("prjquota");
+ filters_show(NULL, glade_path);
+}
+
+void wrapper_add_user_show() {
+ set_temp_menu("usrquota", "add");
+ set_all_config(&all_config);
+ set_vector(&all_config.v_user);
+ temp_show(NULL, glade_path);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_user_disk),&i);
+}
+
+void wrapper_edit_user_show() {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.user);
+ set_temp_menu("usrquota", "edit");
+ temp_set_index(index);
+ set_all_config(&all_config);
+ set_vector(&all_config.v_user);
+ temp_show(NULL, glade_path);
+ set_edit_gui_data_base(&all_config, index);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_user_disk),&i);
+}
+
+void wrapper_add_group_show() {
+ set_temp_menu("grpquota", "add");
+ set_all_config(&all_config);
+ set_vector(&all_config.v_group);
+ temp_show(NULL, glade_path);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_groups_disk),&i);
+}
+
+void wrapper_edit_group_show() {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.group);
+ set_temp_menu("grpquota", "edit");
+ temp_set_index(index);
+ set_all_config(&all_config);
+ set_vector(&all_config.v_group);
+ temp_show(NULL, glade_path);
+ set_edit_gui_data_base(&all_config, index);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_groups_disk),&i);
+
+}
+
+void wrapper_add_project_show() {
+ set_temp_menu("prjquota", "add");
+ set_all_config(&all_config);
+ set_vector(&all_config.v_project);
+ temp_show(NULL, glade_path);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_project_disk),&i);
+}
+
+void wrapper_edit_project_show(GtkWidget* self, vector* vec_temp) {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.project);
+ set_temp_menu("prjquota", "edit");
+ temp_set_index(index);
+ set_all_config(&all_config);
+ set_vector(&all_config.v_project);
+ temp_show(NULL, glade_path);
+ set_edit_gui_data_base(&all_config, index);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_temp()->btnSaveTempSave),"clicked",G_CALLBACK(entry_project_disk),&i);
+}
+
+void wrapper_edit_view_device_show(GtkWidget* self) {
+ view_device_set_vector_device(&all_config.v_disk_status);
+ view_device_set_index(index_selected);
+ set_view_device_menu("edit");
+ view_device_all_config(&all_config);
+ view_device_show(NULL, glade_path);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_view_device()->btnSaveTempSave),"clicked",G_CALLBACK(entry_device_disk),&i);
+}
+
+void wrapper_add_view_device_show(GtkWidget* self) {
+ view_device_set_vector_device(&all_config.v_disk_status);
+ view_device_set_index(-1);
+ set_view_device_menu("add");
+ view_device_all_config(&all_config);
+ view_device_show(NULL, glade_path);
+ int i = 0;
+ g_signal_connect(G_OBJECT(get_widget_view_device()->btnSaveTempSave),"clicked",G_CALLBACK(entry_device_disk),&i);
+}
+
+void block_tree_view(hotebook* widgets,void (*f)()) {
+ g_signal_handlers_block_by_func(G_OBJECT(widgets->tree_view), G_CALLBACK(f), NULL);
+}
+
+void unlock_tree_view(hotebook* widgets,void (*f)()) {
+ g_signal_handlers_unblock_by_func(G_OBJECT(widgets->tree_view), G_CALLBACK(f), NULL);
+}
+
+void tree_view_select(GtkWidget* self, vector* vec_temp, hotebook* widgets) {
+ if (self) {}
+ if (vec_temp->vectorList.total > 0 && all_config.v_disk_status.vectorList.total>0) {
+ wrapper_select_tree_view(widgets);
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ gtk_widget_set_sensitive(widgets->btnAdd, 1);
+ gtk_widget_set_sensitive(widgets->btnDel, 1);
+ gtk_widget_set_sensitive(widgets->btnEdit, 1);
+ }
+ else {
+ if (main_config.lock_save_global == 0 || main_config.lock_save_local == 0) {
+ gtk_widget_set_sensitive(widgets->btnAdd,1);
+ }
+ gtk_widget_set_sensitive(widgets->btnDel, 0);
+ gtk_widget_set_sensitive(widgets->btnEdit, 0);
+ }
+ }
+ if (vec_temp->vectorList.total > 0 && all_config.v_disk_status.vectorList.total==0) {
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ gtk_widget_set_sensitive(widgets->btnDel, 1);
+ }
+ else {
+ if (main_config.lock_save_global == 0 || main_config.lock_save_local == 0) {
+ gtk_widget_set_sensitive(widgets->btnAdd,1);
+ }
+ gtk_widget_set_sensitive(widgets->btnAdd, 0);
+ gtk_widget_set_sensitive(widgets->btnDel, 0);
+ gtk_widget_set_sensitive(widgets->btnEdit, 0);
+ }
+ }
+ else if (!all_config.v_disk_status.vectorList.total && note_selected != 3) {
+ gtk_widget_set_sensitive(widgets->btnAdd, 0);
+ }
+ else if (all_config.v_disk_status.vectorList.total > 0 && note_selected != 3) {
+ gtk_widget_set_sensitive(widgets->btnAdd, 1);
+ }
+ else {
+ gtk_widget_set_sensitive(widgets->btnDel, 0);
+ gtk_widget_set_sensitive(widgets->btnEdit, 0);
+ }
+ if (widgets->note_selected == note_selected && index_selected>= 0) {
+ gtk_widget_set_sensitive(widgets->btnAdd, 1);
+ gtk_widget_set_sensitive(widgets->btnDel, 1);
+ gtk_widget_set_sensitive(widgets->btnEdit, 1);
+ }
+ else {
+ gtk_widget_set_sensitive(widgets->btnDel, 0);
+ gtk_widget_set_sensitive(widgets->btnEdit, 0);
+ }
+}
+
+void device_remove() {
+ if (note_selected == 3) {
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(cfg_custom_gui.device.liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cfg_custom_gui.device.tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.device);
+ gtk_list_store_remove(cfg_custom_gui.device.liststore, &iter);
+ if (index!=-1) {
+ index_selected = -1;
+ disk_status* _config = (disk_status*)all_config.v_disk_status.pfVectorGet(&all_config.v_disk_status, index);
+ yon_window_config_erase_custom_parameter(_config->device, "deferring_size");
+ yon_window_config_erase_custom_parameter(_config->device, "deferring_file");
+ yon_window_config_erase_custom_parameter(_config->device, _config->device);
+ all_config.v_disk_remove.pfVectorAdd(&all_config.v_disk_remove, yon_char_new(_config->device));
+ model_search_disk_remove(&all_config.v_user, &all_config.v_remove, _config->device);
+ model_search_disk_remove(&all_config.v_group, &all_config.v_remove, _config->device);
+ model_search_disk_remove_project(&all_config.v_project,&all_config.v_disk_status, &all_config.v_remove, _config->device);
+ model_clear_cfg_device(_config);
+ all_config.v_disk_status.pfVectorDelete(&all_config.v_disk_status, index);
+ all_config.flag_save = 1;
+
+ }
+ }
+ }
+ entry_user_disk(0, 0);
+ entry_groups_disk(0, 0);
+ entry_project_disk(0, 0);
+ tree_view_select_user(NULL);
+ tree_view_select_group(NULL);
+ tree_view_select_project(NULL);
+}
+
+
+void user_remove() {
+ if (note_selected == 0) {
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(cfg_custom_gui.user.liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cfg_custom_gui.user.tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.user);
+ gtk_list_store_remove(cfg_custom_gui.user.liststore, &iter);
+ model_template_remove(&all_config.v_user, &all_config.v_remove, index);
+ index_selected = -1;
+ all_config.flag_save = 1;
+ }
+
+ }
+}
+
+void group_remove() {
+ if (note_selected == 1) {
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(cfg_custom_gui.group.liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cfg_custom_gui.group.tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.group);
+ gtk_list_store_remove(cfg_custom_gui.group.liststore, &iter);
+ model_template_remove(&all_config.v_group, &all_config.v_remove, index);
+ index_selected = -1;
+ all_config.flag_save = 1;
+ }
+ }
+}
+
+void project_remove() {
+ if (note_selected == 2) {
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(cfg_custom_gui.project.liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(cfg_custom_gui.project.tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ int index = wrapper_select_tree_view(&cfg_custom_gui.project);
+ gtk_list_store_remove(cfg_custom_gui.project.liststore, &iter);
+ model_template_remove(&all_config.v_project, &all_config.v_remove, index);
+ index_selected = -1;
+ all_config.flag_save = 1;
+ }
+
+ }
+}
+
+int wrapper_select_tree_view(hotebook* widgets) {
+ int index = -1;
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->tree_view));
+ if(gtk_tree_selection_get_selected(selection, &model, &iter)) {
+ char* str_iter = gtk_tree_model_get_string_from_iter(model, &iter);
+ index = atoi(str_iter);
+ index_selected = index;
+ }
+ else {
+ index_selected = -1;
+ }
+ return index;
+}
+
+void wrapper_all_save() {
+ int flag_mess_save = 0;
+ if (all_config.flag_load == 0) {
+ flag_mess_save = wrapper_template_save(&all_config, CMD_ALL_SAVE, CMD_ALL_REMOVE);
+ }
+ else {
+ flag_mess_save = wrapper_template_save(&all_config, CMD_ALL_SAVE, CMD_ALL_REMOVE);
+ }
+ if (flag_mess_save) {
+ yon_ubl_status_box_render(GLOBAL_LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ all_config.flag_load=0;
+ }
+ else {
+ yon_ubl_status_box_render(MESS_NOTHING_SAVE, BACKGROUND_IMAGE_SUCCESS_TYPE);
+ }
+}
+void wrapper_global_save() {
+ if (wrapper_template_save(&all_config, CMD_SAVE_GLOBAL, CMD_REMOVE_GLOBAL)) {
+ yon_ubl_status_box_render(GLOBAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ all_config.flag_load-=1;
+ }
+ else {
+ yon_ubl_status_box_render(MESS_NOTHING_SAVE, BACKGROUND_IMAGE_SUCCESS_TYPE);
+ }
+}
+void wrapper_system_save() {
+ if (wrapper_template_save(&all_config, CMD_SAVE_SYSTEM, CMD_REMOVE_SYSTEM)) {
+ yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ all_config.flag_load-=1;
+ }
+ else {
+ yon_ubl_status_box_render(MESS_NOTHING_SAVE, BACKGROUND_IMAGE_SUCCESS_TYPE);
+ }
+}
+void load_system_cfg() {
+ all_config.flag_load = 0;
+ load_template_load_cfg(&all_config, CMD_LOAD_SYSTEM);
+ yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL, BACKGROUND_IMAGE_SUCCESS_TYPE);
+ entry_device_disk(0, 0);
+ entry_user_disk(0, 0);
+ entry_groups_disk(0, 0);
+ entry_project_disk(0, 0);
+ tree_view_select_user(NULL);
+ tree_view_select_group(NULL);
+ tree_view_select_project(NULL);
+ tree_view_select_device(NULL);
+}
+
+void load_global_cfg() {
+ all_config.flag_load = 1;
+ load_template_load_cfg(&all_config, CMD_LOAD_GLOBAL);
+ yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ entry_device_disk(0, 0);
+ entry_user_disk(0, 0);
+ entry_groups_disk(0, 0);
+ entry_project_disk(0, 0);
+ tree_view_select_user(NULL);
+ tree_view_select_group(NULL);
+ tree_view_select_project(NULL);
+ tree_view_select_device(NULL);
+}
+
+void tree_view_select_device(GtkWidget* self) {
+ note_selected = 3;
+ tree_view_select(NULL,&all_config.v_disk_status , &cfg_custom_gui.device);
+}
+
+void tree_view_select_user(GtkWidget* self) {
+ note_selected = 0;
+ tree_view_select(NULL,&all_config.v_user , &cfg_custom_gui.user);
+}
+void tree_view_select_group(GtkWidget* self) {
+ note_selected = 1;
+ tree_view_select(NULL,&all_config.v_group ,&cfg_custom_gui.group);
+}
+void tree_view_select_project(GtkWidget* self) {
+ note_selected = 2;
+ tree_view_select(NULL,&all_config.v_project , &cfg_custom_gui.project);
+}
+
+void control_event(main_window* _config_main_gui, custom_window* _config_custom_gui) {
+ g_signal_connect(G_OBJECT(_config_main_gui->LoadLocalMenuItem), "activate", G_CALLBACK(load_system_cfg), NULL);
+ g_signal_connect(G_OBJECT(_config_main_gui->LoadGlobalMenuItem), "activate", G_CALLBACK(load_global_cfg), NULL);
+ g_signal_connect(G_OBJECT(_config_main_gui->SaveGlobalMenuItem), "activate", G_CALLBACK(wrapper_global_save), NULL);
+ g_signal_connect(G_OBJECT(_config_main_gui->SaveLocalMenuItem), "activate", G_CALLBACK(wrapper_system_save), NULL);
+ g_signal_connect(G_OBJECT(_config_main_gui->SaveMenuItem), "activate", G_CALLBACK(wrapper_all_save), NULL);
+ g_signal_connect(G_OBJECT(_config_custom_gui->user.btnAdd),"clicked",G_CALLBACK(wrapper_add_user_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->user.btnEdit),"clicked",G_CALLBACK(wrapper_edit_user_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->user.btnDel),"clicked",G_CALLBACK(user_remove), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->group.btnAdd),"clicked",G_CALLBACK(wrapper_add_group_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->group.btnEdit),"clicked",G_CALLBACK(wrapper_edit_group_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->group.btnDel),"clicked",G_CALLBACK(group_remove), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->project.btnAdd),"clicked",G_CALLBACK(wrapper_add_project_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->project.btnEdit),"clicked",G_CALLBACK(wrapper_edit_project_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->project.btnDel),"clicked",G_CALLBACK(project_remove), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->user.btnFilter),"clicked",G_CALLBACK(wrapper_filters_user_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->group.btnFilter),"clicked",G_CALLBACK(wrapper_filters_group_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->project.btnFilter),"clicked",G_CALLBACK(wrapper_filters_project_show), glade_path);
+
+ g_signal_connect(G_OBJECT(_config_custom_gui->user.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_user), NULL);
+ g_signal_connect(G_OBJECT(_config_custom_gui->group.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_group), NULL);
+ g_signal_connect(G_OBJECT(_config_custom_gui->project.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_project), NULL);
+ g_signal_connect(G_OBJECT(_config_custom_gui->device.tree_view), "cursor-changed", G_CALLBACK(tree_view_select_device), NULL);
+ g_signal_connect(G_OBJECT(_config_custom_gui->device.btnEdit), "clicked", G_CALLBACK(wrapper_edit_view_device_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->device.btnAdd), "clicked", G_CALLBACK(wrapper_add_view_device_show), glade_path);
+ g_signal_connect(G_OBJECT(_config_custom_gui->device.btnDel),"clicked",G_CALLBACK(device_remove), glade_path);
+
+}
+
+int main(int argc, char *argv[]){
+ all_config.flag_not_data = 0;
+ vector_init(&all_config.v_user);
+ vector_init(&all_config.v_group);
+ vector_init(&all_config.v_project);
+ vector_init(&all_config.v_disk_status);
+ vector_init(&all_config.v_remove);
+ local=setlocale(LC_ALL, "");
+ textdomain(LocaleName);
+ config_init(&main_config);
+ 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);
+
+ 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);
+ yon_window_config_setup(GTK_WINDOW(widgets->Window));
+ yon_window_config_load(config_path);
+ if (getuid()!=0) {
+ load_system_cfg();
+ yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+ }
+ else {
+ yon_ubl_status_box_render(LOAD_LOCAL_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ if (main_config.lock_load_global == 0) {
+ load_global_cfg();
+ }
+ if (main_config.lock_save_local == 0) {
+ load_system_cfg();
+ }
+ }
+
+ yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id);
+ 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);
+ tree_view_select_user(NULL);
+ tree_view_select_group(NULL);
+ tree_view_select_project(NULL);
+ tree_view_select_device(NULL);
+ gtk_main();
+}
\ No newline at end of file
diff --git a/source/controler.h b/source/controler.h
new file mode 100644
index 0000000..04ed1ed
--- /dev/null
+++ b/source/controler.h
@@ -0,0 +1,38 @@
+#include "ubl-settings-diskquota.h"
+#include "ubl-strings.h"
+#include "view_set_disk.h"
+char *local;
+
+int main(int argc, char *argv[]);
+void load_global_cfg();
+void load_system_cfg();
+void control_event(main_window* _config_main_gui, custom_window* _config_custom_gui);
+void wrapper_all_save();
+void wrapper_global_save();
+void wrapper_system_save();
+int fill_tree_view_project(config_all* all_config, hotebook* widget, char* str_fill , int flag_gui_add);
+void entry_user_disk(GtkWidget *self,int* flag_update);
+void entry_groups_disk(GtkWidget *self,int* flag_update);
+void entry_project_disk(GtkWidget *self,int* flag_update);
+void wrapper_add_user_show();
+void wrapper_edit_user_show();
+void wrapper_add_group_show();
+void wrapper_edit_group_show();
+void wrapper_add_project_show();
+void wrapper_edit_project_show();
+void wrapper_filters_user_show();
+void wrapper_filters_group_show();
+void wrapper_filters_project_show();
+void wrapper_get_spin_time_gui_user();
+void wrapper_get_spin_time_gui_group();
+void wrapper_get_spin_time_gui_project();
+void tree_view_select_user(GtkWidget* self);
+void tree_view_select_group(GtkWidget* self);
+void tree_view_select_project(GtkWidget* self);
+void tree_view_select_device(GtkWidget* self);
+void get_spin_time_gui(vector* vec_u_g_p, hotebook* widgets);
+void tree_view_select(GtkWidget* self, vector* vec_temp, hotebook* widgets);
+void block_spin_time(hotebook* widgets,void (*f)());
+void unlock_spin_time(hotebook* widgets,void (*f)());
+void template_set_status_disk(GtkWidget* self, hotebook* widgets);
+void get_status_disk(hotebook* widgets);
diff --git a/source/controller.cc b/source/controller.cc
deleted file mode 100644
index 81040e4..0000000
--- a/source/controller.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-#include "controller.h"
-
-int socket_ext_id_I = 0;
-int socket_trd_id_I = 0;
-
-Controller::Controller(BaseObjectType* obj, Glib::RefPtr const& builder)
- :Gtk::ApplicationWindow(obj), builder{builder} {
- this->builder = builder;
- this->settings();
-}
-
-Controller::Controller(Glib::RefPtr const& builder) {
- this->builder = builder;
- this->settings();
-}
-
-Controller::~Controller()
-{
-}
-
-void Controller::settings() {
- obj_open_browser->set_obj_about(obj_view_about);
- obj_main_window = new MainWindow(builder, obj_open_browser, &socket_ext_id_I, &socket_trd_id_I);
- obj_main_window->set_obj_wrapper_load_save(obj_wrapper_load_save);
- obj_open_browser->settings();
- obj_main_window->set_map_gui(&map_gui_cfg);
- obj_main_window->set_map_global(&map_global_cfg);
- obj_main_window->set_map_local(&map_system_cfg);
- obj_main_window->set_obj_view_filters(&obj_view_filters);
- obj_main_window->set_obj_view_edit(&obj_view_edit);
- obj_main_window->set_obj_view_add(&obj_view_add);
- obj_main_window->set_obj_view_add_project(&obj_view_add_project);
- obj_main_window->set_obj_view_edit_project(&obj_view_edit_project);
- obj_main_window->settings();
-}
-
-CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help)
-: Glib::OptionGroup{p_name, p_description, p_help} {
- Glib::OptionEntry socketIDArg;
- socketIDArg.set_long_name("socket-id");
- socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
- socketIDArg.set_description("Settings manager socket");
- Glib::OptionEntry socketExtId;
- socketExtId.set_long_name("socket-ext-id");
- socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
- socketExtId.set_description("Settings manager secondary socket");
- Glib::OptionEntry socketTrdId;
- socketTrdId.set_long_name("socket-trd-id");
- socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN);
- socketTrdId.set_description("Settings manager secondary socket");
- add_entry(socketIDArg, m_socketID);
- add_entry(socketExtId, socket_ext_id_I);
- add_entry(socketTrdId, socket_trd_id_I);
-}
-
-::Window CmdArgParser::GetSocketID() const{
- return m_socketID;
-}
-
-SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder)
- :Gtk::Plug{p_socketID} {
- Controller* wnd = nullptr;
- builder->get_widget_derived("window", wnd);
- builder->get_widget("plugBox", plugBox);
- plugBox->get_parent()->remove(*plugBox);
- add(*plugBox);
- show_all_children();
-}
\ No newline at end of file
diff --git a/source/controller.h b/source/controller.h
deleted file mode 100644
index b452ee4..0000000
--- a/source/controller.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef CONTROLLER_H
-#define CONTROLLER_H
-#include "my_type.h"
-#include "view/view_open_browser.h"
-#include "view/view_about.h"
-#include "view/ubl-settings-diskquota.h"
-#include "view/model/wrapper_load_save.h"
-#include "view/view_filters.h"
-#include "view/view_add_user_group.h"
-#include "view/view_edit_user_group.h"
-#include "view/view_edit_project.h"
-#include "view/view_add_project.h"
-
-extern int socket_ext_id_I;
-extern int socket_trd_id_I;
-
-class Controller : public Gtk::ApplicationWindow
-{
-private:
- Glib::RefPtr builder;
- map_str_str map_gui_cfg;
- map_str_str map_global_cfg;
- map_str_str map_system_cfg;
-public:
- ~Controller();
- void settings();
- View_open_browser* obj_open_browser = new View_open_browser();
- View_about* obj_view_about = new View_about();
- MainWindow* obj_main_window;
- Wrapper_load_save *obj_wrapper_load_save = new Wrapper_load_save();
- View_filters obj_view_filters = View_filters();
- View_add_user_group obj_view_add = View_add_user_group();
- View_edit_user_group obj_view_edit = View_edit_user_group();
- View_edit_project obj_view_edit_project = View_edit_project();
- View_add_project obj_view_add_project = View_add_project();
- Controller(BaseObjectType* obj, Glib::RefPtr const& builder);
- Controller(Glib::RefPtr const& builder);
-
-
-};
-
-class CmdArgParser : public Glib::OptionGroup {
-public:
- CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help);
- ::Window GetSocketID() const;
-private:
- int m_socketID = 0;
-
-};
-class SettingsPlug : public Gtk::Plug{
-public:
- Gtk::Window *window;
- SettingsPlug(::Window p_socketID, Glib::RefPtr builder);
-
-private:
- Gtk::Widget *plugBox;
- Gtk::Widget *parent;
-};
-#endif
\ No newline at end of file
diff --git a/source/main.cc b/source/main.cc
deleted file mode 100644
index 7c2362a..0000000
--- a/source/main.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "controller.h"
-#include "var.h"
-
-void pars_flag(int index_start, int argc, char* argv[]);
-
-int main(int argc, char** argv) {
- string str_argv= "";
- string str_cmd_argv = "";
- for (int i=1; i 1){
- str_argv = argv[1];
- }
- bindtextdomain(app_name, "/usr/share/locale/");
- bind_textdomain_codeset(app_name, "UTF-8");
- textdomain(app_name);
- if (str_argv.find("--socket-id") != std::string::npos) {
- auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example.plug");
- auto builder = Gtk::Builder::create_from_file(path_glade);
- Glib::init();
- setlocale(LC_ALL, "");
- Glib::OptionContext context;
-
- CmdArgParser parser{
- "Socket ID",
- "Command line argument for socket ID communication.",
- "No help available, sorry"
- };
-
- context.set_main_group(parser);
- context.parse(argc, argv);
-
- ::Window socketID = parser.GetSocketID();
-
- // Handle plug:
- SettingsPlug plug{socketID, builder};
- plug.show();
-
- app->run(plug);
- return 0;
- }
- else if (str_argv.find("-") != std::string::npos || argc == 1) {
- int len_argv = 1;
- auto app = Gtk::Application::create(len_argv, argv, "org.gtkmm.example.plug");
- auto builder = Gtk::Builder::create_from_file(path_glade);
- pars_flag(1, argc, argv);
- Controller* wnd = nullptr;
- builder->get_widget_derived("window", wnd);
- auto r = app->run(*wnd);
- delete wnd;
- return r;
- }
-}
-
-void pars_flag(int index_start, int argc, char* argv[]) {
- string str_argv = "";
- for (int i = index_start; iv_user);
+ load_free_vector(_all_config, &_all_config->v_group);
+ load_free_vector(_all_config, &_all_config->v_project);
+ free_remove_vector(_all_config, &_all_config->v_remove);
+ model_free_vector_string(&_all_config->v_disk_remove);
+ device_disk_parsed();
+ vector_init(&_all_config->v_user);
+ vector_init(&_all_config->v_group);
+ vector_init(&_all_config->v_project);
+ vector_init(&_all_config->v_disk_status);
+ vector_init(&_all_config->v_remove);
+ vector_init(&_all_config->v_disk_remove);
+ if (size == 1 && strcmp(cfg[0], "(null)") == 0) {
+ for (int index_1 = 0; index_1 < get_device_vec()->vectorList.total; index_1++) {
+ char* device = NULL;
+ device_config* _config_disk = (device_config*)get_device_vec()->pfVectorGet(get_device_vec(), index_1);
+ if (yon_window_config_get_parameter(_config_disk->name_disk, _config_disk->name_disk, &device, YON_TYPE_STRING)) {
+ if (strstr(device, _config_disk->name_disk)) {
+ size_t deferring_size = 0;
+ size_t deferring_file = 0;
+ disk_status* disk_cfg = malloc(sizeof(disk_status));
+ disk_cfg->status = 1;
+ _all_config->v_disk_status.pfVectorAdd(&_all_config->v_disk_status, disk_cfg);
+ disk_cfg->device = yon_char_new(device);
+ disk_cfg->fs = yon_char_new(_config_disk->file_system);
+ disk_cfg->mount_point = yon_char_new(_config_disk->mounted);
+ disk_cfg->name = yon_char_new(_config_disk->type_dick);
+ if (yon_window_config_get_parameter("deferring_size", _config_disk->name_disk, &deferring_size, YON_TYPE_INT)) {
+ disk_cfg->deferring_size = deferring_size;
+ }
+ else {
+ disk_cfg->deferring_size = 0;
+ }
+ if (yon_window_config_get_parameter("deferring_file", _config_disk->name_disk, &deferring_file, YON_TYPE_INT)) {
+ disk_cfg->deferring_file = deferring_file;
+ }
+ else {
+ disk_cfg->deferring_file = 0;
+ }
+ }
+ }
+ }
+ }
+ 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);
+ yon_char_divide_search(str_key, "[",-1);
+ str_key = yon_char_divide_search(str_key, "]",-1);
+ char* str_value = str_key_value;
+ int flag_find = 0;
+ for (int j=0; j < _all_config->v_disk_status.vectorList.total;j++) {
+ disk_status* config_disk_status = (disk_status*)_all_config->v_disk_status.pfVectorGet(&_all_config->v_disk_status, j);
+ if (strstr(str_key, config_disk_status->device)) {
+ flag_find = 1;
+ }
+ }
+ if (((strstr(str_value, "enable") || strstr(str_value, "disable")) || yon_char_find_count(str_key, ":") == 1) && flag_find == 0) {
+ disk_status* disk_cfg = malloc(sizeof(disk_status));
+ disk_cfg->deferring_size = 0;
+ disk_cfg->deferring_file = 0;
+ load_pars_values_status(disk_cfg, str_key, str_value);
+ _all_config->v_disk_status.pfVectorAdd(&_all_config->v_disk_status, disk_cfg);
+ for (int index = 0; index < get_device_vec()->vectorList.total; index++) {
+ device_config* _config_disk = (device_config*)get_device_vec()->pfVectorGet(get_device_vec(), index);
+ for (int j=0; j < _all_config->v_disk_status.vectorList.total;j++) {
+ disk_status* config_disk_status = (disk_status*)_all_config->v_disk_status.pfVectorGet(&_all_config->v_disk_status, j);
+ if (strstr(config_disk_status->device, _config_disk->name_disk)) {
+ config_disk_status->device = yon_char_new(_config_disk->name_disk);
+ config_disk_status->fs = yon_char_new(_config_disk->file_system);
+ config_disk_status->mount_point = yon_char_new(_config_disk->mounted);
+ config_disk_status->name = yon_char_new(_config_disk->type_dick);
+ if (yon_char_find_count(str_key, ":") == 1 && (!strstr(str_value, "enable") && !strstr(str_value, "disable"))) {
+ int size_value = 0;
+ char** arr_values = philos_str_split(str_value, &size_value, ":");
+ config_disk_status->deferring_size = atoll(arr_values[4]);
+ config_disk_status->deferring_file = atoll(arr_values[5]);
+ config_disk_status->status = 2;
+ philos_free_string_array(&arr_values, size_value);
+ }
+ else {
+
+ }
+
+ }
+ }
+ }
+ }
+ else if ((strstr(str_value, "enable") || strstr(str_value, "disable")) && flag_find) {
+
+ }
+ else {
+ if (yon_char_find_count(str_key, ":") == 1) {
+
+ }
+ else {
+ config_u_g_p* _config = malloc(sizeof(config_u_g_p));
+ model_null_str_writing(_config);
+ _config->loaded_keys = yon_char_new(str_key);
+ load_pars_keys(_config, yon_char_new(str_key), index);
+ load_pars_values(_config, _all_config,str_key, yon_char_new(str_value), index);
+
+ if (strstr(str_key, "prjquota")) {
+ _all_config->v_project.pfVectorAdd(&_all_config->v_project,_config);
+ }
+ else if (strstr(str_key, "usrquota")) {
+ _all_config->v_user.pfVectorAdd(&_all_config->v_user,_config);
+ }
+ else if (strstr(str_key, "grpquota")){
+ _all_config->v_group.pfVectorAdd(&_all_config->v_group,_config);
+ }
+ }
+
+ }
+
+ }
+ _all_config->flag_set_data = 0;
+ _all_config->flag_not_data = 1;
+ _all_config->flag_save = 0;
+
+}
+
+void load_pars_keys(config_u_g_p* _config, char* str_key, int index) {
+ load_pars_keys_u_g(_config, yon_char_new(str_key), index);
+ load_pars_keys_p(_config, yon_char_new(str_key), index);
+}
+
+void load_pars_keys_u_g(config_u_g_p* _config, char* str_key, int index) {
+ if (strstr(str_key, "prjquota")) {
+ return;
+ }
+ if (yon_char_find_count(str_key, ":") == 1) {
+ return;
+ }
+ if (yon_char_find_count(str_key, ":") || yon_char_find_count(str_key, ",")) {
+ int size_point = 0;
+ char** arr_keys = philos_str_split(yon_char_new(str_key), &size_point, ":");
+ _config->type_arr = yon_char_new(arr_keys[0]);
+ int size_users = 0;
+ if (yon_char_find_count(str_key, ":") == 1) {
+ int size_comma = 0;
+ char** arr_user = philos_str_split(arr_keys[size_point-1], &size_comma, ",");
+ _config->UNIX_file = yon_char_new(arr_keys[1]);
+ }
+ else if (yon_char_find_count(str_key, ":") == 2) {
+ if (yon_char_find_count(str_key, ",")) {
+ int size_comma = 0;
+ char** arr_user = philos_str_split(arr_keys[size_point-1], &size_comma, ",");
+ _config->UNIX_file = yon_char_new(arr_keys[1]);
+ for (int i = 0; i < size_comma; i++) {
+ _config->actors.pfVectorAdd(&_config->actors,yon_char_new(arr_user[i]));
+ }
+ }
+ else {
+ _config->UNIX_file = yon_char_new(arr_keys[1]);
+ if (size_point == 3) {
+ _config->actors.pfVectorAdd(&_config->actors,yon_char_new(arr_keys[2]));
+ }
+
+ }
+ }
+ }
+ else {
+
+ }
+}
+
+void load_pars_keys_p(config_u_g_p* _config, char* str_key, int index) {
+ if (yon_char_find_count(str_key, ":") == 1) {
+ return;
+ }
+ if (strstr(str_key, "prjquota")) {
+ if (yon_char_find_count(str_key, ":") || yon_char_find_count(str_key, ",")) {
+ int size_point = 0;
+ char** arr_keys = philos_str_split(yon_char_new(str_key), &size_point, ":");
+ _config->type_arr = yon_char_new(arr_keys[0]);
+ int size_users = 0;
+ if (yon_char_find_count(str_key, ":") == 2) {
+ _config->UNIX_file = yon_char_new(arr_keys[1]);
+ int size_comma = 0;
+ if (yon_char_find_count(str_key, ",")) {
+ char** arr_user = philos_str_split(arr_keys[size_point-1], &size_comma, ",");
+ if (strstr(str_key, "AUTO")) {
+ _config->id = -1;
+ }
+ else {
+ _config->id = atoi(arr_user[0]);
+ }
+ _config->actors.pfVectorAdd(&_config->actors,yon_char_new(arr_user[size_comma-1]));
+ }
+ else {
+ if (strstr(str_key, "AUTO")) {
+ _config->id = -1;
+ }
+ else {
+ _config->id = atoi(arr_keys[size_point-1]);
+ }
+ }
+ }
+ }
+ }
+ else {
+ }
+}
+
+void load_pars_values_status(disk_status* _config, char* key, char* value) {
+ _config->device = yon_char_new(key);
+ if (strstr(value,"enable")) {
+ _config->status = 2;
+ return;
+ }
+ else if (strstr(value,"disable")) {
+ _config->status = 1;
+ return;
+ }
+}
+
+void load_pars_values(config_u_g_p* _config, config_all* _all_config, char* str_key, char* str_value, int index) {
+ int size_array_size_pow = 0;
+ char** array_size_pow = NULL;
+ 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);
+ int size = 0;
+ char* new_value = yon_char_new(str_value);
+ char** arr_values = philos_str_split(new_value, &size, ":");
+ int index_split = yon_char_find_count(str_value, ":");
+ if (index_split == 3 || index_split == 5) {
+ philos_set_pow_size_memory(yon_char_new(arr_values[0]), &_config->soft_restriction_size_pow, array_size_pow);
+ philos_set_size_memory_integer(yon_char_new(arr_values[0]), &_config->soft_restriction_size);
+ philos_set_pow_size_memory(yon_char_new(arr_values[1]), &_config->severe_limitation_size_pow, array_size_pow);
+ philos_set_size_memory_integer(yon_char_new(arr_values[1]), &_config->severe_limitation_size);
+ philos_set_size_memory_integer(yon_char_new(arr_values[2]), &_config->soft_restriction_file);
+ philos_set_size_memory_integer(yon_char_new(arr_values[3]), &_config->severe_limitation_file);
+ if (index_split == 5) {
+ _config->deferring_size = atoll(arr_values[4]);
+ _config->deferring_file = atoll(arr_values[5]);
+ }
+ else {
+ philos_set_size_memory_integer("-", &_config->deferring_size);
+ philos_set_size_memory_integer("-", &_config->deferring_file);
+ }
+ for (int j=0; j < _all_config->v_disk_status.vectorList.total;j++) {
+ disk_status* config_disk_status = (disk_status*)_all_config->v_disk_status.pfVectorGet(&_all_config->v_disk_status, j);
+ if (strstr(str_key, config_disk_status->device)){
+ config_disk_status->deferring_file = _config->deferring_file;
+ config_disk_status->deferring_size = _config->deferring_size;
+ }
+ }
+
+ }
+ else {
+
+ }
+}
+
+void load_free_vector(config_all* _all_config, vector* vec_config) {
+
+ if (_all_config->flag_not_data == 1) {
+ for (int i = 0; i < vec_config->pfVectorTotal(vec_config); i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_config->pfVectorGet(vec_config, i);
+ model_clear_cfg(_config);
+ }
+ vec_config->pfVectorFree(vec_config);
+ }
+
+}
+
+void free_remove_vector(config_all* _all_config, vector* vec_remove) {
+ if (_all_config->flag_not_data == 1) {
+ if (vec_remove->vectorList.total > 0) {
+ for (int i = 0; i < vec_remove->vectorList.total; i++) {
+ char* str_remove = (char*)vec_remove->pfVectorGet(vec_remove, i);
+ free(str_remove);
+ }
+ vec_remove->pfVectorFree(vec_remove);
+ }
+ }
+}
+
+
+
diff --git a/source/model/load.h b/source/model/load.h
new file mode 100644
index 0000000..4ae62df
--- /dev/null
+++ b/source/model/load.h
@@ -0,0 +1,16 @@
+#ifndef LOAD_H
+#define LOAD_H
+#include "ubl-utils.h"
+#include "philos_utils.h"
+#include "my_device.h"
+
+void load_template_load_cfg(config_all* _all_config, char* cmd);
+void load_pars_keys(config_u_g_p* _config, char* str_key, int index);
+void load_pars_keys_u_g(config_u_g_p* _config, char* str_key, int index);
+void load_pars_keys_p(config_u_g_p* _config, char* str_key, int index);
+void load_pars_values(config_u_g_p* _config, config_all* _all_config, char* str_key, char* str_value, int index);
+void load_free_vector(config_all* _all_config,vector* vec_config);
+void load_pars_values_status(disk_status* _config, char* key, char* value);
+void free_remove_vector(config_all* _all_config, vector* vec_remove);
+
+#endif
\ No newline at end of file
diff --git a/source/model/model.c b/source/model/model.c
new file mode 100644
index 0000000..8684eb8
--- /dev/null
+++ b/source/model/model.c
@@ -0,0 +1,425 @@
+#include "model.h"
+
+size_t check_null(size_t num) {
+ if (num == 0) {
+ return -1;
+ }
+ return num;
+}
+
+char* check_null_to_str(size_t num) {
+ if (num == 0) {
+ return yon_char_new("-");
+ }
+ return philos_char_from_size_t(num);
+}
+
+void model_clear_cfg(config_u_g_p* _config) {
+ free(_config->quota);
+ free(_config->size_memory);
+ free(_config->device);
+ free(_config->UNIX_file);
+ free(_config->files);
+ model_free_vector_string(&_config->actors);
+ vectorFree(&_config->actors);
+ free(_config->loaded_keys);
+}
+
+void model_clear_cfg_device(disk_status* _config) {
+ free(_config->device);
+ free(_config->fs);
+ free(_config->mount_point);
+ free(_config->name);
+}
+
+void model_free_vector_string(vector* vec_str) {
+ if (vec_str) {
+ if (vec_str->vectorList.total> 0) {
+ for (int i = 0; i < vec_str->vectorList.total; i++) {
+ vectorDelete(vec_str, i);
+ }
+ }
+ }
+}
+void model_free_vector_disk_status(vector* vec_disk_status) {
+ if (vec_disk_status) {
+ if (vec_disk_status->vectorList.total> 0) {
+ for (int i = 0; i < vec_disk_status->vectorList.total; i++) {
+ disk_status* _config = (disk_status*)vec_disk_status->pfVectorGet(vec_disk_status, i);
+ // model_clear_cfg_device(_config);
+ vectorDelete(vec_disk_status, i);
+ }
+ }
+ }
+}
+
+void model_tree_view_add(config_u_g_p* _config) {
+ model_null_str_writing(_config);
+}
+
+void model_null_str_writing(config_u_g_p* _config) {
+ _config->type_arr = yon_char_new(empty_str);
+ _config->quota = yon_char_new(empty_str);
+ _config->size_memory = yon_char_new(empty_str);
+ _config->device = yon_char_new(empty_str);
+ _config->UNIX_file = yon_char_new(empty_str);
+ _config->files = yon_char_new(empty_str);
+ _config->loaded_keys = yon_char_new(empty_str);
+ _config->type_arr = yon_char_new(empty_str);
+ _config->id = 0;
+ _config->soft_restriction_size = 0;
+ _config->soft_restriction_file = 0;
+ _config->severe_limitation_size = 0;
+ _config->severe_limitation_file = 0;
+ _config->deferring_size = 0;
+ _config->deferring_file = 0;
+ _config->size_memory_pow = 0;
+ _config->soft_restriction_size_pow = 0;
+ _config->severe_limitation_size_pow = 0;
+ vector_init(&_config->actors);
+}
+
+char* format_actors(vector* vec_actors) {
+ char* str_all = yon_char_new("");
+ char split_simvol[2] = {0};
+ split_simvol[0] = 0;
+ split_simvol[1] = 0;
+ char* str_actors = NULL;
+ if (vec_actors->vectorList.total> 0) {
+ for (int i = 0; i < vec_actors->vectorList.total; i++) {
+ str_actors = (char*)vec_actors->pfVectorGet(vec_actors, i);
+ if (str_actors) {
+ str_all = yon_char_unite(str_all,split_simvol, str_actors, NULL);
+ split_simvol[0] = ',';
+ split_simvol[1] = '\0';
+ }
+ }
+ }
+
+ if (strlen(str_all) < 3) {
+ return yon_char_new("-");
+ }
+ return str_all;
+}
+
+int fill_tree_view_project(config_all* all_config,hotebook* widget , char* str_fill, int flag_gui_add) {
+ GtkTreeModel *model = GTK_TREE_MODEL(widget->liststore);
+ if (flag_gui_add == 0) {
+ g_object_ref(widget->liststore);
+ gtk_list_store_clear(widget->liststore);
+ }
+ int flag_searhc = 0;
+ for (int i = 0; i < all_config->v_project.pfVectorTotal(&all_config->v_project); i++) {
+ config_u_g_p* _config = (config_u_g_p*)all_config->v_project.pfVectorGet(&all_config->v_project, i);
+ if (strcmp(_config->type_arr, str_fill) == 0) {
+ GtkTreeIter iter;
+ flag_searhc++;
+ gtk_list_store_append(widget->liststore,&iter);
+ char* deferring_size = wrapper_str_time(_config->deferring_size);
+ char* deferring_file = wrapper_str_time(_config->deferring_file);
+ gtk_list_store_set(widget->liststore,&iter,
+ 0,model_find_path_to_disk(&all_config->v_disk_status, _config->UNIX_file),
+ 1,_config->UNIX_file,
+ 2,fill_tree_view_id(_config->id),
+ 3,format_actors(&_config->actors),
+ 4,philos_format_cfg_str_size_memory("", check_null(_config->soft_restriction_size),_config->soft_restriction_size_pow),
+ 5,philos_format_cfg_str_size_memory("", check_null(_config->severe_limitation_size),_config->severe_limitation_size_pow),
+ 6,deferring_size,
+ 7,check_null_to_str(_config->soft_restriction_file),
+ 8,check_null_to_str(_config->severe_limitation_file),
+ 9,deferring_file,
+ -1);
+
+ }
+ }
+ if (flag_gui_add != 0) {
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widget->tree_view), model);
+ }
+ return flag_searhc;
+}
+
+int fill_tree_view_user_group(config_all* all_config, hotebook* widget, char* str_fill ,int flag_gui_add) {
+ GtkTreeModel *model = GTK_TREE_MODEL(widget->liststore);
+ if (flag_gui_add == 0) {
+ g_object_ref(widget->liststore);
+ gtk_list_store_clear(widget->liststore);
+ }
+ int flag_searhc = 0;
+ vector* vec_temp = NULL;
+ if (strcmp(str_fill, "usrquota")==0) {
+ vec_temp = &all_config->v_user;
+ }
+ else {
+ vec_temp = &all_config->v_group;
+ }
+ if (vec_temp->vectorList.total > 0) {
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ if (strcmp(_config->type_arr, str_fill) == 0) {
+ GtkTreeIter iter;
+ flag_searhc++;
+ gtk_list_store_append(widget->liststore,&iter);
+ char* deferring_size = wrapper_str_time(_config->deferring_size);
+ char* deferring_file = wrapper_str_time(_config->deferring_file);
+ gtk_list_store_set(widget->liststore,&iter,
+ 0,format_actors(&_config->actors),
+ 1,_config->UNIX_file,
+ 2,philos_format_cfg_str_size_memory("", check_null(_config->soft_restriction_size),_config->soft_restriction_size_pow),
+ 3,philos_format_cfg_str_size_memory("", check_null(_config->severe_limitation_size),_config->severe_limitation_size_pow),
+ 4,deferring_size,
+ 5,check_null_to_str(_config->soft_restriction_file),
+ 6,check_null_to_str(_config->severe_limitation_file),
+ 7,deferring_file,
+ -1);
+ }
+ }
+ }
+ if (flag_gui_add != 0) {
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widget->tree_view), model);
+ }
+ return flag_searhc;
+}
+
+char* wrapper_str_time(size_t seconds) {
+ me_time t;
+ if (seconds>0) {
+ t = time_convert(seconds);
+ t.str_time = yon_char_unite(yon_char_from_int(t.weeks),WEEKS,
+ yon_char_from_int(t.days), DAYS,
+ yon_char_from_int(t.hours), HOURS,
+ yon_char_from_int(t.minutes), MINUTES, NULL);
+ }
+ else {
+ t.str_time = yon_char_new("-");
+ }
+
+ return t.str_time;
+}
+
+char* quota_type(char* str_quota) {
+ if (strcmp(str_quota, "usrquota")==0) {
+ return STR_USER;
+ }
+ else if (strcmp(str_quota, "grpquota")==0) {
+ return STR_GROUP;
+ }
+ else if (strcmp(str_quota, "prjquota")==0) {
+ return STR_PROJECT;
+ }
+}
+char quota_fill_generate(char* str_quota, config_u_g_p* _config, GtkListStore* list_store, GtkTreeIter* iter) {
+ int index = -1;
+ if (strcmp(str_quota, "usrquota")==0) {
+ index = 4;
+ }
+ else if (strcmp(str_quota, "grpquota")==0) {
+ index = 5;
+ }
+ else if (strcmp(str_quota, "prjquota")==0) {
+ index = 6;
+ }
+ if (index != -1) {
+ gtk_list_store_set(list_store,iter,index,format_actors(&_config->actors), -1);
+ }
+
+}
+
+int pars_status_generate(vector* vec_status, config_u_g_p* _config_u_g_p) {
+ int flag = 0;
+ if (vec_status->vectorList.total > 0) {
+ for (int i = 0; i < vec_status->vectorList.total; i++) {
+ disk_status* _config = (disk_status*)vec_status->pfVectorGet(vec_status, i);
+ if (strstr(_config_u_g_p->type_arr,"prjquota")) {
+ if (strstr(_config_u_g_p->UNIX_file, _config->mount_point)) {
+ if (_config->status == 0 || _config->status == 1) {
+ flag = 0;
+ }
+ else {
+ flag = 1;
+ }
+ }
+ }
+ else {
+ if (strstr(_config_u_g_p->UNIX_file, _config->device)) {
+ if (_config->status == 0 || _config->status == 1) {
+ flag = 0;
+ }
+ else {
+ flag = 1;
+ }
+ }
+ }
+
+ }
+ }
+ return flag;
+}
+
+int fill_tree_view_generate(vector* vec_fill, vector* vec_status_disk, char* str_fill, GtkWidget* tree_view, GtkListStore* liststoreGeneral) {
+ GtkTreeModel *model = GTK_TREE_MODEL(liststoreGeneral);
+ if (vec_fill->vectorList.total > 0) {
+ for (int i = 0; i < vec_fill->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_fill->pfVectorGet(vec_fill, i);
+ GtkTreeIter iter;
+ gtk_list_store_append(liststoreGeneral,&iter);
+ char* deferring_size = wrapper_str_time(_config->deferring_size);
+ char* deferring_file = wrapper_str_time(_config->deferring_file);
+ quota_fill_generate(str_fill, _config,liststoreGeneral,&iter);
+ gtk_list_store_set(liststoreGeneral,&iter,
+ 0,pars_status_generate(vec_status_disk,_config),
+ 1,_config->quota,
+ 2,quota_type(str_fill),
+ 3,_config->UNIX_file,
+ 7,philos_format_cfg_str_size_memory("", check_null(_config->soft_restriction_size),_config->soft_restriction_size_pow),
+ 8,philos_format_cfg_str_size_memory("", check_null(_config->severe_limitation_size),_config->severe_limitation_size_pow),
+ 9,deferring_size,
+ 10,check_null_to_str(_config->soft_restriction_file),
+ 11,check_null_to_str(_config->severe_limitation_file),
+ 12,deferring_file,
+ -1);
+ }
+ }
+ gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), model);
+ return 1;
+}
+
+int pars_status_device(disk_status* _config) {
+ if (_config->status == 2) {
+ return 1;
+ }
+ return 0;
+}
+
+int fill_tree_view_device(vector* vec_device, hotebook* widget, int flag_gui_add) {
+ GtkTreeModel *model = GTK_TREE_MODEL(widget->liststore);
+ if (flag_gui_add == 0) {
+ g_object_ref(widget->liststore);
+ gtk_list_store_clear(widget->liststore);
+ }
+ int flag_searhc = 0;
+ if (vec_device->vectorList.total > 0) {
+ for (int i = 0; i < vec_device->vectorList.total; i++) {
+ disk_status* _config = (disk_status*)vec_device->pfVectorGet(vec_device, i);
+ GtkTreeIter iter;
+ flag_searhc++;
+ gtk_list_store_append(widget->liststore,&iter);
+ char* deferring_size = wrapper_str_time(_config->deferring_size);
+ char* deferring_file = wrapper_str_time(_config->deferring_file);
+ gtk_list_store_set(widget->liststore,&iter,
+ 0,pars_status_device(_config),
+ 1,_config->device,
+ 2,_config->mount_point,
+ 3,_config->fs,
+ 4,_config->name,
+ 5,deferring_size,
+ 6,deferring_file,
+ -1);
+ }
+ }
+ if (flag_gui_add != 0) {
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widget->tree_view), model);
+ }
+ return flag_searhc;
+}
+void del_disk_to_vector_device(vector* vec_temp, char* str_disk) {
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ if (strstr(_config->UNIX_file, str_disk)) {
+ vec_temp->pfVectorDelete(vec_temp, i);
+ }
+ }
+}
+
+char* format_str_del_config(config_u_g_p* _config) {
+ char* space = g_malloc0(sizeof(char)*2);
+ char* actors = yon_char_new("");
+ char* cmd = NULL;
+ char* unix_file = NULL;
+ if (strstr(_config->UNIX_file, " ") && !strstr(_config->UNIX_file, "\"")) {
+ unix_file = yon_char_unite("\"", _config->UNIX_file, "\"", NULL);
+ }
+ else {
+ unix_file = yon_char_new(_config->UNIX_file);
+ }
+ for (int i = 0; i < _config->actors.vectorList.total; i++) {
+ actors = yon_char_unite(actors, space, _config->actors.pfVectorGet(&_config->actors, i), NULL);
+ space[0] = ',';
+ space[1] = '\0';
+ }
+ if (strstr(_config->type_arr, "prjquota")) {
+ if (_config->actors.vectorList.total == 0) {
+ cmd = yon_char_unite(_config->type_arr, ":", unix_file, ":",fill_tree_view_id(_config->id), NULL);
+ }
+ else {
+ cmd = yon_char_unite(_config->type_arr, ":", unix_file, ":",fill_tree_view_id(_config->id), ",", actors, NULL);
+ }
+
+ }
+ else {
+ cmd = yon_char_unite(_config->type_arr, ":", unix_file, ":", actors, NULL);
+ }
+ free(space);
+ free(unix_file);
+ return cmd;
+}
+
+void model_template_remove(vector* vec_temp, vector* vec_remove, int index) {
+ if (index!=-1) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, index);
+ vec_remove->pfVectorAdd(vec_remove, format_str_del_config(_config));
+ model_clear_cfg(_config);
+ vec_temp->pfVectorDelete(vec_temp, index);
+ }
+}
+
+void model_search_disk_remove(vector* vec_temp, vector* vec_remove, char* str_disk) {
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ if (strstr(_config->UNIX_file, str_disk)) {
+ model_template_remove(vec_temp,vec_remove, i);
+ }
+ }
+}
+
+char* model_find_path_to_disk(vector* vec_temp, char* str_path) {
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ disk_status* _config = (disk_status*)vec_temp->pfVectorGet(vec_temp, i);
+ if (strstr(str_path, _config->mount_point)) {
+ return _config->device;
+ }
+ }
+ return "-";
+}
+
+void model_search_disk_remove_project(vector* vec_temp,vector* vec_status, vector* vec_remove, char* str_disk) {
+ for (int i = 0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config_project = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ for (int j = 0; j < vec_status->vectorList.total; j++) {
+ disk_status* _config = (disk_status*)vec_status->pfVectorGet(vec_status, j);
+ if (strstr(_config_project->UNIX_file, _config->mount_point)) {
+ model_template_remove(vec_temp,vec_remove, i);
+ }
+ }
+ }
+}
+
+void model_format_del_str(config_u_g_p* _config) {
+ char* loaded_keys = yon_char_new("");
+ if (strstr(_config->type_arr,"prjquota")) {
+ if (strcmp(format_actors(&_config->actors), "-") == 0) {
+ loaded_keys = yon_char_unite(_config->type_arr,":" , _config->UNIX_file,":", fill_tree_view_id(_config->id), ",", format_actors(&_config->actors), NULL);
+ }
+ else {
+ loaded_keys = yon_char_unite(_config->type_arr,":" , _config->UNIX_file,":", fill_tree_view_id(_config->id), NULL);
+ }
+ }
+ else {
+ if (strcmp(format_actors(&_config->actors), "-") == 0) {
+ loaded_keys = yon_char_unite(_config->type_arr,":" , _config->UNIX_file, NULL);
+ }
+ else {
+ loaded_keys = yon_char_unite(_config->type_arr,":" , _config->UNIX_file,":", format_actors(&_config->actors), NULL);
+ }
+ }
+ _config->loaded_keys = loaded_keys;
+}
\ No newline at end of file
diff --git a/source/model/model.h b/source/model/model.h
new file mode 100644
index 0000000..c85646b
--- /dev/null
+++ b/source/model/model.h
@@ -0,0 +1,84 @@
+#ifndef MODEL_H
+#define MODEL_H
+#include "ubl-utils.h"
+#include "philos_utils.h"
+#include "vector.h"
+#include "../ubl-strings.h"
+typedef struct{
+ char* type_arr;
+ int id;
+ char* quota;
+ char* size_memory;
+ char* UNIX_file;
+ char* files;
+ vector actors;
+ size_t actors_size;
+ char* loaded_keys;
+ size_t soft_restriction_size;
+ size_t soft_restriction_file;
+ size_t severe_limitation_size;
+ size_t severe_limitation_file;
+ size_t deferring_size;
+ size_t deferring_file;
+
+ int size_memory_pow;
+ int soft_restriction_size_pow;
+ int severe_limitation_size_pow;
+ char* device;
+ size_t size;
+
+} config_u_g_p;
+
+typedef struct {
+ vector v_general;
+ vector v_user;
+ vector v_group;
+ vector v_project;
+ vector v_disk_status;
+ vector v_disk_remove;
+ vector v_remove;
+ int flag_set_data;
+ int flag_save;
+ int flag_load;
+ int count_remove;
+ int flag_not_data;
+} config_all;
+
+typedef struct{
+ char* device;
+ int status;
+ size_t deferring_size;
+ size_t deferring_file;
+ char* fs;
+ char* mount_point;
+ char* name;
+
+} disk_status;
+
+typedef struct{
+ int flag_status;
+ int size;
+} config_general;
+
+typedef struct{
+ int flag_load;
+} config_gui;
+
+void model_clear_cfg_device(disk_status* _config);
+char* wrapper_str_time(size_t seconds);
+void model_template_remove(vector* vec_temp, vector* vec_remove, int index);
+void model_search_disk_remove(vector* vec_temp, vector* vec_remove, char* str_disk);
+void model_null_str_writing(config_u_g_p* _config);
+void model_clear_cfg(config_u_g_p* _config);
+void model_array_size_memory();
+char* format_actors(vector* vec_actors);
+char* model_find_path_to_disk(vector* vec_temp, char* str_path);
+void model_search_disk_remove_project(vector* vec_temp,vector* vec_status, vector* vec_remove, char* str_disk);
+void model_free_vector_string(vector* vec_str);
+void model_format_del_str(config_u_g_p* _config);
+void del_disk_to_vector_device(vector* vec_temp, char* str_disk);
+int fill_tree_view_user_group(config_all* all_config, hotebook* widget,char* str_fill , int flag_gui_add);
+int fill_tree_view_project(config_all* all_config, hotebook* widget, char* str_fill , int flag_gui_add);
+int fill_tree_view_generate(vector* vec_fill, vector* vec_status_disk, char* str_fill, GtkWidget* tree_view, GtkListStore* liststoreGeneral);
+int fill_tree_view_device(vector* vec_device, hotebook* widget, int flag_gui_add);
+#endif
\ 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..038dc79
--- /dev/null
+++ b/source/model/my_device.c
@@ -0,0 +1,99 @@
+#include "my_device.h"
+
+vector vec_disk;
+
+vector *get_device_vec()
+{
+ return &vec_disk;
+}
+
+void device_disk_parsed() {
+ char *cmd = "findmnt -lo source,target,fstype,label,size -t ext4";
+ device_device_config_free(get_device_vec());
+ vector_init(get_device_vec());
+ int size = 0;
+ char **responce = yon_config_load(cmd, &size);
+ 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 && !strstr(disk, "zram") && !strstr(disk, "["))
+ {
+ int size_str = 0;
+ char** name_disk = yon_char_parse(disk, &size_str, " ");
+ int flag = 0;
+ device_config* obj_device_config = malloc(sizeof(device_config));
+ for (int index_1 = 0; index_1 < size_str; index_1++) {
+ if (strlen(name_disk[index_1])) {
+ if (flag == 0) {
+ obj_device_config->name_disk = yon_char_new(name_disk[index_1]);
+ }
+ else if (flag == 1) {
+ obj_device_config->mounted = yon_char_new(name_disk[index_1]);
+ }
+ else if (flag == 2) {
+ obj_device_config->file_system = yon_char_new(name_disk[index_1]);
+ }
+ else if (flag == 3) {
+ obj_device_config->type_dick = yon_char_new(name_disk[index_1]);
+ }
+ else if (flag == 4) {
+ obj_device_config->size_disk = philos_convert_memory(yon_char_new(name_disk[index_1]));
+ }
+ flag+=1;
+ }
+ }
+ obj_device_config->description_disk = yon_char_unite(obj_device_config->name_disk,split_simvol,
+ obj_device_config->file_system,
+ split_simvol,
+ obj_device_config->mounted,
+ split_simvol,
+ obj_device_config->type_dick, NULL);
+ get_device_vec()->pfVectorAdd(get_device_vec(), obj_device_config);
+ philos_free_string_array(&name_disk, size_str);
+ }
+ free(disk);
+ }
+ philos_free_string_array(&responce, size);
+}
+
+
+void device_fill_disk(GtkWidget *combo_box_text, vector* vec_filt)
+{
+ vector vec;
+ vector_init(&vec);
+ vec.pfVectorCopy(&vec, get_device_vec());
+ for (int i = 0; i < vec_filt->vectorList.total; i++) {
+ disk_status* _config_disk_remove = (disk_status*)vec_filt->pfVectorGet(vec_filt, i);
+ for (int index = 0; index < vec.vectorList.total; index++) {
+ device_config* _config_disk = (device_config*)vec.pfVectorGet(&vec, index);
+ if (strcmp(_config_disk->name_disk, _config_disk_remove->device) == 0) {
+ vec.pfVectorDelete(&vec, index);
+ }
+
+ }
+ }
+
+ if (vec.vectorList.total > 0) {
+ for (int index = 0; index < vec.vectorList.total; index++)
+ {
+ device_config* _config_disk_remove = (device_config*)vec.pfVectorGet(&vec, index);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo_box_text), yon_char_new(_config_disk_remove->description_disk));
+ }
+ }
+}
+
+void device_device_config_free() {
+ if (get_device_vec()) {
+ for (int i = 0; i < get_device_vec()->vectorList.total; i++) {
+ device_config* _config_disk_remove = (device_config*)get_device_vec()->pfVectorGet(get_device_vec(), i);
+ free(_config_disk_remove->description_disk);
+ free(_config_disk_remove->type_dick);
+ free(_config_disk_remove->mounted);
+ free(_config_disk_remove->file_system);
+ free(_config_disk_remove->name_disk);
+ get_device_vec()->pfVectorDelete(get_device_vec(), i);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/source/model/my_device.h b/source/model/my_device.h
new file mode 100644
index 0000000..fcc5811
--- /dev/null
+++ b/source/model/my_device.h
@@ -0,0 +1,26 @@
+#ifndef MY_DEVICE_H
+#define MY_DEVICE_H
+#include "ubl-utils.h"
+#include
+#include
+#include
+#include "philos_utils.h"
+#include "model.h"
+typedef struct {
+ char* name_disk;
+ char* file_system;
+ char* mounted;
+ char* type_dick;
+ char* description_disk;
+ size_t size_disk;
+} device_config;
+
+void device_disk_parsed();
+vector *get_device_vec();
+void device_fill_disk(GtkWidget* combo_box_text, vector* vec_filt);
+size_t get_mem_total();
+float get_size_pow_memory(size_t size_memory, int size);
+size_t get_resurs_total(char* cmd);
+void device_device_config_free();
+
+#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..743f8c2
--- /dev/null
+++ b/source/model/philos_utils.c
@@ -0,0 +1,873 @@
+#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, 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) = 0;
+ str_find = yon_char_divide(str_find, length-1);
+ str_find = yon_char_unite(str_find, " ", STR_KB, NULL);
+ }
+ else if (strstr(str_find,"M") != NULL) {
+ (*array_size) = 1;
+ str_find = yon_char_divide(str_find, length-1);
+ str_find = yon_char_unite(str_find," ", STR_MB, NULL);
+ }
+ else if (strstr(str_find,"G") != NULL) {
+ (*array_size) = 2;
+ str_find = yon_char_divide(str_find, length-1);
+ str_find = yon_char_unite(str_find," ", STR_GB, NULL);
+ }
+ else if (strstr(str_find,"T") != NULL) {
+ (*array_size) = 3;
+ str_find = yon_char_divide(str_find, length-1);
+
+ str_find = yon_char_unite(str_find," ", STR_TB, NULL);
+ }
+ else if (strstr(str_find,"%%") != NULL) {
+ (*array_size) = -1;
+ str_find = yon_char_divide(str_find, length-1);
+ }
+ else if (strstr(str_find,"-") != NULL) {
+ (*array_size) = -1;
+ }
+ else {
+ (*array_size) = 0;
+ }
+
+}
+
+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_user(int* size, int flag_lim) {
+ 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 (flag_lim == 1) {
+ 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);
+ }
+ }
+ else {
+ 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_group(int* size, int flag_lim) {
+ 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);
+ char *cmd = "cat /etc/group";
+ int size_groups = 0;
+ size_t pw_gid = 0;
+ char **responce = yon_config_load(cmd, &size_groups);
+ for (int i = 0; i< size_groups; i++) {
+ char* str_data = yon_char_new(responce[i]);
+ char* str_group = yon_char_divide_search(str_data,":x:",-1);
+ char* num = yon_char_divide_search(str_data, ":", -1);
+ pw_gid = atoll(yon_char_divide_search(str_data, ":", -1));
+ if (flag_lim == 1) {
+ if ((pw_gid >= uid_min && pw_gid < uid_max) || pw_gid == 0) {
+ str_users = yon_char_parsed_append(str_users, size, str_group);
+ }
+ }
+ else {
+ str_users = yon_char_parsed_append(str_users, size, str_group);
+ }
+ }
+ 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 (value == 0) {
+ return str_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;
+ }
+
+}
+
+
+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;
+}
+
+
+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));
+ guint value_spin = atoi((char*)gtk_entry_get_text(GTK_ENTRY(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, (value*100));
+ if ((value*100)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;
+}
+#ifdef VTE_TERMINAL
+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);
+}
+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));
+}
+#endif
+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;
+}
+
+/**[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;
+ }
+ }
+}
+
+char** philos_char_parsed_append(char** parsed, int *size, char *string) {
+ parsed = yon_char_parsed_append(parsed, size, string);
+ (*size)--;
+ return parsed;
+}
+
+void philos_set_size_memory_integer(char* str_find, size_t* array_data) {
+ if (strstr(str_find, " ")) {
+ yon_char_divide_search(str_find, " ", -1);
+ }
+ char* simv_del_array[9] = {"K","M","G","T","k","m","g","t","%"};
+ for (size_t i = 0; i < 9; 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) {
+ (*array_data) = atoll(str_find);
+ }
+ else {
+ (*array_data) = -1;
+ }
+}
+
+me_time time_convert(size_t seconds) {
+ me_time t;
+ if (seconds != -1) {
+ double weeks = seconds / (7*24*60*60);
+ double days = seconds / (24*60*60) - 7*weeks;
+ double hours = seconds / (60*60) - 7*24*weeks - 24*days;
+ double minutes = seconds / 60 - 7*24*60*weeks - 24*60*days - 60*hours;
+ if (weeks>0) {
+ t.weeks = (int)weeks;
+ }
+ else {
+ t.weeks = 0;
+ }
+ if (days>0) {
+ t.days = (int)days;
+ }
+ else {
+ t.days = 0;
+ }
+ if (hours>0) {
+ t.hours = (int)hours;
+ }
+ else {
+ t.hours = 0;
+ }
+ if (minutes>0) {
+ t.minutes = (int)minutes;
+ }
+ else {
+ t.minutes = 0;
+ }
+ t.str_time = NULL;
+ }
+ else {
+ t.weeks = 0;
+ t.days = 0;
+ t.hours = 0;
+ t.hours = 0;
+ t.str_time = NULL;
+ }
+
+
+ return t;
+}
+
+char* fill_tree_view_id(int id) {
+ if (id < 0) {
+ return yon_char_new("AUTO");
+ }
+ else {
+ return yon_char_from_int(id);
+ }
+}
+
+
+char *philos_char_from_size_t(size_t int_to_convert) {
+ int i = 1;
+ float convert_check = (float)int_to_convert;
+ for (i = 1; convert_check >= 10; i++)
+ {
+ convert_check = convert_check / 10;
+ }
+ char *ch = g_malloc0(i * sizeof(char) + 1);
+ sprintf(ch, "%d", int_to_convert);
+ return ch;
+}
+size_t philos_convert_memory(char* num_memory_pow) {
+ float num_f = atof(yon_char_new(num_memory_pow));
+ if (strstr(num_memory_pow,"K") != NULL) {
+ return (size_t)(num_f);
+ }
+ else if (strstr(num_memory_pow,"M") != NULL) {
+ return (size_t)(num_f*1024);
+ }
+ else if (strstr(num_memory_pow,"G") != NULL) {
+ return (size_t)(num_f*1024*1024);
+ }
+ else if (strstr(num_memory_pow,"T") != NULL) {
+ return (size_t)(num_f*1024*1024*1024);
+ }
+ return 0;
+}
+
diff --git a/source/model/philos_utils.h b/source/model/philos_utils.h
new file mode 100644
index 0000000..267205e
--- /dev/null
+++ b/source/model/philos_utils.h
@@ -0,0 +1,158 @@
+#ifndef PHILOS_UTILS_H
+#define PHILOS_UTILS_H
+#include "ubl-utils.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#ifdef VTE_TERMINAL
+ #include
+#endif
+
+#include
+#include
+
+#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* lblSetUGP;
+ GtkWidget* lblHeadQuotasEditWindow;
+
+ GtkWidget* btnOpenUserGroup;
+
+ GtkWidget* btnReviewProject;
+ GtkWidget* btnGenerateProject;
+ GtkWidget* entryCatalogProject;
+ GtkWidget* chbAuto;
+ GtkWidget* entryProjectName;
+ GtkWidget* boxProjectAddEdit;
+ GtkWidget* boxProject;
+ GtkWidget* lblCatalogProjectEdit;
+ GtkWidget* lblProjectIdValueEdit;
+ GtkWidget* entryProjectId;
+ GtkWidget* boxTempDevice;
+
+ GtkWidget* wndChooseFileWallpaper;
+ GtkWidget* btnFilemangerOk;
+ GtkWidget* btnFilemangerExit;
+ GtkWidget* quotegroupSizeSoftLimitCheck;
+ GtkWidget* quotegroupSizeSoftLimitSpin;
+ GtkWidget* quotegroupSizeSoftLimitCombo;
+ GtkWidget* quotegroupSizeHardLimitCheck;
+ GtkWidget* quotegroupSizeHardLimitSpin;
+ GtkWidget* quotegroupSizeHardLimitCombo;
+ GtkWidget* quotegroupFilesSoftLimitCheck;
+ GtkWidget* quotegroupFilesSoftLimitSpin;
+ GtkWidget* quotegroupFilesHardLimitCheck;
+ GtkWidget* quotegroupFilesHardLimitSpin;
+ GtkWidget* lblSetNameDevice;
+ GtkWidget* boxProjectAddEditboxProjectId;
+ GtkWidget* entryUser;
+ GtkWidget* UserDeviceCombo;
+ GtkWidget* lblSetQuotasStatus;
+ GtkWidget* lblWarningText;
+ GtkWidget* WarrningWindow;
+ GtkWidget* CancelWarrningButton;
+ GtkWidget* boxBlockGuiAddEdit;
+} temp_set_window;
+
+typedef struct {
+ char* name;
+ int note_selected;
+ GtkListStore *liststore;
+ GtkWidget* tree_view;
+ GtkWidget* btnAdd;
+ GtkWidget* btnEdit;
+ GtkWidget* btnDel;
+ GtkWidget* btnFilter;
+ GtkWidget* lblSetNameDevice;
+} hotebook;
+typedef struct {
+ int weeks;
+ int days;
+ int hours;
+ int minutes;
+ char* str_time;
+} me_time;
+
+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, 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);
+unsigned short philos_read_uid_min_max(char* filename, char* search);
+config_str philos_list_user(int* size, int flag_lim);
+config_str philos_list_group(int* size, int flag_lim);
+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_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);
+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);
+#ifdef VTE_TERMINAL
+static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data);
+#endif
+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);
+char** philos_char_parsed_append(char** parsed, int *size, char *string);
+void philos_set_size_memory_integer(char* str_find, size_t* array_data);
+me_time time_convert(size_t seconds);
+char* fill_tree_view_id(int id);
+char *philos_char_from_size_t(size_t int_to_convert);
+size_t philos_convert_memory(char* num_memory_pow);
+
+#endif
\ No newline at end of file
diff --git a/source/model/save.c b/source/model/save.c
new file mode 100644
index 0000000..eade62c
--- /dev/null
+++ b/source/model/save.c
@@ -0,0 +1,264 @@
+#ifndef SAVE_H
+#define SAVE_H
+#include "save.h"
+
+char* save_str_users(config_u_g_p* config, int index, char* start_split) {
+ char* cmd = yon_char_new("");
+ char split_simvol[2] = {0};
+ split_simvol[0] = 0;
+ split_simvol[1] = 0;
+ vector* vec_actors = &config->actors;
+ char* str_actors = NULL;
+ if (vec_actors->vectorList.total> 0) {
+ for (int i = 0; i < vec_actors->vectorList.total; i++) {
+ if (i==0) {
+ cmd = yon_char_unite(cmd, start_split, NULL);
+ }
+ str_actors = (char*)vec_actors->pfVectorGet(vec_actors, i);
+ cmd = yon_char_unite(cmd, split_simvol, str_actors, NULL);
+ split_simvol[0] = ',';
+ split_simvol[1] = '\0';
+ }
+ }
+ return cmd;
+
+}
+
+char* template_format_save(vector* vec_temp) {
+ char* cmd = yon_char_new("");
+ if (vec_temp->vectorList.total> 0) {
+ for (int i = 0; i < vec_temp->pfVectorTotal(vec_temp); i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ char* key = save_format_key(_config, i);
+ char* value = save_format_str_value(_config, i);
+ if (key!= NULL) {
+ cmd = yon_char_unite(cmd, key, "=" , value, " ", NULL);
+ free(key);
+ free(value);
+ }
+ }
+ }
+ return cmd;
+}
+
+char* save_format_status_cmd_all(vector* vec_temp, vector* vec_status_disk) {
+ char* cmd = yon_char_new("");
+ char* str_cmd_format = NULL;
+ if (vec_temp->vectorList.total > 0 && vec_status_disk->vectorList.total > 0) {
+ for (int i=0; i < vec_temp->vectorList.total; i++) {
+ config_u_g_p* _config = (config_u_g_p*)vec_temp->pfVectorGet(vec_temp, i);
+ for (int j=0; j < vec_status_disk->vectorList.total;j++) {
+ disk_status* config_disk_status = (disk_status*)vec_status_disk->pfVectorGet(vec_status_disk, j);
+ if (strstr(config_disk_status->device, _config->UNIX_file) ) {
+ str_cmd_format = save_format_status_cmd(config_disk_status, _config);
+ if (str_cmd_format) {
+ cmd = yon_char_unite(cmd, " ", str_cmd_format, NULL);
+ free(str_cmd_format);
+ }
+ }
+ }
+ }
+ }
+ return cmd;
+}
+
+char* set_status_and_del(config_all* _all_config) {
+ char* cmd = yon_char_new("");
+ for (int j=0; j < _all_config->v_disk_status.vectorList.total;j++) {
+ disk_status* config_disk_status = (disk_status*)_all_config->v_disk_status.pfVectorGet(&_all_config->v_disk_status, j);
+ if (config_disk_status->status == 2 && (config_disk_status->deferring_size == 0 && config_disk_status->deferring_file == 0)) {
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[usrquota:" , config_disk_status->device, "]=enable ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[grpquota:" , config_disk_status->device, "]=enable ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[prjquota:" , config_disk_status->device, "]=enable ", NULL);
+ yon_window_config_erase_custom_parameter(config_disk_status->device, "deferring_size");
+ yon_window_config_erase_custom_parameter(config_disk_status->device, "deferring_file");
+ yon_window_config_erase_custom_parameter(config_disk_status->device, config_disk_status->device);
+ }
+ else if (config_disk_status->status == 1) {
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[usrquota:" , config_disk_status->device, "]=disable ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[grpquota:" , config_disk_status->device, "]=disable ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[prjquota:" , config_disk_status->device, "]=disable ", NULL);
+ yon_window_config_erase_custom_parameter(config_disk_status->device, "deferring_size");
+ yon_window_config_erase_custom_parameter(config_disk_status->device, "deferring_file");
+ yon_window_config_erase_custom_parameter(config_disk_status->device, config_disk_status->device);
+ }
+ if (config_disk_status->status == 2 && (config_disk_status->deferring_size != 0 || config_disk_status->deferring_file != 0)) {
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[usrquota:", config_disk_status->device, "]=0:0:0:0:",yon_char_from_int(config_disk_status->deferring_size), ":", yon_char_from_int(config_disk_status->deferring_file)," ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[grpquota:", config_disk_status->device, "]=0:0:0:0:",yon_char_from_int(config_disk_status->deferring_size), ":", yon_char_from_int(config_disk_status->deferring_file)," ", NULL);
+ cmd = yon_char_unite(cmd, "DISK_QUOTA[prjquota:", config_disk_status->device, "]=0:0:0:0:",yon_char_from_int(config_disk_status->deferring_size), ":", yon_char_from_int(config_disk_status->deferring_file)," ", NULL);
+ }
+ }
+ return cmd;
+}
+
+char* wrapper_save_format_status_cmd_all(config_all* _all_config) {
+ return set_status_and_del(_all_config);
+}
+
+char* save_format_status_cmd(disk_status* config_disk_status, config_u_g_p* config) {
+ char* cmd = yon_char_unite("DISK_QUOTA[", config->type_arr, ":", config->UNIX_file,"]=", NULL);;
+ if (config_disk_status->status == 2) {
+ cmd = yon_char_unite(cmd,"enable", NULL);
+ return cmd;
+ }
+ else if (config_disk_status->status == 1) {
+ return yon_char_unite(cmd,"disable", NULL);
+ }
+ else {
+ return NULL;
+ }
+}
+
+char* wrapper_template_format_save(config_all* _all_config, char* source_set_cmd) {
+ char* cmd_user = template_format_save(&_all_config->v_user);
+ char* cmd_group = template_format_save(&_all_config->v_group);
+ char* cmd_project = template_format_save(&_all_config->v_project);
+ char* cmd_status_disk = wrapper_save_format_status_cmd_all(_all_config);
+ if ((strlen(cmd_status_disk) > 3 || strlen(cmd_user) > 3 || strlen(cmd_group) > 3 || strlen(cmd_project) > 3) && !save_check_save(_all_config)) {
+ return yon_char_unite(source_set_cmd," ", cmd_status_disk, " ", cmd_user, " ", cmd_group, " ", cmd_project, NULL);
+ }
+ return NULL;
+
+}
+char* template_format_remove_save(config_all* _all_config, char* source_remove_cmd) {
+ if (_all_config->v_remove.vectorList.total > 0) {
+ char* cmd = yon_char_new(source_remove_cmd);
+ for (int i = 0; i < _all_config->v_remove.vectorList.total; i++) {
+ char* str_remove = (char*)_all_config->v_remove.pfVectorGet(&_all_config->v_remove, i);
+ cmd = yon_char_unite(cmd, " DISK_QUOTA[" , str_remove, "] ", NULL);
+ }
+ if (strlen(cmd) > strlen(source_remove_cmd) && save_check_save(_all_config)== 0) {
+ return cmd;
+ }
+ }
+ return NULL;
+
+}
+char* template_format_remove_save_device(config_all* _all_config, char* source_remove_cmd) {
+ char* cmd = yon_char_new("");
+ if (_all_config->v_disk_remove.vectorList.total > 0) {
+ for (int i=0; i < _all_config->v_disk_remove.vectorList.total; i++) {
+ char* str_del = (char*)_all_config->v_disk_remove.pfVectorGet(&_all_config->v_disk_remove, i);
+ if (str_del) {
+ cmd = yon_char_unite(cmd, " DISK_QUOTA[usrquota:" , str_del, "] ", NULL);
+ cmd = yon_char_unite(cmd, " DISK_QUOTA[grpquota:" , str_del, "] ", NULL);
+ cmd = yon_char_unite(cmd, " DISK_QUOTA[prjquota:" , str_del, "] ", NULL);
+ yon_window_config_erase_custom_parameter(str_del, "deferring_size");
+ yon_window_config_erase_custom_parameter(str_del, "deferring_file");
+ yon_window_config_erase_custom_parameter(str_del, str_del);
+ }
+
+ }
+ }
+ if (strlen(cmd)>5) {
+ for (int i=0; i < _all_config->v_disk_remove.vectorList.total; i++) {
+ _all_config->v_disk_remove.pfVectorDelete(&_all_config->v_disk_remove, i);
+ }
+ return cmd;
+ }
+ else {
+ return NULL;
+ }
+
+}
+
+
+int wrapper_template_save(config_all* _all_config, char* source_set_cmd, char* source_remove_cmd) {
+ char* str_cmd_remove = template_format_remove_save(_all_config,source_remove_cmd);
+ char* str_cmd_remove_device = template_format_remove_save_device(_all_config,source_remove_cmd);
+ char* str_cmd_set = wrapper_template_format_save(_all_config,source_set_cmd);
+ if (str_cmd_set != NULL && str_cmd_remove != NULL && str_cmd_remove_device != NULL) {
+ philos_config_save(yon_char_unite(str_cmd_remove, " " ,str_cmd_remove_device, "; " , str_cmd_set, NULL));
+ }
+ else {
+ if (str_cmd_remove != NULL) {
+ philos_config_save(str_cmd_remove);
+ }
+ if (str_cmd_remove_device != NULL) {
+ philos_config_save(yon_char_unite(source_remove_cmd, " " , str_cmd_remove_device, NULL));
+ }
+ if (str_cmd_set != NULL) {
+ philos_config_save(str_cmd_set);
+ }
+
+ }
+
+ if (str_cmd_remove != NULL) {
+ free(str_cmd_remove);
+ }
+ if (str_cmd_set != NULL) {
+ free(str_cmd_set);
+ }
+ if (str_cmd_remove_device != NULL) {
+ free(str_cmd_remove_device);
+ }
+ vector_init(&_all_config->v_remove);
+ _all_config->flag_set_data = 0;
+ return 1;
+}
+
+char* save_format_key(config_u_g_p* config, int index) {
+ char* value = yon_char_new("");
+ char* key = yon_char_new("");
+ int number = config->id;
+ key = yon_char_unite("DISK_QUOTA[", config->type_arr, ":", NULL);
+ char* unix_file = NULL;
+ if (strstr(config->UNIX_file, " ") && !strstr(config->UNIX_file, "\"") ) {
+ unix_file = yon_char_unite("\"", config->UNIX_file, "\"", NULL);
+ }
+ else {
+ unix_file = yon_char_new(config->UNIX_file);
+ }
+ if (strstr(config->type_arr, "prjquota")) {
+ if (number!=-1) {
+ key = yon_char_unite(key, unix_file,":",yon_char_from_int(number), NULL);
+ }
+ else {
+ key = yon_char_unite(key, unix_file,":AUTO", NULL);
+ }
+ key = yon_char_unite(key, save_str_users(config, index, ",") , "]", NULL);
+ }
+ else {
+ key = yon_char_unite(key, unix_file, NULL);
+ key = yon_char_unite(key, save_str_users(config, index, ":") , "]", NULL);
+ }
+ free(unix_file);
+ return key;
+}
+
+
+char* save_format_str_value(config_u_g_p* config, int index) {
+ char* value = NULL;
+ if (config->soft_restriction_size) {
+ value = yon_char_unite(philos_format_cfg_str_size_memory("", config->soft_restriction_size,config->soft_restriction_size_pow), NULL);
+ }
+ else {
+ value = yon_char_new("0");
+ }
+ if (config->severe_limitation_size) {
+ value = yon_char_unite(value, ":", philos_format_cfg_str_size_memory("", config->severe_limitation_size,config->severe_limitation_size_pow), NULL);
+ }
+ else {
+ value = yon_char_unite(value,":0", NULL);
+ }
+ value = yon_char_unite(value, ":", yon_char_from_int(config->soft_restriction_file), NULL);
+ value = yon_char_unite(value, ":", NULL);
+ value = yon_char_unite(value, yon_char_from_int(config->severe_limitation_file), NULL);
+ value = yon_char_unite(value, ":", NULL);
+ value = yon_char_unite(value, philos_char_from_size_t(config->deferring_size), ":", NULL);
+ value = yon_char_unite(value, philos_char_from_size_t(config->deferring_file), NULL);
+ return value;
+}
+
+int save_check_save(config_all* _all_config) {
+ if (_all_config->flag_set_data == 1 || _all_config->flag_save>0) {
+ return 0;
+ }
+ else if (_all_config->flag_set_data == 0 || _all_config->flag_save<=0) {
+ return 1;
+ }
+ return 0;
+}
+
+
+#endif
\ No newline at end of file
diff --git a/source/model/save.h b/source/model/save.h
new file mode 100644
index 0000000..0e4a241
--- /dev/null
+++ b/source/model/save.h
@@ -0,0 +1,14 @@
+#ifndef SAVE
+#define SAVE
+#include "ubl-utils.h"
+#include "model.h"
+char* template_format_save(vector* vec_temp);
+char* save_format_key(config_u_g_p* _config, int index);
+char* save_str_users(config_u_g_p* _config, int index, char* start_split);
+char* save_format_str_value(config_u_g_p* config, int index);
+char* save_format_status_cmd(disk_status* config_disk_status, config_u_g_p* config);
+char* template_format_remove_save(config_all* _all_config, char* source_remove_cmd);
+void save_remove_array(config_all* _all_config);
+int save_check_save(config_all* _all_config);
+int wrapper_template_save(config_all* _all_config, char* source_set_cmd, char* source_remove_cmd);
+#endif
\ No newline at end of file
diff --git a/source/model/ubl-utils.c b/source/model/ubl-utils.c
new file mode 100644
index 0000000..ac34d72
--- /dev/null
+++ b/source/model/ubl-utils.c
@@ -0,0 +1,1927 @@
+#include "ubl-utils.h"
+
+// dictionary functions
+
+/**yon_dictionary_new():
+ * [EN]
+ * Creates and returns empty dictionary
+ * [RU]
+ * Создаёт и возвращает пустой словарь.
+ */
+dictionary *yon_dictionary_new()
+{
+ 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;
+}
+
+/**yon_dictionary_copy(dictionary *dict)
+ * [EN]
+ *
+ * [RU]
+ * Создаёт и возвращает копию элемента словаря [dict]
+*/
+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)
+ * [EN]
+ *
+ * [RU]
+ * Создаёт полную копию словаря [dict] и возвращает первый элемент
+*/
+dictionary *yon_dictionary_copy_deep(dictionary *dict){
+ dictionary *dct = NULL;
+ dictionary *newone=NULL;
+ for_dictionaries(dct,dict){
+ yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data);
+ newone->data_type=dct->data_type;
+ }
+ return newone->first;
+}
+
+/**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;
+}
+
+/**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;
+ return 1;
+}
+
+/** 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;
+ return 1;
+}
+
+/**int yon_dictionary_empty(dictionary *dict)
+ * [EN]
+ *
+ * [RU]
+ * Очищает элемент словаря [dict] от данных
+*/
+int yon_dictionary_empty(dictionary *dict){
+ dict->data=NULL;
+ dict->data_type=DICTIONARY_OTHER_TYPE;
+ return 1;
+}
+
+/**yon_dictionary_switch_to_last(dictionary **dict)
+ * [EN]
+ *
+ * [RU]
+ * Переключает словарь [dict] на последний элемент.
+*/
+void yon_dictionary_switch_to_last(dictionary **dict)
+{
+ dictionary *dct=NULL, *dact=*dict;
+ for_dictionaries(dct,dact);
+}
+
+/**yon_dictionary_create_conneced(dictionary *targetdict)
+ * [EN]
+ *
+ * [RU]
+ * Создаёт новый элемент словаря [targetdict]
+*/
+dictionary *yon_dictionary_append(dictionary *targetdict)
+{
+ targetdict = yon_dictionary_get_last(targetdict);
+ targetdict->next = yon_dictionary_new();
+ targetdict->next->prev = targetdict;
+ targetdict->next->first = targetdict->first;
+ targetdict->next->data_type = DICTIONARY_OTHER_TYPE;
+ return targetdict->next;
+}
+
+/**yon_dictionary_get_last(dictionary *dict)
+ * [EN]
+ *
+ * [RU]
+ * Возвращает последний элемент словаря [dict].
+ * В отличае от yon_dictionary_switch_to_last()
+ * словарь [dict] остаётся на прежнем элементе.
+*/
+dictionary *yon_dictionary_get_last(dictionary *dict)
+{
+ if (dict->next){
+ dictionary *dct = NULL;
+ for_dictionaries(dct,dict);
+ return dct;
+ } else return dict;
+}
+
+/**yon_dictionary_switch_places(dictionary *dict, int aim)
+ * [EN]
+ *
+ * [RU]
+ * Меняет элемент словаря [dict] местами с другим элементом.
+ * если [aim]<0 элемент меняется местами с левым элементом;
+ * если [aim]>0 элемент меняется местами с правым элементом;
+*/
+dictionary *yon_dictionary_swap(dictionary *dict, int aim)
+{
+ if (aim < 0)
+ {
+ if (dict->prev)
+ {
+ if (dict->prev->prev)
+ {
+ dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev;
+ if (next)
+ {
+ preprev->next = dict;
+ dict->prev = preprev;
+ dict->next = prev;
+ prev->prev = dict;
+ prev->next = next;
+ next->prev = prev;
+ }
+ else
+ {
+ preprev->next = dict;
+ dict->prev = preprev;
+ dict->next = prev;
+ prev->prev = dict;
+ prev->next = NULL;
+ }
+ return prev;
+ }
+ else
+ {
+ dictionary *next = dict->next, *prev = dict->prev;
+ if (next)
+ {
+ yon_dictionary_make_first(dict);
+ dict->prev = NULL;
+ dict->next = prev;
+ prev->prev = dict;
+ prev->next = next;
+ next->prev = prev;
+ }
+ else
+ {
+ dict->prev = NULL;
+ dict->next = prev;
+ prev->prev = dict;
+ prev->next = NULL;
+ }
+ return prev;
+ }
+ }
+ }
+ else if (aim > 0)
+ {
+ if (dict->next)
+ {
+ if (dict->next->next)
+ {
+ dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next;
+ if (prev)
+ {
+ prev->next = next;
+ next->prev = prev;
+ next->next = dict;
+ dict->prev = next;
+ dict->next = afnext;
+ afnext->prev = dict;
+ }
+ else
+ {
+ yon_dictionary_make_first(next);
+ next->prev = NULL;
+ next->next = dict;
+ dict->prev = next;
+ dict->next = afnext;
+ afnext->prev = dict;
+ }
+ return next;
+ }
+ else
+ {
+ dictionary *next = dict->next, *prev = dict->prev;
+ if (prev)
+ {
+ prev->next = next;
+ next->prev = prev;
+ next->next = dict;
+ dict->prev = next;
+ dict->next = NULL;
+ }
+ else
+ {
+ next->prev = NULL;
+ next->next = dict;
+ dict->prev = next;
+ dict->next = NULL;
+ }
+ }
+ }
+ }
+}
+
+/**yon_dictionary_make_first(dictionary *dict)
+ * [EN]
+ *
+ * [RU]
+ * Устанавливает указатель первого элемента словаря [dict]
+ * на текущий элемент. Не использовать.
+*/
+void yon_dictionary_make_first(dictionary *dict)
+{
+ for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
+ {
+ dct->first = dict;
+ }
+}
+
+/**yon_dictionary_make_nth(dictionary *dict, int nth)
+ * [EN]
+ *
+ * [RU]
+ * Перемещает элемент словаря [dict] на позицию [nth].
+*/
+void yon_dictionary_make_nth(dictionary *dict, int nth)
+{
+ dictionary *dct = dict->first;
+ for (int i = 0; i < nth; i++)
+ {
+ if (dct == NULL)
+ return;
+ else
+ dct = dct->next;
+ }
+ yon_dictionary_rip(dict);
+ dictionary *prev = dct->prev;
+ prev->next = dict;
+ dict->prev = prev;
+ dict->next = dct;
+ dct->prev = dict;
+}
+
+/**yon_dictionary_create_with_data(char *key, void *data)
+ * [EN]
+ *
+ * [RU]
+ * Создаёт новый словарь с ключом [key] и указателем на данные [data]
+*/
+dictionary *yon_dictionary_new_with_data(char *key, void *data)
+{
+ dictionary *dct = yon_dictionary_new();
+ dct->key = yon_char_new(key);
+ dct->data = data;
+ dct->data_type = DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation)
+ * [EN]
+ * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary.
+ * [RU]
+ * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря.
+*/
+void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){
+ dictionary *dict=NULL;
+ for_dictionaries(dict,dictionary_to_free){
+ if(data_manipulation)
+ data_manipulation(dict->data);
+ if(dict->prev)
+ free(dict->prev);
+ }
+ free(dict);
+ return NULL;
+}
+
+/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data)
+ * [EN]
+ *
+ * [RU]
+ * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict]
+ * с ключом [key] и указателем на данные [data]
+*/
+dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data)
+{
+ dictionary *dct = yon_dictionary_append(dict);
+ dct->key = yon_char_new(key);
+ dct->data = data;
+ dct->data_type = DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+/**yon_dictionary_connect(dictionary *old, dictionary *toconnect)
+ * [EN]
+ *
+ * [RU]
+ * Присоединяет словарь [toconnect] в конец словаря [old].
+*/
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect)
+{
+ dictionary *dict = yon_dictionary_get_last(old);
+ dict->next = toconnect;
+ toconnect->prev = dict;
+ toconnect->first = dict->first;
+ return toconnect;
+}
+
+/**yon_dictionary_get(dictionary **dict, char *key)
+ * [EN]
+ *
+ * [RU]
+ * Возвращает элемент словаря [dict] с ключом [key].
+ * Если такого элемента не было обнаружено, возвращается NULL
+*/
+dictionary *yon_dictionary_get(dictionary **dict, char *key)
+{
+ dictionary *dct = *dict;
+ for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next)
+ {
+ if (strcmp(pointer->key, key) == 0)
+ {
+ *dict = pointer;
+ return pointer;
+ }
+ }
+ return NULL;
+}
+
+/**yon_dictionary_rip(dictionary *dict)
+ * [EN]
+ *
+ * [RU]
+ * Вырезает элемент из словаря и возвращает вырезанный элемент.
+*/
+dictionary *yon_dictionary_rip(dictionary *dict)
+{
+ if (!dict->next&&!dict->prev) return NULL;
+ else if (!dict->next)
+ {
+ dictionary *prev = dict->prev;
+ if (prev)
+ {
+ prev->next = NULL;
+ return prev;
+ }
+ else
+ return dict;
+ }
+ else if (!dict->prev)
+ {
+ dictionary *next = dict->next;
+ if (next)
+ {
+ yon_dictionary_make_first(next);
+ next->prev = NULL;
+ return next;
+ }
+ else
+ return dict;
+ }
+ else
+ {
+ dictionary *next = dict->next, *prev = dict->prev;
+ next->prev = prev;
+ prev->next = next;
+ return next;
+ }
+}
+
+/**yon_dictionary_get_nth(dictionary *dict, int place)
+ * [EN]
+ *
+ * [RU]
+ * Возвращает [place]-й элемент словаря [dict]
+*/
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place)
+{
+ if (dict){
+ dict = dict->first;
+ int i = 0;
+ for (i = 0; i < place; i++)
+ if (dict->next)
+ dict = dict->next;
+ else
+ break;
+ if (i == place)
+ return dict;
+ else
+ return NULL;
+ } else return NULL;
+}
+
+// char functions
+
+int yon_char_find_last(char *source, char find){
+ int size = strlen(source);
+ int i=size;
+ for (;source[i]!=find&&i>0;i--);
+ return i;
+}
+
+/**[EN]
+ *
+ * creates new char string by combining two char strings.
+ */
+char *yon_char_append(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;
+}
+
+/**[EN]
+ *
+ * creates new char string by copying another char.
+ */
+char *yon_char_new(char *chr)
+{
+ if (chr){
+ char *newchar = malloc(strlen(chr) + 1);
+ memset(newchar, 0, strlen(chr) + 1);
+ memcpy(newchar, chr, strlen(chr));
+ return newchar;
+ } else
+ return NULL;
+}
+
+/**yon_char_unite(char *source, ...)
+ * [En]
+ *
+ * [RU]
+ * Объединяет строку [source] со всеми строками, написанными в [...]
+*/
+char *yon_char_unite(char *source, ...){
+ va_list arglist;
+ char *new_char=NULL;
+ char *unite_char=NULL;
+ new_char=yon_char_new(source);
+ va_start(arglist,source);
+ unite_char = va_arg(arglist,char*);
+ while(unite_char){
+ new_char = yon_char_append(new_char,unite_char);
+ unite_char = va_arg(arglist,char*);
+ }
+ va_end(arglist);
+ return new_char;
+}
+
+/**yon_cut(char *source, int size, int startpos)
+ * [EN]
+ * cuts source string by size length from startpos position.
+ */
+char *yon_cut(char *source, int size, int startpos)
+{
+ char *cut = NULL;
+ cut = malloc(size + 1);
+ memset(cut, 0, size + 1);
+ memcpy(cut, source + startpos, size);
+ return cut;
+}
+
+/**yon_char_divide(char *source, int dividepos)
+ * [EN]
+ * divides source string in dividepos position,
+ * returning left part of divided string and
+ * inserting right part to source string.
+ */
+char *yon_char_divide(char *source, int dividepos)
+{
+ char *cut = malloc(dividepos + 1);
+ memset(cut, 0, dividepos + 1);
+ memcpy(cut, source, dividepos);
+ 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));
+ memcpy(source, left, strlen(left));
+ 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=source;
+ int size=0;
+ while ((working_string = strstr(working_string, find))) {
+ if (working_string) {
+ working_string++;
+ size++;
+ }
+ }
+ return size;
+}
+
+/**yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+ * [EN]
+ * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+ * searches string [dividepos] in [source] string and divides it,
+ * returning left part of divided string and
+ * inserting right part to [source] string.
+ * if [delete_divider] is 0, left part will contain [delete_divider] substring, else
+ * if [delete_divider] is 1 it will stay in right part, else
+ * if [delete_divider] is -1 it will be deleted from string.
+ *
+ * [RU]
+ * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+ * Ищет строку [dividepos] в строке [source] и делит её в этом месте,
+ * возвращая левую часть разделённой строки и устанавливает в [source] правую часть.
+ * Если [delete_divider] равен 0, [dividepos] останется в левой строке, иначе
+ * если [delete_divider] равен 1, [dividepos] останется в правой строке, иначе
+ * если [delete_divider] равен -1, [dividepos] удаляется из строки.
+ */
+char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+{
+ if (source&÷pos){
+ char *cut = strstr(source, dividepos);
+ if (cut)
+ {
+ int leng = strlen(source) - strlen(cut);
+ cut = yon_char_divide(source, leng);
+ return cut;
+ }
+ }
+ return source;
+}
+
+/**yon_char_from_int(int int_to_convert)
+ * [EN]
+ * char *yon_char_from_int(int int_to_convert)
+ * converts int to char*.
+ *
+ * [RU]
+ * char *yon_char_from_int(int int_to_convert)
+ * Конвертирует int в char*
+ */
+char *yon_char_from_int(int int_to_convert)
+{
+ int i = 1;
+ float convert_check = (float)int_to_convert;
+ for (i = 1; convert_check >= 10; i++)
+ {
+ convert_check = convert_check / 10;
+ }
+ char *ch = g_malloc0(i * sizeof(char) + 1);
+ sprintf(ch, "%d", int_to_convert);
+ return ch;
+}
+
+/**yon_char_replace(char *source, char *find, char*replace)
+ * [EN]
+ *
+ * [RU]
+ * Заменяет в строке [source] все вхождения строки [find] на [replace]
+*/
+char *yon_char_replace(char *source, char *find, char*replace){
+ if (!strstr(replace,find)){
+
+
+ char *final=NULL;
+ char *temp=NULL;
+ if(!strstr(replace,find)){
+ while ((final=strstr(source,find))){
+ temp=malloc(strlen(source)-strlen(final));
+ memset(temp,0,strlen(source)-strlen(final)+strlen(replace));
+ memcpy(temp,source,strlen(source)-strlen(final));
+ temp=yon_char_append(temp,replace);
+ source=yon_char_append(temp,final+1);
+ }
+
+ }
+ }
+ return source;
+}
+
+/**yon_char_parse(char *parameters, int *size, char *divider)
+ * [EN]
+ * Parses string [parameters], divided by [divider],
+ * then returns parsed string array and sets [size] to
+ * size of returned array
+*/
+char **yon_char_parse(char *parameters, int *size, char *divider){
+ char **string=NULL;
+ if (!strstr(parameters, divider)) {
+ return NULL;
+ }
+ int i=1;
+ string=malloc(sizeof(char*));
+ char *paramline=yon_char_new(parameters);
+ char *param;
+ while ((param=yon_char_divide_search(paramline,divider,1))){
+ if (strcmp(param,paramline)==0) break;
+ string=realloc(string,sizeof(char*)*i);
+ string[i-1]=yon_char_new(param);
+ i++;
+ }
+ string=realloc(string,sizeof(char*)*i);
+ string[i-1]=yon_char_new(paramline);
+ i++;
+ // printf("%d\n",i);
+ *size=i-1;
+ return string;
+
+}
+
+/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete)
+ * [EN]
+ *
+ * [RU]
+ * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size]
+ * Возвращает получившийся массив, в [size] загружается размер нового массива.
+*/
+char **yon_char_parsed_rip(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;
+}
+
+/**yon_char_parsed_check_exist(char **parameters, int size, char *param)
+ * [EN]
+ * Checks if [parameters] string array of length [size]
+ * has [param] element;
+ * [RU]
+ * Проверяет есть ли в массиве строк [parameters], размера [size]
+ * элемент [param]
+*/
+int yon_char_parsed_check_exist(char **parameters, int size, char *param){
+
+ for (int i=0;id_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)
+{
+ apps tmp;
+ if (size > 2)
+ {
+ for (int i = 1; i < size; i++)
+ {
+ for (int j = 1; j < size; j++)
+ {
+ if (strcmp(applist[j].Name, applist[j - 1].Name) < 0)
+ {
+ tmp = applist[j];
+ applist[j] = applist[j - 1];
+ applist[j - 1] = tmp;
+ };
+ }
+ };
+ }
+};
+
+apps *yon_apps_get_by_name(apps *applist, char *name, int size)
+{
+ for (int i = 0; i < size; i++)
+ {
+ if (strcmp(applist[i].Name, name) == 0)
+ return &applist[i];
+ }
+ return NULL;
+};
+
+//config functions
+
+/**yon_config_load_register(char *command)
+ * [EN]
+ *
+ * [RU]
+ * Выполняет команду [command].
+ * Полученные данные парсятся и регистрируются в конфиг.
+*/
+int yon_config_load_register(char *command){
+ if (__yon__config__strings){
+ __yon__config__strings = yon_dictionary_free_all(__yon__config__strings,NULL);
+ }
+ FILE *output = popen(command, "r");
+ 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,"=",-1);
+ yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,str);
+ __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
+ }
+ }
+ check_config
+ return 0;
+ else return 1;
+}
+
+/**yon_config_remove_by_key(char *key)
+ * [EN]
+ *
+ * [RU]
+ * Удаляет параметр конфига по ключу [key]
+*/
+int yon_config_remove_by_key(char *key){
+ check_config{
+ dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
+ if (dict){
+ yon_dictionary_rip(dict);
+ return 1;
+ }else return 0;
+ }
+ return 0;
+}
+
+/**yon_config_remove_by_data(void *data)
+ * [EN]
+ *
+ * [RU]
+ * Производит поиск по конфигу на наличие параметра со значением [data] и удаляет найденное значение из конфига.
+*/
+int yon_config_remove_by_data(void *data){
+ check_config{
+ dictionary *dict = NULL;
+ for_dictionaries(dict,__yon__config__strings){
+ if (dict->data==data){
+ yon_dictionary_rip(dict);
+ return 1;
+ }
+ }
+ return 0;
+ }
+ return 0;
+}
+
+/**yon_config_remove_element(char *key, char *deleted)
+ * [EN]
+ *
+ * [RU]
+ * Удаляет элемент [deleted] из массива параметров с ключом [key]
+*/
+int yon_config_remove_element(char *key, char *deleted){
+ check_config{
+ dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
+ char *data = (char*)dict->data;
+ char *found = strstr(data,deleted);
+ int size=strlen(data)-strlen(found)+1;
+ char *new_data = malloc(size);
+ memset(new_data,0,size);
+ if (strlen(found)!=strlen(deleted)){
+ memcpy(new_data,data,size-1);
+ new_data = yon_char_append(new_data,found+strlen(deleted)+1);
+ } else {
+ memcpy(new_data,data,size-2);
+ new_data = yon_char_append(new_data,found+strlen(deleted));
+ }
+ dict->data=(void*)(new_data);
+ free(data);
+ dict->flag1=1;
+ return 1;
+ } else return 0;
+}
+
+/**yon_config_get_by_key(char *key)
+ * [EN]
+ *
+ * [RU]
+ * Возвращает значение параметра конфига с ключом [key]
+*/
+void *yon_config_get_by_key(char *key){
+ check_config{
+ dictionary *dict = NULL;
+ for_dictionaries(dict, __yon__config__strings){
+ if (strcmp(dict->key,key)==0){
+ return dict->data;
+ }
+ }
+ }
+ return NULL;
+}
+
+/**yon_config_get_key_by_data(char *data)
+ * [EN]
+ *
+ * [RU]
+ * Возвращает ключ параметра конфига со значением [data].
+ * Если параметр с таким значением не найден, возвращается NULL
+*/
+char *yon_config_get_key_by_data(char *data){
+ check_config{
+ dictionary *dict = NULL;
+ for_dictionaries(dict, __yon__config__strings){
+ if (strcmp(((char*)dict->data),data)==0){
+ return dict->key;
+ }
+ }
+ }
+ return NULL;
+}
+
+/**yon_config_set(char *key, void *data)
+ * [EN]
+ *
+ * [RU]
+ * Производит поиск по конфигу и заменяет значение параметра с ключом [key] на новое значение [data];
+*/
+int yon_config_set(char *key, void *data){
+ check_config{
+ dictionary *dict = yon_dictionary_get(&__yon__config__strings,key);
+ dict->data=data;
+ return 1;
+ } else return 0;
+}
+
+/**yon_config_clean()
+ * [EN]
+ * Erase all parameters from config;
+ * [RU]
+ * Удаляет все параметры из конфига;
+*/
+int yon_config_clean(){
+ check_config{
+ __yon__config__strings = yon_dictionary_free_all(__yon__config__strings, NULL);
+ return 1;
+ }
+ else return 0;
+}
+
+/**yon_config_register(char *key, void *data)
+ * [EN]
+ *
+ * [RU]
+ * Регистрирует новый параметр конфига.
+ * [key] - ключ параметра;
+ * [data] - значение параметра;
+*/
+void yon_config_register(char *key, void *data){
+ yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,data);
+ __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE;
+}
+
+/**yon_config_load(char *command, int *str_len)
+ * [EN]
+ *
+ * [RU]
+ * Выполняет команду [command] и возвращает распаршеный результат выполнения команды.
+ * В [str_len] возвращается длина возвращаемого массива
+*/
+config_str yon_config_load(char *command, int *str_len){
+ FILE *output = popen(command, "r");
+ 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)
+ {
+ output_strings = realloc(output_strings, sizeof(char *) * (i + 1));
+ // printf("%s\n", str);
+ output_strings[i] = NULL;
+ output_strings[i] = yon_char_new(str);
+ memset(str, 0, 4096);
+ i++;
+ }
+ }
+ if (i>0){
+ *str_len = i;
+ return output_strings;
+ } else{
+ *str_len=-1;
+ return NULL;
+ }
+}
+
+/**int yon_config_save(char *command)
+ * [EN]
+ * Saves config with [command]
+ * [RU]
+ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде:
+ * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]"
+*/
+int yon_config_save_registered(char *command){
+ check_config{
+ dictionary *dict = NULL;
+ for_dictionaries(dict,__yon__config__strings){
+ 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){
+ 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 parameters, int size, char *param)
+ * [EN]
+ * Gets parameter [param] from parameter list [parameters] of size [size];
+ * or NULL if nothing were found
+ * [RU]
+ * Возвращает параметр [param] из массива строк [parameters] размером [size]
+ * или NULL если такой не был найден
+*/
+char *yon_config_get_parameter(config_str parameters, int size, char *param)
+{
+ if (param[0]==' ')
+ 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]), "=", 1);
+ if (name)
+ {
+ if (strcmp(name, param) == 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;
+ }
+ }
+ }
+ return NULL;
+}
+
+
+
+// terminal-using functions
+
+/**yon_launch_app_with_arguments(char *name, char *args)
+ * [EN]
+ * Execute [command] in separate thread;
+ * [RU]
+ * Выполнить команду [command] в отдельном потоке;
+*/
+int yon_launch_app_with_arguments(char *name, char *args)
+{
+ 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 *)yon_launch, command);
+};
+
+/**yon_launch(char *command)
+ * [EN]
+ * Execute command [command]
+ * [RU]
+ * Выполнить команду [command]
+*/
+void yon_launch(char *command)
+{
+ system(command);
+}
+
+// Gtk functions
+
+
+#ifdef __GTK_H__
+
+
+static render_data render;
+
+#ifdef VTE_TERMINAL
+
+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));
+}
+
+/**
+ * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument)
+ * [EN]
+ * launches terminal with specific [command],
+ * terminal is shown in [place_to_show] container,
+ * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
+ * [RU]
+ * Запускает терминал с командой [command],
+ * терминал добавляется в контейнер [place_to_show] виджета,
+ * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
+*/
+void yon_terminal_integrated_launch(GtkWidget *place_to_show, 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;
+ GtkWidget *terminal = vte_terminal_new();
+ 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);
+ gtk_container_add(GTK_CONTAINER(place_to_show),terminal);
+ char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL);
+ printf("%s\n",install_command);
+ 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);
+ }
+
+/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument)
+ * [EN]
+ * launches terminal with specific [command],
+ * terminal is shown in [place_to_show] container,
+ * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument.
+ * [RU]
+ * Запускает терминал с командой [command],
+ * терминал добавляется в контейнер [place_to_show] виджета,
+ * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument].
+*/
+void yon_terminal_integrated_start(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," ; sleep 5;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), 100);
+ 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);
+ }
+#endif
+
+ // Window config functions
+
+ #define check_window_config_setup if(__yon_window_config_target_window)
+
+ typedef struct {
+ char *parameter_name;
+ enum YON_TYPE containing_type;
+ GtkWidget *track_widget;
+ char *property_name;
+ } __yon_listener_parameter;
+
+ typedef struct {
+ char *parameter_name;
+ char *section;
+ enum YON_TYPE containing_type;
+ void *property;
+ } __yon_custom_parameter;
+
+ struct {
+ int x;
+ int y;
+ int width;
+ int height;
+ int fullscreen;
+ dictionary *custom_listeners;
+ dictionary *custom_parameters;
+ dictionary *deleted_parameters;
+ } __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;
+
+ void yon_window_config_save(){
+ g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x);
+ g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y);
+ g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width);
+ g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height);
+ g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen);
+ dictionary *dict=NULL;
+ if (__yon_main_window_config.custom_listeners)
+ for_dictionaries(dict,__yon_main_window_config.custom_listeners){
+ __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
+ GValue *val = g_malloc0(sizeof(GValue));
+ g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
+ switch(param->containing_type){
+ case YON_TYPE_STRING:
+ g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val));
+ break;
+ case YON_TYPE_INT:
+ g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val));
+ break;
+ case YON_TYPE_BOOLEAN:
+ g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val));
+ break;
+ case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
+ }
+ }
+ if (__yon_main_window_config.custom_parameters)
+ for_dictionaries(dict,__yon_main_window_config.custom_parameters){
+ __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
+ switch (param->containing_type){
+ case YON_TYPE_STRING:
+ g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property);
+ break;
+ case YON_TYPE_INT:
+ g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property);
+ break;
+ case YON_TYPE_BOOLEAN:
+ g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property);
+ break;
+ default:
+ break;
+ }
+ }
+ if (__yon_main_window_config.deleted_parameters)
+ for_dictionaries(dict,__yon_main_window_config.deleted_parameters){
+ __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*);
+ g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL);
+ }
+ g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL);
+ }
+
+ void yon_get_is_fullscreen(){
+ gtk_window_is_maximized(__yon_window_config_target_window);
+ __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window);
+ if (!__yon_main_window_config.fullscreen) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y);
+ }
+
+ /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event)
+ * [EN]
+ *
+ * [RU]
+ * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается.
+ */
+ void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){
+ check_window_config_setup{
+ yon_get_is_fullscreen();
+ yon_window_config_save();
+ }
+ gtk_main_quit();
+ }
+
+ void __yon_window_config_on_resize(){
+ int max=0;
+ max=gtk_window_is_maximized(__yon_window_config_target_window);
+ if(max==0){
+ gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height);
+ gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y);
+ }
+ }
+
+ /**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){
+ g_usleep(G_USEC_PER_SEC/10);
+ if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window);
+ }
+
+ /**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 *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL);
+ if (stat(path, &st) == -1) {
+ mkdir(path, 0777);
+ }
+ FILE *fp;
+ fp=fopen(__yon_window_config_path,"w");
+ fclose(fp);
+ g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL);
+ }
+ __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL);
+ __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL);
+ __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL);
+ __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL);
+ __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL);
+ dictionary *dict=NULL;
+ if (__yon_main_window_config.custom_listeners)
+ for_dictionaries(dict,__yon_main_window_config.custom_listeners){
+ __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*);
+ GValue *val = g_malloc0(sizeof(GValue));
+ g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val);
+ switch(param->containing_type){
+ case YON_TYPE_STRING:
+ g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL));
+ break;
+ case YON_TYPE_INT:
+ g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL));
+ break;
+ case YON_TYPE_BOOLEAN:
+ gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL);
+ g_value_set_boolean(val,res);
+ break;
+ default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break;
+ }
+ g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val);
+ }
+ if (__yon_main_window_config.width==0) __yon_main_window_config.width=800;
+ if (__yon_main_window_config.height==0) __yon_main_window_config.height=600;
+ 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,(void *)_yon_maximize,NULL);
+ return 1;
+ }
+
+ void yon_window_config_apply(){
+ 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);
+ }
+
+ config_str yon_window_config_get_section(char *section, gsize *size){
+ config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL);
+ return key;
+ }
+
+ /**yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type)
+ * [EN]
+ *
+ * [RU]
+ * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name].
+ */
+ void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){
+ __yon_listener_parameter *param = NULL;
+ param = yon_remalloc(param,sizeof(__yon_listener_parameter));
+ param->parameter_name = yon_char_new(param_name);
+ param->track_widget = widget;
+ param->property_name = yon_char_new(widget_property);
+ param->containing_type = val_type;
+ yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param);
+ }
+
+ void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){
+ __yon_custom_parameter *param = NULL;
+ param = yon_remalloc(param,sizeof(__yon_custom_parameter));
+ param->parameter_name = yon_char_new(param_name);
+ param->section=section;
+ param->property = tracked_value;
+ param->containing_type = val_type;
+ yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param);
+ }
+
+ void yon_window_config_erase_custom_parameter(char *param_name, char *section){
+ __yon_custom_parameter *param = NULL;
+ param = yon_remalloc(param,sizeof(__yon_custom_parameter));
+ param->parameter_name=param_name;
+ param->section=section;
+ yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param);
+ }
+
+ int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){
+ GError *err=NULL;
+ switch (type){
+ case YON_TYPE_BOOLEAN:
+ *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err);
+ if (err) return 0; else return 1;
+ break;
+ case YON_TYPE_INT:
+ *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err);
+ if (err) return 0; else return 1;
+ break;
+ case YON_TYPE_STRING:
+ *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err);
+ if (err) return 0; else return 1;
+ break;
+ case YON_TYPE_STRING_LIST:
+ gsize size=0;
+ *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err);
+ *((char***)return_value)=yon_remalloc(return_value,size+1);
+ *((char***)return_value)[size]=NULL;
+ if (err) return 0; else return 1;
+ break;
+ }
+ }
+
+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;imessage);
+ g_error_free(err);
+ }
+ if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type)
+ {
+ gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
+ gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
+ gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+ }
+ else if (type == BACKGROUND_IMAGE_FAIL_TYPE)
+ {
+ gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK");
+ gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError");
+ gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+ }
+ if (text)
+ gtk_label_set_text(GTK_LABEL(data.label), text);
+}
+
+void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){
+ _yon_ubl_status_box_render(text,type);
+}
+
+/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id)
+ * [EN]
+ * Set up plugs for using with GtkSockets insine ubl-settings-manager.
+ * [main_window] is container widget, which holds main application functionality.
+ * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header.
+ * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header.
+ * [socket_main_id] is id of socket for [main_window].
+ * [socket_left_id] is id of socket for [left_window].
+ * [socket_right_id] is id of socket for [right_window].
+ * [RU]
+ * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager.
+ * [main_window] - контейнер основного интерфейса приложения.
+ * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager.
+ * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager.
+ * [socket_main_id] - id сокета для [main_window].
+ * [socket_left_id] - id сокета для [left_window].
+ * [socket_right_id] - id сокета для [right_window].
+*/
+void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){
+ if (main_window&&socket_main_id>-1){
+ gtk_widget_hide(gtk_widget_get_toplevel(main_window));
+ GtkWidget *plug_main=gtk_plug_new(socket_main_id);
+ GtkWidget *plug_left=NULL;
+ GtkWidget *plug_right=NULL;
+ GtkWidget *box=NULL;
+ g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL);
+ if (socket_left_id>-1&&left_window){
+ plug_left=gtk_plug_new(socket_left_id);
+ g_object_ref(left_window);
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
+ gtk_container_add(GTK_CONTAINER(plug_left),left_window);
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar");
+ gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button");
+ gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited");
+ gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color");
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder");
+ gtk_widget_show(plug_left);
+ }
+ else if (left_window){
+ if (box==NULL){
+ box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+ gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
+ gtk_box_reorder_child(GTK_BOX(main_window),box,0);
+ gtk_widget_show(box);
+ }
+ gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited");
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window);
+ gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5);
+ }
+ if (socket_right_id>-1&&right_window){
+ plug_right=gtk_plug_new(socket_right_id);
+ g_object_ref(right_window);
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
+ gtk_container_add(GTK_CONTAINER(plug_right),right_window);
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar");
+ gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button");
+ gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited");
+ gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color");
+ gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder");
+ gtk_widget_show(plug_right);
+ }
+ else if (right_window){
+ if (box==NULL){
+ box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+ gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5);
+ gtk_box_reorder_child(GTK_BOX(main_window),box,0);
+ gtk_widget_show(box);
+ }
+ gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited");
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window);
+ gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5);
+ }
+ g_object_ref(main_window);
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window);
+ gtk_container_add(GTK_CONTAINER(plug_main),main_window);
+ gtk_widget_show(plug_main);
+ }
+}
+
+#ifdef WEBKIT_FOUND
+
+/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
+ * [EN]
+ * Launches integrated browser window, named [browser_window_name] at header with [link].
+ * [RU]
+ * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link]
+*/
+void yon_ubl_browser_window_open(char *link, char *browser_window_name){
+ GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+ GtkWidget *header=gtk_header_bar_new();
+ GtkWidget *header_label=gtk_label_new(browser_window_name);
+ GtkWidget *WebView=webkit_web_view_new();
+ gtk_container_add(GTK_CONTAINER(browser),web_place);
+ gtk_window_set_titlebar(GTK_WINDOW(browser),header);
+ gtk_window_set_title(GTK_WINDOW(browser),browser_window_name);
+ gtk_widget_set_size_request(browser,800,600);
+ gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label);
+ gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1);
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link);
+ gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0);
+ gtk_widget_show_all(browser);
+}
+#else
+
+/**yon_ubl_browser_window_open(char *link, char *browser_window_name)
+ * [EN]
+ * Launches browser with [link].
+ * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function.
+ * [RU]
+ * Открывает браузер со страницей по ссылке [link]
+ * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции.
+*/
+void yon_ubl_browser_window_open(char *link, char *browser_window_name){
+ char *user=getenv("SUDO_USER");
+ if (!user)
+ user=getlogin();
+ char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL);
+ yon_launch_app(command);
+}
+#endif
+
+#endif
diff --git a/source/model/ubl-utils.h b/source/model/ubl-utils.h
new file mode 100644
index 0000000..b956787
--- /dev/null
+++ b/source/model/ubl-utils.h
@@ -0,0 +1,368 @@
+#ifndef UBL_UTILS
+#define UBL_UTILS
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#define try bool __HadError=false;
+#define catch(x) ExitJmp:if(__HadError)
+#define throw(x) {__HadError=true;goto ExitJmp;}
+
+#include "../../compile/ubl-cmake.h"
+#ifdef WEBKIT_FOUND
+ #include
+#endif
+#define DesktopPath "/usr/share/applications/"
+
+#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next)
+
+#define new(type) malloc(sizeof(type))
+#define new_arr(type,size) malloc(sizeof(type)*size)
+
+#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL)
+
+typedef enum
+{
+ #ifdef __GTK_H__
+ DICTIONARY_GTK_WIDGETS_TYPE,
+ #endif
+ DICTIONARY_OTHER_TYPE=0,
+ DICTIONARY_CHAR_TYPE,
+ DICTIONARY_INT_TYPE,
+ DICTIONARY_BOOL_TYPE,
+
+} DICT_TYPE;
+
+typedef struct dictionary
+{
+ char *key;
+ void *data;
+ struct dictionary *next;
+ struct dictionary *prev;
+ struct dictionary *first;
+ DICT_TYPE data_type;
+ int flag1;
+} dictionary;
+
+typedef struct apps
+{
+ char *Name;
+ int Type;
+ char *Categories;
+ char *Exec;
+ char *Icon;
+ int Pluggable;
+ int DualPluggable;
+} 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)
+
+#define for_config dictionary temp = NULL; for_dictionary(temp,__yon__config__strings)
+
+#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size)
+// dictionary functions
+
+/**yon_dictionary_get_data(dictionary, type)
+ * [EN]
+ * Gets data from dictionary.
+ * [dictionary] is dictionary, from which data should be extracted;
+ * [type] is type of data, [dictionary] contains.
+ * [RU]
+ * Возвращает данные из словаря.
+ * [dictionary] - словарь из которого достаются данные.
+ * [type] - тип данных, хранящихся в словаре [dictionary].
+*/
+#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data)
+
+/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data)
+ * [EN]
+ *
+ * [RU]
+ * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data].
+ * Если словарь не существует, создаёт его
+*/
+#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \
+ else dict=yon_dictionary_append_with_data(dict,key,data);}
+
+dictionary *yon_dictionary_new();
+
+dictionary *yon_dictionary_append(dictionary *targetdict);
+
+dictionary *yon_dictionary_get_last(dictionary *dict);
+
+dictionary *yon_dictionary_swap(dictionary *dict, int aim);
+
+void yon_dictionary_make_first(dictionary *dict);
+
+void yon_dictionary_make_nth(dictionary *dict, int nth);
+
+dictionary *yon_dictionary_new_with_data(char *key, void *data);
+
+dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data);
+
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
+
+dictionary *yon_dictionary_get(dictionary **dict, char *key);
+
+dictionary *yon_dictionary_rip(dictionary *dict);
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
+
+void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*));
+
+// char functions
+
+int yon_char_find_last(char *source, char find);
+
+char *yon_char_append(char *source, char *append);
+
+char *yon_char_new(char *chr);
+
+char *yon_char_unite(char *source, ...);
+
+char *yon_cut(char *source, int size, int startpos);
+
+char *yon_char_divide(char *source, int dividepos);
+
+char *yon_char_divide_search(char *source, char *dividepos, int delete_divider);
+
+char *yon_char_from_int(int int_to_convert);
+
+char *yon_char_replace(char *source, char *find, char*replace);
+
+char **yon_char_parse(char *parameters, int *size, char *divider);
+
+char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete);
+
+int yon_char_parsed_check_exist(char **parameters, int size, char *param);
+
+int yon_char_find_count(char *source, char *find);
+
+int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size);
+
+config_str yon_char_parsed_new (int *size, ...);
+
+void yon_char_parsed_copy(config_str *source, config_str *to_copy);
+
+config_str yon_char_parsed_append(config_str parsed, int *size, char *string);
+
+int yon_ubl_check_root();
+
+char *yon_ubl_root_user_get();
+
+char *yon_ubl_user_get_home_directory();
+
+// parsing functions
+
+apps *yon_apps_scan_and_parse_desktops(int *sizef);
+
+void yon_apps_sort(apps *applist, int size);
+
+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_registered(char *command);
+
+char *yon_config_get_parameter(config_str parameters, int size, char *param);
+
+int yon_config_load_register(char *command);
+
+int yon_config_remove_by_key(char *key);
+
+int yon_config_remove_by_data(void *data);
+
+int yon_config_remove_element(char *key, char *deleted);
+
+void *yon_config_get_by_key(char *key);
+
+char *yon_config_get_key_by_data(char *data);
+
+int yon_config_set(char *key, void *data);
+
+int yon_config_clean();
+
+void yon_config_register(char *key, void *data);
+
+config_str yon_config_get_all();
+
+// terminal-using functions
+
+int yon_launch_app_with_arguments(char *name, char *args);
+
+void yon_launch(char *command);
+
+// Gtk functions
+
+#ifdef __GTK_H__
+#ifdef VTE_TERMINAL
+void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument);
+
+void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument);
+
+#endif
+
+enum YON_TYPE{
+ YON_TYPE_STRING,
+ YON_TYPE_INT,
+ YON_TYPE_STRING_LIST,
+ YON_TYPE_BOOLEAN,
+ YON_TYPE_OTHER
+};
+
+GtkWidget *yon_ubl_menu_item_about_new(char *buttonname);
+GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname);
+
+/**yon_gtk_builder_get_widget(builder, widget_name)
+ * [EN]
+ * Returns GtkWidget from GtkBuilder *[builder].
+ * [builder] is GtkBuilder*;
+ * [widget_name] is id of widget;
+*/
+#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name))
+
+typedef struct
+{
+ GtkWidget *Icon;
+ GtkWidget *Label;
+ GtkWidget *IconView;
+ GtkListStore *List;
+} expander_icon_view;
+
+void yon_window_config_setup(GtkWindow *window);
+
+int yon_window_config_load(char *path);
+
+config_str yon_window_config_get_section(char *section, gsize *size);
+
+void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type);
+
+void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type);
+
+void yon_window_config_erase_custom_parameter(char *param_name, char *section);
+
+int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type);
+
+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);
+
+int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
+
+int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
+
+int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
+
+
+
+typedef enum
+{
+ BACKGROUND_IMAGE_SUCCESS_TYPE,
+ BACKGROUND_IMAGE_FAIL_TYPE
+} BACKGROUND_IMAGE_TYPE;
+
+typedef struct {
+ BACKGROUND_IMAGE_TYPE type;
+ GtkWidget *icon;
+ GtkWidget *box;
+ GtkWidget *label;
+ char* text_to_render;
+} render_data;
+
+
+/**yon_ubl_status_box_setup(render,icon,box,label)
+ * [EN]
+ * Sets up [render] structure of type render_data.
+ * [icon] is GtkImage widget of status box for showing status icons;
+ * [box] is GtkBox widget of status box for showing status color;
+ * [label] is GtkLabel widget of status box for showing status text;
+ * [RU]
+ * Настраивает структуру [render] типа render_data.
+ * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки;
+ * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса;
+ * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения;
+*/
+int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label);
+
+/**yon_ubl_status_box_render(render,text,type)
+ * [EN]
+ * Renders message in status box;
+ * [render] is render_data structure of status box;
+ * [text] is text to be shown in status box;
+ * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE
+ * [RU]
+ * Отображает сообщение в статусном окне.
+ * [render] - структура типа render_data для нужного статусного окна;
+ * [text] - текст, отображаемый в статусном окне;
+ * [type] - тип сообщения. Может быть:
+ * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак)
+ * или
+ * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка)
+*/
+void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type);
+
+#ifdef __cplusplus
+
+/**yon_ubl_header_setup(overlay, head, image, imag_path)
+ * [EN]
+ * Sets up header of app.
+ * [overlay] is overlay for app header;
+ * [head] is box of header, which connects to [overlay]
+ * [image] is header background image;
+ * [imag_path] is path of image, shown in [image]
+ * [RU]
+ * Настраивает заголовок приложения.
+ * [overlay] - оверлей заголовка приложения;
+ * [head] - шапка заголовка, присоединяемая к [overlay]
+ * [image] - виджет картинки для заднего фона;
+ * [imag_path] - путь до картинки, загружаемой в [image]
+*/
+#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path)
+#else
+
+/**yon_ubl_header_setup(overlay, head, image, imag_path)
+ * [EN]
+ * Sets up header of app.
+ * [overlay] is overlay for app header;
+ * [head] is box of header, which connects to [overlay]
+ * [image] is header background image;
+ * [imag_path] is path of image, shown in [image]
+ * [RU]
+ * Настраивает заголовок приложения.
+ * [overlay] - оверлей заголовка приложения;
+ * [head] - шапка заголовка, присоединяемая к [overlay]
+ * [image] - виджет картинки для заднего фона;
+ * [imag_path] - путь до картинки, загружаемой в [image]
+*/
+#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
+#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
+#endif
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+
+void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+
+void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id);
+#ifdef WEBKIT_FOUND
+
+void yon_ubl_browser_window_open(char *link, char *browser_window_name);
+#else
+void yon_ubl_browser_window_open(char *link, char *browser_window_name);
+#endif
+#endif
+#endif
diff --git a/source/model/vector.c b/source/model/vector.c
new file mode 100644
index 0000000..8e5ac91
--- /dev/null
+++ b/source/model/vector.c
@@ -0,0 +1,128 @@
+#include "vector.h"
+
+int vectorTotal(vector *v)
+{
+ int totalCount = UNDEFINE;
+ if(v)
+ {
+ totalCount = v->vectorList.total;
+ }
+ return totalCount;
+}
+int vectorResize(vector *v, int capacity)
+{
+ int status = UNDEFINE;
+ if(v)
+ {
+ void **items = realloc(v->vectorList.items, sizeof(void *) * capacity);
+ if (items)
+ {
+ v->vectorList.items = items;
+ v->vectorList.capacity = capacity;
+ status = SUCCESS;
+ }
+ }
+ return status;
+}
+int vectorPushBack(vector *v, void *item)
+{
+ int status = UNDEFINE;
+ if(v)
+ {
+ if (v->vectorList.capacity == v->vectorList.total)
+ {
+ status = vectorResize(v, v->vectorList.capacity * 2);
+ if(status != UNDEFINE)
+ {
+ v->vectorList.items[v->vectorList.total++] = item;
+ }
+ }
+ else
+ {
+ v->vectorList.items[v->vectorList.total++] = item;
+ status = SUCCESS;
+ }
+ }
+ return status;
+}
+int vectorSet(vector *v, int index, void *item)
+{
+ int status = UNDEFINE;
+ if(v)
+ {
+ if ((index >= 0) && (index < v->vectorList.total))
+ {
+ v->vectorList.items[index] = item;
+ status = SUCCESS;
+ }
+ }
+ return status;
+}
+void *vectorGet(vector *v, int index)
+{
+ void *readData = NULL;
+ if(v)
+ {
+ if ((index >= 0) && (index < v->vectorList.total))
+ {
+ readData = v->vectorList.items[index];
+ }
+ }
+ return readData;
+}
+int vectorDelete(vector *v, int index)
+{
+ int status = UNDEFINE;
+ int i = 0;
+ if(v)
+ {
+ if ((index < 0) || (index >= v->vectorList.total))
+ return status;
+ v->vectorList.items[index] = NULL;
+ for (i = index; (i < v->vectorList.total - 1); ++i)
+ {
+ v->vectorList.items[i] = v->vectorList.items[i + 1];
+ v->vectorList.items[i + 1] = NULL;
+ }
+ v->vectorList.total--;
+ if ((v->vectorList.total > 0) && ((v->vectorList.total) == (v->vectorList.capacity / 4)))
+ {
+ vectorResize(v, v->vectorList.capacity / 2);
+ }
+ status = SUCCESS;
+ }
+ return status;
+}
+int vectorFree(vector *v)
+{
+ int status = UNDEFINE;
+ if(v)
+ {
+ free(v->vectorList.items);
+ v->vectorList.items = NULL;
+ status = SUCCESS;
+ }
+ return status;
+}
+void vectorCopy(vector* v_to_copy, vector* v_from_copy) {
+ for (int i = 0; i < v_from_copy->vectorList.total; i++) {
+ vectorPushBack(v_to_copy, vectorGet(v_from_copy, i));
+ }
+}
+
+void vector_init(vector *v)
+{
+ //init function pointers
+ v->pfVectorTotal = vectorTotal;
+ v->pfVectorResize = vectorResize;
+ v->pfVectorAdd = vectorPushBack;
+ v->pfVectorSet = vectorSet;
+ v->pfVectorGet = vectorGet;
+ v->pfVectorFree = vectorFree;
+ v->pfVectorDelete = vectorDelete;
+ v->pfVectorCopy = vectorCopy;
+ //initialize the capacity and allocate the memory
+ v->vectorList.capacity = VECTOR_INIT_CAPACITY;
+ v->vectorList.total = 0;
+ v->vectorList.items = malloc(sizeof(void *) * v->vectorList.capacity);
+}
diff --git a/source/model/vector.h b/source/model/vector.h
new file mode 100644
index 0000000..1682777
--- /dev/null
+++ b/source/model/vector.h
@@ -0,0 +1,40 @@
+#include
+#include
+
+// https://aticleworld.com/implement-vector-in-c/
+
+#define VECTOR_INIT_CAPACITY 7
+#define UNDEFINE -1
+#define SUCCESS 0
+//Store and track the stored data
+typedef struct sVectorList
+{
+ void **items;
+ int capacity;
+ int total;
+} sVectorList;
+//structure contain the function pointer
+typedef struct sVector vector;
+struct sVector
+{
+ sVectorList vectorList;
+//function pointers
+ int (*pfVectorTotal)(vector *);
+ int (*pfVectorResize)(vector *, int);
+ int (*pfVectorAdd)(vector *, void *);
+ int (*pfVectorSet)(vector *, int, void *);
+ void *(*pfVectorGet)(vector *, int);
+ int (*pfVectorDelete)(vector *, int);
+ int (*pfVectorFree)(vector *);
+ void (*pfVectorCopy)(vector *,vector *);
+
+};
+void vector_init(vector *v);
+int vectorFree(vector *v);
+int vectorDelete(vector *v, int index);
+void *vectorGet(vector *v, int index);
+int vectorSet(vector *v, int index, void *item);
+int vectorPushBack(vector *v, void *item);
+int vectorResize(vector *v, int capacity);
+int vectorTotal(vector *v);
+void vectorCopy(vector* v_to_copy, vector* v_from_copy);
\ No newline at end of file
diff --git a/source/my_type.h b/source/my_type.h
deleted file mode 100644
index 6355b2f..0000000
--- a/source/my_type.h
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef MY_TYPE_H
-#define MY_TYPE_H
-
-#include "project_lib.h"
-#include
-
-using namespace std;
-
-typedef unsigned long max_num_T;
-
-struct users_grups{
- string name;
- bool state;
- max_num_T size_data;
- max_num_T soft_limit_size;
- max_num_T severe_restriction_size;
- max_num_T postponement_size_brat;
- max_num_T hard_limit_activation_time_size;
- max_num_T file;
- max_num_T soft_file_limitation;
- max_num_T hard_file_restriction;
- max_num_T postponement_hard_file_restriction;
- max_num_T hard_limit_activation_time;
- };
-struct Mount {
- std::string device;
- std::string destination;
- std::string fstype;
- std::string options;
- std::string dump;
- std::string pass;
-};
-struct partition_cmd {
- string device;
- string cmd;
-};
-struct struct_quotas {
- string device;
- string cmd;
- string type_quotas;
- string name;
-};
-struct status_quotas {
- bool user;
- bool group;
- bool project;
- bool status;
-};
-struct data_all_quotas {
- string username;
- string status;
- string block_used;
- string block_soft;
- string block_hard;
- string block_grace;
- string file_used;
- string file_soft;
- string file_hard;
- string file_grace;
- bool is_validate;
-};
-struct tv_g_u_p {
- string name;
- string quotas;
- string size;
- string soft_limit_size;
- string hard_limit_size;
- string deferring_size;
- string files;
- string soft_limit_files;
- string hard_limit_delay;
- string deferring_files;
-};
-
-typedef struct users_grups USER_GRUPS;
-typedef map map_str_str;
-typedef map * map_s_s_ptr;
-typedef std::map map_str_device;
-#endif
\ No newline at end of file
diff --git a/source/project_lib.h b/source/project_lib.h
deleted file mode 100644
index 9bd1546..0000000
--- a/source/project_lib.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef PROJECT_LIB_H
-#define PROJECT_LIB_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include