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
32 static int file_size
, bomsize
;
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 rb
->lseek(fd
, pos
+bomsize
, SEEK_SET
);
61 numread
= rb
->read(fd
, buffer
, MIN(BUFFER_SIZE
, file_size
-pos
));
66 for(i
=0;i
<numread
;i
++) {
73 buffer_pos
= pos
+ i
+1 ;
76 /* write to playlist */
77 rb
->write(fdw
, &buffer
[line_end
],
78 rb
->strlen( &buffer
[line_end
] ));
79 rb
->write(fdw
, &crlf
, 1);
89 if (!found
&& tolower(buffer
[i
]) == tolower(search_string
[0]))
90 found
= strpcasecmp(&search_string
[0],&buffer
[i
]) ;
94 DEBUGF("\n-------------------\n");
97 static void search_buffer(void){
101 while ((buffer_pos
+1) < file_size
)
102 fill_buffer(buffer_pos
);
105 static void clear_display(void){
108 rb
->screens
[i
]->clear_display();
112 static bool search_init(const char* file
){
113 rb
->memset(search_string
, 0, sizeof(search_string
));
115 if (!rb
->kbd_input(search_string
,sizeof search_string
)){
117 rb
->splash(0, "Searching...");
118 fd
= rb
->open_utf8(file
, O_RDONLY
);
122 bomsize
= rb
->lseek(fd
, 0, SEEK_CUR
);
124 fdw
= rb
->open_utf8(resultfile
, O_WRONLY
|O_CREAT
|O_TRUNC
);
126 fdw
= rb
->open(resultfile
, O_WRONLY
|O_CREAT
|O_TRUNC
, 0666);
129 #ifdef HAVE_LCD_BITMAP
130 rb
->splash(HZ
, "Failed to create result file!");
132 rb
->splash(HZ
, "File creation failed");
138 file_size
= rb
->lseek(fd
, 0, SEEK_END
) - bomsize
;
146 /* this is the plugin entry point */
147 enum plugin_status
plugin_start(const void* parameter
)
150 const char *filename
= parameter
;
152 if(!parameter
) return PLUGIN_ERROR
;
154 DEBUGF("%s - %s\n", (char *)parameter
, &filename
[rb
->strlen(filename
)-4]);
155 /* Check the extension. We only allow .m3u files. */
156 if (!(p
= rb
->strrchr(filename
, '.')) ||
157 (rb
->strcasecmp(p
, ".m3u") && rb
->strcasecmp(p
, ".m3u8")))
159 rb
->splash(HZ
, "Not a .m3u or .m3u8 file");
163 rb
->strcpy(path
, filename
);
165 p
= rb
->strrchr(path
, '/');
169 rb
->snprintf(resultfile
, MAX_PATH
, "%s/search_result.m3u", path
);
170 ok
= search_init(parameter
);
176 rb
->splash(HZ
, "Done");
179 rb
->reload_directory();