summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/viewer.c145
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 @@
24PLUGIN_HEADER 24PLUGIN_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 */
171struct bookmarked_file_info { 173struct 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
179struct bookmark_file_data {
180 signed int bookmarked_files_count;
181 struct bookmarked_file_info bookmarks[];
182};
183
176struct preferences { 184struct 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
235static unsigned char buffer[BUFFER_SIZE + 1]; 241static 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}
1009static 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
1023static void viewer_load_settings(void) /* same name as global, but not the same file.. */ 1015static 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}
1065void 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
1102static void viewer_save_settings(void)/* same name as global, but not the same file.. */ 1097static 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
1113static void viewer_exit(void *parameter) 1118static void viewer_exit(void *parameter)