diff options
Diffstat (limited to 'apps/gui')
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 156 |
1 files changed, 75 insertions, 81 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index c2364dab8d..23b3d27cbb 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c | |||
@@ -133,8 +133,8 @@ static int parse_dir_level(const char *wps_bufptr, | |||
133 | struct wps_token *token, struct wps_data *wps_data); | 133 | struct wps_token *token, struct wps_data *wps_data); |
134 | static int parse_setting_and_lang(const char *wps_bufptr, | 134 | static int parse_setting_and_lang(const char *wps_bufptr, |
135 | struct wps_token *token, struct wps_data *wps_data); | 135 | struct wps_token *token, struct wps_data *wps_data); |
136 | 136 | ||
137 | 137 | ||
138 | static int parse_languagedirection(const char *wps_bufptr, | 138 | static int parse_languagedirection(const char *wps_bufptr, |
139 | struct wps_token *token, struct wps_data *wps_data) | 139 | struct wps_token *token, struct wps_data *wps_data) |
140 | { | 140 | { |
@@ -171,7 +171,7 @@ static int parse_font_load(const char *wps_bufptr, | |||
171 | static int parse_viewportcolour(const char *wps_bufptr, | 171 | static int parse_viewportcolour(const char *wps_bufptr, |
172 | struct wps_token *token, struct wps_data *wps_data); | 172 | struct wps_token *token, struct wps_data *wps_data); |
173 | static int parse_image_special(const char *wps_bufptr, | 173 | static int parse_image_special(const char *wps_bufptr, |
174 | struct wps_token *token, struct wps_data *wps_data); | 174 | struct wps_token *token, struct wps_data *wps_data); |
175 | #endif | 175 | #endif |
176 | #ifdef HAVE_ALBUMART | 176 | #ifdef HAVE_ALBUMART |
177 | static int parse_albumart_load(const char *wps_bufptr, | 177 | static int parse_albumart_load(const char *wps_bufptr, |
@@ -360,7 +360,7 @@ static const struct wps_tag all_tags[] = { | |||
360 | { WPS_TOKEN_TUNER_SCANMODE, "tm", WPS_REFRESH_DYNAMIC, NULL }, | 360 | { WPS_TOKEN_TUNER_SCANMODE, "tm", WPS_REFRESH_DYNAMIC, NULL }, |
361 | { WPS_TOKEN_TUNER_STEREO, "ts", WPS_REFRESH_DYNAMIC, NULL }, | 361 | { WPS_TOKEN_TUNER_STEREO, "ts", WPS_REFRESH_DYNAMIC, NULL }, |
362 | { WPS_TOKEN_TUNER_MINFREQ, "ta", WPS_REFRESH_STATIC, NULL }, | 362 | { WPS_TOKEN_TUNER_MINFREQ, "ta", WPS_REFRESH_STATIC, NULL }, |
363 | { WPS_TOKEN_TUNER_MAXFREQ, "tb", WPS_REFRESH_STATIC, NULL }, | 363 | { WPS_TOKEN_TUNER_MAXFREQ, "tb", WPS_REFRESH_STATIC, NULL }, |
364 | { WPS_TOKEN_TUNER_CURFREQ, "tf", WPS_REFRESH_DYNAMIC, NULL }, | 364 | { WPS_TOKEN_TUNER_CURFREQ, "tf", WPS_REFRESH_DYNAMIC, NULL }, |
365 | { WPS_TOKEN_PRESET_ID, "Ti", WPS_REFRESH_STATIC, NULL }, | 365 | { WPS_TOKEN_PRESET_ID, "Ti", WPS_REFRESH_STATIC, NULL }, |
366 | { WPS_TOKEN_PRESET_NAME, "Tn", WPS_REFRESH_STATIC, NULL }, | 366 | { WPS_TOKEN_PRESET_NAME, "Tn", WPS_REFRESH_STATIC, NULL }, |
@@ -419,7 +419,7 @@ static const struct wps_tag all_tags[] = { | |||
419 | { WPS_TOKEN_TRANSLATEDSTRING, "Sx", WPS_REFRESH_STATIC, | 419 | { WPS_TOKEN_TRANSLATEDSTRING, "Sx", WPS_REFRESH_STATIC, |
420 | parse_setting_and_lang }, | 420 | parse_setting_and_lang }, |
421 | { WPS_TOKEN_LANG_IS_RTL , "Sr", WPS_REFRESH_STATIC, NULL }, | 421 | { WPS_TOKEN_LANG_IS_RTL , "Sr", WPS_REFRESH_STATIC, NULL }, |
422 | 422 | ||
423 | { WPS_TOKEN_LASTTOUCH, "Tl", WPS_REFRESH_DYNAMIC, parse_timeout }, | 423 | { WPS_TOKEN_LASTTOUCH, "Tl", WPS_REFRESH_DYNAMIC, parse_timeout }, |
424 | { WPS_TOKEN_CURRENT_SCREEN, "cs", WPS_REFRESH_DYNAMIC, NULL }, | 424 | { WPS_TOKEN_CURRENT_SCREEN, "cs", WPS_REFRESH_DYNAMIC, NULL }, |
425 | { WPS_NO_TOKEN, "T", 0, parse_touchregion }, | 425 | { WPS_NO_TOKEN, "T", 0, parse_touchregion }, |
@@ -732,6 +732,11 @@ static int parse_image_load(const char *wps_bufptr, | |||
732 | img->num_subimages = atoi(ptr); | 732 | img->num_subimages = atoi(ptr); |
733 | if (img->num_subimages <= 0) | 733 | if (img->num_subimages <= 0) |
734 | return WPS_ERROR_INVALID_PARAM; | 734 | return WPS_ERROR_INVALID_PARAM; |
735 | /* Check there is a terminating ) */ | ||
736 | while(isdigit(*ptr)) | ||
737 | ptr++; | ||
738 | if (*ptr != ')') | ||
739 | return WPS_ERROR_INVALID_PARAM; | ||
735 | } | 740 | } |
736 | struct skin_token_list *item = new_skin_token_list_item(NULL, img); | 741 | struct skin_token_list *item = new_skin_token_list_item(NULL, img); |
737 | if (!item) | 742 | if (!item) |
@@ -753,7 +758,7 @@ static int parse_font_load(const char *wps_bufptr, | |||
753 | const char *ptr = wps_bufptr; | 758 | const char *ptr = wps_bufptr; |
754 | int id; | 759 | int id; |
755 | char *filename; | 760 | char *filename; |
756 | 761 | ||
757 | if (*ptr != '(') | 762 | if (*ptr != '(') |
758 | return WPS_ERROR_INVALID_PARAM; | 763 | return WPS_ERROR_INVALID_PARAM; |
759 | 764 | ||
@@ -762,10 +767,10 @@ static int parse_font_load(const char *wps_bufptr, | |||
762 | if (!(ptr = parse_list("ds", NULL, ',', ptr, &id, &filename))) | 767 | if (!(ptr = parse_list("ds", NULL, ',', ptr, &id, &filename))) |
763 | return WPS_ERROR_INVALID_PARAM; | 768 | return WPS_ERROR_INVALID_PARAM; |
764 | 769 | ||
765 | /* Check there is a terminating | */ | 770 | /* Check there is a terminating ) */ |
766 | if (*ptr != ')') | 771 | if (*ptr != ')') |
767 | return WPS_ERROR_INVALID_PARAM; | 772 | return WPS_ERROR_INVALID_PARAM; |
768 | 773 | ||
769 | if (id <= FONT_UI || id >= MAXFONTS-1) | 774 | if (id <= FONT_UI || id >= MAXFONTS-1) |
770 | return WPS_ERROR_INVALID_PARAM; | 775 | return WPS_ERROR_INVALID_PARAM; |
771 | #if defined(DEBUG) || defined(SIMULATOR) | 776 | #if defined(DEBUG) || defined(SIMULATOR) |
@@ -781,11 +786,11 @@ static int parse_font_load(const char *wps_bufptr, | |||
781 | return WPS_ERROR_INVALID_PARAM; | 786 | return WPS_ERROR_INVALID_PARAM; |
782 | skinfonts[id-FONT_FIRSTUSERFONT].id = -1; | 787 | skinfonts[id-FONT_FIRSTUSERFONT].id = -1; |
783 | skinfonts[id-FONT_FIRSTUSERFONT].name = filename; | 788 | skinfonts[id-FONT_FIRSTUSERFONT].name = filename; |
784 | 789 | ||
785 | return skip_end_of_line(wps_bufptr); | 790 | return skip_end_of_line(wps_bufptr); |
786 | } | 791 | } |
787 | 792 | ||
788 | 793 | ||
789 | static int parse_viewport_display(const char *wps_bufptr, | 794 | static int parse_viewport_display(const char *wps_bufptr, |
790 | struct wps_token *token, | 795 | struct wps_token *token, |
791 | struct wps_data *wps_data) | 796 | struct wps_data *wps_data) |
@@ -918,7 +923,7 @@ static int parse_playlistview(const char *wps_bufptr, | |||
918 | length = parse_playlistview_text(viewer, TRACK_HAS_NO_INFO, ptr+length); | 923 | length = parse_playlistview_text(viewer, TRACK_HAS_NO_INFO, ptr+length); |
919 | if (length < 0) | 924 | if (length < 0) |
920 | return WPS_ERROR_INVALID_PARAM; | 925 | return WPS_ERROR_INVALID_PARAM; |
921 | 926 | ||
922 | return skip_end_of_line(wps_bufptr); | 927 | return skip_end_of_line(wps_bufptr); |
923 | } | 928 | } |
924 | #endif | 929 | #endif |
@@ -969,7 +974,6 @@ static int parse_viewport(const char *wps_bufptr, | |||
969 | } | 974 | } |
970 | else | 975 | else |
971 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ | 976 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ |
972 | |||
973 | } | 977 | } |
974 | else if (*ptr == 'l') | 978 | else if (*ptr == 'l') |
975 | { | 979 | { |
@@ -1007,7 +1011,7 @@ static int parse_viewport(const char *wps_bufptr, | |||
1007 | } | 1011 | } |
1008 | else | 1012 | else |
1009 | vp->flags &= ~VP_FLAG_ALIGN_RIGHT; /* ignore right-to-left languages */ | 1013 | vp->flags &= ~VP_FLAG_ALIGN_RIGHT; /* ignore right-to-left languages */ |
1010 | 1014 | ||
1011 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 1015 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
1012 | skin_vp->start_fgcolour = vp->fg_pattern; | 1016 | skin_vp->start_fgcolour = vp->fg_pattern; |
1013 | skin_vp->start_bgcolour = vp->bg_pattern; | 1017 | skin_vp->start_bgcolour = vp->bg_pattern; |
@@ -1232,7 +1236,7 @@ static int parse_timeout(const char *wps_bufptr, | |||
1232 | 1236 | ||
1233 | return skip; | 1237 | return skip; |
1234 | } | 1238 | } |
1235 | 1239 | ||
1236 | static int parse_progressbar(const char *wps_bufptr, | 1240 | static int parse_progressbar(const char *wps_bufptr, |
1237 | struct wps_token *token, | 1241 | struct wps_token *token, |
1238 | struct wps_data *wps_data) | 1242 | struct wps_data *wps_data) |
@@ -1245,7 +1249,7 @@ static int parse_progressbar(const char *wps_bufptr, | |||
1245 | PB_X, | 1249 | PB_X, |
1246 | PB_Y, | 1250 | PB_Y, |
1247 | PB_WIDTH, | 1251 | PB_WIDTH, |
1248 | PB_HEIGHT | 1252 | PB_HEIGHT, |
1249 | }; | 1253 | }; |
1250 | const char *filename; | 1254 | const char *filename; |
1251 | int x, y, height, width; | 1255 | int x, y, height, width; |
@@ -1291,14 +1295,7 @@ static int parse_progressbar(const char *wps_bufptr, | |||
1291 | 1295 | ||
1292 | if (!(ptr = parse_list("sdddd", &set, ',', ptr, &filename, | 1296 | if (!(ptr = parse_list("sdddd", &set, ',', ptr, &filename, |
1293 | &x, &y, &width, &height))) | 1297 | &x, &y, &width, &height))) |
1294 | { | ||
1295 | /* If we are in a conditional then we probably don't want to fail | ||
1296 | * if the above doesnt work. So assume the | is breaking the conditional | ||
1297 | * and move on. The next token will fail if this is incorrect. */ | ||
1298 | if (level >= 0) | ||
1299 | return 0; | ||
1300 | return WPS_ERROR_INVALID_PARAM; | 1298 | return WPS_ERROR_INVALID_PARAM; |
1301 | } | ||
1302 | 1299 | ||
1303 | if (LIST_VALUE_PARSED(set, PB_FILENAME)) /* filename */ | 1300 | if (LIST_VALUE_PARSED(set, PB_FILENAME)) /* filename */ |
1304 | pb->bm.data = (char*)filename; | 1301 | pb->bm.data = (char*)filename; |
@@ -1346,13 +1343,16 @@ static int parse_progressbar(const char *wps_bufptr, | |||
1346 | else | 1343 | else |
1347 | pb->y = -line_num - 1; /* Will be computed during the rendering */ | 1344 | pb->y = -line_num - 1; /* Will be computed during the rendering */ |
1348 | 1345 | ||
1346 | if (*ptr != ')') | ||
1347 | return WPS_ERROR_INVALID_PARAM; | ||
1348 | |||
1349 | add_to_ll_chain(&wps_data->progressbars, item); | 1349 | add_to_ll_chain(&wps_data->progressbars, item); |
1350 | if (token->type == WPS_TOKEN_VOLUME) | 1350 | if (token->type == WPS_TOKEN_VOLUME) |
1351 | token->type = WPS_TOKEN_VOLUMEBAR; | 1351 | token->type = WPS_TOKEN_VOLUMEBAR; |
1352 | else if (token->type == WPS_TOKEN_BATTERY_PERCENT) | 1352 | else if (token->type == WPS_TOKEN_BATTERY_PERCENT) |
1353 | token->type = WPS_TOKEN_BATTERY_PERCENTBAR; | 1353 | token->type = WPS_TOKEN_BATTERY_PERCENTBAR; |
1354 | pb->type = token->type; | 1354 | pb->type = token->type; |
1355 | 1355 | ||
1356 | return ptr+1-wps_bufptr; | 1356 | return ptr+1-wps_bufptr; |
1357 | #else | 1357 | #else |
1358 | (void)wps_bufptr; | 1358 | (void)wps_bufptr; |
@@ -1394,7 +1394,7 @@ static int parse_albumart_load(const char *wps_bufptr, | |||
1394 | /* format: %Cl|x|y|[[l|c|r]mwidth]|[[t|c|b]mheight]| */ | 1394 | /* format: %Cl|x|y|[[l|c|r]mwidth]|[[t|c|b]mheight]| */ |
1395 | if (!(ptr = parse_list("dddd", NULL,',',ptr, &aa->x, &aa->y, &aa->width, &aa->height))) | 1395 | if (!(ptr = parse_list("dddd", NULL,',',ptr, &aa->x, &aa->y, &aa->width, &aa->height))) |
1396 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ | 1396 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ |
1397 | 1397 | ||
1398 | /* if we got here, we parsed everything ok .. ! */ | 1398 | /* if we got here, we parsed everything ok .. ! */ |
1399 | if (aa->width < 0) | 1399 | if (aa->width < 0) |
1400 | aa->width = 0; | 1400 | aa->width = 0; |
@@ -1420,62 +1420,56 @@ static int parse_albumart_load(const char *wps_bufptr, | |||
1420 | 1420 | ||
1421 | if (0 <= albumart_slot) | 1421 | if (0 <= albumart_slot) |
1422 | wps_data->playback_aa_slot = albumart_slot; | 1422 | wps_data->playback_aa_slot = albumart_slot; |
1423 | 1423 | ||
1424 | if (*ptr == ')') | 1424 | if (*ptr == ',') |
1425 | return skip_end_of_line(wps_bufptr); | ||
1426 | else if (*ptr != ',') | ||
1427 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ | ||
1428 | ptr++; | ||
1429 | switch (*ptr) | ||
1430 | { | 1425 | { |
1431 | case 'l': | 1426 | ptr++; |
1432 | case 'L': | 1427 | switch (*ptr) |
1433 | if (swap_for_rtl) | 1428 | { |
1434 | aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; | 1429 | case 'l': |
1435 | else | 1430 | case 'L': |
1436 | aa->xalign = WPS_ALBUMART_ALIGN_LEFT; | 1431 | if (swap_for_rtl) |
1437 | break; | 1432 | aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; |
1438 | case 'c': | 1433 | else |
1439 | case 'C': | 1434 | aa->xalign = WPS_ALBUMART_ALIGN_LEFT; |
1440 | aa->xalign = WPS_ALBUMART_ALIGN_CENTER; | 1435 | break; |
1441 | break; | 1436 | case 'c': |
1442 | case 'r': | 1437 | case 'C': |
1443 | case 'R': | 1438 | aa->xalign = WPS_ALBUMART_ALIGN_CENTER; |
1444 | if (swap_for_rtl) | 1439 | break; |
1445 | aa->xalign = WPS_ALBUMART_ALIGN_LEFT; | 1440 | case 'r': |
1446 | else | 1441 | case 'R': |
1447 | aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; | 1442 | if (swap_for_rtl) |
1448 | break; | 1443 | aa->xalign = WPS_ALBUMART_ALIGN_LEFT; |
1444 | else | ||
1445 | aa->xalign = WPS_ALBUMART_ALIGN_RIGHT; | ||
1446 | break; | ||
1447 | } | ||
1448 | ptr++; | ||
1449 | } | 1449 | } |
1450 | ptr++; | 1450 | if (*ptr == ',') |
1451 | if (*ptr == ')') | ||
1452 | return skip_end_of_line(wps_bufptr); | ||
1453 | else if (*ptr != ',') | ||
1454 | return WPS_ERROR_INVALID_PARAM; /* malformed token: e.g. %Cl7 */ | ||
1455 | ptr++; | ||
1456 | switch (*ptr) | ||
1457 | { | 1451 | { |
1458 | case 't': | 1452 | ptr++; |
1459 | case 'T': | 1453 | switch (*ptr) |
1460 | aa->yalign = WPS_ALBUMART_ALIGN_TOP; | 1454 | { |
1461 | break; | 1455 | case 't': |
1462 | case 'c': | 1456 | case 'T': |
1463 | case 'C': | 1457 | aa->yalign = WPS_ALBUMART_ALIGN_TOP; |
1464 | aa->yalign = WPS_ALBUMART_ALIGN_CENTER; | 1458 | break; |
1465 | break; | 1459 | case 'c': |
1466 | case 'b': | 1460 | case 'C': |
1467 | case 'B': | 1461 | aa->yalign = WPS_ALBUMART_ALIGN_CENTER; |
1468 | aa->yalign = WPS_ALBUMART_ALIGN_BOTTOM; | 1462 | break; |
1469 | break; | 1463 | case 'b': |
1470 | case 'd': | 1464 | case 'B': |
1471 | case 'D': | 1465 | aa->yalign = WPS_ALBUMART_ALIGN_BOTTOM; |
1472 | case 'i': | 1466 | break; |
1473 | case 'I': | 1467 | } |
1474 | case 's': | 1468 | ptr++; |
1475 | case 'S': | ||
1476 | /* simply ignored */ | ||
1477 | break; | ||
1478 | } | 1469 | } |
1470 | if (*ptr != ')') | ||
1471 | return WPS_ERROR_INVALID_PARAM; | ||
1472 | |||
1479 | return skip_end_of_line(wps_bufptr); | 1473 | return skip_end_of_line(wps_bufptr); |
1480 | } | 1474 | } |
1481 | 1475 | ||
@@ -1554,7 +1548,7 @@ static int parse_touchregion(const char *wps_bufptr, | |||
1554 | if (!(ptr = parse_list("dddds", NULL, ',', ptr, &x, &y, &w, &h, &action))) | 1548 | if (!(ptr = parse_list("dddds", NULL, ',', ptr, &x, &y, &w, &h, &action))) |
1555 | return WPS_ERROR_INVALID_PARAM; | 1549 | return WPS_ERROR_INVALID_PARAM; |
1556 | 1550 | ||
1557 | /* Check there is a terminating | */ | 1551 | /* Check there is a terminating ) */ |
1558 | if (*ptr != ')') | 1552 | if (*ptr != ')') |
1559 | return WPS_ERROR_INVALID_PARAM; | 1553 | return WPS_ERROR_INVALID_PARAM; |
1560 | 1554 | ||
@@ -1801,7 +1795,7 @@ static bool wps_parse(struct wps_data *data, const char *wps_bufptr, bool debug) | |||
1801 | return false; | 1795 | return false; |
1802 | skin_buffer_increment(max_tokens * sizeof(struct wps_token), false); | 1796 | skin_buffer_increment(max_tokens * sizeof(struct wps_token), false); |
1803 | data->num_tokens = 0; | 1797 | data->num_tokens = 0; |
1804 | 1798 | ||
1805 | #if LCD_DEPTH > 1 | 1799 | #if LCD_DEPTH > 1 |
1806 | /* Backdrop defaults to the setting unless %X is used, so set it now */ | 1800 | /* Backdrop defaults to the setting unless %X is used, so set it now */ |
1807 | if (global_settings.backdrop_file[0]) | 1801 | if (global_settings.backdrop_file[0]) |
@@ -2272,7 +2266,7 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, | |||
2272 | skin_data_reset(wps_data); | 2266 | skin_data_reset(wps_data); |
2273 | wps_data->wps_loaded = false; | 2267 | wps_data->wps_loaded = false; |
2274 | curr_screen = screen; | 2268 | curr_screen = screen; |
2275 | 2269 | ||
2276 | /* alloc default viewport, will be fixed up later */ | 2270 | /* alloc default viewport, will be fixed up later */ |
2277 | curr_vp = skin_buffer_alloc(sizeof(struct skin_viewport)); | 2271 | curr_vp = skin_buffer_alloc(sizeof(struct skin_viewport)); |
2278 | if (!curr_vp) | 2272 | if (!curr_vp) |
@@ -2287,7 +2281,7 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, | |||
2287 | curr_vp->label = VP_DEFAULT_LABEL; | 2281 | curr_vp->label = VP_DEFAULT_LABEL; |
2288 | curr_vp->hidden_flags = 0; | 2282 | curr_vp->hidden_flags = 0; |
2289 | curr_vp->lines = NULL; | 2283 | curr_vp->lines = NULL; |
2290 | 2284 | ||
2291 | viewport_set_defaults(&curr_vp->vp, screen); | 2285 | viewport_set_defaults(&curr_vp->vp, screen); |
2292 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) | 2286 | #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) |
2293 | curr_vp->start_fgcolour = curr_vp->vp.fg_pattern; | 2287 | curr_vp->start_fgcolour = curr_vp->vp.fg_pattern; |