summaryrefslogtreecommitdiff
path: root/apps/gui/skin_engine/skin_display.c
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2010-01-15 07:20:56 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2010-01-15 07:20:56 +0000
commitfea4689e91139ed92f2acad3c3c30afcbf1c1794 (patch)
treeba29527e52c26fb67bee64c75dbec89d8dae4191 /apps/gui/skin_engine/skin_display.c
parentfafbfbc56c3f70fe29cb2bc74666298186fa2434 (diff)
downloadrockbox-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.c60
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);
169static void draw_playlist_viewer_list(struct gui_wps *gwps, 169static 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)