diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/viewer.c | 145 |
1 files changed, 75 insertions, 70 deletions
diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c index 28b82baede..01293030a4 100644 --- a/apps/plugins/viewer.c +++ b/apps/plugins/viewer.c | |||
@@ -24,6 +24,7 @@ | |||
24 | PLUGIN_HEADER | 24 | PLUGIN_HEADER |
25 | 25 | ||
26 | #define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" /* binary file, so dont use .cfg */ | 26 | #define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" /* binary file, so dont use .cfg */ |
27 | #define BOOKMARKS_FILE "/.rockbox/viewers/viewer_bookmarks.dat" | ||
27 | 28 | ||
28 | #define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */ | 29 | #define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */ |
29 | #define MAX_COLUMNS 64 /* Max displayable string len (over-estimate) */ | 30 | #define MAX_COLUMNS 64 /* Max displayable string len (over-estimate) */ |
@@ -37,7 +38,7 @@ PLUGIN_HEADER | |||
37 | #define BOTTOM_SECTOR (buffer + 2*(SMALL_BLOCK_SIZE)) | 38 | #define BOTTOM_SECTOR (buffer + 2*(SMALL_BLOCK_SIZE)) |
38 | #define SCROLLBAR_WIDTH 6 | 39 | #define SCROLLBAR_WIDTH 6 |
39 | 40 | ||
40 | #define MAX_BOOKMARKED_FILES 10/*((signed)BUFFER_SIZE/(signed)sizeof(struct bookmarked_file_info))*/ | 41 | #define MAX_BOOKMARKED_FILES (((signed)BUFFER_SIZE/(signed)sizeof(struct bookmarked_file_info))-1) |
41 | 42 | ||
42 | /* Out-Of-Bounds test for any pointer to data in the buffer */ | 43 | /* Out-Of-Bounds test for any pointer to data in the buffer */ |
43 | #define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end) | 44 | #define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end) |
@@ -168,11 +169,18 @@ PLUGIN_HEADER | |||
168 | 169 | ||
169 | #endif | 170 | #endif |
170 | 171 | ||
172 | /* stuff for the bookmarking */ | ||
171 | struct bookmarked_file_info { | 173 | struct bookmarked_file_info { |
172 | long file_position; | 174 | long file_position; |
173 | int top_ptr_pos; | 175 | int top_ptr_pos; |
174 | char filename[MAX_PATH]; | 176 | char filename[MAX_PATH]; |
175 | }; | 177 | }; |
178 | |||
179 | struct bookmark_file_data { | ||
180 | signed int bookmarked_files_count; | ||
181 | struct bookmarked_file_info bookmarks[]; | ||
182 | }; | ||
183 | |||
176 | struct preferences { | 184 | struct preferences { |
177 | enum { | 185 | enum { |
178 | WRAP=0, | 186 | WRAP=0, |
@@ -227,9 +235,7 @@ struct preferences { | |||
227 | } scroll_mode; | 235 | } scroll_mode; |
228 | 236 | ||
229 | int autoscroll_speed; | 237 | int autoscroll_speed; |
230 | /* stuff for the bookmarking */ | 238 | |
231 | signed int bookmarked_files_count; | ||
232 | struct bookmarked_file_info bookmarks[MAX_BOOKMARKED_FILES]; | ||
233 | } prefs; | 239 | } prefs; |
234 | 240 | ||
235 | static unsigned char buffer[BUFFER_SIZE + 1]; | 241 | static unsigned char buffer[BUFFER_SIZE + 1]; |
@@ -1004,26 +1010,11 @@ static void viewer_reset_settings(void) | |||
1004 | prefs.scrollbar_mode = SB_OFF; | 1010 | prefs.scrollbar_mode = SB_OFF; |
1005 | #endif | 1011 | #endif |
1006 | prefs.autoscroll_speed = 1; | 1012 | prefs.autoscroll_speed = 1; |
1007 | prefs.bookmarked_files_count = 0; | ||
1008 | } | ||
1009 | static int get_bookmarked_position(char* filename) | ||
1010 | { | ||
1011 | int i; | ||
1012 | if (prefs.bookmarked_files_count > MAX_BOOKMARKED_FILES) | ||
1013 | prefs.bookmarked_files_count = MAX_BOOKMARKED_FILES; | ||
1014 | |||
1015 | for (i=0; i < prefs.bookmarked_files_count; i++) | ||
1016 | { | ||
1017 | if (!rb->strcmp(filename, prefs.bookmarks[i].filename)) | ||
1018 | return i; | ||
1019 | } | ||
1020 | return -1; | ||
1021 | } | 1013 | } |
1022 | 1014 | ||
1023 | static void viewer_load_settings(void) /* same name as global, but not the same file.. */ | 1015 | static void viewer_load_settings(void) /* same name as global, but not the same file.. */ |
1024 | { | 1016 | { |
1025 | int settings_fd; | 1017 | int settings_fd; |
1026 | int bookmarked_pos; | ||
1027 | 1018 | ||
1028 | settings_fd=rb->open(SETTINGS_FILE, O_RDONLY); | 1019 | settings_fd=rb->open(SETTINGS_FILE, O_RDONLY); |
1029 | if (settings_fd < 0) | 1020 | if (settings_fd < 0) |
@@ -1039,21 +1030,61 @@ static void viewer_load_settings(void) /* same name as global, but not the same | |||
1039 | 1030 | ||
1040 | rb->read(settings_fd, &prefs, sizeof(struct preferences)); | 1031 | rb->read(settings_fd, &prefs, sizeof(struct preferences)); |
1041 | rb->close(settings_fd); | 1032 | rb->close(settings_fd); |
1042 | 1033 | settings_fd = rb->open(BOOKMARKS_FILE, O_RDONLY); | |
1034 | if (settings_fd >= 0) | ||
1035 | { | ||
1036 | struct bookmark_file_data *data = (struct bookmark_file_data*)buffer; /* grab the text buffer */ | ||
1037 | struct bookmark_file_data dummy; | ||
1038 | int i; | ||
1039 | data->bookmarked_files_count = 0; | ||
1040 | rb->read(settings_fd, &data->bookmarked_files_count, sizeof(signed int)); /* figure out how many items to read */ | ||
1041 | if (data->bookmarked_files_count > MAX_BOOKMARKED_FILES) | ||
1042 | data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */ | ||
1043 | rb->read(settings_fd, data->bookmarks, | ||
1044 | sizeof(struct bookmarked_file_info) * data->bookmarked_files_count); | ||
1045 | rb->close(settings_fd); | ||
1046 | for (i=0; i < data->bookmarked_files_count; i++) | ||
1047 | { | ||
1048 | if (!rb->strcmp(file_name, data->bookmarks[i].filename)) | ||
1049 | break; | ||
1050 | } | ||
1051 | if (i < data->bookmarked_files_count) | ||
1052 | { | ||
1053 | /* it is in the list, write everything back in the correct order, and reload the file correctly */ | ||
1054 | settings_fd = rb->creat(BOOKMARKS_FILE, O_WRONLY); | ||
1055 | if (settings_fd >=0 ) | ||
1056 | { | ||
1057 | if (data->bookmarked_files_count > MAX_BOOKMARKED_FILES) | ||
1058 | data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */ | ||
1059 | rb->write (settings_fd, &data->bookmarked_files_count, sizeof(signed int)); | ||
1060 | /* write this item, then all up to it, then all after it */ | ||
1061 | rb->write (settings_fd, &data->bookmarks[i], sizeof(struct bookmarked_file_info)); | ||
1062 | rb->write (settings_fd, data->bookmarks, sizeof(struct bookmarked_file_info)*i); | ||
1063 | rb->write (settings_fd, &data->bookmarks[i+1], | ||
1064 | sizeof(struct bookmarked_file_info)*(data->bookmarked_files_count-i-1)); | ||
1065 | rb->close(settings_fd); | ||
1066 | } | ||
1067 | file_pos = data->bookmarks[i].file_position; | ||
1068 | screen_top_ptr = buffer + data->bookmarks[i].top_ptr_pos; | ||
1069 | } | ||
1070 | else /* not in list, write the list to the file */ | ||
1071 | { | ||
1072 | settings_fd = rb->creat(BOOKMARKS_FILE, O_WRONLY); | ||
1073 | if (settings_fd >=0 ) | ||
1074 | { | ||
1075 | if (++(data->bookmarked_files_count) > MAX_BOOKMARKED_FILES) | ||
1076 | data->bookmarked_files_count = MAX_BOOKMARKED_FILES; /* dump the older files */ | ||
1077 | rb->write (settings_fd, &data->bookmarked_files_count, sizeof(signed int)); | ||
1078 | rb->PREFIX(lseek)(settings_fd,sizeof(struct bookmarked_file_info),SEEK_CUR); | ||
1079 | // rb->memset(&dummy,0,sizeof(struct bookmarked_file_info)); /* the actual info will be written on exit */ | ||
1080 | //rb->write (settings_fd, &dummy, sizeof(struct bookmarked_file_info)); | ||
1081 | rb->write (settings_fd, data->bookmarks, sizeof(struct bookmarked_file_info)*(data->bookmarked_files_count-1)); | ||
1082 | rb->close(settings_fd); | ||
1083 | } | ||
1084 | } | ||
1085 | } /* BOOKMARKS_FILE opened ok */ | ||
1043 | init_need_scrollbar(); | 1086 | init_need_scrollbar(); |
1044 | 1087 | ||
1045 | bookmarked_pos = get_bookmarked_position(file_name); | ||
1046 | |||
1047 | if (bookmarked_pos < 0) | ||
1048 | { | ||
1049 | file_pos = 0; | ||
1050 | screen_top_ptr = buffer; | ||
1051 | } | ||
1052 | else | ||
1053 | { | ||
1054 | file_pos = prefs.bookmarks[bookmarked_pos].file_position; | ||
1055 | screen_top_ptr = buffer + prefs.bookmarks[bookmarked_pos].top_ptr_pos; | ||
1056 | } | ||
1057 | buffer_end = BUFFER_END(); /* Update whenever file_pos changes */ | 1088 | buffer_end = BUFFER_END(); /* Update whenever file_pos changes */ |
1058 | 1089 | ||
1059 | if (BUFFER_OOB(screen_top_ptr)) { | 1090 | if (BUFFER_OOB(screen_top_ptr)) { |
@@ -1062,52 +1093,26 @@ static void viewer_load_settings(void) /* same name as global, but not the same | |||
1062 | 1093 | ||
1063 | fill_buffer(file_pos, buffer, BUFFER_SIZE); | 1094 | fill_buffer(file_pos, buffer, BUFFER_SIZE); |
1064 | } | 1095 | } |
1065 | void viewer_rearrange_bookmarks(void) | ||
1066 | { | ||
1067 | int this_item = -1; | ||
1068 | struct bookmarked_file_info *buf = (struct bookmarked_file_info*)buffer; /* grab the text buffer */ | ||
1069 | /* copy the bookmakred file list to the text buffer, | ||
1070 | put this file at the top, then dump the filenames back and write to the fd */ | ||
1071 | rb->memcpy(buf,&prefs.bookmarks, sizeof(struct bookmarked_file_info)*MAX_BOOKMARKED_FILES); | ||
1072 | this_item = get_bookmarked_position(file_name); | ||
1073 | |||
1074 | /* regardless of its position in the list, put it on top */ | ||
1075 | rb->strcpy(prefs.bookmarks[0].filename, file_name); | ||
1076 | prefs.bookmarks[0].file_position = file_pos; | ||
1077 | prefs.bookmarks[0].top_ptr_pos = screen_top_ptr - buffer; | ||
1078 | |||
1079 | if (this_item < 0) | ||
1080 | { | ||
1081 | /* not in the list yet, so put it first then dump the list back */ | ||
1082 | if (prefs.bookmarked_files_count == MAX_BOOKMARKED_FILES) | ||
1083 | { | ||
1084 | /* bookmark list is full! dump the lru file*/ | ||
1085 | rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(MAX_BOOKMARKED_FILES-1)); | ||
1086 | } | ||
1087 | else | ||
1088 | { | ||
1089 | rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(prefs.bookmarked_files_count)); | ||
1090 | prefs.bookmarked_files_count++; | ||
1091 | } | ||
1092 | } | ||
1093 | else | ||
1094 | { | ||
1095 | /* dump up to this item, skip 1 then dummp the rest */ | ||
1096 | rb->memcpy(&prefs.bookmarks[1],buf, sizeof(struct bookmarked_file_info)*(this_item)); | ||
1097 | rb->memcpy(&prefs.bookmarks[this_item+1],&buf[this_item+1], | ||
1098 | sizeof(struct bookmarked_file_info)*(MAX_BOOKMARKED_FILES-this_item-1)); | ||
1099 | } | ||
1100 | } | ||
1101 | 1096 | ||
1102 | static void viewer_save_settings(void)/* same name as global, but not the same file.. */ | 1097 | static void viewer_save_settings(void)/* same name as global, but not the same file.. */ |
1103 | { | 1098 | { |
1104 | int settings_fd; | 1099 | int settings_fd; |
1105 | settings_fd = rb->creat(SETTINGS_FILE, O_WRONLY); /* create the settings file */ | 1100 | settings_fd = rb->creat(SETTINGS_FILE, O_WRONLY); /* create the settings file */ |
1106 | |||
1107 | viewer_rearrange_bookmarks(); | ||
1108 | 1101 | ||
1109 | rb->write (settings_fd, &prefs, sizeof(struct preferences)); | 1102 | rb->write (settings_fd, &prefs, sizeof(struct preferences)); |
1110 | rb->close(settings_fd); | 1103 | rb->close(settings_fd); |
1104 | |||
1105 | settings_fd = rb->open(BOOKMARKS_FILE, O_WRONLY|O_CREAT); | ||
1106 | if (settings_fd >= 0 ) | ||
1107 | { | ||
1108 | struct bookmarked_file_info b = {0,0,""}; | ||
1109 | b.file_position = file_pos; | ||
1110 | b.top_ptr_pos = screen_top_ptr - buffer; | ||
1111 | rb->strcpy(b.filename,file_name); | ||
1112 | rb->PREFIX(lseek)(settings_fd,sizeof(signed int),SEEK_SET); | ||
1113 | rb->write (settings_fd, &b, sizeof(struct bookmarked_file_info)); | ||
1114 | rb->close(settings_fd); | ||
1115 | } | ||
1111 | } | 1116 | } |
1112 | 1117 | ||
1113 | static void viewer_exit(void *parameter) | 1118 | static void viewer_exit(void *parameter) |