/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * * $Id$ * * Copyright (C) 2007 Jonathan Gordon * * 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 #include #include #include #include "string.h" #include "atoi.h" #include #include "sprintf.h" #include "settings.h" #include "debug.h" #include "lang.h" #include "language.h" #include "kernel.h" #include "plugin.h" #include "filetypes.h" #include "screens.h" #include "icons.h" #include "dir.h" #include "file.h" #include "icons.h" #include "splash.h" #include "buffer.h" /* max filetypes (plugins & icons stored here) */ #if CONFIG_CODEC == SWCODEC #define MAX_FILETYPES 72 #else #define MAX_FILETYPES 48 #endif /* number of bytes for the binary icon */ #define ICON_LENGTH 6 /* mask for dynamic filetype info in attribute */ #define FILETYPES_MASK 0xFF00 #define ROCK_EXTENSION "rock" struct file_type { int icon; /* the icon which shall be used for it, NOICON if unknown */ bool viewer; /* true if the rock is in viewers, false if in rocks */ unsigned char attr; /* FILETYPES_MASK >> 8 */ char* plugin; /* Which plugin to use, NULL if unknown, or builtin */ char* extension; /* NULL for none */ }; static struct file_type filetypes[MAX_FILETYPES]; static int custom_filetype_icons[MAX_FILETYPES]; static bool custom_icons_loaded = false; static int filetype_count = 0; static unsigned char heighest_attr = 0; static char *filetypes_strdup(char* string) { char *buffer = (char*)buffer_alloc(strlen(string)+1); strcpy(buffer, string); return buffer; } static void read_builtin_types(void); static void read_config(char* config_file); #ifdef HAVE_LCD_BITMAP void read_viewer_theme_file(void) { char buffer[MAX_PATH]; int fd; char *ext, *icon; int i; custom_icons_loaded = false; custom_filetype_icons[0] = Icon_Folder; for (i=1; i 0) { if (!settings_parseline(buffer, &ext, &icon)) continue; for (i=0; i= '0' && *icon <= '9') custom_filetype_icons[i] = Icon_Last_Themeable + atoi(icon); break; } } } close(fd); custom_icons_loaded = true; } #endif void filetype_init(void) { /* set the directory item first */ filetypes[0].extension = NULL; filetypes[0].plugin = NULL; filetypes[0].attr = 0; filetypes[0].icon = Icon_Folder; filetype_count = 1; read_builtin_types(); read_config(VIEWERS_CONFIG); #ifdef HAVE_LCD_BITMAP read_viewer_theme_file(); #endif } /* remove all white spaces from string */ static void rm_whitespaces(char* str) { char *s = str; while (*str) { if (!isspace(*str)) { *s = *str; s++; } str++; } *s = '\0'; } static void read_builtin_types(void) { const struct filetype *types; int count, i; tree_get_filetypes(&types, &count); for(i=0; i>8; if (filetypes[filetype_count].attr > heighest_attr) heighest_attr = filetypes[filetype_count].attr; filetypes[filetype_count].icon = types[i].icon; filetype_count++; } } static void read_config(char* config_file) { char line[64], *s, *e; char extension[8], plugin[32]; bool viewer; int fd = open(config_file, O_RDONLY); if (fd < 0) return; /* config file is in the for ,, ignore line if either of the first two are missing */ while (read_line(fd, line, 64) > 0) { if (filetype_count >= MAX_FILETYPES) { gui_syncsplash(HZ, str(LANG_FILETYPES_FULL)); break; } rm_whitespaces(line); /* get the extention */ s = line; e = strchr(s, ','); if (!e) continue; *e = '\0'; strcpy(extension, s); /* get the plugin */ s = e+1; e = strchr(s, '/'); if (!e) continue; *e = '\0'; if (!strcasecmp("viewers", s)) viewer = true; else viewer = false; s = e+1; e = strchr(s, ','); if (!e) continue; *e = '\0'; strcpy(plugin, s); /* ok, store this plugin/extension, check icon after */ filetypes[filetype_count].extension = filetypes_strdup(extension); filetypes[filetype_count].plugin = filetypes_strdup(plugin); filetypes[filetype_count].viewer = viewer; filetypes[filetype_count].attr = heighest_attr +1; filetypes[filetype_count].icon = Icon_Questionmark; heighest_attr++; /* get the icon */ #ifdef HAVE_LCD_BITMAP s = e+1; if (*s == '*') filetypes[filetype_count].icon = atoi(s+1); else if (*s == '-') filetypes[filetype_count].icon = Icon_NOICON; else if (*s >= '0' && *s <= '9') filetypes[filetype_count].icon = Icon_Last_Themeable + atoi(s); #else filetypes[filetype_count].icon = Icon_NOICON; #endif filetype_count++; } } int filetype_get_attr(const char* file) { char *extension = strrchr(file, '.'); int i; if (!extension) return 0; extension++; for (i=0; i>8) == filetypes[i].attr) return i; } return -1; } int filetype_get_icon(int attr) { int index = find_attr(attr); if (index < 0) return Icon_NOICON; if (custom_icons_loaded) return custom_filetype_icons[index]; return filetypes[index].icon; } char* filetype_get_plugin(const struct entry* file) { static char plugin_name[MAX_PATH]; int index = find_attr(file->attr); if (index < 0) return NULL; if (filetypes[index].plugin == NULL) return NULL; snprintf(plugin_name, MAX_PATH, "%s/%s.%s", filetypes[index].viewer? VIEWERS_DIR: PLUGIN_DIR, filetypes[index].plugin, ROCK_EXTENSION); return plugin_name; } bool filetype_supported(int attr) { return find_attr(attr) >= 0; } int filetype_list_viewers(const char* current_file) { int i, count = 0; char *strings[MAX_FILETYPES/2]; struct menu_callback_with_desc cb_and_desc = { NULL, ID2P(LANG_ONPLAY_OPEN_WITH), Icon_Plugin }; struct menu_item_ex menu; for (i=0; i= 0) return filetype_load_plugin(strings[i], (void*)current_file); return i; } int filetype_load_plugin(const char* plugin, char* file) { int fd; char plugin_name[MAX_PATH]; snprintf(plugin_name, sizeof(plugin_name), "%s/%s.%s", VIEWERS_DIR, plugin, ROCK_EXTENSION); if ((fd = open(plugin_name,O_RDONLY))>=0) { close(fd); return plugin_load(plugin_name,file); } else { snprintf(plugin_name, sizeof(plugin_name), "%s/%s.%s", PLUGIN_DIR, plugin, ROCK_EXTENSION); if ((fd = open(plugin_name,O_RDONLY))>=0) { close(fd); return plugin_load(plugin_name,file); } } return PLUGIN_ERROR; }