diff --git a/apps/plugin.c b/apps/plugin.c index d2d6bc3896..7c7c7adf09 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -675,6 +675,7 @@ static const struct plugin_api rockbox_api = { pcmbuf_beep, #endif crc_32, + open_utf8, }; int plugin_load(const char* plugin, const void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index a302cc4241..8e5f474232 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -135,7 +135,7 @@ void* plugin_get_buffer(size_t *buffer_size); #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 176 +#define PLUGIN_API_VERSION 177 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any @@ -329,24 +329,27 @@ struct plugin_api { unsigned (*lcd_remote_get_foreground)(void); void (*lcd_remote_set_background)(unsigned background); unsigned (*lcd_remote_get_background)(void); - void (*lcd_remote_bitmap_part)(const fb_remote_data *src, int src_x, int src_y, - int stride, int x, int y, int width, int height); - void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, int width, - int height); + void (*lcd_remote_bitmap_part)(const fb_remote_data *src, + int src_x, int src_y, int stride, + int x, int y, int width, int height); + void (*lcd_remote_bitmap)(const fb_remote_data *src, int x, int y, + int width, int height); #endif - void (*viewport_set_defaults)(struct viewport *vp, enum screen_type screen); + void (*viewport_set_defaults)(struct viewport *vp, + const enum screen_type screen); /* list */ void (*gui_synclist_init)(struct gui_synclist * lists, list_get_name callback_get_item_name, void * data, bool scroll_all,int selected_size, struct viewport parent[NB_SCREENS]); void (*gui_synclist_set_nb_items)(struct gui_synclist * lists, int nb_items); - void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, list_get_icon icon_callback); + void (*gui_synclist_set_icon_callback)(struct gui_synclist * lists, + list_get_icon icon_callback); int (*gui_synclist_get_nb_items)(struct gui_synclist * lists); int (*gui_synclist_get_sel_pos)(struct gui_synclist * lists); void (*gui_synclist_draw)(struct gui_synclist * lists); void (*gui_synclist_select_item)(struct gui_synclist * lists, - int item_number); + int item_number); void (*gui_synclist_add_item)(struct gui_synclist * lists); void (*gui_synclist_del_item)(struct gui_synclist * lists); void (*gui_synclist_limit_scroll)(struct gui_synclist * lists, bool scroll); @@ -358,7 +361,7 @@ struct plugin_api { const struct text_message * yes_message, const struct text_message * no_message); void (*simplelist_info_init)(struct simplelist_info *info, char* title, - int count, void* data); + int count, void* data); bool (*simplelist_show_list)(struct simplelist_info *info); /* button */ @@ -431,7 +434,8 @@ struct plugin_api { void (*yield)(void); volatile long* current_tick; long (*default_event_handler)(long event); - long (*default_event_handler_ex)(long event, void (*callback)(void *), void *parameter); + long (*default_event_handler_ex)(long event, + void (*callback)(void *), void *parameter); unsigned int (*create_thread)(void (*function)(void), void* stack, size_t stack_size, unsigned flags, const char *name @@ -554,7 +558,8 @@ struct plugin_api { const char * (*sound_unit)(int setting); int (*sound_val2phys)(int setting, int value); #ifndef SIMULATOR - void (*mp3_play_data)(const unsigned char* start, int size, void (*get_more)(unsigned char** start, size_t* size)); + void (*mp3_play_data)(const unsigned char* start, int size, + void (*get_more)(unsigned char** start, size_t* size)); void (*mp3_play_pause)(bool play); void (*mp3_play_stop)(void); bool (*mp3_is_playing)(void); @@ -849,6 +854,7 @@ struct plugin_api { int amplitude); #endif unsigned (*crc_32)(const void *src, unsigned len, unsigned crc32); + int (*open_utf8)(const char* pathname, int flags); }; /* plugin header */ diff --git a/apps/plugins/search.c b/apps/plugins/search.c index d732c0282b..4f60c82d08 100644 --- a/apps/plugins/search.c +++ b/apps/plugins/search.c @@ -29,7 +29,7 @@ PLUGIN_HEADER static int fd; static int fdw; -static int file_size; +static int file_size, bomsize; static int results = 0; static char buffer[BUFFER_SIZE+1]; @@ -57,13 +57,8 @@ static void fill_buffer(int pos){ int found = false ; const char crlf = '\n'; - if (pos>=file_size-BUFFER_SIZE) - pos = file_size-BUFFER_SIZE; - if (pos<0) - pos = 0; - - rb->lseek(fd, pos, SEEK_SET); - numread = rb->read(fd, buffer, BUFFER_SIZE); + rb->lseek(fd, pos+bomsize, SEEK_SET); + numread = rb->read(fd, buffer, MIN(BUFFER_SIZE, file_size-pos)); buffer[numread] = 0; line_end = 0; @@ -120,11 +115,15 @@ static bool search_init(const char* file){ if (!rb->kbd_input(search_string,sizeof search_string)){ clear_display(); rb->splash(0, "Searching..."); - fd = rb->open(file, O_RDONLY); + fd = rb->open_utf8(file, O_RDONLY); if (fd < 0) return false; - fdw = rb->creat(resultfile); + bomsize = rb->lseek(fd, 0, SEEK_CUR); + if (bomsize) + fdw = rb->open_utf8(resultfile, O_WRONLY|O_CREAT|O_TRUNC); + else + fdw = rb->open(resultfile, O_WRONLY|O_CREAT|O_TRUNC); if (fdw < 0) { #ifdef HAVE_LCD_BITMAP @@ -136,7 +135,7 @@ static bool search_init(const char* file){ return false; } - file_size = rb->lseek(fd, 0, SEEK_END); + file_size = rb->lseek(fd, 0, SEEK_END) - bomsize; return true; } @@ -177,7 +176,7 @@ enum plugin_status plugin_start(const void* parameter) rb->splash(HZ, "Done"); rb->close(fdw); rb->close(fd); + rb->reload_directory(); - /* We fake a USB connection to force a reload of the file browser */ - return PLUGIN_USB_CONNECTED; + return PLUGIN_OK; } diff --git a/apps/plugins/sort.c b/apps/plugins/sort.c index 1877831815..2ae788ebbd 100644 --- a/apps/plugins/sort.c +++ b/apps/plugins/sort.c @@ -65,6 +65,7 @@ static int num_entries; static char **pointers; static char *stringbuffer; static char crlf[2] = "\r\n"; +static int bomsize; /* Compare function for sorting backwards */ static int compare(const void* p1, const void* p2) @@ -86,11 +87,14 @@ int read_buffer(int offset) char *buf_ptr; char *tmp_ptr; int readsize; - - fd = rb->open(filename, O_RDONLY); + + fd = rb->open_utf8(filename, O_RDONLY); if(fd < 0) return 10 * fd - 1; + bomsize = rb->lseek(fd, 0, SEEK_CUR); + offset += bomsize; + /* Fill the buffer from the file */ rb->lseek(fd, offset, SEEK_SET); readsize = rb->read(fd, stringbuffer, buf_size); @@ -127,7 +131,7 @@ int read_buffer(int offset) num_entries++; buf_ptr++; } while(buf_ptr < stringbuffer + readsize); - + return 0; } @@ -140,7 +144,11 @@ static int write_file(void) /* Create a temporary file */ rb->snprintf(tmpfilename, MAX_PATH+1, "%s.tmp", filename); - fd = rb->creat(tmpfilename); + if (bomsize) + fd = rb->open_utf8(tmpfilename, O_WRONLY|O_CREAT|O_TRUNC); + else + fd = rb->open(tmpfilename, O_WRONLY|O_CREAT|O_TRUNC); + if(fd < 0) return 10 * fd - 1; @@ -191,16 +199,16 @@ enum plugin_status plugin_start(const void* parameter) rb->lcd_clear_display(); rb->splash(0, "Loading..."); - + rc = read_buffer(0); if(rc == 0) { rb->lcd_clear_display(); rb->splash(0, "Sorting..."); sort_buffer(); - + rb->lcd_clear_display(); rb->splash(0, "Writing..."); - + rc = write_file(); if(rc < 0) { rb->lcd_clear_display(); @@ -218,6 +226,6 @@ enum plugin_status plugin_start(const void* parameter) rb->splash(HZ, "The file is too big"); } } - + return PLUGIN_OK; }