New plugin, search.rock, by Stefan Meyer (Patch #723682)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4874 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
a96a130f5a
commit
6d84d3a691
2 changed files with 181 additions and 0 deletions
180
apps/plugins/search.c
Normal file
180
apps/plugins/search.c
Normal file
|
@ -0,0 +1,180 @@
|
|||
/***************************************************************************
|
||||
*
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2003 Stefan Meyer
|
||||
*
|
||||
* 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"
|
||||
#include "ctype.h"
|
||||
|
||||
static struct plugin_api* rb;
|
||||
|
||||
#define BUFFER_SIZE 16384
|
||||
|
||||
static int fd;
|
||||
static int fdw;
|
||||
|
||||
static int file_size;
|
||||
static int results = 0;
|
||||
|
||||
static char buffer[BUFFER_SIZE+1];
|
||||
static char search_string[60] ;
|
||||
|
||||
static int buffer_pos; /* Position of the buffer in the file */
|
||||
|
||||
static int line_end; /* Index of the end of line */
|
||||
|
||||
char resultfile[MAX_PATH];
|
||||
char path[MAX_PATH];
|
||||
|
||||
static int strpcasecmp(const char *s1, const char *s2)
|
||||
{
|
||||
while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) {
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
|
||||
return (*s1 == '\0') ;
|
||||
}
|
||||
|
||||
static void fill_buffer(int pos)
|
||||
{
|
||||
int numread;
|
||||
int i;
|
||||
int found = false ;
|
||||
char crlf[2] = "\n\0";
|
||||
|
||||
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);
|
||||
|
||||
buffer[numread] = 0;
|
||||
line_end = 0;
|
||||
|
||||
for(i=0;i<numread;i++) {
|
||||
switch(buffer[i]) {
|
||||
case '\r':
|
||||
buffer[i] = ' ';
|
||||
break;
|
||||
case '\n':
|
||||
buffer[i] = 0;
|
||||
buffer_pos = pos + i +1 ;
|
||||
|
||||
if (found)
|
||||
{
|
||||
/* write to playlist */
|
||||
rb->write(fdw, &buffer[line_end],
|
||||
rb->strlen( &buffer[line_end] ));
|
||||
rb->write(fdw, &crlf,1);
|
||||
|
||||
found = false ;
|
||||
results++ ;
|
||||
}
|
||||
line_end = i +1 ;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
if (!found && tolower(buffer[i]) == tolower(search_string[0]))
|
||||
{
|
||||
found = strpcasecmp(&search_string[0],&buffer[i]) ;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void search_buffer(void)
|
||||
{
|
||||
buffer_pos = 0;
|
||||
|
||||
fill_buffer(0);
|
||||
while ((buffer_pos+1) < file_size) {
|
||||
fill_buffer(buffer_pos);
|
||||
}
|
||||
}
|
||||
|
||||
static bool search_init(char* file)
|
||||
{
|
||||
if (!rb->kbd_input(search_string,sizeof search_string))
|
||||
{
|
||||
rb->lcd_clear_display();
|
||||
rb->splash(0, true, "Searching...");
|
||||
fd = rb->open(file, O_RDONLY);
|
||||
if (fd==-1)
|
||||
return false;
|
||||
|
||||
fdw = rb->creat(resultfile,0);
|
||||
|
||||
if (fdw < 0) {
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
rb->splash(HZ, true, "Failed to create result file!");
|
||||
#else
|
||||
rb->splash(HZ, true, "File creation failed");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
file_size = rb->lseek(fd, 0, SEEK_END);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false ;
|
||||
}
|
||||
|
||||
/* this is the plugin entry point */
|
||||
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
|
||||
{
|
||||
int ok;
|
||||
char *filename = parameter;
|
||||
char *p;
|
||||
|
||||
TEST_PLUGIN_API(api);
|
||||
|
||||
rb = api;
|
||||
|
||||
/* Check the extension. We only allow .m3u files. */
|
||||
if(!strpcasecmp(&filename[rb->strlen(filename)-4], ".m3u")) {
|
||||
rb->splash(HZ, true, "Not a .m3u file");
|
||||
return PLUGIN_ERROR;
|
||||
}
|
||||
|
||||
rb->strcpy(path, filename);
|
||||
|
||||
p = rb->strrchr(path, '/');
|
||||
if(p)
|
||||
*p = 0;
|
||||
|
||||
rb->snprintf(resultfile, MAX_PATH, "%s/search_result.m3u", path, p+1);
|
||||
ok = search_init(parameter);
|
||||
if (!ok) {
|
||||
return PLUGIN_ERROR;
|
||||
}
|
||||
search_buffer();
|
||||
|
||||
rb->lcd_clear_display();
|
||||
rb->splash(HZ, true, "Done");
|
||||
rb->close(fdw);
|
||||
rb->close(fd);
|
||||
|
||||
/* We fake a USB connection to force a reload of the file browser */
|
||||
return PLUGIN_USB_CONNECTED;
|
||||
}
|
|
@ -4,3 +4,4 @@ jpg,jpeg.rock,18 24 3C 3C 24 18
|
|||
ucl,rockbox_flash.rock,2A 7F 41 41 7F 2A
|
||||
rvf,video.rock,5D 7F 5D 7F 5D 7F
|
||||
mp3,vbrfix.rock,10 08 58 38 04 02
|
||||
m3u,search.rock,00 00 00 00 00 00
|
||||
|
|
Loading…
Reference in a new issue