Index: apps/plugins/disktidy.c =================================================================== --- apps/plugins/disktidy.c (revision 17210) +++ apps/plugins/disktidy.c (working copy) @@ -30,15 +30,15 @@ TIDY_RETURN_ABORT = 3, }; -/* Which systems junk are we removing */ -enum tidy_system -{ - TIDY_MAC = 0, - TIDY_WIN = 1, - TIDY_NIX = 2, - TIDY_ALL = 3, +struct clean_item{ + char* name; + int type; }; +#define CFG_FILE PLUGIN_APPS_DIR"/disktidy.cfg" +#define ALL_OS "" +#define FILES_TO_CLEAN "Files To Clean" + /* variable button definitions */ #if CONFIG_KEYPAD == PLAYER_PAD #define TIDY_STOP BUTTON_STOP @@ -106,7 +106,7 @@ rb->lcd_update(); } -void tidy_get_absolute_path(struct dirent *entry, char *fullname, +void tidy_get_absolute_path(struct dirent *entry, char *fullname, const char* name) { /* gets absolute path using dirent and name */ @@ -126,16 +126,16 @@ int button; DIR *dir; char fullname[MAX_PATH]; - + /* display status text */ tidy_lcd_status(name, removed); - + rb->yield(); - + dir = rb->opendir(name); if (dir) { - while((status == TIDY_RETURN_OK) && ((entry = rb->readdir(dir)) != 0)) + while ((status == TIDY_RETURN_OK) && ((entry = rb->readdir(dir)) != 0)) /* walk directory */ { /* check for user input and usb connect */ @@ -150,12 +150,12 @@ rb->closedir(dir); return TIDY_RETURN_USB; } - + rb->yield(); - + /* get absolute path */ tidy_get_absolute_path(entry, fullname, name); - + if (entry->attribute & ATTR_DIRECTORY) { /* dir ignore "." and ".." */ @@ -184,8 +184,8 @@ return status; } -enum tidy_return tidy_clean(const char *name, int *removed, \ - enum tidy_system system) +enum tidy_return tidy_clean(const char *name, int *removed, + const struct clean_item *items, int num_items) { /* deletes junk files and dirs left by system */ struct dirent *entry; @@ -194,16 +194,17 @@ int del; /* has the item been deleted */ DIR *dir; char fullname[MAX_PATH]; - + int i; + /* display status text */ tidy_lcd_status(name, removed); - + rb->yield(); - + dir = rb->opendir(name); if (dir) { - while((status == TIDY_RETURN_OK) && ((entry = rb->readdir(dir)) != 0)) + while ((status == TIDY_RETURN_OK) && ((entry = rb->readdir(dir)) != 0)) /* walk directory */ { /* check for user input and usb connect */ @@ -218,9 +219,9 @@ rb->closedir(dir); return TIDY_RETURN_USB; } - + rb->yield(); - + if (entry->attribute & ATTR_DIRECTORY) { /* directory ignore "." and ".." */ @@ -228,44 +229,30 @@ (rb->strcmp(entry->d_name, "..") != 0)) { del = 0; - + /* get absolute path */ tidy_get_absolute_path(entry, fullname, name); - + /* check if we are in root directory "/" */ if (rb->strcmp(name, "/") == 0) { - if ((system == TIDY_MAC) || (system == TIDY_ALL)) - { - /* mac directories */ - if (rb->strcmp(entry->d_name, ".Trashes") == 0) + for(i = 0; i < num_items; i++){ + if (items[i].type==ATTR_DIRECTORY && + rb->strncmp(entry->d_name, items[i].name, + rb->strlen(items[i].name)) == 0) { /* delete dir */ tidy_removedir(fullname, removed); del = 1; + break; } } - - if (del == 0) - { - if ((system == TIDY_WIN) || (system == TIDY_ALL)) - { - /* windows directories */ - if (rb->strcmp(entry->d_name, "Recycled") == 0 \ - || rb->strcmp(entry->d_name, "System Volume Information") == 0) - { - /* delete dir */ - tidy_removedir(fullname, removed); - del = 1; - } - } - } } - + if (del == 0) { /* dir not deleted so clean it */ - status = tidy_clean(fullname, removed, system); + status = tidy_clean(fullname, removed, items, num_items); } } } @@ -273,64 +260,23 @@ { /* file */ del = 0; - - if ((system == TIDY_MAC) || (system == TIDY_ALL)) - { - /* remove mac files */ - if ((rb->strcmp(entry->d_name, ".DS_Store") == 0) || \ - (rb->strncmp(entry->d_name, "._", 2) == 0)) + for(i=0; istrncmp(entry->d_name, items[i].name, + rb->strlen(items[i].name)) == 0) { *removed += 1; /* increment removed files counter */ - + /* get absolute path */ char fullname[MAX_PATH]; tidy_get_absolute_path(entry, fullname, name); - + /* delete file */ rb->remove(fullname); del = 1; + break; } } - - if (del == 0) - { - if ((system == TIDY_WIN) || (system == TIDY_ALL)) - { - /* remove windows files*/ - if ((rb->strcmp(entry->d_name, "Thumbs.db") == 0)) - { - *removed += 1; /* increment removed files counter */ - - /* get absolute path */ - char fullname[MAX_PATH]; - tidy_get_absolute_path(entry, fullname, name); - - /* delete file */ - rb->remove(fullname); - del = 1; - } - } - } - if (del == 0) - { - if ((system ==TIDY_NIX) || (system == TIDY_ALL)) - { - /* remove linux files*/ - if ((rb->strcmp(entry->d_name, ".dolphinview") == 0) || \ - (rb->strncmp(entry->d_name, ".d3lphinview", 2) == 0)) - { - *removed += 1; /* increment removed files counter */ - - /* get absolute path */ - char fullname[MAX_PATH]; - tidy_get_absolute_path(entry, fullname, name); - - /* delete file */ - rb->remove(fullname); - del = 1; - } - } - } } } rb->closedir(dir); @@ -342,23 +288,69 @@ } } -enum plugin_status tidy_do(enum tidy_system system) +enum plugin_status tidy_do(char* buffer, const char* system, int len) { /* clean disk and display num of items removed */ int removed = 0; enum tidy_return status; char text[24]; /* "Cleaned up nnnnn items" */ - + #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(true); #endif - - status = tidy_clean("/", &removed, system); - + +#define MAX_ITEMS 100 + struct clean_item items[MAX_ITEMS]; + ssize_t pos = 0; + bool begin = false; + int num_items = 0; + bool all = rb->strcmp(system, ALL_OS) == 0; + + while (pos < len && num_items < MAX_ITEMS) { + if (buffer[pos] == '<' && /* find os */ + (rb->strncmp(system, &(buffer[pos]), rb->strlen(system)) == 0 || all) ) + { + while (buffer[pos++] != '>') /* move pos to end */ + { + } + begin=true; + } + if (begin) { + if (buffer[pos] == '<' && !all) /* next os */ + { + break; + } + if (buffer[pos] == '\n' || buffer[pos] == '\r') + { + buffer[pos] = 0; /* replace \r and \n with 0 */ + } + else if (buffer[pos] != 0) /* collect items */ + { + items[num_items].name =& (buffer[pos]); + while (buffer[pos] != '\n' && buffer[pos] != '\r') + { + ++pos; + } + buffer[pos] = 0; + if (buffer[pos-1] == '/') /* directory? */ + { + items[num_items++].type = ATTR_DIRECTORY; + buffer[pos-1] = 0; /* delete '/' */ + } + else + { + items[num_items++].type = ATTR_ARCHIVE; + } + } + } + ++pos; + } + status = tidy_clean("/", &removed, items, num_items); + #ifdef HAVE_ADJUSTABLE_CPU_FREQ rb->cpu_boost(false); #endif - + if ((status == TIDY_RETURN_OK) || (status == TIDY_RETURN_ABORT)) { rb->lcd_clear_display(); @@ -373,37 +365,54 @@ return status; } -int tidy_lcd_menu(void) +char* tidy_lcd_menu(char *buffer, int len) { - int selection, ret = 3; + int selection; + char* ret=ALL_OS; bool menu_quit = false; MENUITEM_STRINGLIST(menu,"Disktidy Menu",NULL,"Start Cleaning", - "Files to Clean","Quit"); + FILES_TO_CLEAN,"Quit"); - static const struct opt_items system_option[] = + while (!menu_quit) { - { "Mac", -1 }, - { "Windows", -1 }, - { "Linux", -1 }, - { "All", -1 } - }; - - while (!menu_quit) - { switch(rb->do_menu(&menu, &selection, NULL, false)) { - case 0: menu_quit = true; /* start cleaning */ break; case 1: - rb->set_option("Files to Clean", &ret, INT, system_option, 4, NULL); + { + #define MAX_OS 10 + static struct opt_items system_option[MAX_OS]; + int os, num_os = 0, pos = 0; + while (pos < len && num_os < MAX_OS) + { + if(buffer[pos] == '<') /* find os */ + { + system_option[num_os].string = &buffer[pos]; + system_option[num_os++].voice_id = -1; + + while(buffer[pos++] != '>') /* move pos to end */ + { + } + buffer[pos]=0; + } + ++pos; + } + system_option[num_os].string = ALL_OS; + system_option[num_os++].voice_id = -1; + os = num_os; + + rb->set_option( + FILES_TO_CLEAN, &os, INT, system_option, num_os, NULL); + + ret = (char*)system_option[os].string; break; - + } default: - ret = 99; /* exit plugin */ + ret = NULL; /* exit plugin */ menu_quit = true; break; } @@ -414,55 +423,79 @@ /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - enum tidy_system system = TIDY_ALL; enum tidy_return status; (void)parameter; rb = api; - - switch(tidy_lcd_menu()) + + /* open/read cfg file */ + size_t size; + char* buffer = rb->plugin_get_buffer(&size); + int fd = rb->open(CFG_FILE, O_RDONLY); + + if (fd < 0) { - case 0: - system = TIDY_MAC; - break; - case 1: - system = TIDY_WIN; - break; - case 2: - system = TIDY_NIX; - break; - case 3: - system = TIDY_ALL; - break; - case 99: - return PLUGIN_OK; - default: - system = TIDY_ALL; + fd = rb->creat(CFG_FILE); /* create cfg sample */ + rb->write(fd, "\r\n", 11); + rb->write(fd, "Recycled/\r\n", 11); + rb->write(fd, "System Volume Information/\r\n", 28); + rb->write(fd, "Thumbs.db\r\n", 11); + rb->write(fd, "\r\n", 7); + rb->write(fd, ".Trashes/\r\n", 11); + rb->write(fd, ".DS_Store\r\n", 11); + rb->write(fd, "._\r\n", 4); + rb->write(fd, "\r\n", 9); + rb->write(fd, ".dolphinview\r\n", 14); + rb->write(fd, ".d3lphinview\r\n", 14); + rb->write(fd, ".Trash-\r\n", 9); + rb->close(fd); + return plugin_start(api, NULL); } + if (size < (unsigned)rb->filesize(fd)) + { + rb->splash(HZ, "Not Enough Memory!"); + } + + ssize_t len = rb->read(fd, buffer, size); + + rb->close(fd); + + if (len <= 0) { + return PLUGIN_ERROR; + } + + buffer[len] = 0; + + char *system = tidy_lcd_menu(buffer,len); + if (system == NULL) + { + return PLUGIN_OK; + } + while (true) { - status = tidy_do(system); + status = tidy_do(buffer, system, len); - switch (status) - { - case TIDY_RETURN_OK: - return PLUGIN_OK; - case TIDY_RETURN_ERROR: - return PLUGIN_ERROR; - case TIDY_RETURN_USB: - return PLUGIN_USB_CONNECTED; - case TIDY_RETURN_ABORT: - return PLUGIN_OK; - } + switch (status) + { + case TIDY_RETURN_OK: + return PLUGIN_OK; + case TIDY_RETURN_ERROR: + return PLUGIN_ERROR; + case TIDY_RETURN_USB: + return PLUGIN_USB_CONNECTED; + case TIDY_RETURN_ABORT: + return PLUGIN_OK; + } } - + if (rb->default_event_handler(rb->button_get(false)) == SYS_USB_CONNECTED) + { return PLUGIN_USB_CONNECTED; - + } + rb->yield(); - - return PLUGIN_OK; }