Apply FS#9368 : add generic settings tag to WPS.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19357 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Antoine Cellerier 2008-12-07 16:20:35 +00:00
parent 3ad535031a
commit 8289b966b8
4 changed files with 99 additions and 1 deletions

View file

@ -26,6 +26,7 @@
#include <stdlib.h>
#include "system.h"
#include "settings.h"
#include "settings_list.h"
#include "rbunicode.h"
#include "rtc.h"
#include "audio.h"
@ -1402,6 +1403,53 @@ static const char *get_token_value(struct gui_wps *gwps,
token->value.i * TIMEOUT_UNIT))
return "v";
return NULL;
case WPS_TOKEN_SETTING:
{
if (intval)
{
/* Handle contionals */
const struct settings_list *s = settings+token->value.i;
switch (s->flags&F_T_MASK)
{
case F_T_INT:
case F_T_UINT:
if (s->flags&F_RGB)
/* %?St|name|<#000000|#000001|...|#FFFFFF> */
/* shouldn't overflow since colors are stored
* on 16 bits ...
* but this is pretty useless anyway */
*intval = *(int*)s->setting + 1;
else if (s->cfg_vals == NULL)
/* %?St|name|<1st choice|2nd choice|...> */
*intval = (*(int*)s->setting-s->int_setting->min)
/s->int_setting->step + 1;
else
/* %?St|name|<1st choice|2nd choice|...> */
/* Not sure about this one. cfg_name/vals are
* indexed from 0 right? */
*intval = *(int*)s->setting + 1;
break;
case F_T_BOOL:
/* %?St|name|<if true|if false> */
*intval = *(bool*)s->setting?1:2;
break;
case F_T_CHARPTR:
/* %?St|name|<if non empty string|if empty>
* The string's emptyness discards the setting's
* prefix and suffix */
*intval = ((char*)s->setting)[0]?1:2;
break;
default:
/* This shouldn't happen ... but you never know */
*intval = -1;
break;
}
}
cfg_to_string(token->value.i,buf,buf_size);
return buf;
}
default:
return NULL;
}

View file

@ -292,7 +292,10 @@ enum wps_token_type {
WPS_VIEWPORT_ENABLE,
/* buttons */
WPS_TOKEN_BUTTON_VOLUME
WPS_TOKEN_BUTTON_VOLUME,
/* Setting option */
WPS_TOKEN_SETTING,
};
struct wps_token {

View file

@ -56,6 +56,7 @@
#include "gwps.h"
#include "settings.h"
#include "settings_list.h"
#ifdef HAVE_LCD_BITMAP
#include "bmp.h"
@ -137,6 +138,8 @@ static int parse_progressbar(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
static int parse_dir_level(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
static int parse_setting(const char *wps_bufptr,
struct wps_token *token, struct wps_data *wps_data);
#ifdef HAVE_LCD_BITMAP
static int parse_viewport_display(const char *wps_bufptr,
@ -342,6 +345,8 @@ static const struct wps_tag all_tags[] = {
#endif
#endif
{ WPS_TOKEN_SETTING, "St", WPS_REFRESH_DYNAMIC, parse_setting },
{ WPS_TOKEN_UNKNOWN, "", 0, NULL }
/* the array MUST end with an empty string (first char is \0) */
};
@ -726,6 +731,39 @@ static int parse_viewport(const char *wps_bufptr,
return skip_end_of_line(wps_bufptr);
}
static int parse_setting(const char *wps_bufptr,
struct wps_token *token,
struct wps_data *wps_data)
{
(void)wps_data;
const char *ptr = wps_bufptr;
const char *end;
int i;
/* Find the setting's cfg_name */
if (*ptr != '|')
return WPS_ERROR_INVALID_PARAM;
ptr++;
end = strchr(ptr,'|');
if (!end)
return WPS_ERROR_INVALID_PARAM;
/* Find the setting */
for (i=0; i<nb_settings; i++)
if (settings[i].cfg_name &&
!strncmp(settings[i].cfg_name,ptr,end-ptr) &&
/* prevent matches on cfg_name prefixes */
strlen(settings[i].cfg_name)==end-ptr) break;
if (i == nb_settings)
return WPS_ERROR_INVALID_PARAM;
/* Store the setting number */
token->value.i = i;
/* Skip the rest of the line */
return end-ptr+2;
}
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
static int parse_image_special(const char *wps_bufptr,