summaryrefslogtreecommitdiff
path: root/apps/plugins/textviewer/tv_settings.c
diff options
context:
space:
mode:
authorYoshihisa Uchida <uchida@rockbox.org>2010-04-14 11:19:30 +0000
committerYoshihisa Uchida <uchida@rockbox.org>2010-04-14 11:19:30 +0000
commit4157a31924be37b440c92df8a141ada7e7bfb704 (patch)
treed26a07f45b66aa8fc35ff8bec22aa15823fc037e /apps/plugins/textviewer/tv_settings.c
parent2ca2684ede50f145985ae147ca52aef27f7580b2 (diff)
downloadrockbox-4157a31924be37b440c92df8a141ada7e7bfb704.tar.gz
rockbox-4157a31924be37b440c92df8a141ada7e7bfb704.zip
rvert r25644
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25645 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/textviewer/tv_settings.c')
-rw-r--r--apps/plugins/textviewer/tv_settings.c464
1 files changed, 0 insertions, 464 deletions
diff --git a/apps/plugins/textviewer/tv_settings.c b/apps/plugins/textviewer/tv_settings.c
deleted file mode 100644
index 463e6a42de..0000000000
--- a/apps/plugins/textviewer/tv_settings.c
+++ /dev/null
@@ -1,464 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 Gilles Roux
11 * 2003 Garrett Derner
12 * 2010 Yoshihisa Uchida
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
18 *
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
21 *
22 ****************************************************************************/
23#include "plugin.h"
24#include <ctype.h>
25
26/* global settings file
27 * binary file, so dont use .cfg
28 *
29 * setting file format
30 *
31 * part byte count
32 * --------------------------------
33 * 'TVGS' 4
34 * version 1
35 * word_mode 1
36 * line_mode 1
37 * view_mode 1
38 * encoding 1
39 * scrollbar_mode 1
40 * need_scrollbar 1
41 * page_mode 1
42 * page_number_mode 1
43 * title_mode 1
44 * scroll_mode 1
45 * autoscroll_speed 1
46 * font name MAX_PATH
47 */
48#define GLOBAL_SETTINGS_FILE VIEWERS_DIR "/viewer.dat"
49
50/* temporary file */
51#define GLOBAL_SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp"
52
53#define GLOBAL_SETTINGS_HEADER "\x54\x56\x47\x53\x31" /* header="TVGS" version=1 */
54#define GLOBAL_SETTINGS_H_SIZE 5
55
56/* preferences and bookmarks at each file
57 * binary file, so dont use .cfg
58 *
59 * setting file format
60 *
61 * part byte count
62 * --------------------------------
63 * 'TVS' 3
64 * version 1
65 * file count 2
66 * [1st file]
67 * file path MAX_PATH
68 * next file pos 2
69 * [preferences]
70 * word_mode 1
71 * line_mode 1
72 * view_mode 1
73 * encoding 1
74 * scrollbar_mode 1
75 * need_scrollbar 1
76 * page_mode 1
77 * header_mode 1
78 * footer_mode 1
79 * scroll_mode 1
80 * autoscroll_speed 1
81 * font name MAX_PATH
82 * bookmark count 1
83 * [1st bookmark]
84 * file_position 4
85 * page 2
86 * line 1
87 * flag 1
88 * [2nd bookmark]
89 * ...
90 * [last bookmark]
91 * [2nd file]
92 * ...
93 * [last file]
94 */
95#define SETTINGS_FILE VIEWERS_DIR "/viewer_file.dat"
96
97/* temporary file */
98#define SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp"
99
100#define SETTINGS_HEADER "\x54\x56\x53\x32" /* header="TVS" version=2 */
101#define SETTINGS_H_SIZE 4
102
103#ifndef HAVE_LCD_BITMAP
104#define BOOKMARK_ICON "\xee\x84\x81\x00"
105#endif
106
107#define PREFERENCES_SIZE (11 + MAX_PATH)
108
109
110struct preferences prefs;
111struct preferences old_prefs;
112
113static int fd;
114static const char *file_name;
115static int cline = 1;
116static int cpage = 1;
117static int lpage = 0;
118
119static void viewer_default_preferences(void)
120{
121 prefs.word_mode = WRAP;
122 prefs.line_mode = NORMAL;
123 prefs.view_mode = NARROW;
124 prefs.scroll_mode = PAGE;
125 prefs.page_mode = NO_OVERLAP;
126 prefs.scrollbar_mode = SB_OFF;
127 rb->memset(prefs.font, 0, MAX_PATH);
128#ifdef HAVE_LCD_BITMAP
129 prefs.header_mode = HD_BOTH;
130 prefs.footer_mode = FT_BOTH;
131 rb->snprintf(prefs.font, MAX_PATH, "%s", rb->global_settings->font_file);
132#else
133 prefs.header_mode = HD_NONE;
134 prefs.footer_mode = FT_NONE;
135#endif
136 prefs.autoscroll_speed = 1;
137 /* Set codepage to system default */
138 prefs.encoding = rb->global_settings->default_codepage;
139}
140
141static bool viewer_read_preferences(int pfd)
142{
143 unsigned char buf[PREFERENCES_SIZE];
144 unsigned char *p = buf;
145
146 if (rb->read(pfd, buf, sizeof(buf)) != sizeof(buf))
147 return false;
148
149 prefs.word_mode = *p++;
150 prefs.line_mode = *p++;
151 prefs.view_mode = *p++;
152 prefs.encoding = *p++;
153 prefs.scrollbar_mode = *p++;
154 prefs.need_scrollbar = *p++;
155 prefs.page_mode = *p++;
156 prefs.header_mode = *p++;
157 prefs.footer_mode = *p++;
158 prefs.scroll_mode = *p++;
159 prefs.autoscroll_speed = *p++;
160 rb->memcpy(prefs.font, p, MAX_PATH);
161
162 return true;
163}
164
165static bool viewer_write_preferences(int pfd)
166{
167 unsigned char buf[PREFERENCES_SIZE];
168 unsigned char *p = buf;
169
170 *p++ = prefs.word_mode;
171 *p++ = prefs.line_mode;
172 *p++ = prefs.view_mode;
173 *p++ = prefs.encoding;
174 *p++ = prefs.scrollbar_mode;
175 *p++ = prefs.need_scrollbar;
176 *p++ = prefs.page_mode;
177 *p++ = prefs.header_mode;
178 *p++ = prefs.footer_mode;
179 *p++ = prefs.scroll_mode;
180 *p++ = prefs.autoscroll_speed;
181 rb->memcpy(p, prefs.font, MAX_PATH);
182
183 return (rb->write(pfd, buf, sizeof(buf)) == sizeof(buf));
184}
185
186static bool viewer_load_global_settings(void)
187{
188 unsigned buf[GLOBAL_SETTINGS_H_SIZE];
189 int sfd = rb->open(GLOBAL_SETTINGS_FILE, O_RDONLY);
190
191 if (sfd < 0)
192 return false;
193
194 if ((rb->read(sfd, buf, GLOBAL_SETTINGS_H_SIZE) != GLOBAL_SETTINGS_H_SIZE) ||
195 rb->memcmp(buf, GLOBAL_SETTINGS_HEADER, GLOBAL_SETTINGS_H_SIZE) ||
196 !viewer_read_preferences(sfd))
197 {
198 rb->close(sfd);
199 return false;
200 }
201 rb->close(sfd);
202 return true;
203}
204
205static bool viewer_save_global_settings(void)
206{
207 int sfd = rb->open(GLOBAL_SETTINGS_TMP_FILE, O_WRONLY|O_CREAT|O_TRUNC);
208
209 if (sfd < 0)
210 return false;
211
212 if (rb->write(sfd, &GLOBAL_SETTINGS_HEADER, GLOBAL_SETTINGS_H_SIZE)
213 != GLOBAL_SETTINGS_H_SIZE ||
214 !viewer_write_preferences(sfd))
215 {
216 rb->close(sfd);
217 rb->remove(GLOBAL_SETTINGS_TMP_FILE);
218 return false;
219 }
220 rb->close(sfd);
221 rb->remove(GLOBAL_SETTINGS_FILE);
222 rb->rename(GLOBAL_SETTINGS_TMP_FILE, GLOBAL_SETTINGS_FILE);
223 return true;
224}
225
226void viewer_load_settings(void)
227{
228 unsigned char buf[MAX_PATH+2];
229 unsigned int fcount;
230 unsigned int i;
231 bool res = false;
232 int sfd;
233 unsigned int size;
234
235 sfd = rb->open(SETTINGS_FILE, O_RDONLY);
236 if (sfd < 0)
237 goto read_end;
238
239 if ((rb->read(sfd, buf, SETTINGS_H_SIZE+2) != SETTINGS_H_SIZE+2) ||
240 rb->memcmp(buf, SETTINGS_HEADER, SETTINGS_H_SIZE))
241 {
242 /* illegal setting file */
243 rb->close(sfd);
244
245 if (rb->file_exists(SETTINGS_FILE))
246 rb->remove(SETTINGS_FILE);
247
248 goto read_end;
249 }
250
251 fcount = (buf[SETTINGS_H_SIZE] << 8) | buf[SETTINGS_H_SIZE+1];
252 for (i = 0; i < fcount; i++)
253 {
254 if (rb->read(sfd, buf, MAX_PATH+2) != MAX_PATH+2)
255 break;
256
257 size = (buf[MAX_PATH] << 8) | buf[MAX_PATH+1];
258 if (rb->strcmp(buf, file_name))
259 {
260 if (rb->lseek(sfd, size, SEEK_CUR) < 0)
261 break;
262 continue;
263 }
264 if (!viewer_read_preferences(sfd))
265 break;
266
267 res = viewer_read_bookmark_infos(sfd);
268 break;
269 }
270
271 rb->close(sfd);
272
273read_end:
274 if (!res)
275 {
276 /* load global settings */
277 if (!viewer_load_global_settings())
278 viewer_default_preferences();
279
280 file_pos = 0;
281 screen_top_ptr = buffer;
282 cpage = 1;
283 cline = 1;
284 bookmark_count = 0;
285 }
286
287 rb->memcpy(&old_prefs, &prefs, sizeof(struct preferences));
288 calc_max_width();
289
290 if (bookmark_count > 1)
291 viewer_select_bookmark(-1);
292 else if (bookmark_count == 1)
293 {
294 int screen_pos;
295 int screen_top;
296
297 screen_pos = bookmarks[0].file_position;
298 screen_top = screen_pos % buffer_size;
299 file_pos = screen_pos - screen_top;
300 screen_top_ptr = buffer + screen_top;
301 cpage = bookmarks[0].page;
302 cline = bookmarks[0].line;
303 }
304
305 viewer_remove_last_read_bookmark();
306
307 check_bom();
308 get_filesize();
309
310 buffer_end = BUFFER_END(); /* Update whenever file_pos changes */
311
312 if (BUFFER_OOB(screen_top_ptr))
313 screen_top_ptr = buffer;
314
315 fill_buffer(file_pos, buffer, buffer_size);
316 if (prefs.scroll_mode == PAGE && cline > 1)
317 viewer_scroll_to_top_line();
318
319 /* remember the current position */
320 start_position = file_pos + screen_top_ptr - buffer;
321
322#ifdef HAVE_LCD_BITMAP
323 if (rb->strcmp(prefs.font, rb->global_settings->font_file))
324 change_font(prefs.font);
325
326 init_need_scrollbar();
327 init_header_and_footer();
328#endif
329}
330
331bool viewer_save_settings(void)
332{
333 unsigned char buf[MAX_PATH+2];
334 unsigned int fcount = 0;
335 unsigned int i;
336 int idx;
337 int ofd;
338 int tfd;
339 off_t first_copy_size = 0;
340 off_t second_copy_start_pos = 0;
341 off_t size;
342
343 /* add reading page to bookmarks */
344 idx = viewer_find_bookmark(cpage, cline);
345 if (idx >= 0)
346 bookmarks[idx].flag |= BOOKMARK_LAST;
347 else
348 {
349 viewer_add_bookmark(cpage, cline);
350 bookmarks[bookmark_count-1].flag = BOOKMARK_LAST;
351 }
352
353 tfd = rb->open(SETTINGS_TMP_FILE, O_WRONLY|O_CREAT|O_TRUNC);
354 if (tfd < 0)
355 return false;
356
357 ofd = rb->open(SETTINGS_FILE, O_RDWR);
358 if (ofd >= 0)
359 {
360 if ((rb->read(ofd, buf, SETTINGS_H_SIZE+2) != SETTINGS_H_SIZE+2) ||
361 rb->memcmp(buf, SETTINGS_HEADER, SETTINGS_H_SIZE))
362 {
363 rb->close(ofd);
364 goto save_err;
365 }
366 fcount = (buf[SETTINGS_H_SIZE] << 8) | buf[SETTINGS_H_SIZE+1];
367
368 for (i = 0; i < fcount; i++)
369 {
370 if (rb->read(ofd, buf, MAX_PATH+2) != MAX_PATH+2)
371 {
372 rb->close(ofd);
373 goto save_err;
374 }
375 size = (buf[MAX_PATH] << 8) | buf[MAX_PATH+1];
376 if (rb->strcmp(buf, file_name))
377 {
378 if (rb->lseek(ofd, size, SEEK_CUR) < 0)
379 {
380 rb->close(ofd);
381 goto save_err;
382 }
383 }
384 else
385 {
386 first_copy_size = rb->lseek(ofd, 0, SEEK_CUR);
387 if (first_copy_size < 0)
388 {
389 rb->close(ofd);
390 goto save_err;
391 }
392 second_copy_start_pos = first_copy_size + size;
393 first_copy_size -= MAX_PATH+2;
394 fcount--;
395 break;
396 }
397 }
398 if (first_copy_size == 0)
399 first_copy_size = rb->filesize(ofd);
400
401 if (!copy_bookmark_file(ofd, tfd, 0, first_copy_size))
402 {
403 rb->close(ofd);
404 goto save_err;
405 }
406 if (second_copy_start_pos > 0)
407 {
408 if (!copy_bookmark_file(ofd, tfd, second_copy_start_pos,
409 rb->filesize(ofd) - second_copy_start_pos))
410 {
411 rb->close(ofd);
412 goto save_err;
413 }
414 }
415 rb->close(ofd);
416 }
417 else
418 {
419 rb->memcpy(buf, SETTINGS_HEADER, SETTINGS_H_SIZE);
420 buf[SETTINGS_H_SIZE] = 0;
421 buf[SETTINGS_H_SIZE+1] = 0;
422 if (rb->write(tfd, buf, SETTINGS_H_SIZE+2) != SETTINGS_H_SIZE+2)
423 goto save_err;
424 }
425
426 /* copy to current read file's bookmarks */
427 rb->memset(buf, 0, MAX_PATH);
428 rb->snprintf(buf, MAX_PATH, "%s", file_name);
429
430 size = PREFERENCES_SIZE + bookmark_count * BOOKMARK_SIZE + 1;
431 buf[MAX_PATH] = size >> 8;
432 buf[MAX_PATH+1] = size;
433
434 if (rb->write(tfd, buf, MAX_PATH+2) != MAX_PATH+2)
435 goto save_err;
436
437 if (!viewer_write_preferences(tfd))
438 goto save_err;
439
440 if (!viewer_write_bookmark_infos(tfd))
441 goto save_err;
442
443 if (rb->lseek(tfd, SETTINGS_H_SIZE, SEEK_SET) < 0)
444 goto save_err;
445
446 fcount++;
447 buf[0] = fcount >> 8;
448 buf[1] = fcount;
449
450 if (rb->write(tfd, buf, 2) != 2)
451 goto save_err;
452
453 rb->close(tfd);
454
455 rb->remove(SETTINGS_FILE);
456 rb->rename(SETTINGS_TMP_FILE, SETTINGS_FILE);
457
458 return true;
459
460save_err:
461 rb->close(tfd);
462 rb->remove(SETTINGS_TMP_FILE);
463 return false;
464}