summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/plugin.c1
-rw-r--r--apps/plugin.h28
-rw-r--r--apps/plugins/search.c25
-rw-r--r--apps/plugins/sort.c24
4 files changed, 46 insertions, 32 deletions
diff --git a/apps/plugin.c b/apps/plugin.c
index d2d6bc3..7c7c7ad 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 a302cc4..8e5f474 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 d732c02..4f60c82 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 1877831..2ae788e 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;
}