Index: apps/plugins/disktidy.c =================================================================== --- apps/plugins/disktidy.c (revision 16414) +++ apps/plugins/disktidy.c (working copy) @@ -30,14 +30,14 @@ TIDY_RETURN_ABORT = 3, }; -/* Which systems junk are we removing */ -enum tidy_system -{ - TIDY_MAC = 0, - TIDY_WIN = 1, - TIDY_BOTH = 2, +struct clean_item{ + char* name; + int type; }; +#define ALL_OS "" +#define FILES_TO_CLEAN "Files To Clean" + /* variable button definitions */ #if CONFIG_KEYPAD == PLAYER_PAD #define TIDY_STOP BUTTON_STOP @@ -96,7 +96,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 */ @@ -116,12 +116,12 @@ int button; DIR *dir; char fullname[MAX_PATH]; - + /* display status text */ tidy_lcd_status(name, removed); - + rb->yield(); - + dir = rb->opendir(name); if (dir) { @@ -140,12 +140,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 ".." */ @@ -174,8 +174,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; @@ -184,12 +184,13 @@ 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) { @@ -208,9 +209,9 @@ rb->closedir(dir); return TIDY_RETURN_USB; } - + rb->yield(); - + if (entry->attribute & ATTR_DIRECTORY) { /* directory ignore "." and ".." */ @@ -218,44 +219,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_BOTH)) - { - /* mac directories */ - if (rb->strcmp(entry->d_name, ".Trashes") == 0) - { - /* delete dir */ - tidy_removedir(fullname, removed); - del = 1; - } - } - - if (del == 0) - { - if ((system == TIDY_WIN) || (system == TIDY_BOTH)) - { - /* 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; - } - } - } + for(i=0; istrncmp(entry->d_name, items[i].name, + rb->strlen(items[i].name)) == 0) + { + /* delete dir */ + tidy_removedir(fullname, removed); + del = 1; + break; + } + } } - + if (del == 0) { /* dir not deleted so clean it */ - status = tidy_clean(fullname, removed, system); + status = tidy_clean(fullname, removed, items, num_items); } } } @@ -263,45 +250,24 @@ { /* file */ del = 0; - - if ((system == TIDY_MAC) || (system == TIDY_BOTH)) - { - /* 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_BOTH)) - { - /* 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; - } - } - } - } + } } rb->closedir(dir); return status; @@ -312,23 +278,56 @@ } } -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(posstrncmp(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(); @@ -343,36 +342,47 @@ return status; } -int tidy_lcd_menu(void) +char* tidy_lcd_menu(char *buffer, int len) { - int selection, ret = 2; + int selection; + char* ret=ALL_OS; bool menu_quit = false; - + MENUITEM_STRINGLIST(menu,"Disktidy Menu",NULL,"Start Cleaning", - "Files to Clean","Quit"); - - static const struct opt_items system_option[3] = + FILES_TO_CLEAN,"Quit"); + while (!menu_quit) { - { "Mac", -1 }, - { "Windows", -1 }, - { "Both", -1 } - }; - - while (!menu_quit) - { switch(rb->do_menu(&menu, &selection)) { - + case 0: menu_quit = true; /* start cleaning */ break; - - case 1: - rb->set_option("Files to Clean", &ret, INT, system_option, 3, NULL); + + case 1:{ + #define MAX_OS 10 + static struct opt_items system_option[MAX_OS]; + int os, num_os=0, pos=0; + while(posset_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; } @@ -383,33 +393,33 @@ /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - enum tidy_system system = TIDY_BOTH; enum tidy_return status; (void)parameter; rb = api; - - switch(tidy_lcd_menu()) - { - case 0: - system = TIDY_MAC; - break; - case 1: - system = TIDY_WIN; - break; - case 2: - system = TIDY_BOTH; - break; - case 99: - return PLUGIN_OK; - default: - system = TIDY_BOTH; + + /* open/read cfg file */ + size_t size; + char* buffer=rb->plugin_get_buffer(&size); + int fd=rb->open(PLUGIN_APPS_DIR"/disktidy.cfg", O_RDONLY); + if(fd<0){ + rb->splash(HZ, "Cannot open cfg file!"); + return PLUGIN_ERROR; } + 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) { @@ -420,15 +430,13 @@ case TIDY_RETURN_USB: return PLUGIN_USB_CONNECTED; case TIDY_RETURN_ABORT: - return PLUGIN_OK; + return PLUGIN_OK; } } - + if (rb->default_event_handler(rb->button_get(false)) == SYS_USB_CONNECTED) return PLUGIN_USB_CONNECTED; - + rb->yield(); - - return PLUGIN_OK; } Index: apps/plugins/disktidy.cfg =================================================================== --- apps/plugins/disktidy.cfg (revision 0) +++ apps/plugins/disktidy.cfg (revision 0) @@ -0,0 +1,8 @@ + +Recycled/ +System Volume Information/ +Thumbs.db + +.Trashes/ +.DS_Store +._ Property changes on: apps/plugins/disktidy.cfg ___________________________________________________________________ Name: svn:executable + * Index: tools/buildzip.pl =================================================================== --- tools/buildzip.pl (revision 16414) +++ tools/buildzip.pl (working copy) @@ -336,7 +336,7 @@ } `cp $ROOT/apps/tagnavi.config .rockbox/`; - + `cp $ROOT/apps/plugins/disktidy.cfg .rockbox/rocks/apps/`; # disktidy if($bitmap) { `cp $ROOT/apps/plugins/sokoban.levels .rockbox/rocks/games/`; # sokoban levels `cp $ROOT/apps/plugins/snake2.levels .rockbox/rocks/games/`; # snake2 levels