diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/viewer.c | 41 |
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 | ||
1922 | static bool viewer_read_preferences(int pfd) | 1926 | static 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 | ||
2068 | static bool viewer_save_global_settings(void) | 2075 | static 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); |