diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 379da09..f11641c 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -40,6 +40,7 @@ add_library(${PROJECT_NAME} SHARED ${PROJECT_NAME}-calendar.c ${PROJECT_NAME}-menu.c ${PROJECT_NAME}-misc.c + ${PROJECT_NAME}-packages.c ${PROJECT_NAME}-socket.c ${PROJECT_NAME}-status.c ${PROJECT_NAME}-tree-view.c diff --git a/source/libublsettings-gtk3-apps.c b/source/libublsettings-gtk3-apps.c index d3e7482..6b07e27 100644 --- a/source/libublsettings-gtk3-apps.c +++ b/source/libublsettings-gtk3-apps.c @@ -17,7 +17,11 @@ void yon_app_free(apps *target){ int yon_app_set_from_file(apps *target, const char *path){ GKeyFile *cur_file = g_key_file_new(); - if (!g_key_file_load_from_file(cur_file,path,G_KEY_FILE_KEEP_TRANSLATIONS,NULL)) return 0; + GError *err = NULL; + if (!g_key_file_load_from_file(cur_file,path,G_KEY_FILE_KEEP_TRANSLATIONS,&err)) { + printf("%s\n",err->message); + return 0; + } target->Name = g_key_file_get_locale_string(cur_file,"Desktop Entry","Name",NULL,NULL); target->Desktop_path = yon_char_new(path); @@ -64,8 +68,9 @@ void yon_apps_init(){ if (!strstr(paths[i],".desktop")) continue; char *cur_path = yon_char_unite(DesktopPath,"/",paths[i],NULL); apps *cur_app = yon_app_new(); - yon_app_set_from_file(cur_app,cur_path); - g_hash_table_insert(_apps,yon_char_new(cur_app->Desktop_path),cur_app); + if (yon_app_set_from_file(cur_app,cur_path)){ + g_hash_table_insert(_apps,yon_char_new(cur_app->Desktop_path),cur_app); + } } } diff --git a/source/libublsettings-gtk3-packages.c b/source/libublsettings-gtk3-packages.c new file mode 100644 index 0000000..c98a4b5 --- /dev/null +++ b/source/libublsettings-gtk3-packages.c @@ -0,0 +1,254 @@ +#include "libublsettings-gtk3.h" +#include + + +struct packages { + alpm_handle_t *packages_handle; + int init_status; +} packages_struct = {}; + +int _yon_packages_get_db(){ + const char *root = "/"; + const char *dbpath = "/var/lib/pacman"; + const char *config_path = "/etc/pacman.conf"; + packages_struct.packages_handle = alpm_initialize(root,dbpath,NULL); + if (!packages_struct.packages_handle){ + packages_struct.init_status=0; + return 0; + } + int size = 0; + config_str pacman_config = yon_file_open((char*)config_path,&size); + char *pacman_config_full = yon_char_parsed_to_string(pacman_config,size,""); + + GRegex *regex = g_regex_new("^\\[.*\\]$",G_REGEX_MULTILINE,0,NULL); + GMatchInfo *match = NULL; + g_regex_match(regex,pacman_config_full,G_REGEX_MATCH_DEFAULT,&match); + + while (g_match_info_matches(match)){ + char *iter = g_match_info_fetch(match,0); + if (iter[0]=='['){ + free(yon_char_divide(iter,0)); + yon_char_remove_last_symbol(iter,']'); + } + if (strcmp(iter,"options")){ + alpm_register_syncdb(packages_struct.packages_handle,iter,ALPM_SIG_USE_DEFAULT); + } + g_match_info_next(match,NULL); + } + + return 1; +} + +alpm_list_t *_yon_packages_get_db_list(enum YON_PACKAGES_DB_TYPE type){ + alpm_list_t *db_list = NULL; + switch(type){ + case YON_PACKAGES_LOCAL: + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + break; + + case YON_PACKAGES_SYNC: + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + break; + + case YON_PACKAGES_ALL:{ + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + } + { + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + if (!db_list) db_list = alpm_list_append(&db_list,database); + else alpm_list_append(&db_list,database); + } + break; + + } + return db_list; +} + +int yon_packages_init(){ + if (packages_struct.packages_handle) return 0; + + int status = _yon_packages_get_db(); + if (!status) return 0; + + return 1; +} + + +int yon_packages_check_exist(const char *package_name){ + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + } + return 0; +} + +int yon_packages_check_installed(char *package_name){ + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) return 1; + return 0; +} + +int yon_packages_check_updates(char *package_name){ + alpm_pkg_t *sync_db_package = NULL; + alpm_pkg_t *local_db_package = NULL; + + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) sync_db_package = package; + } + { + alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); + alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); + if (package) local_db_package = package; + } + + if (sync_db_package && local_db_package){ + const char *sync_db_package_version = alpm_pkg_get_version(sync_db_package); + const char *local_db_package_version = alpm_pkg_get_version(sync_db_package); + if (strcmp(sync_db_package_version,local_db_package_version)) return 1; + } + return 0; +} + +config_str yon_packages_find(enum YON_PACKAGES_DB_TYPE type, const char *search_string, gsize *size){ + (*size)=0; + if (yon_char_is_empty(search_string)) return NULL; + + config_str final = NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_db_t *database = iter->data; + alpm_list_t *packages = alpm_db_get_pkgcache(database); + alpm_list_t *iter2 = NULL; + for (iter2 = packages; iter2; iter2=iter2->next){ + const char *name = alpm_pkg_get_name(iter2->data); + if (strstr(name,search_string)){ + yon_char_parsed_add_or_create_if_exists(final,(int*)size,(char*)name); + } + } + } + return final; +} + +char *yon_packages_get_version(enum YON_PACKAGES_DB_TYPE type, const char *package){ + if (yon_char_is_empty(package)) return NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); + if (!pkg) continue; + const char *name = alpm_pkg_get_name(pkg); + if (!strcmp(name,package)){ + return yon_char_new(alpm_pkg_get_version(pkg)); + } + } +} + +char *yon_packages_get_description(enum YON_PACKAGES_DB_TYPE type, const char *package){ + if (yon_char_is_empty(package)) return NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); + if (!pkg) continue; + const char *name = alpm_pkg_get_name(pkg); + if (!strcmp(name,package)){ + return yon_char_new(alpm_pkg_get_desc(pkg)); + } + } +} + +config_str yon_packages_get_depends(enum YON_PACKAGES_DB_TYPE type, const char *package, int *size){ + (*size)=0; + if (yon_char_is_empty(package)) return NULL; + config_str depends = NULL; + + alpm_list_t *databases = _yon_packages_get_db_list(type); + alpm_list_t *iter = NULL, *pkg_iter = NULL; + for (iter = databases; iter; iter=iter->next){ + alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); + if (!pkg) continue; + alpm_list_t *list = alpm_pkg_compute_requiredby(pkg); + for (pkg_iter = list; pkg_iter; pkg_iter=pkg_iter->next){ + yon_char_parsed_add_or_create_if_exists(depends,size,pkg_iter->data); + + } + break; + } + + return depends; +} + +void yon_packages_update(){ + if (getuid()) return; + if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle); + packages_struct.packages_handle=NULL; + _yon_packages_get_db(); +} + +int yon_packages_install(char *package){ + if (!packages_struct.init_status) return 0; + // char *command = install_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); + + yon_packages_update(); + // free(command); +} + +int yon_packages_remove(char *package){ + if (!packages_struct.init_status) return 0; + // char *command = remove_package_command(package); + // yon_terminal_window_launch(NULL,command,"",""); + + yon_packages_update(); + // free(command); +} + +void yon_packages_finish(){ + if (!packages_struct.init_status) return; + alpm_release(packages_struct.packages_handle); +} + +GList *yon_packages_get_all(){ + if (!packages_struct.init_status) return NULL; + + GList *list = NULL; + + alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); + for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ + alpm_db_t *database = iter->data; + alpm_list_t *package_list = alpm_db_get_pkgcache(database); + for (alpm_list_t *iter = package_list;iter;iter=iter->next){ + const char *cur_name = alpm_pkg_get_name(iter->data); + if (!list) list = g_list_append(list,yon_char_new(cur_name)); + else if (g_list_append(list,yon_char_new(cur_name))){}; + } + } + + return list; +} + +int yon_packages_upac_init(){ + +} \ No newline at end of file diff --git a/source/libublsettings-gtk3.c b/source/libublsettings-gtk3.c index 4866b63..f12fcd9 100644 --- a/source/libublsettings-gtk3.c +++ b/source/libublsettings-gtk3.c @@ -1,6 +1,5 @@ #include "libublsettings-gtk3.h" -#include #ifdef __GTK_H__ @@ -42,252 +41,6 @@ // } -struct packages { - alpm_handle_t *packages_handle; - int init_status; -} packages_struct = {}; - -int _yon_packages_get_db(){ - const char *root = "/"; - const char *dbpath = "/var/lib/pacman"; - const char *config_path = "/etc/pacman.conf"; - packages_struct.packages_handle = alpm_initialize(root,dbpath,NULL); - if (!packages_struct.packages_handle){ - packages_struct.init_status=0; - return 0; - } - int size = 0; - config_str pacman_config = yon_file_open((char*)config_path,&size); - char *pacman_config_full = yon_char_parsed_to_string(pacman_config,size,""); - - GRegex *regex = g_regex_new("^\\[.*\\]$",G_REGEX_MULTILINE,0,NULL); - GMatchInfo *match = NULL; - g_regex_match(regex,pacman_config_full,G_REGEX_MATCH_DEFAULT,&match); - - while (g_match_info_matches(match)){ - char *iter = g_match_info_fetch(match,0); - if (iter[0]=='['){ - free(yon_char_divide(iter,0)); - yon_char_remove_last_symbol(iter,']'); - } - if (strcmp(iter,"options")){ - alpm_register_syncdb(packages_struct.packages_handle,iter,ALPM_SIG_USE_DEFAULT); - } - g_match_info_next(match,NULL); - } - - return 1; -} - -alpm_list_t *_yon_packages_get_db_list(enum YON_PACKAGES_DB_TYPE type){ - alpm_list_t *db_list = NULL; - switch(type){ - case YON_PACKAGES_LOCAL: - alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); - if (!db_list) db_list = alpm_list_append(&db_list,database); - else alpm_list_append(&db_list,database); - break; - - case YON_PACKAGES_SYNC: - alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); - for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ - alpm_db_t *database = iter->data; - if (!db_list) db_list = alpm_list_append(&db_list,database); - else alpm_list_append(&db_list,database); - } - break; - - case YON_PACKAGES_ALL:{ - alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); - for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ - alpm_db_t *database = iter->data; - if (!db_list) db_list = alpm_list_append(&db_list,database); - else alpm_list_append(&db_list,database); - } - } - { - alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); - if (!db_list) db_list = alpm_list_append(&db_list,database); - else alpm_list_append(&db_list,database); - } - break; - - } - return db_list; -} - -int yon_packages_init(){ - if (packages_struct.packages_handle||getuid()) return 0; - - int status = _yon_packages_get_db(); - if (!status) return 0; - - return 1; -} - - -int yon_packages_check_exist(const char *package_name){ - alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); - for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ - alpm_db_t *database = iter->data; - alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); - if (package) return 1; - } - return 0; -} - -int yon_packages_check_installed(char *package_name){ - alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); - alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); - if (package) return 1; - return 0; -} - -int yon_packages_check_updates(char *package_name){ - alpm_pkg_t *sync_db_package = NULL; - alpm_pkg_t *local_db_package = NULL; - - alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); - for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ - alpm_db_t *database = iter->data; - alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); - if (package) sync_db_package = package; - } - { - alpm_db_t *database = alpm_get_localdb(packages_struct.packages_handle); - alpm_pkg_t *package = alpm_db_get_pkg(database,package_name); - if (package) local_db_package = package; - } - - if (sync_db_package && local_db_package){ - const char *sync_db_package_version = alpm_pkg_get_version(sync_db_package); - const char *local_db_package_version = alpm_pkg_get_version(sync_db_package); - if (strcmp(sync_db_package_version,local_db_package_version)) return 1; - } - return 0; -} - -config_str yon_packages_find(enum YON_PACKAGES_DB_TYPE type, const char *search_string, gsize *size){ - (*size)=0; - if (yon_char_is_empty(search_string)) return NULL; - - config_str final = NULL; - - alpm_list_t *databases = _yon_packages_get_db_list(type); - alpm_list_t *iter = NULL; - for (iter = databases; iter; iter=iter->next){ - alpm_db_t *database = iter->data; - alpm_list_t *packages = alpm_db_get_pkgcache(database); - alpm_list_t *iter2 = NULL; - for (iter2 = packages; iter2; iter2=iter2->next){ - const char *name = alpm_pkg_get_name(iter2->data); - if (strstr(name,search_string)){ - yon_char_parsed_add_or_create_if_exists(final,(int*)size,(char*)name); - } - } - } - return final; -} - -char *yon_packages_get_version(enum YON_PACKAGES_DB_TYPE type, const char *package){ - if (yon_char_is_empty(package)) return NULL; - - alpm_list_t *databases = _yon_packages_get_db_list(type); - alpm_list_t *iter = NULL; - for (iter = databases; iter; iter=iter->next){ - alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); - if (!pkg) continue; - const char *name = alpm_pkg_get_name(pkg); - if (!strcmp(name,package)){ - return yon_char_new(alpm_pkg_get_version(pkg)); - } - } -} - -char *yon_packages_get_description(enum YON_PACKAGES_DB_TYPE type, const char *package){ - if (yon_char_is_empty(package)) return NULL; - - alpm_list_t *databases = _yon_packages_get_db_list(type); - alpm_list_t *iter = NULL; - for (iter = databases; iter; iter=iter->next){ - alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); - if (!pkg) continue; - const char *name = alpm_pkg_get_name(pkg); - if (!strcmp(name,package)){ - return yon_char_new(alpm_pkg_get_desc(pkg)); - } - } -} - -config_str yon_packages_get_depends(enum YON_PACKAGES_DB_TYPE type, const char *package, int *size){ - (*size)=0; - if (yon_char_is_empty(package)) return NULL; - config_str depends = NULL; - - alpm_list_t *databases = _yon_packages_get_db_list(type); - alpm_list_t *iter = NULL, *pkg_iter = NULL; - for (iter = databases; iter; iter=iter->next){ - alpm_pkg_t *pkg = alpm_db_get_pkg(iter->data,package); - if (!pkg) continue; - alpm_list_t *list = alpm_pkg_compute_requiredby(pkg); - for (pkg_iter = list; pkg_iter; pkg_iter=pkg_iter->next){ - yon_char_parsed_add_or_create_if_exists(depends,size,pkg_iter->data); - - } - break; - } - - return depends; -} - -void yon_packages_update(){ - if (getuid()) return; - if (packages_struct.packages_handle) alpm_release(packages_struct.packages_handle); - packages_struct.packages_handle=NULL; - _yon_packages_get_db(); -} - -int yon_packages_install(char *package){ - if (!packages_struct.init_status) return 0; - // char *command = install_package_command(package); - // yon_terminal_window_launch(NULL,command,"",""); - - yon_packages_update(); - // free(command); -} - -int yon_packages_remove(char *package){ - if (!packages_struct.init_status) return 0; - // char *command = remove_package_command(package); - // yon_terminal_window_launch(NULL,command,"",""); - - yon_packages_update(); - // free(command); -} - -void yon_packages_finish(){ - if (!packages_struct.init_status) return; - alpm_release(packages_struct.packages_handle); -} - -GList *yon_packages_get_all(){ - if (!packages_struct.init_status) return NULL; - - GList *list = NULL; - - alpm_list_t *sync_db = alpm_get_syncdbs(packages_struct.packages_handle); - for (alpm_list_t *iter=sync_db;iter;iter=alpm_list_next(iter)){ - alpm_db_t *database = iter->data; - alpm_list_t *package_list = alpm_db_get_pkgcache(database); - for (alpm_list_t *iter = package_list;iter;iter=iter->next){ - const char *cur_name = alpm_pkg_get_name(iter->data); - if (!list) list = g_list_append(list,yon_char_new(cur_name)); - else if (g_list_append(list,yon_char_new(cur_name))){}; - } - } - - return list; -} config_str yon_resource_open_file(const char *path, int *size){ config_str parsed = NULL;