summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/Bkmks.cpp
Unidiff
Diffstat (limited to 'noncore/apps/opie-reader/Bkmks.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/Bkmks.cpp310
1 files changed, 196 insertions, 114 deletions
diff --git a/noncore/apps/opie-reader/Bkmks.cpp b/noncore/apps/opie-reader/Bkmks.cpp
index 30d2881..998601a 100644
--- a/noncore/apps/opie-reader/Bkmks.cpp
+++ b/noncore/apps/opie-reader/Bkmks.cpp
@@ -1,240 +1,322 @@
1#include "name.h"
1#include <qmessagebox.h> 2#include <qmessagebox.h>
2 3
3#include "Bkmks.h" 4#include "Bkmks.h"
4 5
5#include "StyleConsts.h" 6#include "StyleConsts.h"
6#include "Markups.h" 7#include "Markups.h"
7#include "my_list.h" 8#include "my_list.h"
8#include "version.h" 9#include "version.h"
9 10
10const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned long)'t' << 16) | ((unsigned long)'r' << 8) | ((unsigned long)BKMKTYPE); 11const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned long)'t' << 16) | ((unsigned long)'r' << 8) | ((unsigned long)BKMKTYPE);
11 12
13Bkmk::Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p) : m_position(_p)
14{
15 init(_nm, _nmlen, _anno, _annolen, _p);
16}
17
18Bkmk::Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short annolen, unsigned int _p) : m_position(_p)
19{
20 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, annolen, _p);
21}
12 22
13Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_p) 23Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_p)
14{ 24{
15 int len = ustrlen(_nm)+1;
16 m_name = new tchar[len];
17 for (int i = 0; i < len; i++) m_name[i] = _nm[i];
18 25
19 if (_anno == NULL) 26 if (_anno == NULL)
20 { 27 {
21 m_anno = new tchar[1]; 28 tchar t = 0;
22 m_anno[0] = 0; 29 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p);
23 } 30 }
24 else 31 else
25 { 32 {
26 len = ustrlen(_anno)+1; 33 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, sizeof(tchar)*(ustrlen(_anno)+1), _p);
27 m_anno = new tchar[len];
28 for (int i = 0; i < len; i++) m_anno[i] = _anno[i];
29 } 34 }
30} 35}
31 36
37void Bkmk::init(const void* _nm, unsigned short _nmlen, const void* _anno, unsigned short _annolen, unsigned int _p)
38{
39 m_namelen = _nmlen;
40 if (m_namelen > 0)
41 {
42 m_name = new unsigned char[m_namelen];
43 memcpy(m_name, _nm, m_namelen);
44 }
45 else
46 {
47 m_name = NULL;
48 }
49
50 m_annolen = _annolen;
51 if (m_annolen > 0)
52 {
53 m_anno = new unsigned char[m_annolen];
54 memcpy(m_anno, _anno, m_annolen);
55 }
56 else
57 {
58 m_anno = NULL;
59 }
60 m_position = _p;
61}
62
32Bkmk::~Bkmk() 63Bkmk::~Bkmk()
33{ 64{
34 if (m_name != NULL) delete [] m_name; 65 if (m_name != NULL) delete [] m_name;
35 m_name = NULL; 66 m_name = NULL;
36 if (m_anno != NULL) delete [] m_anno; 67 if (m_anno != NULL) delete [] m_anno;
37 m_anno = NULL; 68 m_anno = NULL;
38} 69}
39 70
40Bkmk& Bkmk::operator=(const Bkmk& rhs) 71Bkmk& Bkmk::operator=(const Bkmk& rhs)
41{ 72{
42 if (m_name != NULL) 73 if (m_name != NULL)
43 { 74 {
44 delete [] m_name; 75 delete [] m_name;
45 m_name = NULL; 76 m_name = NULL;
46 } 77 }
47 if (m_anno != NULL) 78 if (m_anno != NULL)
48 { 79 {
49 delete [] m_anno; 80 delete [] m_anno;
50 m_anno = NULL; 81 m_anno = NULL;
51 } 82 }
52 if (rhs.m_name != NULL) 83 if (rhs.m_name != NULL)
53 { 84 {
54 int len = ustrlen(rhs.m_name)+1; 85 m_namelen = rhs.m_namelen;
55 m_name = new tchar[len]; 86 m_name = new unsigned char[m_namelen];
56 for (int i = 0; i < len; i++) m_name[i] = rhs.m_name[i]; 87 memcpy(m_name, rhs.m_name, m_namelen);
57 } 88 }
58 else 89 else
59 m_name = NULL; 90 m_name = NULL;
60 if (rhs.m_anno != NULL) 91 if (rhs.m_anno != NULL)
61 { 92 {
62 int len = ustrlen(rhs.m_anno)+1; 93 m_annolen = rhs.m_annolen;
63 m_anno = new tchar[len]; 94 m_anno = new unsigned char[m_annolen];
64 for (int i = 0; i < len; i++) m_anno[i] = rhs.m_anno[i]; 95 memcpy(m_anno, rhs.m_anno, m_annolen);
65 } 96 }
66 else 97 else
67 m_anno = NULL; 98 m_anno = NULL;
68 m_position = rhs.m_position; 99 m_position = rhs.m_position;
69 return *this; 100 return *this;
70} 101}
71 102
72bool Bkmk::operator==(const Bkmk& rhs) 103bool Bkmk::operator==(const Bkmk& rhs)
73{ 104{
74 return (m_position == rhs.m_position && ustrcmp(m_name,rhs.m_name) == 0); 105 return (m_position == rhs.m_position && (rhs.m_namelen == m_namelen) && memcmp(m_name,rhs.m_name,m_namelen) == 0);
106}
107
108void Bkmk::setAnno(unsigned char* t, unsigned short len)
109{
110 if (m_anno != NULL)
111 {
112 delete [] m_anno;
113 m_anno = NULL;
114 }
115 if (t != NULL)
116 {
117 m_annolen = len;
118 m_anno = new unsigned char[m_annolen];
119 memcpy(m_anno, t, m_annolen);
120 }
121 else
122 {
123 m_annolen = sizeof(tchar);
124 m_anno = new unsigned char[m_annolen];
125 *((tchar*)m_anno) = 0;
126 }
75} 127}
76 128
77void Bkmk::setAnno(tchar* t) 129void Bkmk::setAnno(tchar* t)
78{ 130{
79 if (m_anno != NULL) 131 if (m_anno != NULL)
80 { 132 {
81 delete [] m_anno; 133 delete [] m_anno;
82 m_anno = NULL; 134 m_anno = NULL;
83 } 135 }
84 if (t != NULL) 136 if (t != NULL)
85 { 137 {
86 int len = ustrlen(t)+1; 138 unsigned short len = ustrlen(t)+1;
87 m_anno = new tchar[len]; 139 m_annolen = sizeof(tchar)*len;
88 for (int i = 0; i < len; i++) m_anno[i] = t[i]; 140 m_anno = new unsigned char[m_annolen];
141 memcpy(m_anno, t, m_annolen);
89 } 142 }
90 else 143 else
91 m_anno = NULL; 144 {
145 m_annolen = sizeof(tchar);
146 m_anno = new unsigned char[m_annolen];
147 *((tchar*)m_anno) = 0;
148 }
92} 149}
93 150
94BkmkFile::BkmkFile(const char *fnm, bool w ) 151BkmkFile::BkmkFile(const char *fnm, bool w = false)
95 : 152 :
96 wt(w), isUpgraded(false) 153 wt(w), isUpgraded(false)
97{ 154{
98 if (w) 155 if (w)
99 { 156 {
100 f = fopen(fnm, "wb"); 157 f = fopen(fnm, "wb");
101 } 158 }
102 else 159 else
103 { 160 {
104 f = fopen(fnm, "rb"); 161 f = fopen(fnm, "rb");
105 } 162 }
106} 163}
107 164
108BkmkFile::~BkmkFile() 165BkmkFile::~BkmkFile()
109{ 166{
110 if (f != NULL) fclose(f); 167 if (f != NULL) fclose(f);
111} 168}
112 169
113void BkmkFile::write(tchar* nm, tchar* an, const unsigned int& pos) 170void BkmkFile::write(const Bkmk& b)
114{ 171{
115 if (f != NULL) 172 if (f != NULL)
116 { 173 {
117 unsigned short ln = ustrlen(nm); 174 fwrite(&b.m_namelen, sizeof(b.m_namelen),1,f);
118 fwrite(&ln,sizeof(ln),1,f); 175 fwrite(b.m_name,1,b.m_namelen,f);
119 fwrite(nm,sizeof(tchar),ln,f); 176 fwrite(&b.m_annolen, sizeof(b.m_annolen),1,f);
120 ln = ustrlen(an); 177 fwrite(b.m_anno,1,b.m_annolen,f);
121 fwrite(&ln,sizeof(ln),1,f); 178 fwrite(&b.m_position,sizeof(b.m_position),1,f);
122 if (ln > 0) fwrite(an,sizeof(tchar),ln,f);
123 fwrite(&pos,sizeof(pos),1,f);
124 } 179 }
125} 180}
126 181
127void BkmkFile::write(const Bkmk& b) { write(b.name(), b.anno(), b.value()); }
128
129void BkmkFile::write(CList<Bkmk>& bl) 182void BkmkFile::write(CList<Bkmk>& bl)
130{ 183{
131 if (f != NULL) 184 if (f != NULL)
132 { 185 {
133 fwrite(&magic, sizeof(magic), 1, f); 186 fwrite(&magic, sizeof(magic), 1, f);
134 for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++) 187 for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++)
135 { 188 {
136 write(*i); 189 write(*i);
137 } 190 }
138 }
139}
140
141Bkmk* BkmkFile::read()
142{
143 Bkmk* b = NULL;
144 if (f != NULL)
145 {
146 unsigned short ln;
147 if (fread(&ln,sizeof(ln),1,f) == 1)
148 {
149 b = new Bkmk;
150 b->m_name = new tchar[ln+1];
151 fread(b->m_name,sizeof(tchar),ln,f);
152 b->m_name[ln] = 0;
153
154 fread(&ln,sizeof(ln),1,f);
155 b->m_anno = new tchar[ln+1];
156 if (ln > 0) fread(b->m_anno,sizeof(tchar),ln,f);
157 b->m_anno[ln] = 0;
158 fread(&b->m_position,sizeof(b->m_position),1,f);
159 }
160 } 191 }
161 return b;
162} 192}
163 193
164CList<Bkmk>* BkmkFile::readall() 194CList<Bkmk>* BkmkFile::readall()
165{ 195{
166 CList<Bkmk>* bl = NULL; 196 CList<Bkmk>* bl = NULL;
167 if (f != NULL) 197 if (f != NULL)
168 { 198 {
169 unsigned long newmagic; 199 unsigned long newmagic;
170 fread(&newmagic, sizeof(newmagic), 1, f); 200 fread(&newmagic, sizeof(newmagic), 1, f);
171 if (newmagic != magic) 201 if ((newmagic & 0xffffff00) != (magic & 0xffffff00))
172 { 202 {
173 if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of OpieReader\ndid you upgrade from?", "0_4*", "Any other version") == 0) 203 if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of " PROGNAME "\ndid you upgrade from?", "0_4*", "Any other version") == 0)
174 { 204 {
175 fseek(f,0,SEEK_SET); 205 fseek(f,0,SEEK_SET);
176 bl = readall04(); 206 bl = readall00(&read05);
177 } 207 }
178 else 208 else
179 { 209 {
180 fseek(f,0,SEEK_SET); 210 fseek(f,0,SEEK_SET);
181 bl = readall03(); 211 bl = readall00(&read03);
182 } 212 }
183 isUpgraded = true; 213 isUpgraded = true;
184 } 214 }
185 else 215 else
186 { 216 {
187 bl = readall04(); 217 switch(newmagic & 0xff)
188 } 218 {
219 case 6:
220 isUpgraded = false;
221 bl = readall00(read06);
222 qDebug("Correct version!");
223 break;
224 case 5:
225 isUpgraded = true;
226 bl = readall00(read05);
227 qDebug("Known version!");
228 break;
229 default:
230 qDebug("Unknown version!");
231 isUpgraded = true;
232 bl = readall00(read05);
233 }
234 }
189 } 235 }
190 return bl; 236 return bl;
191} 237}
192 238
193CList<Bkmk>* BkmkFile::readall04() 239CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(FILE*))
194{ 240{
195 CList<Bkmk>* bl = new CList<Bkmk>; 241 CList<Bkmk>* bl = new CList<Bkmk>;
196 while (1) 242 while (1)
197 { 243 {
198 Bkmk* b = read(); 244 Bkmk* b = (*readfn)(f);
199 if (b == NULL) break; 245 if (b == NULL) break;
200 bl->push_back(*b); 246 bl->push_back(*b);
201 delete b; 247 delete b;
202 } 248 }
203 return bl; 249 return bl;
204} 250}
205 251
206CList<Bkmk>* BkmkFile::readall03() 252Bkmk* BkmkFile::read03(FILE* f)
207{ 253{
208 CList<Bkmk>* bl = new CList<Bkmk>; 254 Bkmk* b = NULL;
209 while (1) 255 if (f != NULL)
210 { 256 {
211 Bkmk* b = read03(); 257 unsigned short ln;
212 if (b == NULL) break; 258 if (fread(&ln,sizeof(ln),1,f) == 1)
213 bl->push_back(*b); 259 {
214 delete b; 260 tchar* name = new tchar[ln+1];
261 fread(name,sizeof(tchar),ln,f);
262 name[ln] = 0;
263
264 ln = 0;
265 tchar* anno = new tchar[ln+1];
266 anno[ln] = 0;
267
268 unsigned int pos;
269 fread(&pos,sizeof(pos),1,f);
270 b = new Bkmk(name,anno,pos);
271 }
215 } 272 }
216 return bl; 273 return b;
217} 274}
218 275
219Bkmk* BkmkFile::read03() 276Bkmk* BkmkFile::read05(FILE* f)
220{ 277{
221 Bkmk* b = NULL; 278 Bkmk* b = NULL;
222 if (f != NULL) 279 if (f != NULL)
223 { 280 {
224 unsigned short ln; 281 unsigned short ln;
225 if (fread(&ln,sizeof(ln),1,f) == 1) 282 if (fread(&ln,sizeof(ln),1,f) == 1)
226 { 283 {
227 b = new Bkmk; 284 tchar* nm = new tchar[ln+1];
228 b->m_name = new tchar[ln+1]; 285 fread(nm,sizeof(tchar),ln,f);
229 fread(b->m_name,sizeof(tchar),ln,f); 286 nm[ln] = 0;
230 b->m_name[ln] = 0; 287 fread(&ln,sizeof(ln),1,f);
288 tchar* anno = new tchar[ln+1];
289 if (ln > 0) fread(anno,sizeof(tchar),ln,f);
290 anno[ln] = 0;
291 unsigned int pos;
292 fread(&pos,sizeof(pos),1,f);
293 b = new Bkmk(nm,anno,pos);
294 }
295 }
296 return b;
297}
231 298
232 ln = 0; 299Bkmk* BkmkFile::read06(FILE* f)
233 b->m_anno = new tchar[ln+1]; 300{
234 b->m_anno[ln] = 0; 301 Bkmk* b = NULL;
302 if (f != NULL)
303 {
304 unsigned short ln;
305 if (fread(&ln,sizeof(ln),1,f) == 1)
306 {
307 b = new Bkmk;
308 b->m_namelen = ln;
309 b->m_name = new unsigned char[b->m_namelen];
310 fread(b->m_name,1,b->m_namelen,f);
235 311
236 fread(&b->m_position,sizeof(b->m_position),1,f); 312 fread(&(b->m_annolen),sizeof(b->m_annolen),1,f);
237 } 313 if (b->m_annolen > 0)
314 {
315 b->m_anno = new unsigned char[b->m_annolen];
316 fread(b->m_anno,1,b->m_annolen,f);
317 }
318 fread(&(b->m_position),sizeof(b->m_position),1,f);
319 }
238 } 320 }
239 return b; 321 return b;
240} 322}