diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2005-04-07 12:17:14 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2005-04-07 12:17:14 +0000 |
commit | 2fa2bf6cede19ef5724429643e4002335dea79b1 (patch) | |
tree | 9838a7cec7fa631c91da5d1e72a9ba671a888224 /apps/plugins/iriverify.c | |
parent | 43bf39edb718aa510188b3594e583c905dea5a54 (diff) | |
download | rockbox-2fa2bf6cede19ef5724429643e4002335dea79b1.tar.gz rockbox-2fa2bf6cede19ef5724429643e4002335dea79b1.zip |
Patch #1164207 by Alexandre Bourget, the iriverify plugin, transforms Rockbox generated playlists so they are recognized by the iRiver firmware
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6259 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/iriverify.c')
-rw-r--r-- | apps/plugins/iriverify.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/apps/plugins/iriverify.c b/apps/plugins/iriverify.c new file mode 100644 index 0000000000..9e7cdfb16a --- /dev/null +++ b/apps/plugins/iriverify.c @@ -0,0 +1,176 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 Alexandre Bourget + * + * Plugin to transform a Rockbox produced m3u playlist into something + * understandable by the picky original iRiver firmware. + * + * Based on sort.c by the Rockbox team. + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "plugin.h" + + +static struct plugin_api* rb; + +int buf_size; +static char *filename; +static int readsize; +static char *stringbuffer; +static char crlf[2] = "\r\n"; + +int read_buffer(int offset) +{ + int fd; + + fd = rb->open(filename, O_RDONLY); + if(fd < 0) + return 10 * fd - 1; + + /* Fill the buffer from the file */ + rb->lseek(fd, offset, SEEK_SET); + readsize = rb->read(fd, stringbuffer, buf_size); + rb->close(fd); + + if(readsize < 0) + return readsize * 10 - 2; + + if(readsize == buf_size) + return buf_size; /* File too big */ + + return 0; +} + +static int write_file(void) +{ + char tmpfilename[MAX_PATH+1]; + int fd; + int rc; + char *buf_ptr; + char *str_begin; + + /* Create a temporary file */ + + rb->snprintf(tmpfilename, MAX_PATH+1, "%s.tmp", filename); + + fd = rb->creat(tmpfilename, 0); + if(fd < 0) + return 10 * fd - 1; + + /* Let's make sure it always writes CR/LF and not only LF */ + buf_ptr = stringbuffer; + str_begin = stringbuffer; + do { + /* Transform slashes into backslashes */ + if(*buf_ptr == '/') + *buf_ptr = '\\'; + + if((*buf_ptr == '\r') || (*buf_ptr == '\n')) { + /* We have no complete string ? It's only a leading \n or \r ? */ + if (!str_begin) + continue; + + /* Terminate string */ + *buf_ptr = 0; + + /* Write our new string */ + rc = rb->write(fd, str_begin, rb->strlen(str_begin)); + if(rc < 0) { + rb->close(fd); + return 10 * rc - 2; + } + /* Write CR/LF */ + rc = rb->write(fd, crlf, 2); + if(rc < 0) { + rb->close(fd); + return 10 * rc - 3; + } + + /* Reset until we get a new line */ + str_begin = NULL; + + } + else { + /* We start a new line here */ + if (!str_begin) + str_begin = buf_ptr; + } + + /* Ok, skip a char */ + buf_ptr++; + + /* until ... */ + } while(buf_ptr < stringbuffer + readsize); + + rb->close(fd); + + /* Remove the original file */ + rc = rb->remove(filename); + if(rc < 0) { + return 10 * rc - 4; + } + + /* Replace the old file with the new */ + rc = rb->rename(tmpfilename, filename); + if(rc < 0) { + return 10 * rc - 5; + } + + return 0; +} + +enum plugin_status plugin_start(struct plugin_api* api, void* parameter) +{ + char *buf; + int rc; + TEST_PLUGIN_API(api); + + filename = (char *)parameter; + + rb = api; + + buf = rb->plugin_get_audio_buffer(&buf_size); /* start munching memory */ + + stringbuffer = buf; + + rb->lcd_clear_display(); + rb->splash(0, true, "Converting..."); + + rc = read_buffer(0); + if(rc == 0) { + rb->lcd_clear_display(); + rb->splash(0, true, "Writing..."); + rc = write_file(); + + if(rc < 0) { + rb->lcd_clear_display(); + rb->splash(HZ, true, "Can't write file: %d", rc); + } else { + rb->lcd_clear_display(); + rb->splash(HZ, true, "Done"); + } + } else { + if(rc < 0) { + rb->lcd_clear_display(); + rb->splash(HZ, true, "Can't read file: %d", rc); + } else { + rb->lcd_clear_display(); + rb->splash(HZ, true, "The file is too big"); + } + } + + return PLUGIN_OK; +} |