summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/viewer.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c
index 271ca37630..890ed629f4 100644
--- a/apps/plugins/viewer.c
+++ b/apps/plugins/viewer.c
@@ -52,8 +52,10 @@ PLUGIN_HEADER
52/* temporary file */ 52/* temporary file */
53#define GLOBAL_SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp" 53#define GLOBAL_SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp"
54 54
55#define GLOBAL_SETTINGS_HEADER "\x54\x56\x47\x53\x31" /* header="TVGS" version=1 */ 55#define GLOBAL_SETTINGS_HEADER "\x54\x56\x47\x53" /* header="TVGS" */
56#define GLOBAL_SETTINGS_H_SIZE 5 56#define GLOBAL_SETTINGS_H_SIZE 5
57#define GLOBAL_SETTINGS_VERSION 0x32 /* version=2 */
58#define GLOBAL_SETTINGS_FIRST_VERSION 0x31
57 59
58/* preferences and bookmarks at each file 60/* preferences and bookmarks at each file
59 * binary file, so dont use .cfg 61 * binary file, so dont use .cfg
@@ -100,8 +102,10 @@ PLUGIN_HEADER
100/* temporary file */ 102/* temporary file */
101#define SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp" 103#define SETTINGS_TMP_FILE VIEWERS_DIR "/viewer_file.tmp"
102 104
103#define SETTINGS_HEADER "\x54\x56\x53\x32" /* header="TVS" version=2 */ 105#define SETTINGS_HEADER "\x54\x56\x53" /* header="TVS" */
104#define SETTINGS_H_SIZE 4 106#define SETTINGS_H_SIZE 4
107#define SETTINGS_VERSION 0x33 /* version=3 */
108#define SETTINGS_FIRST_VERSION 0x32
105 109
106#define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */ 110#define WRAP_TRIM 44 /* Max number of spaces to trim (arbitrary) */
107#define NARROW_MAX_COLUMNS 64 /* Max displayable string len [narrow] (over-estimate) */ 111#define NARROW_MAX_COLUMNS 64 /* Max displayable string len [narrow] (over-estimate) */
@@ -127,7 +131,7 @@ PLUGIN_HEADER
127#define BOOKMARK_ICON "\xee\x84\x81\x00" 131#define BOOKMARK_ICON "\xee\x84\x81\x00"
128#endif 132#endif
129 133
130#define PREFERENCES_SIZE (11 + MAX_PATH) 134#define PREFERENCES_SIZE (12 + MAX_PATH)
131 135
132/* Out-Of-Bounds test for any pointer to data in the buffer */ 136/* Out-Of-Bounds test for any pointer to data in the buffer */
133#define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end) 137#define BUFFER_OOB(p) ((p) < buffer || (p) >= buffer_end)
@@ -1919,7 +1923,7 @@ static void viewer_default_preferences(void)
1919 prefs.encoding = rb->global_settings->default_codepage; 1923 prefs.encoding = rb->global_settings->default_codepage;
1920} 1924}
1921 1925
1922static bool viewer_read_preferences(int pfd) 1926static bool viewer_read_preferences(int pfd, int version)
1923{ 1927{
1924 unsigned char buf[PREFERENCES_SIZE]; 1928 unsigned char buf[PREFERENCES_SIZE];
1925 unsigned char *p = buf; 1929 unsigned char *p = buf;
@@ -1930,7 +1934,10 @@ static bool viewer_read_preferences(int pfd)
1930 prefs.word_mode = *p++; 1934 prefs.word_mode = *p++;
1931 prefs.line_mode = *p++; 1935 prefs.line_mode = *p++;
1932 prefs.view_mode = *p++; 1936 prefs.view_mode = *p++;
1933 prefs.alignment = *p++; 1937 if (version > 0)
1938 prefs.alignment = *p++;
1939 else
1940 prefs.alignment = LEFT;
1934 prefs.encoding = *p++; 1941 prefs.encoding = *p++;
1935 prefs.scrollbar_mode = *p++; 1942 prefs.scrollbar_mode = *p++;
1936 prefs.need_scrollbar = *p++; 1943 prefs.need_scrollbar = *p++;
@@ -1940,7 +1947,6 @@ static bool viewer_read_preferences(int pfd)
1940 prefs.scroll_mode = *p++; 1947 prefs.scroll_mode = *p++;
1941 prefs.autoscroll_speed = *p++; 1948 prefs.autoscroll_speed = *p++;
1942 rb->memcpy(prefs.font, p, MAX_PATH); 1949 rb->memcpy(prefs.font, p, MAX_PATH);
1943
1944 return true; 1950 return true;
1945} 1951}
1946 1952
@@ -2050,19 +2056,20 @@ static bool viewer_load_global_settings(void)
2050{ 2056{
2051 unsigned buf[GLOBAL_SETTINGS_H_SIZE]; 2057 unsigned buf[GLOBAL_SETTINGS_H_SIZE];
2052 int sfd = rb->open(GLOBAL_SETTINGS_FILE, O_RDONLY); 2058 int sfd = rb->open(GLOBAL_SETTINGS_FILE, O_RDONLY);
2059 int version;
2060 bool res = false;
2053 2061
2054 if (sfd < 0) 2062 if (sfd < 0)
2055 return false; 2063 return false;
2056 2064
2057 if ((rb->read(sfd, buf, GLOBAL_SETTINGS_H_SIZE) != GLOBAL_SETTINGS_H_SIZE) || 2065 if ((rb->read(sfd, buf, GLOBAL_SETTINGS_H_SIZE) == GLOBAL_SETTINGS_H_SIZE) ||
2058 rb->memcmp(buf, GLOBAL_SETTINGS_HEADER, GLOBAL_SETTINGS_H_SIZE) || 2066 (rb->memcmp(buf, GLOBAL_SETTINGS_HEADER, GLOBAL_SETTINGS_H_SIZE - 1) == 0))
2059 !viewer_read_preferences(sfd)) 2067 {
2060 { 2068 version = buf[GLOBAL_SETTINGS_H_SIZE - 1] - GLOBAL_SETTINGS_FIRST_VERSION;
2061 rb->close(sfd); 2069 res = viewer_read_preferences(sfd, version);
2062 return false;
2063 } 2070 }
2064 rb->close(sfd); 2071 rb->close(sfd);
2065 return true; 2072 return res;
2066} 2073}
2067 2074
2068static bool viewer_save_global_settings(void) 2075static bool viewer_save_global_settings(void)
@@ -2094,13 +2101,14 @@ static bool viewer_load_settings(void)
2094 bool res = false; 2101 bool res = false;
2095 int sfd; 2102 int sfd;
2096 unsigned int size; 2103 unsigned int size;
2104 int version;
2097 2105
2098 sfd = rb->open(SETTINGS_FILE, O_RDONLY); 2106 sfd = rb->open(SETTINGS_FILE, O_RDONLY);
2099 if (sfd < 0) 2107 if (sfd < 0)
2100 goto read_end; 2108 goto read_end;
2101 2109
2102 if ((rb->read(sfd, buf, SETTINGS_H_SIZE+2) != SETTINGS_H_SIZE+2) || 2110 if ((rb->read(sfd, buf, SETTINGS_H_SIZE+2) != SETTINGS_H_SIZE+2) ||
2103 rb->memcmp(buf, SETTINGS_HEADER, SETTINGS_H_SIZE)) 2111 rb->memcmp(buf, SETTINGS_HEADER, SETTINGS_H_SIZE - 1))
2104 { 2112 {
2105 /* illegal setting file */ 2113 /* illegal setting file */
2106 rb->close(sfd); 2114 rb->close(sfd);
@@ -2111,6 +2119,7 @@ static bool viewer_load_settings(void)
2111 goto read_end; 2119 goto read_end;
2112 } 2120 }
2113 2121
2122 version = buf[SETTINGS_H_SIZE - 1] - SETTINGS_FIRST_VERSION;
2114 fcount = (buf[SETTINGS_H_SIZE] << 8) | buf[SETTINGS_H_SIZE+1]; 2123 fcount = (buf[SETTINGS_H_SIZE] << 8) | buf[SETTINGS_H_SIZE+1];
2115 for (i = 0; i < fcount; i++) 2124 for (i = 0; i < fcount; i++)
2116 { 2125 {
@@ -2124,7 +2133,7 @@ static bool viewer_load_settings(void)
2124 break; 2133 break;
2125 continue; 2134 continue;
2126 } 2135 }
2127 if (!viewer_read_preferences(sfd)) 2136 if (!viewer_read_preferences(sfd, version))
2128 break; 2137 break;
2129 2138
2130 res = viewer_read_bookmark_infos(sfd); 2139 res = viewer_read_bookmark_infos(sfd);