包管理兼容开明和kare

This commit is contained in:
tianshaoshuai 2024-06-17 09:08:52 +08:00
parent 9e5b8834a8
commit 3cc9b87866
3 changed files with 395 additions and 33 deletions

View File

@ -33,6 +33,7 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/statfs.h> #include <sys/statfs.h>
#include <ctype.h>
#define KDK_DEKSTOP_FILE_PATH "/usr/share/applications/" #define KDK_DEKSTOP_FILE_PATH "/usr/share/applications/"
#define KDK_LOCALE_DEKSTOP_FILE_PATH "/.local/share/applications/" #define KDK_LOCALE_DEKSTOP_FILE_PATH "/.local/share/applications/"
@ -73,7 +74,7 @@ static inline char *read_key(char *buffer, const char *key)
return NULL; return NULL;
} }
static int get_desktop_info(char *dir_path, kdk_startmenu_list *programlist) static int get_desktop_info(char *dir_path, kdk_app_info *programlist, int start_app)
{ {
char canonical_filename[4096] = {"\0"}; char canonical_filename[4096] = {"\0"};
if (!realpath(dir_path, canonical_filename) || !verify_file(canonical_filename)) if (!realpath(dir_path, canonical_filename) || !verify_file(canonical_filename))
@ -91,7 +92,7 @@ static int get_desktop_info(char *dir_path, kdk_startmenu_list *programlist)
if (DT_DIR == dir_t->d_type) if (DT_DIR == dir_t->d_type)
continue; continue;
kdk_startmenu_t *curinfo = NULL; kdk_app_t *curinfo = NULL;
if (strstr(dir_t->d_name, ".desktop")) if (strstr(dir_t->d_name, ".desktop"))
{ {
char fpath[PROGRAM_SIZE] = {0}; char fpath[PROGRAM_SIZE] = {0};
@ -112,8 +113,6 @@ static int get_desktop_info(char *dir_path, kdk_startmenu_list *programlist)
return 0; return 0;
} }
FILE *fp = fopen(filename, "r"); FILE *fp = fopen(filename, "r");
if (NULL == fp) if (NULL == fp)
{ {
@ -164,7 +163,7 @@ static int get_desktop_info(char *dir_path, kdk_startmenu_list *programlist)
// 判断是否是显示在开始菜单的应用程序 // 判断是否是显示在开始菜单的应用程序
if ((val = read_key(buffer, "NoDisplay="))) if ((val = read_key(buffer, "NoDisplay=")))
{ {
if (0 == strcmp(val, "true")) if (0 == strcmp(val, "true") && start_app)
{ {
is_start_menu_app = 0; is_start_menu_app = 0;
} }
@ -174,11 +173,11 @@ static int get_desktop_info(char *dir_path, kdk_startmenu_list *programlist)
if (is_start_menu_app) if (is_start_menu_app)
{ {
kdk_startmenu_t **tmp = (kdk_startmenu_t **)realloc(programlist->list, PROGRAM_SIZE * sizeof(kdk_startmenu_t *)); kdk_app_t **tmp = (kdk_app_t **)realloc(programlist->list, PROGRAM_SIZE * sizeof(kdk_app_t *));
if (!tmp) if (!tmp)
return 0; return 0;
curinfo = (kdk_startmenu_t *)calloc(1, sizeof(kdk_startmenu_t)); curinfo = (kdk_app_t *)calloc(1, sizeof(kdk_app_t));
if (!curinfo) if (!curinfo)
return 0; return 0;
@ -258,7 +257,7 @@ static char *read_default_app(const char *filetype)
} }
fp = fopen(canonical_filename, "r"); fp = fopen(canonical_filename, "r");
if(NULL == fp) if (NULL == fp)
return NULL; return NULL;
while (fgets(line, 1024, fp)) while (fgets(line, 1024, fp))
@ -343,6 +342,100 @@ kdk_package_list *kdk_package_get_packagelist()
} while (feof(fp) == 0); } while (feof(fp) == 0);
fclose(fp); fclose(fp);
char *kaiming = "kaiming list";
fp = popen(kaiming, "r");
if (NULL != fp)
{
char line[1024];
while (fgets(line, sizeof(line), fp))
{
char name[256], id[256], branch[64], module[64], version[64], size[128], description[1024];
int count = sscanf(line, "%s %s %s %s %s %s %s", name, id, branch, module, version, size, description);
if (count != 7)
continue;
if (0 == strcmp(name, "Name") && 0 == strcmp(id, "Id")) // 第一行表头
continue;
curpackage = (kdk_package_t *)calloc(1, sizeof(kdk_package_t));
if (!curpackage)
goto err_out;
if (packagelist->nums == maxpackage)
{
maxpackage += PACKAGE_INCREASE_STEP;
kdk_package_t **tmp = (kdk_package_t **)realloc(packagelist->list, maxpackage * sizeof(kdk_package_t *));
if (!tmp)
{
free(curpackage);
goto err_out;
}
packagelist->list = tmp;
}
packagelist->list[packagelist->nums] = curpackage;
packagelist->nums++;
curpackage->name = strdup(name);
curpackage->version = strdup(version);
char numericStr[20];
int i = 0, j = 0;
// 从字符串中提取数字部分到 numericStr
while ('\0' != size[i])
{
if (isdigit(size[i]))
numericStr[j++] = size[i];
i++;
}
numericStr[j] = '\0';
if (0 == strendwith(size, "B"))
curpackage->size_kb = atol(numericStr) / 1024;
if (0 == strendwith(size, "MB"))
curpackage->size_kb = atol(numericStr) * 1024;
if (0 == strendwith(size, "GB"))
curpackage->size_kb = atol(numericStr) * 1024 * 1024;
}
}
pclose(fp);
char *kare = "kare -l";
fp = popen(kare, "r");
if (NULL != fp)
{
char line[1024];
while (fgets(line, sizeof(line), fp))
{
char name[256], version[64];
int count = sscanf(line, "%s %s", name, version);
if (count != 2)
continue;
if (0 == strcmp(name, "软件包名")) // 第一行表头
continue;
curpackage = (kdk_package_t *)calloc(1, sizeof(kdk_package_t));
if (!curpackage)
goto err_out;
if (packagelist->nums == maxpackage)
{
maxpackage += PACKAGE_INCREASE_STEP;
kdk_package_t **tmp = (kdk_package_t **)realloc(packagelist->list, maxpackage * sizeof(kdk_package_t *));
if (!tmp)
{
free(curpackage);
goto err_out;
}
packagelist->list = tmp;
}
packagelist->list[packagelist->nums] = curpackage;
packagelist->nums++;
curpackage->name = strdup(name);
curpackage->version = strdup(version);
}
}
pclose(fp);
return packagelist; return packagelist;
err_out: err_out:
@ -384,6 +477,73 @@ void kdk_package_free_packagelist(kdk_package_list *pl)
free(pl); free(pl);
} }
InstallMethod kdk_package_get_installation_method(const char *name, const char *version)
{
const char *dpkg = "dpkg -l";
FILE *fp = popen(dpkg, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%*s %s %s %*s %*s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name) && 0 == strcmp(tmp_version, version))
{
pclose(fp);
if (strstr(name, "kwre"))
return KWRE_METHOD;
else if (strstr(name, "kmre"))
return KMRE_METHOD;
else
return DPKG_METHOD;
}
}
}
const char *kaiming = "kaiming list";
fp = popen(kaiming, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %*s %*s %*s %s %*s %*s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name) && 0 == strcmp(tmp_version, version))
{
pclose(fp);
return KM_METHOD;
}
}
}
const char *kare = "kare -l";
fp = popen(kare, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name) && 0 == strcmp(tmp_version, version))
{
pclose(fp);
return KARE_METHOD;
}
}
}
return NONE_METHOD;
}
int kdk_package_install_package(const char *packagePath) int kdk_package_install_package(const char *packagePath)
{ {
} }
@ -412,7 +572,49 @@ char *kdk_package_get_version(const char *name)
break; break;
} }
fclose(fp); fclose(fp);
return val ? strdup(val) : NULL;
if (val)
return strdup(val);
const char *kaiming = "kaiming list";
fp = popen(kaiming, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %*s %*s %*s %s %*s %*s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name))
{
pclose(fp);
return strdup(tmp_version);
}
}
}
const char *kare = "kare -l";
fp = popen(kare, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name))
{
pclose(fp);
return strdup(tmp_version);
}
}
}
return NULL;
} }
int kdk_package_is_installed(const char *name, const char *version) int kdk_package_is_installed(const char *name, const char *version)
@ -436,6 +638,50 @@ int kdk_package_is_installed(const char *name, const char *version)
} }
} }
fclose(fp); fclose(fp);
if (1 == flag)
return flag;
const char *kaiming = "kaiming list";
fp = popen(kaiming, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %*s %*s %*s %s %*s %*s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name) && 0 == strcmp(tmp_version, version))
{
pclose(fp);
flag = 1;
break;
}
}
}
if (1 == flag)
return flag;
const char *kare = "kare -l";
fp = popen(kare, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], tmp_version[64];
int count = sscanf(line, "%s %s", tmp_name, tmp_version);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name) && 0 == strcmp(tmp_version, version))
{
pclose(fp);
flag = 1;
break;
}
}
}
return flag; return flag;
} }
@ -472,7 +718,30 @@ char *kdk_package_get_description(const char *name)
} }
} }
fclose(fp); fclose(fp);
return val ? strdup(result) : NULL;
if (val)
return strdup(val);
const char *kaiming = "kaiming list";
fp = popen(kaiming, "r");
if (NULL != fp)
{
char *line[1024];
while (fgets(line, sizeof(line), fp))
{
char tmp_name[256], description[1024];
int count = sscanf(line, "%s %*s %*s %*s %*s %*s %s", tmp_name, description);
if (count != 2)
continue;
if (0 == strcmp(tmp_name, name))
{
pclose(fp);
return strdup(description);
}
}
}
return NULL;
} }
char **kdk_package_get_code_path(const char *name) char **kdk_package_get_code_path(const char *name)
@ -648,31 +917,51 @@ char *kdk_package_get_default_ppt_viewer(void)
return read_default_app("application/wps-office.ppt"); return read_default_app("application/wps-office.ppt");
} }
kdk_startmenu_list *kdk_package_get_startmenu_list(void) kdk_app_info* kdk_package_get_startmenu_list(void)
{ {
kdk_startmenu_list *programlist = (kdk_startmenu_list *)calloc(1, sizeof(kdk_startmenu_list)); kdk_app_info *programlist = (kdk_app_info *)calloc(1, sizeof(kdk_app_info));
if (!programlist) if (!programlist)
return NULL; return NULL;
get_desktop_info(KDK_DEKSTOP_FILE_PATH, programlist); get_desktop_info(KDK_DEKSTOP_FILE_PATH, programlist, 1);
char *homeDir = getenv("HOME"); char *homeDir = getenv("HOME");
char *filepath[PROGRAM_SIZE] = {0}; char *filepath[PROGRAM_SIZE] = {0};
sprintf(filepath, "%s%s", homeDir, KDK_LOCALE_DEKSTOP_FILE_PATH); sprintf(filepath, "%s%s", homeDir, KDK_LOCALE_DEKSTOP_FILE_PATH);
get_desktop_info(filepath, programlist); get_desktop_info(filepath, programlist, 1);
get_desktop_info(KDK_SNAPD_DEKSTOP_FILE_PATH, programlist); get_desktop_info(KDK_SNAPD_DEKSTOP_FILE_PATH, programlist, 1);
get_desktop_info(KDK_FLATPAK_DEKSTOP_FILE_PATH, programlist); get_desktop_info(KDK_FLATPAK_DEKSTOP_FILE_PATH, programlist, 1);
return programlist; return programlist;
} }
void kdk_package_free_startmenu_list(kdk_startmenu_list *list) void kdk_package_free_startmenu_list(kdk_app_info *list)
{ {
if(NULL == list) if (NULL == list)
return; return;
for(int i = 0; i < list->nums; i++) for (int i = 0; i < list->nums; i++)
free(list->list[i]);
free(list);
}
kdk_app_info *kdk_package_get_application_list(void)
{
kdk_app_info *programlist = (kdk_app_info *)calloc(1, sizeof(kdk_app_info));
if (!programlist)
return NULL;
get_desktop_info(KDK_DEKSTOP_FILE_PATH, programlist, 0);
return programlist;
}
void kdk_package_free_app_info(kdk_app_info *list)
{
if (NULL == list)
return;
for (int i = 0; i < list->nums; i++)
free(list->list[i]); free(list->list[i]);
free(list); free(list);
} }

