diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2010-01-15 07:20:56 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2010-01-15 07:20:56 +0000 |
commit | fea4689e91139ed92f2acad3c3c30afcbf1c1794 (patch) | |
tree | ba29527e52c26fb67bee64c75dbec89d8dae4191 /apps/gui/skin_engine/skin_display.c | |
parent | fafbfbc56c3f70fe29cb2bc74666298186fa2434 (diff) | |
download | rockbox-fea4689e91139ed92f2acad3c3c30afcbf1c1794.tar.gz rockbox-fea4689e91139ed92f2acad3c3c30afcbf1c1794.zip |
Get rid of those horrible macros to protect against NULL reference when looking up the id3 info for tokens.
Change the way the wps playlist viewer gets the token values. All %i tokens are now supported (and a few others, experiment :) )
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24233 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index e63b078d37..e90ac4c4ce 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c | |||
@@ -169,17 +169,20 @@ bool audio_peek_track(struct mp3entry* id3, int offset); | |||
169 | static void draw_playlist_viewer_list(struct gui_wps *gwps, | 169 | static void draw_playlist_viewer_list(struct gui_wps *gwps, |
170 | struct playlistviewer *viewer) | 170 | struct playlistviewer *viewer) |
171 | { | 171 | { |
172 | struct wps_state *state = gwps->state; | ||
172 | int lines = viewport_get_nb_lines(viewer->vp); | 173 | int lines = viewport_get_nb_lines(viewer->vp); |
173 | int line_height = font_get(viewer->vp->font)->height; | 174 | int line_height = font_get(viewer->vp->font)->height; |
174 | int cur_playlist_pos = playlist_get_display_index(); | 175 | int cur_playlist_pos = playlist_get_display_index(); |
175 | int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); | 176 | int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); |
176 | int i; | 177 | int i; |
178 | struct wps_token token; | ||
177 | 179 | ||
178 | struct mp3entry *pid3; | 180 | struct mp3entry *pid3; |
179 | #if CONFIG_CODEC == SWCODEC | 181 | #if CONFIG_CODEC == SWCODEC |
180 | struct mp3entry id3; | 182 | struct mp3entry id3; |
181 | #endif | 183 | #endif |
182 | char buf[MAX_PATH*2], tempbuf[MAX_PATH]; | 184 | char buf[MAX_PATH*2], tempbuf[MAX_PATH]; |
185 | unsigned int buf_used = 0; | ||
183 | 186 | ||
184 | 187 | ||
185 | gwps->display->set_viewport(viewer->vp); | 188 | gwps->display->set_viewport(viewer->vp); |
@@ -187,11 +190,11 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps, | |||
187 | { | 190 | { |
188 | if (i == cur_playlist_pos) | 191 | if (i == cur_playlist_pos) |
189 | { | 192 | { |
190 | pid3 = audio_current_track(); | 193 | pid3 = state->id3; |
191 | } | 194 | } |
192 | else if (i == cur_playlist_pos+1) | 195 | else if (i == cur_playlist_pos+1) |
193 | { | 196 | { |
194 | pid3 = audio_next_track(); | 197 | pid3 = state->nid3; |
195 | } | 198 | } |
196 | #if CONFIG_CODEC == SWCODEC | 199 | #if CONFIG_CODEC == SWCODEC |
197 | else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) | 200 | else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) |
@@ -200,51 +203,56 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps, | |||
200 | } | 203 | } |
201 | #endif | 204 | #endif |
202 | else | 205 | else |
206 | { | ||
203 | pid3 = NULL; | 207 | pid3 = NULL; |
208 | } | ||
204 | 209 | ||
205 | int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; | 210 | int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; |
206 | int token = 0, cur_string = 0; | 211 | int j = 0, cur_string = 0; |
207 | char *filename = playlist_peek(i-cur_playlist_pos); | 212 | char *filename = playlist_peek(i-cur_playlist_pos); |
208 | buf[0] = '\0'; | 213 | buf[0] = '\0'; |
209 | while (token < viewer->lines[line].count) | 214 | buf_used = 0; |
215 | while (j < viewer->lines[line].count && (buf_used<sizeof(buf))) | ||
210 | { | 216 | { |
211 | switch (viewer->lines[line].tokens[token]) | 217 | const char *out = NULL; |
218 | token.type = viewer->lines[line].tokens[j]; | ||
219 | token.value.i = 0; | ||
220 | token.next = false; | ||
221 | out = get_id3_token(&token, pid3, tempbuf, sizeof(tempbuf), -1, NULL); | ||
222 | if (out) | ||
223 | { | ||
224 | snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", out); | ||
225 | buf_used += strlen(out); | ||
226 | j++; | ||
227 | continue; | ||
228 | } | ||
229 | switch (viewer->lines[line].tokens[j]) | ||
212 | { | 230 | { |
213 | case WPS_TOKEN_STRING: | 231 | case WPS_TOKEN_STRING: |
214 | case WPS_TOKEN_CHARACTER: | 232 | case WPS_TOKEN_CHARACTER: |
215 | strcat(buf, viewer->lines[line].strings[cur_string++]); | 233 | snprintf(tempbuf, sizeof(tempbuf), "%s", |
234 | viewer->lines[line].strings[cur_string]); | ||
235 | cur_string++; | ||
216 | break; | 236 | break; |
217 | case WPS_TOKEN_PLAYLIST_POSITION: | 237 | case WPS_TOKEN_PLAYLIST_POSITION: |
218 | snprintf(tempbuf, sizeof(tempbuf), "%d", i); | 238 | snprintf(tempbuf, sizeof(tempbuf), "%d", i); |
219 | strcat(buf, tempbuf); | ||
220 | break; | 239 | break; |
221 | case WPS_TOKEN_FILE_NAME: | 240 | case WPS_TOKEN_FILE_NAME: |
222 | get_dir(tempbuf, sizeof(tempbuf), filename, 0); | 241 | get_dir(tempbuf, sizeof(tempbuf), filename, 0); |
223 | strcat(buf, tempbuf); | ||
224 | break; | 242 | break; |
225 | case WPS_TOKEN_FILE_PATH: | 243 | case WPS_TOKEN_FILE_PATH: |
226 | strcat(buf, filename); | 244 | snprintf(tempbuf, sizeof(tempbuf), "%s", filename); |
227 | break; | ||
228 | case WPS_TOKEN_METADATA_ARTIST: | ||
229 | if (pid3) | ||
230 | strcat(buf, pid3->artist ? pid3->artist : ""); | ||
231 | break; | 245 | break; |
232 | case WPS_TOKEN_METADATA_TRACK_TITLE: | ||
233 | if (pid3) | ||
234 | strcat(buf, pid3->title ? pid3->title : ""); | ||
235 | break; | ||
236 | case WPS_TOKEN_TRACK_LENGTH: | ||
237 | if (pid3) | ||
238 | { | ||
239 | format_time(tempbuf, sizeof(tempbuf), pid3->length); | ||
240 | strcat(buf, tempbuf); | ||
241 | } | ||
242 | break; | ||
243 | |||
244 | default: | 246 | default: |
247 | tempbuf[0] = '\0'; | ||
245 | break; | 248 | break; |
246 | } | 249 | } |
247 | token++; | 250 | if (tempbuf[0]) |
251 | { | ||
252 | snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", tempbuf); | ||
253 | buf_used += strlen(tempbuf); | ||
254 | } | ||
255 | j++; | ||
248 | } | 256 | } |
249 | 257 | ||
250 | if (viewer->lines[line].scroll) | 258 | if (viewer->lines[line].scroll) |