st-settings.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 366 行

C
366
字号
/* * Copyright (c) 2002, 2003, 2004 Jean-Yves Lefort * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include <string.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <glib.h>#include <glib/gi18n.h>#include "sg-util.h"#include "st-dialog-api.h"#include "st-settings.h"#include "st-transfer.h"#include "st-shell.h"/*** variable declarations ***************************************************/STSettings st_settings;G_LOCK_DEFINE(st_settings);/*** function declarations ***************************************************/static gboolean st_settings_load_disabled_plugins_list (GError **err);/*** API implementation ******************************************************//** * st_settings_get_private_dir: * * Gets the streamtuner private directory (the value passed to the -d * command line argument, or ~/.streamtuner). * * Return value: the private directory. **/const char *st_settings_get_private_dir (void){  return st_settings.private_dir;}/** * st_settings_get_music_dir: * * Gets the streamtuner music directory, which can be set by the user * from the preferences. * * Return value: the music directory, or %NULL if unset. The returned * string must be freed when no longer needed. **/char *st_settings_get_music_dir (void){  char *converted = NULL;  G_LOCK(st_settings);  if (st_settings.music_dir)    {      GError *err = NULL;      converted = g_filename_from_utf8(st_settings.music_dir, -1, NULL, NULL, &err);      if (! converted)	{	  st_notice(_("unable to convert st_settings.music_dir to the encoding for filenames: %s"), err->message);	  g_error_free(err);	}    }  G_UNLOCK(st_settings);  return converted;}/*** private implementation **************************************************/voidst_settings_init (const char *custom_private_dir){  const char *home;  const char *local_root;    if (! (home = g_get_home_dir()))    {      st_error_dialog(_("A fatal error has occurred"),		      _("Could not find your home directory."));      exit(1);    }  st_settings.private_dir = custom_private_dir    ? custom_private_dir    : g_build_filename(home, ".streamtuner", NULL);  st_settings.config_file = g_build_filename(st_settings.private_dir, "config", NULL);  st_settings.cache_dir = g_build_filename(st_settings.private_dir, "cache", NULL);  st_settings.accels_file = g_build_filename(st_settings.private_dir, "accels", NULL);  st_settings.splash_disabled_file = g_build_filename(st_settings.private_dir, "splash-disabled", NULL);  st_settings.disabled_plugins_file = g_build_filename(st_settings.private_dir, "disabled-plugins", NULL);  st_settings.images_dir = g_build_filename(st_settings.private_dir, "images", NULL);  /*   * We don't store this setting into the config file because we need   * it earlier in the initialization phase.   */  st_settings.splash_enabled = ! g_file_test(st_settings.splash_disabled_file, G_FILE_TEST_EXISTS);  st_settings.view_toolbar = TRUE;  st_settings.view_tabs = TRUE;  st_settings.view_tab_icons = TRUE;  st_settings.view_statusbar = TRUE;  st_settings.toolbar_style = ST_SHELL_TOOLBAR_STYLE_GTK;  st_settings.toolbar_size = ST_SHELL_TOOLBAR_SIZE_GTK;  st_settings.main_window_width = 600;  st_settings.main_window_height = 400;  st_settings.preferences_window_width = 400;  st_settings.preferences_window_height = -1;  st_settings.preferences_selected_page = NULL;  st_settings.preferences_plugins_expanded = TRUE;  st_settings.stream_properties_window_width = -1;  st_settings.stream_columns_window_width = 330;  st_settings.stream_columns_window_height = 220;  st_settings.proxy_enabled = FALSE;  st_settings.proxy_type = ST_TRANSFER_PROXY_HTTP;  st_settings.proxy_server = NULL;  st_settings.proxy_port = 8080; /* a good default for a HTTP proxy */  st_settings.proxy_auth_enabled = FALSE;  st_settings.proxy_auth_name = NULL;  st_settings.proxy_auth_password = NULL;  st_settings.selected_handler_name = NULL;    st_settings.always_reload = FALSE;  st_settings.find_token = NULL;  st_settings.find_history = NULL;  st_settings.find_case_sensitive = FALSE;  st_settings.find_wrap_around = FALSE;  /*   * We don't store this setting into the config file because we need   * it before loading plugins, but the config file is loaded after   * that.   */  st_settings.disabled_plugins = NULL;  if (g_file_test(st_settings.disabled_plugins_file, G_FILE_TEST_IS_REGULAR))    {      GError *err = NULL;      if (! st_settings_load_disabled_plugins_list(&err))	{	  char *normalized;	  normalized = st_dialog_normalize(err->message);	  	  st_error_dialog(_("Unable to load list of disabled plugins"), "%s", normalized);	  g_free(normalized);	  g_error_free(err);	}    }  /* we support the deprecated STREAMTUNER_LOCAL_ROOT environment variable */  local_root = g_getenv("STREAMTUNER_LOCAL_ROOT");  if (local_root)    {      GError *err = NULL;      st_settings.music_dir = g_filename_to_utf8(local_root, -1, NULL, NULL, &err);      if (! st_settings.music_dir)	{	  st_notice(_("unable to convert the contents of the STREAMTUNER_LOCAL_ROOT environment variable to UTF-8 encoding: %s"), err->message);	  g_error_free(err);	}    }  else    st_settings.music_dir = NULL;}gbooleanst_settings_save_splash_enabled (GError **err){  if (g_file_test(st_settings.splash_disabled_file, G_FILE_TEST_EXISTS))    {      if (st_settings.splash_enabled)	{	  if (unlink(st_settings.splash_disabled_file) < 0)	    {	      g_set_error(err, 0, 0, _("unable to unlink %s: %s"), st_settings.splash_disabled_file, g_strerror(errno));	      return FALSE;	    }	}    }  else    {      if (! st_settings.splash_enabled)	{	  GError *tmp_err = NULL;	  GIOChannel *channel;	  gboolean status;	  channel = g_io_channel_new_file(st_settings.splash_disabled_file, "w", &tmp_err);	  if (! channel)	    {	      g_set_error(err, 0, 0, _("unable to create %s: %s"), st_settings.splash_disabled_file, tmp_err->message);	      g_error_free(tmp_err);	      	      return FALSE;	    }	  status = g_io_channel_shutdown(channel, TRUE, &tmp_err) == G_IO_STATUS_NORMAL;	  g_io_channel_unref(channel);	  if (! status)	    {	      g_set_error(err, 0, 0, _("unable to close %s: %s"), st_settings.splash_disabled_file, tmp_err->message);	      g_error_free(tmp_err);	      return FALSE;	    }	}    }  return TRUE;}static gbooleanst_settings_load_disabled_plugins_list (GError **err){  GError *tmp_err = NULL;  GIOChannel *channel;  GIOStatus status;  char *line;  gsize terminator_pos;  channel = g_io_channel_new_file(st_settings.disabled_plugins_file, "r", &tmp_err);  if (! channel)    {      g_set_error(err, 0, 0, _("unable to open %s: %s"), st_settings.disabled_plugins_file, tmp_err->message);      g_error_free(tmp_err);      return FALSE;    }  while ((status = g_io_channel_read_line(channel, &line, NULL, &terminator_pos, &tmp_err)) == G_IO_STATUS_NORMAL)    {      if (terminator_pos >= 0)	line[terminator_pos] = 0;      st_settings.disabled_plugins = g_slist_append(st_settings.disabled_plugins, g_strdup(line));      g_free(line);    }  if (status == G_IO_STATUS_EOF)    {      status = g_io_channel_shutdown(channel, TRUE, &tmp_err);      g_io_channel_unref(channel);      if (status == G_IO_STATUS_NORMAL)	return TRUE;      else	{	  g_set_error(err, 0, 0, _("unable to close %s: %s"), st_settings.disabled_plugins_file, tmp_err->message);	  g_error_free(tmp_err);	  return FALSE;	}    }  else    {      g_set_error(err, 0, 0, _("unable to read %s: %s"), st_settings.disabled_plugins_file, tmp_err->message);      g_error_free(tmp_err);      status = g_io_channel_shutdown(channel, TRUE, NULL);      g_io_channel_unref(channel);      return FALSE;    }}gbooleanst_settings_save_disabled_plugins_list (GError **err){  GError *tmp_err = NULL;  GIOChannel *channel;  GSList *l;  gboolean status = TRUE;  channel = g_io_channel_new_file(st_settings.disabled_plugins_file, "w", &tmp_err);  if (! channel)    {      g_set_error(err, 0, 0, _("unable to open %s for writing: %s"), st_settings.disabled_plugins_file, tmp_err->message);      g_error_free(tmp_err);      return FALSE;    }  SG_LIST_FOREACH(l, st_settings.disabled_plugins)    {      const char *filename = l->data;      char *line;      line = g_strconcat(filename, "\n", NULL);      if (g_io_channel_write_chars(channel, line, -1, NULL, &tmp_err) != G_IO_STATUS_NORMAL)	{	  g_set_error(err, 0, 0, _("unable to write %s: %s"), st_settings.disabled_plugins_file, tmp_err->message);	  g_error_free(tmp_err);	  status = FALSE;	}      g_free(line);      if (! status)	break;    }  if (status)    {      status = g_io_channel_shutdown(channel, TRUE, &tmp_err) == G_IO_STATUS_NORMAL;      g_io_channel_unref(channel);      if (! status)	{	  g_set_error(err, 0, 0, _("unable to close %s: %s"), st_settings.disabled_plugins_file, tmp_err->message);	  g_error_free(tmp_err);	}    }  else    {      g_io_channel_shutdown(channel, TRUE, NULL);      g_io_channel_unref(channel);    }    return status;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?