View File

@ -46,6 +46,16 @@
extern "C" { extern "C" {
#endif #endif
typedef enum _InstallMethod
{
NONE_METHOD,
DPKG_METHOD,
KM_METHOD,
KARE_METHOD,
KMRE_METHOD,
KWRE_METHOD
} InstallMethod;
typedef struct _kdk_package_t{ typedef struct _kdk_package_t{
char *name; // 包名 char *name; // 包名
char *version; // 版本号 char *version; // 版本号
@ -60,7 +70,7 @@ typedef struct {
kdk_package_t **list; kdk_package_t **list;
}kdk_package_list; }kdk_package_list;
typedef struct _kdk_startmenu_t typedef struct _kdk_app_t
{ {
char *name; // 程序名称 char *name; // 程序名称
char *version; // 版本号 char *version; // 版本号
@ -68,13 +78,13 @@ typedef struct _kdk_startmenu_t
char *cmd; // 可执行文件路径 char *cmd; // 可执行文件路径
char *param; // 启动参数 char *param; // 启动参数
char *icon; // 图标信息 char *icon; // 图标信息
} kdk_startmenu_t; } kdk_app_t;
typedef struct _kdk_startmenu_list typedef struct _kdk_app_info
{ {
unsigned int nums; //list成员个数 unsigned int nums; //list成员个数
kdk_startmenu_t **list; //开始菜单应用信息数组 kdk_app_t **list; //开始菜单应用信息数组
} kdk_startmenu_list; } kdk_app_info;
/** /**
* @brief * @brief
@ -90,6 +100,15 @@ extern kdk_package_list* kdk_package_get_packagelist();
*/ */
extern void kdk_package_free_packagelist(kdk_package_list *list); extern void kdk_package_free_packagelist(kdk_package_list *list);
/**
* @brief
*
* @param name
* @param version
* @return InstallMethod
*/
InstallMethod kdk_package_get_installation_method(const char *name, const char *version);
/** /**
* @brief [] * @brief []
* *
@ -223,16 +242,30 @@ extern char* kdk_package_get_default_ppt_viewer(void);
/** /**
* @brief * @brief
* *
* @return kdk_startmenu_list* * @return kdk_app_info*
*/ */
extern kdk_startmenu_list* kdk_package_get_startmenu_list(void); extern kdk_app_info* kdk_package_get_startmenu_list(void);
/** /**
* @brief kdk_package_get_startmenu_list的返回 * @brief kdk_app_info链表
* *
* @param list kdk_package_get_startmenu_list返回的指针 * @param list kdk_app_info链表
*/ */
extern void kdk_package_free_startmenu_list(kdk_startmenu_list *list); extern void kdk_package_free_startmenu_list(kdk_app_info *list);
/**
* @brief
*
* @return kdk_app_info*
*/
extern kdk_app_info* kdk_package_get_application_list(void);
/**
* @brief kdk_app_info链表
*
* @param list kdk_app_info链表
*/
extern void kdk_package_free_app_info(kdk_app_info *list);

View File

@ -44,6 +44,29 @@ int main()
} }
kdk_package_free_packagelist(list); kdk_package_free_packagelist(list);
InstallMethod ret = kdk_package_get_installation_method("scram-gui", "0.16.2-1build2");
switch (ret)
{
case DPKG_METHOD:
printf("Install method: %s", "dpkg");
break;
case KM_METHOD:
printf("Install method: %s", "km");
break;
case KARE_METHOD:
printf("Install method: %s", "kare");
break;
case KMRE_METHOD:
printf("Install method: %s", "kmre");
break;
case KWRE_METHOD:
printf("Install method: %s", "kwre");
break;
default:
printf("Install method: %s", "None");
break;
}
printf("Evolution是否安装%s\n", kdk_package_is_installed("evolution", NULL) == 1 ? "" : ""); printf("Evolution是否安装%s\n", kdk_package_is_installed("evolution", NULL) == 1 ? "" : "");
char *version = kdk_package_get_version("evolution"); char *version = kdk_package_get_version("evolution");
printf("Evolution版本号%s\n", version); printf("Evolution版本号%s\n", version);
@ -85,12 +108,12 @@ int main()
printf("%s\n", kdk_package_get_default_excel_viewer() ? kdk_package_get_default_excel_viewer() : "get execl failed"); printf("%s\n", kdk_package_get_default_excel_viewer() ? kdk_package_get_default_excel_viewer() : "get execl failed");
printf("%s\n", kdk_package_get_default_ppt_viewer() ? kdk_package_get_default_ppt_viewer() : "get ppt failed"); printf("%s\n", kdk_package_get_default_ppt_viewer() ? kdk_package_get_default_ppt_viewer() : "get ppt failed");
kdk_startmenu_list *start_menu_list = kdk_package_get_startmenu_list(); kdk_app_info *start_menu_list = kdk_package_get_startmenu_list();
if (NULL != start_menu_list) if (NULL != start_menu_list)
{ {
for (int i = 0; i < start_menu_list->nums; i++) for (int i = 0; i < start_menu_list->nums; i++)
{ {
kdk_startmenu_t *tmp = start_menu_list->list[i]; kdk_app_t *tmp = start_menu_list->list[i];
printf("%s\n", tmp->cmd); printf("%s\n", tmp->cmd);
printf("%s\n", tmp->company); printf("%s\n", tmp->company);
printf("%s\n", tmp->icon); printf("%s\n", tmp->icon);
@ -99,7 +122,24 @@ int main()
printf("%s\n", tmp->version); printf("%s\n", tmp->version);
printf("\n"); printf("\n");
} }
kdk_package_free_startmenu_list(start_menu_list); kdk_package_free_app_info(start_menu_list);
}
kdk_app_info *app_list = kdk_package_get_application_list();
if (NULL != app_list)
{
for (int i = 0; i < app_list->nums; i++)
{
kdk_app_t *tmp = app_list->list[i];
printf("%s\n", tmp->cmd);
printf("%s\n", tmp->company);
printf("%s\n", tmp->icon);
printf("%s\n", tmp->name);
printf("%s\n", tmp->param);
printf("%s\n", tmp->version);
printf("\n");
}
kdk_package_free_app_info(app_list);
} }
return 0; return 0;