From b9bb723f12c95f2b253f822bc9dc9d7f474f8d75 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Wed, 26 Mar 2008 18:18:22 +0000 Subject: 1) Make Rockbox reject any WPSs if there are errors loading any of the required bmps; 2) Make checkwps actually load the images using the Rockbox bmp loader, and reject the WPS in the same was as Rockbox on bmp errors. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16822 a1c6a512-1295-4272-9138-f99709370657 --- apps/gui/wps_parser.c | 40 +++++++++++++++++++++++++++++++--------- apps/recorder/bmp.c | 7 ++++++- tools/Makefile | 2 +- tools/checkwps.c | 40 ++++++++++++++++++++++++++++++++++------ 4 files changed, 72 insertions(+), 17 deletions(-) diff --git a/apps/gui/wps_parser.c b/apps/gui/wps_parser.c index ae50499960..55b4ed9cae 100644 --- a/apps/gui/wps_parser.c +++ b/apps/gui/wps_parser.c @@ -17,18 +17,29 @@ * ****************************************************************************/ +#include +#include +#include "gwps.h" +#ifdef __PCTOOL__ +#define DEBUGF printf +#define FONT_SYSFIXED 0 +#define FONT_UI 1 +#else +#include "debug.h" +#endif + +#ifndef __PCTOOL__ #include #include #include #include #include +#include "font.h" + #include "atoi.h" #include "gwps.h" -#include "font.h" -#ifndef __PCTOOL__ #include "settings.h" #include "misc.h" -#include "debug.h" #include "plugin.h" #ifdef HAVE_LCD_BITMAP @@ -382,7 +393,7 @@ static bool load_bitmap(struct wps_data *wps_data, int ret = read_bmp_file(filename, bm, wps_data->img_buf_free, format); - + DEBUGF("Read %s, ret=%d\n",filename,ret); if (ret > 0) { #if LCD_DEPTH == 16 @@ -1370,12 +1381,11 @@ static void wps_reset(struct wps_data *data) #ifdef HAVE_LCD_BITMAP -static void load_wps_bitmaps(struct wps_data *wps_data, char *bmpdir) +static bool load_wps_bitmaps(struct wps_data *wps_data, char *bmpdir) { char img_path[MAX_PATH]; struct bitmap *bitmap; bool *loaded; - int n; for (n = 0; n < BACKDROP_BMP; n++) { @@ -1405,6 +1415,12 @@ static void load_wps_bitmaps(struct wps_data *wps_data, char *bmpdir) wps_data->img[n].subimage_height = wps_data->img[n].bm.height / wps_data->img[n].num_subimages; } + else + { + /* Abort if we can't load an image */ + DEBUGF("ERR: Failed to load image %d - %s\n",n,img_path); + return false; + } } } @@ -1416,14 +1432,19 @@ static void load_wps_bitmaps(struct wps_data *wps_data, char *bmpdir) #ifdef HAVE_REMOTE_LCD if (wps_data->remote_wps) #if LCD_REMOTE_DEPTH > 1 - load_remote_wps_backdrop(img_path) + if (!load_remote_wps_backdrop(img_path)) + return false #endif ; else #endif /* HAVE_REMOTE_LCD */ - load_wps_backdrop(img_path); + if (!load_wps_backdrop(img_path)) + return false; } #endif /* has backdrop support */ + + /* If we got here, everything was OK */ + return true; } #endif /* HAVE_LCD_BITMAP */ @@ -1552,7 +1573,8 @@ bool wps_data_load(struct wps_data *wps_data, bmpdir[bmpdirlen] = 0; /* load the bitmaps that were found by the parsing */ - load_wps_bitmaps(wps_data, bmpdir); + if (!load_wps_bitmaps(wps_data, bmpdir)) + return false; #endif return true; } diff --git a/apps/recorder/bmp.c b/apps/recorder/bmp.c index 3db2cb1817..f844c8908f 100644 --- a/apps/recorder/bmp.c +++ b/apps/recorder/bmp.c @@ -38,11 +38,16 @@ #ifdef HAVE_REMOTE_LCD #include "lcd-remote.h" #endif +#ifndef __PCTOOL__ #include "file.h" #include "config.h" #include "system.h" #include "bmp.h" -#include "lcd.h" +#include "debug.h" +#else +#undef DEBUGF +#define DEBUGF(...) +#endif #ifdef __GNUC__ #define STRUCT_PACKED __attribute__((packed)) diff --git a/tools/Makefile b/tools/Makefile index 4db43c1b6c..94378d8fc5 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -64,7 +64,7 @@ database: database.c ../apps/tagcache.c ../apps/metadata.c \ -D__PCTOOL__ -DHAVE_TAGCACHE -DROCKBOX_HAS_LOGF -DSIMULATOR \ -DCONFIG_CODEC=1 -ldl -I../apps $+ -o $@ -checkwps: checkwps.c ../apps/gui/wps_parser.c ../apps/gui/wps_debug.c ../firmware/common/ctype.c ../apps/misc.c +checkwps: checkwps.c ../apps/gui/wps_parser.c ../apps/gui/wps_debug.c ../firmware/common/ctype.c ../apps/misc.c ../apps/recorder/bmp.c $(SILENT)$(CC) -g -I ../apps/gui -I../firmware/export \ -D__PCTOOL__ -DDEBUG -DROCKBOX_HAS_LOGF -DIPOD_COLOR -D ROCKBOX_DIR_LEN -D WPS_DIR=\".\" \ -I../apps -I../firmware/target/arm/ipod -I../firmware/include $+ -o $@ diff --git a/tools/checkwps.c b/tools/checkwps.c index 92e7a5db94..ddaaf49b73 100644 --- a/tools/checkwps.c +++ b/tools/checkwps.c @@ -7,15 +7,43 @@ bool debug_wps = true; int wps_verbose_level = 0; -int read_bmp_file(char* filename, - struct bitmap *bm, - int maxsize, - int format) +int errno; + +/* static endianness conversion */ +#define SWAP_16(x) ((typeof(x))(unsigned short)(((unsigned short)(x) >> 8) | \ + ((unsigned short)(x) << 8))) + +#define SWAP_32(x) ((typeof(x))(unsigned long)( ((unsigned long)(x) >> 24) | \ + (((unsigned long)(x) & 0xff0000ul) >> 8) | \ + (((unsigned long)(x) & 0xff00ul) << 8) | \ + ((unsigned long)(x) << 24))) +unsigned short letoh16(unsigned short x) { - return 0; + unsigned short n = 0x1234; + unsigned char* ch = &n; + + if (*ch == 0x34) + { + /* Little-endian */ + return x; + } else { + return SWAP_16(x); + } } -int errno; +unsigned int htole32(unsigned int x) +{ + unsigned short n = 0x1234; + unsigned char* ch = &n; + + if (*ch == 0x34) + { + /* Little-endian */ + return x; + } else { + return SWAP_32(x); + } +} int read_line(int fd, char* buffer, int buffer_size) { -- cgit v1.2.3