summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/gui/skin_engine/skin_parser.c156
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);
134static int parse_setting_and_lang(const char *wps_bufptr, 134static 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
138static int parse_languagedirection(const char *wps_bufptr, 138static 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,
171static int parse_viewportcolour(const char *wps_bufptr, 171static 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);
173static int parse_image_special(const char *wps_bufptr, 173static 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
177static int parse_albumart_load(const char *wps_bufptr, 177static 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
789static int parse_viewport_display(const char *wps_bufptr, 794static 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
1236static int parse_progressbar(const char *wps_bufptr, 1240static 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;