/* * Copyright 2022 Olaf Wintermann * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "settings.h" #include #include #include #include #include #include #include #include #include "main.h" #include "utils.h" #include #include #include #include #define CONFIG_BASE_DIR ".config" #define UWP_CONFIG_DIR "uwplayer" #define UWP_CONFIG_FILE "uwplayer.properties" static void* player_bin_search_thread(void *data); static char *uwp_config_dir; static UcxMap *uwp_settings; static int check_config_dir(void) { char *home = getenv("HOME"); if(!home) { return 1; } char *cfg_dir = util_concat_path(home, CONFIG_BASE_DIR); int ret = 0; if(mkdir(cfg_dir, S_IRWXU)) { if(errno != EEXIST) { fprintf(stderr, "Error: Cannot access %s: %s\n", cfg_dir, strerror(errno)); ret = 1; } } if(!ret) { uwp_config_dir = util_concat_path(cfg_dir, UWP_CONFIG_DIR); if(mkdir(uwp_config_dir, S_IRWXU)) { if(errno != EEXIST) { fprintf(stderr, "Error: Cannot access %s: %s\n", uwp_config_dir, strerror(errno)); ret = 1; } } } free(cfg_dir); return ret; } int load_settings(void) { if(check_config_dir()) { return 1; } uwp_settings = ucx_map_new(16); char *cfgfile_path = util_concat_path(uwp_config_dir, UWP_CONFIG_FILE); FILE *cfgfile = fopen(cfgfile_path, "r"); free(cfgfile_path); int ret = 0; if(cfgfile) { if(ucx_properties_load(uwp_settings, cfgfile)) { fprintf(stderr, "Error: Cannot read uwplayer settings\n"); ret = 1; } fclose(cfgfile); if(ret) { return ret; } } // check if mpv or mplayer binaries are configured char *player_bin = ucx_map_cstr_get(uwp_settings, UWP_PLAYER_BIN); char *player_type = ucx_map_cstr_get(uwp_settings, UWP_PLAYER_TYPE); if(!player_bin) { // try to find the mpv or mplayer binary path pthread_t st; pthread_create(&st, NULL, player_bin_search_thread, NULL); } else if(!player_type) { fprintf(stderr, "Warning: unknown player type (mplayer, mpv)\n"); } return 0; } static char* get_which_output(FILE *f, UcxBuffer *buf) { buf->pos = 0; buf->size = 0; ucx_stream_copy(f, buf, (read_func)fread, (write_func)ucx_buffer_write); if(!pclose(f)) { ucx_buffer_putc(buf, 0); size_t i; for(i=0;ipos;i++) { if(buf->space[i] == '\n') { buf->space[i] = 0; break; } } return buf->space; } return NULL; } static Boolean finish_bin_search(XtPointer data) { PlayerInfo *playerInfo = data; ucx_map_cstr_put(uwp_settings, UWP_PLAYER_BIN, playerInfo->bin); ucx_map_cstr_put(uwp_settings, UWP_PLAYER_TYPE, playerInfo->type); free(playerInfo); return 0; } static void* player_bin_search_thread(void *data) { UcxBuffer *buf = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND); FILE *f = popen("which mpv", "r"); if(f) { char *bin = get_which_output(f, buf); if(bin) { PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo)); playerInfo->bin = strdup(bin); playerInfo->type = strdup("mpv"); AppExecProc(finish_bin_search, playerInfo); ucx_buffer_free(buf); return NULL; } } f = popen("which mplayer", "r"); if(f) { char *bin = get_which_output(f, buf); if(bin) { PlayerInfo *playerInfo = malloc(sizeof(PlayerInfo)); playerInfo->bin = strdup(bin); playerInfo->type = strdup("mplayer"); AppExecProc(finish_bin_search, playerInfo); } } ucx_buffer_free(buf); return NULL; } char* SettingsGetPlayerBin(void) { return ucx_map_cstr_get(uwp_settings, UWP_PLAYER_BIN); }