1 /***************************************************************************
4 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
5 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
6 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
7 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
11 * Copyright (C) 2003 Stefan Meyer
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ****************************************************************************/
27 #define BUFFER_SIZE 16384
33 static int results
= 0;
35 static char buffer
[BUFFER_SIZE
+1];
36 static char search_string
[60] ;
38 static int buffer_pos
; /* Position of the buffer in the file */
40 static int line_end
; /* Index of the end of line */
42 char resultfile
[MAX_PATH
];
45 static int strpcasecmp(const char *s1
, const char *s2
){
46 while (*s1
!= '\0' && tolower(*s1
) == tolower(*s2
)) {
54 static void fill_buffer(int pos
){
58 const char crlf
= '\n';
60 if (pos
>=file_size
-BUFFER_SIZE
)
61 pos
= file_size
-BUFFER_SIZE
;
65 rb
->lseek(fd
, pos
, SEEK_SET
);
66 numread
= rb
->read(fd
, buffer
, BUFFER_SIZE
);
71 for(i
=0;i
<numread
;i
++) {
78 buffer_pos
= pos
+ i
+1 ;
81 /* write to playlist */
82 rb
->write(fdw
, &buffer
[line_end
],
83 rb
->strlen( &buffer
[line_end
] ));
84 rb
->write(fdw
, &crlf
, 1);
94 if (!found
&& tolower(buffer
[i
]) == tolower(search_string
[0]))
95 found
= strpcasecmp(&search_string
[0],&buffer
[i
]) ;
99 DEBUGF("\n-------------------\n");
102 static void search_buffer(void){
106 while ((buffer_pos
+1) < file_size
)
107 fill_buffer(buffer_pos
);
110 static void clear_display(void){
113 rb
->screens
[i
]->clear_display();
117 static bool search_init(const char* file
){
118 rb
->memset(search_string
, 0, sizeof(search_string
));
120 if (!rb
->kbd_input(search_string
,sizeof search_string
)){
122 rb
->splash(0, "Searching...");
123 fd
= rb
->open(file
, O_RDONLY
);
127 fdw
= rb
->creat(resultfile
);
130 #ifdef HAVE_LCD_BITMAP
131 rb
->splash(HZ
, "Failed to create result file!");
133 rb
->splash(HZ
, "File creation failed");
138 file_size
= rb
->lseek(fd
, 0, SEEK_END
);
146 /* this is the plugin entry point */
147 enum plugin_status
plugin_start(const void* parameter
)
150 const char *filename
= parameter
;
153 DEBUGF("%s - %s\n", (char *)parameter
, &filename
[rb
->strlen(filename
)-4]);
154 /* Check the extension. We only allow .m3u files. */
155 if(rb
->strcasecmp(&filename
[rb
->strlen(filename
)-4], ".m3u") &&
156 rb
->strcasecmp(&filename
[rb
->strlen(filename
)-5], ".m3u8")) {
157 rb
->splash(HZ
, "Not a .m3u or .m3u8 file");
161 rb
->strcpy(path
, filename
);
163 p
= rb
->strrchr(path
, '/');
167 rb
->snprintf(resultfile
, MAX_PATH
, "%s/search_result.m3u", path
);
168 ok
= search_init(parameter
);
174 rb
->splash(HZ
, "Done");
178 /* We fake a USB connection to force a reload of the file browser */
179 return PLUGIN_USB_CONNECTED
;