st-config-load.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 1,003 行 · 第 1/2 页

C
1,003
字号
	      st_settings.proxy_type = g_value_get_int(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_PROXY_URL:	      {		const char *proxy_url;		char *server = NULL;		int port = 0;				proxy_url = g_value_get_string(&info.statement->value);		if (proxy_url)		  {		    const char *protocol;		    const char *portstr;		    /* skip protocol */		    protocol = strstr(proxy_url, "://");		    if (protocol)		      proxy_url = protocol + 3;		    /* extract port */		    portstr = strrchr(proxy_url, ':');		    if (portstr)		      {			server = g_strndup(proxy_url, portstr - proxy_url);			port = atoi(portstr + 1);		      }		    else		      server = g_strdup(proxy_url);		  }		g_free(st_settings.proxy_server);		st_settings.proxy_server = server;		st_settings.proxy_port = port;		break;	      }	    case STATEMENT_OPTIONS_PROXY_SERVER:	      g_free(st_settings.proxy_server);	      st_settings.proxy_server = g_value_dup_string(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_PROXY_PORT:	      st_settings.proxy_port = g_value_get_int(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_PROXY_AUTH_ENABLED:	      st_settings.proxy_auth_enabled = g_value_get_boolean(&info.statement->value);	      break;	      	    case STATEMENT_OPTIONS_PROXY_AUTH_NAME:	      g_free(st_settings.proxy_auth_name);	      st_settings.proxy_auth_name = g_value_dup_string(&info.statement->value);	      break;	      	    case STATEMENT_OPTIONS_PROXY_AUTH_PASSWORD:	      g_free(st_settings.proxy_auth_password);	      st_settings.proxy_auth_password = g_value_dup_string(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_VIEW_MENUBAR:	    case STATEMENT_OPTIONS_TOOLBAR_THEME:	    case STATEMENT_OPTIONS_GALEON_THEMES_ENABLED:	    case STATEMENT_OPTIONS_GALEON_THEMES_SYSTEM_DIR:	    case STATEMENT_OPTIONS_GALEON_THEMES_USER_DIR:	    case STATEMENT_HANDLER_SELECTED_CATEGORY:	    case STATEMENT_HANDLER_SELECTED_STREAM:	    case STATEMENT_HANDLER_EXPANDED_CATEGORIES:	    case STATEMENT_HANDLER_SELECTED_STREAMS:	    case STATEMENT_OPTIONS_SAVE_AUTOMATIC:	    case STATEMENT_OPTIONS_SELECTED_PREFERENCES_PAGE:	      g_scanner_warn(info.parser->scanner, _("obsolete statement, ignored"));	      break;	    case STATEMENT_OPTIONS_SELECTED_HANDLER:	      g_free(st_settings.selected_handler_name);	      st_settings.selected_handler_name = g_value_dup_string(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_ALWAYS_REFRESH: /* deprecated */	    case STATEMENT_OPTIONS_ALWAYS_RELOAD:	      st_settings.always_reload = g_value_get_boolean(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_FIND_TOKEN:	      g_free(st_settings.find_token);	      st_settings.find_token = g_value_dup_string(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_FIND_CASE_SENSITIVE:	      st_settings.find_case_sensitive = g_value_get_boolean(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_FIND_WRAP_AROUND:	      st_settings.find_wrap_around = g_value_get_boolean(&info.statement->value);	      break;	    case STATEMENT_OPTIONS_MUSIC_DIR:	      g_free(st_settings.music_dir);	      st_settings.music_dir = g_value_dup_string(&info.statement->value);	      break;	    case STATEMENT_ACTION:	      g_free(info.action);	      info.action = g_value_dup_string(&info.statement->value);	      if (! info.action)		g_scanner_warn(info.parser->scanner, _("action name missing"));	      break;	    case STATEMENT_ACTION_COMMAND:	      st_config_load_command(&info);	      break;	    case STATEMENT_ACTION_PROGRAM:	      st_config_load_program(&info);	      break;	      	    case STATEMENT_HANDLER:	      st_config_load_handler_begin(&info);	      break;	      	    case STATEMENT_HANDLER_FIELDS_SORT_INDEX:	      if (info.handler)		{		  int sort_index = g_value_get_int(&info.statement->value);		  		  if (! st_handler_is_dummy(info.handler) && sort_index > st_handler_count_fields(info.handler, ST_HANDLER_FIELD_VISIBLE))		    g_scanner_warn(info.parser->scanner, _("index too big, ignored"));		  else		    st_handler_set_fields_sort_index(info.handler, sort_index);		}	      break;	      	    case STATEMENT_HANDLER_FIELDS_SORT_ORDER:	      if (info.handler)		st_handler_set_fields_sort_order(info.handler, g_value_get_int(&info.statement->value));	      break;	      	    case STATEMENT_HANDLER_PANED_POSITION:	      if (info.handler)		st_handler_set_paned_position(info.handler, g_value_get_int(&info.statement->value));	      break;	    case STATEMENT_HANDLER_FIELD:	      st_config_load_handler_field_begin(&info);	      break;	    case STATEMENT_HANDLER_FIELD_VISIBLE:	      if (info.handler_field)		st_handler_field_set_user_visible(info.handler_field, g_value_get_boolean(&info.statement->value));	      break;	    case STATEMENT_HANDLER_FIELD_WIDTH:	      if (info.handler_field)		st_handler_field_set_width(info.handler_field, g_value_get_int(&info.statement->value));	      break;	    case STATEMENT_HANDLER_FIELD_POSITION:	      if (info.handler_field)		st_handler_field_set_position(info.handler_field, g_value_get_int(&info.statement->value));	      break;	    case STATEMENT_HANDLER_KEY:	      st_config_load_handler_key_begin(&info);	      break;	    }	}      else if (G_IS_VALUE(&info.statement->value))	{	  switch (SG_PARSER_SCOPE(info.parser))	    {	    case STATEMENT_OPTIONS_FIND_HISTORY:	      st_config_load_find_history(&info);	      break;	    case STATEMENT_HANDLER_FIELDS_WIDTH:	      st_config_load_handler_field_width(&info);	      break;	      	    case STATEMENT_HANDLER_EXPANDED_CATEGORIES:	    case STATEMENT_HANDLER_SELECTED_STREAMS:	      /* obsolete */	      break;	    case STATEMENT_HANDLER_KEY:	      st_config_load_handler_key_value(&info);	      break;	    default:	      g_scanner_warn(info.parser->scanner, _("unexpected value"));	    }	}      sg_parser_statement_evaluate(info.statement);      sg_parser_statement_free(info.statement);    }    sg_parser_free(info.parser);  g_free(info.action);  st_handlers_reorder(info.handlers);  g_free(info.handler_config_key);  if (info.handler_config_values)    g_value_array_free(info.handler_config_values);    return TRUE;}static voidst_config_load_find_history (LoadInfo *info){  if (! G_VALUE_HOLDS_STRING(&info->statement->value))    {      g_scanner_warn(info->parser->scanner, _("expected string value"));      return;    }  if (g_slist_length(st_settings.find_history) < ST_SETTINGS_FIND_HISTORY_MAX_LENGTH)    st_settings.find_history = g_slist_append(st_settings.find_history, g_value_dup_string(&info->statement->value));  else    g_scanner_warn(info->parser->scanner, _("too many find history tokens"));}static voidst_config_load_handler_begin (LoadInfo *info){  const char *name;  name = g_value_get_string(&info->statement->value);  if (name)    {      info->handler = st_handlers_find_by_name(name);        if (info->handler)	info->handler_field_iter = st_handler_get_fields(info->handler);      else	{	  info->handler = st_handler_new_dummy(name);	  g_scanner_warn(info->parser->scanner, _("%s: no such handler"), name);	}      info->handlers = g_slist_append(info->handlers, info->handler);    }  else    {      info->handler = NULL;      g_scanner_warn(info->parser->scanner, _("handler name missing"));    }}static voidst_config_load_handler_end (LoadInfo *info){  info->handler = NULL;  info->handler_field_iter = NULL;  info->handler_field = NULL;}static voidst_config_load_handler_field_begin (LoadInfo *info){  if (! info->handler)    return;    if (st_handler_is_dummy(info->handler))    {      info->handler_field = st_handler_field_new_dummy();      st_handler_add_field(info->handler, info->handler_field);    }  else    {      while (info->handler_field_iter)	{	  STHandlerField *field = info->handler_field_iter->data;      	  if (ST_HANDLER_FIELD_IS_VISIBLE(field))	    break;      	  info->handler_field_iter = info->handler_field_iter->next;	}		        if (info->handler_field_iter)	info->handler_field = info->handler_field_iter->data;      else	{	  info->handler_field = NULL;	  g_scanner_warn(info->parser->scanner, _("too many fields"));	}    }}static voidst_config_load_handler_field_end (LoadInfo *info){  if (info->handler_field_iter)    info->handler_field_iter = info->handler_field_iter->next;  /* otherwise it's a dummy handler, or there has been a "too many fields" error -> nop */}static voidst_config_load_command (LoadInfo *info){  if (! info->action)    return;  st_action_associate(info->action, g_value_get_string(&info->statement->value));}static voidst_config_load_program (LoadInfo *info){  const char *command;  char *new_command;  if (! info->action)    return;  command = g_value_get_string(&info->statement->value);  new_command = st_action_convert_old_style_command(command);  st_action_associate(info->action, new_command);  g_free(new_command);}static voidst_config_load_handler_field_width (LoadInfo *info){  STHandlerField *field = NULL;  if (! info->handler)    return;  if (! G_VALUE_HOLDS_INT(&info->statement->value))    {      g_scanner_warn(info->parser->scanner, _("expected integer value"));      return;    }  if (st_handler_is_dummy(info->handler))    {      field = st_handler_field_new_dummy();      st_handler_add_field(info->handler, field);    }  else    while (info->handler_field_iter)      {	field = info->handler_field_iter->data;	info->handler_field_iter = info->handler_field_iter->next;		if (ST_HANDLER_FIELD_IS_VISIBLE(field))	  break;	else	  field = NULL;      }    if (field)    st_handler_field_set_width(field, g_value_get_int(&info->statement->value));  else    g_scanner_warn(info->parser->scanner, _("too many fields"));}static voidst_config_load_handler_key_begin (LoadInfo *info){  if (! info->handler)    return;  if (st_handler_is_dummy(info->handler))    {      g_free(info->handler_config_key);      info->handler_config_key = g_value_dup_string(&info->statement->value);    }  else    {      info->handler_config_pspec = st_handler_config_lookup(info->handler, g_value_get_string(&info->statement->value));      if (! info->handler_config_pspec)	{	  g_scanner_warn(info->parser->scanner, _("unknown configuration key"));	  return;	}    }    if (info->handler_config_values)    g_value_array_free(info->handler_config_values);  info->handler_config_values = g_value_array_new(0);}static voidst_config_load_handler_key_value (LoadInfo *info){  if (! info->handler)    return;  g_value_array_append(info->handler_config_values, &info->statement->value);}static voidst_config_load_handler_key_end (LoadInfo *info){  GParamSpec *pspec;  if (! info->handler)    return;  if (st_handler_is_dummy(info->handler))    {      if (info->handler_config_values->n_values == 0	  || info->handler_config_values->n_values > 1)	pspec = g_param_spec_value_array(info->handler_config_key,					 NULL,					 NULL,					 NULL,					 G_PARAM_READWRITE);      else	{	  GValue *value = g_value_array_get_nth(info->handler_config_values, 0);	  /* keep in sync with st_handler_config_register() */	  if (G_VALUE_HOLDS_BOOLEAN(value))	    pspec = g_param_spec_boolean(info->handler_config_key,					 NULL,					 NULL,					 FALSE,					 G_PARAM_READWRITE);	  else if (G_VALUE_HOLDS_INT(value))	    pspec = g_param_spec_int(info->handler_config_key,				     NULL,				     NULL,				     G_MININT,				     G_MAXINT,				     0,				     G_PARAM_READWRITE);	  else if (G_VALUE_HOLDS_UINT(value))	    pspec = g_param_spec_uint(info->handler_config_key,				      NULL,				      NULL,				      0,				      G_MAXUINT,				      0,				      G_PARAM_READWRITE);	  else if (G_VALUE_HOLDS_DOUBLE(value))	    pspec = g_param_spec_double(info->handler_config_key,					NULL,					NULL,					G_MINDOUBLE,					G_MAXDOUBLE,					0,					G_PARAM_READWRITE);	  else if (G_VALUE_HOLDS_STRING(value))	    pspec = g_param_spec_string(info->handler_config_key,					NULL,					NULL,					NULL,					G_PARAM_READWRITE);	  else	    {	      g_scanner_warn(info->parser->scanner, _("invalid value type"));	      return;	    }	}      st_handler_config_register(info->handler, pspec);    }  else    {      pspec = info->handler_config_pspec;      if (! pspec)	return;    }  if (G_PARAM_SPEC_VALUE_TYPE(pspec) == G_TYPE_VALUE_ARRAY)    {      GValue value = { 0, };      g_value_init(&value, G_TYPE_VALUE_ARRAY);      g_value_set_boxed(&value, info->handler_config_values);      st_handler_config_set_value(info->handler, g_param_spec_get_name(pspec), &value);      g_value_unset(&value);    }  else    {      GValue *value;      if (info->handler_config_values->n_values != 1)	{	  g_scanner_warn(info->parser->scanner, _("wrong number of values"));	  return;	}            value = g_value_array_get_nth(info->handler_config_values, 0);            if (G_VALUE_HOLDS(value, G_PARAM_SPEC_VALUE_TYPE(pspec)))	st_handler_config_set_value(info->handler, g_param_spec_get_name(pspec), value);      else	g_scanner_warn(info->parser->scanner, _("invalid value type"));    }}

⌨️ 快捷键说明

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