00001 #include <qmessagebox.h>
00002
00003 #include "Bkmks.h"
00004
00005 #include "StyleConsts.h"
00006 #include "Markups.h"
00007 #include "my_list.h"
00008 #include "version.h"
00009 #include "names.h"
00010
00011 const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned long)'t' << 16) | ((unsigned long)'r' << 8) | ((unsigned long)BKMKTYPE);
00012
00013 Bkmk::Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p)
00014 {
00015 init(_nm, _nmlen, _anno, _annolen, _p);
00016 }
00017
00018 Bkmk::Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short annolen, unsigned int _p) : m_position(_p)
00019 {
00020 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, annolen, _p);
00021 }
00022
00023 Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_p)
00024 {
00025 if (_anno == NULL)
00026 {
00027 tchar t = 0;
00028 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p);
00029 }
00030 else
00031 {
00032 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, sizeof(tchar)*(ustrlen(_anno)+1), _p);
00033 }
00034 }
00035
00036 Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p, unsigned int _p2) : m_position(_p)
00037 {
00038 if (_anno == NULL)
00039 {
00040 tchar t = 0;
00041 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p);
00042 }
00043 else
00044 {
00045 init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, sizeof(tchar)*(ustrlen(_anno)+1), _p);
00046 }
00047 m_position2 = _p2;
00048 m_red = m_green = m_blue = 127;
00049 }
00050
00051 void Bkmk::init(const void* _nm, unsigned short _nmlen, const void* _anno, unsigned short _annolen, unsigned int _p)
00052 {
00053 m_namelen = _nmlen;
00054 if (m_namelen > 0)
00055 {
00056 m_name = new unsigned char[m_namelen];
00057 memcpy(m_name, _nm, m_namelen);
00058 }
00059 else
00060 {
00061 m_name = NULL;
00062 }
00063
00064 m_annolen = _annolen;
00065 if (m_annolen > 0)
00066 {
00067 m_anno = new unsigned char[m_annolen];
00068 memcpy(m_anno, _anno, m_annolen);
00069 }
00070 else
00071 {
00072 m_anno = NULL;
00073 }
00074 m_position = _p;
00075 m_position2 = _p;
00076 m_red = m_green = m_blue = 255;
00077 m_level = 0;
00078 }
00079
00080 Bkmk::~Bkmk()
00081 {
00082 if (m_name != NULL) delete [] m_name;
00083 m_name = NULL;
00084 if (m_anno != NULL) delete [] m_anno;
00085 m_anno = NULL;
00086 }
00087
00088 Bkmk& Bkmk::operator=(const Bkmk& rhs)
00089 {
00090 if (m_name != NULL)
00091 {
00092 delete [] m_name;
00093 m_name = NULL;
00094 }
00095 if (m_anno != NULL)
00096 {
00097 delete [] m_anno;
00098 m_anno = NULL;
00099 }
00100 if (rhs.m_name != NULL)
00101 {
00102 m_namelen = rhs.m_namelen;
00103 m_name = new unsigned char[m_namelen];
00104 memcpy(m_name, rhs.m_name, m_namelen);
00105 }
00106 else
00107 m_name = NULL;
00108 if (rhs.m_anno != NULL)
00109 {
00110 m_annolen = rhs.m_annolen;
00111 m_anno = new unsigned char[m_annolen];
00112 memcpy(m_anno, rhs.m_anno, m_annolen);
00113 }
00114 else
00115 m_anno = NULL;
00116 m_position = rhs.m_position;
00117 m_position2 = rhs.m_position2;
00118 m_red = rhs.m_red;
00119 m_green = rhs.m_green;
00120 m_blue = rhs.m_blue;
00121 m_level = rhs.m_level;
00122 return *this;
00123 }
00124
00125 bool Bkmk::operator==(const Bkmk& rhs)
00126 {
00127 return ((m_position == rhs.m_position) && (m_position2 == rhs.m_position2) && (rhs.m_namelen == m_namelen) && memcmp(m_name,rhs.m_name,m_namelen) == 0);
00128 }
00129
00130 void Bkmk::setAnno(unsigned char* t, unsigned short len)
00131 {
00132 if (m_anno != NULL)
00133 {
00134 delete [] m_anno;
00135 m_anno = NULL;
00136 }
00137 if (t != NULL)
00138 {
00139 m_annolen = len;
00140 m_anno = new unsigned char[m_annolen];
00141 memcpy(m_anno, t, m_annolen);
00142 }
00143 else
00144 {
00145 m_annolen = sizeof(tchar);
00146 m_anno = new unsigned char[m_annolen];
00147 *((tchar*)m_anno) = 0;
00148 }
00149 }
00150
00151 void Bkmk::setAnno(tchar* t)
00152 {
00153 if (m_anno != NULL)
00154 {
00155 delete [] m_anno;
00156 m_anno = NULL;
00157 }
00158 if (t != NULL)
00159 {
00160 unsigned short len = ustrlen(t)+1;
00161 m_annolen = sizeof(tchar)*len;
00162 m_anno = new unsigned char[m_annolen];
00163 memcpy(m_anno, t, m_annolen);
00164 }
00165 else
00166 {
00167 m_annolen = sizeof(tchar);
00168 m_anno = new unsigned char[m_annolen];
00169 *((tchar*)m_anno) = 0;
00170 }
00171 }
00172
00173 BkmkFile::BkmkFile(const char *fnm, bool w, bool _x)
00174 :
00175 wt(w), isUpgraded(false), m_extras(_x)
00176 {
00177 if (w)
00178 {
00179 f = fopen(fnm, "wb");
00180 }
00181 else
00182 {
00183 f = fopen(fnm, "rb");
00184 }
00185 }
00186
00187 BkmkFile::~BkmkFile()
00188 {
00189 if (f != NULL) fclose(f);
00190 }
00191
00192 void BkmkFile::write(const Bkmk& b)
00193 {
00194 if (f != NULL)
00195 {
00196 fwrite(&b.m_namelen, sizeof(b.m_namelen),1,f);
00197 fwrite(b.m_name,1,b.m_namelen,f);
00198 fwrite(&b.m_annolen, sizeof(b.m_annolen),1,f);
00199 fwrite(b.m_anno,1,b.m_annolen,f);
00200 fwrite(&b.m_position,sizeof(b.m_position),1,f);
00201 if (m_extras)
00202 {
00203 fwrite(&b.m_position2,sizeof(b.m_position2),1,f);
00204 fwrite(&b.m_red,sizeof(b.m_red),1,f);
00205 fwrite(&b.m_green,sizeof(b.m_green),1,f);
00206 fwrite(&b.m_blue,sizeof(b.m_blue),1,f);
00207 fwrite(&b.m_level,sizeof(b.m_level),1,f);
00208 }
00209 }
00210 }
00211
00212 void BkmkFile::write(CList<Bkmk>& bl)
00213 {
00214 if (f != NULL)
00215 {
00216 fwrite(&magic, sizeof(magic), 1, f);
00217 for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++)
00218 {
00219 write(*i);
00220 }
00221 }
00222 }
00223
00224 CList<Bkmk>* BkmkFile::readall()
00225 {
00226 CList<Bkmk>* bl = NULL;
00227 if (f != NULL)
00228 {
00229 unsigned long newmagic;
00230 fread(&newmagic, sizeof(newmagic), 1, f);
00231 if ((newmagic & 0xffffff00) != (magic & 0xffffff00))
00232 {
00233 if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of " PROGNAME "\ndid you upgrade from?", "0_4*", "Any other version") == 0)
00234 {
00235 fseek(f,0,SEEK_SET);
00236 bl = readall00(&read05);
00237 }
00238 else
00239 {
00240 fseek(f,0,SEEK_SET);
00241 bl = readall00(&read03);
00242 }
00243 isUpgraded = true;
00244 }
00245 else
00246 {
00247 switch(newmagic & 0xff)
00248 {
00249 case 7:
00250 isUpgraded = false;
00251 bl = readall00(read07);
00252
00253 break;
00254 case 6:
00255 isUpgraded = true;
00256 bl = readall00(read06);
00257
00258 break;
00259 case 5:
00260 isUpgraded = true;
00261 bl = readall00(read05);
00262
00263 break;
00264 default:
00265
00266 isUpgraded = true;
00267 bl = readall00(read05);
00268 }
00269 }
00270 }
00271 return bl;
00272 }
00273
00274 CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(BkmkFile*, FILE*))
00275 {
00276 CList<Bkmk>* bl = new CList<Bkmk>;
00277 while (1)
00278 {
00279 Bkmk* b = (*readfn)(this, f);
00280 if (b == NULL) break;
00281 bl->push_back(*b);
00282 delete b;
00283 }
00284 return bl;
00285 }
00286
00287 Bkmk* BkmkFile::read03(BkmkFile* , FILE* f)
00288 {
00289 Bkmk* b = NULL;
00290 if (f != NULL)
00291 {
00292 unsigned short ln;
00293 if (fread(&ln,sizeof(ln),1,f) == 1)
00294 {
00295 tchar* name = new tchar[ln+1];
00296 fread(name,sizeof(tchar),ln,f);
00297 name[ln] = 0;
00298
00299 ln = 0;
00300 tchar* anno = new tchar[ln+1];
00301 anno[ln] = 0;
00302
00303 unsigned int pos;
00304 fread(&pos,sizeof(pos),1,f);
00305 b = new Bkmk(name,anno,pos);
00306 }
00307 }
00308 return b;
00309 }
00310
00311 Bkmk* BkmkFile::read05(BkmkFile* , FILE* f)
00312 {
00313 Bkmk* b = NULL;
00314 if (f != NULL)
00315 {
00316 unsigned short ln;
00317 if (fread(&ln,sizeof(ln),1,f) == 1)
00318 {
00319 tchar* nm = new tchar[ln+1];
00320 fread(nm,sizeof(tchar),ln,f);
00321 nm[ln] = 0;
00322 fread(&ln,sizeof(ln),1,f);
00323 tchar* anno = new tchar[ln+1];
00324 if (ln > 0) fread(anno,sizeof(tchar),ln,f);
00325 anno[ln] = 0;
00326 unsigned int pos;
00327 fread(&pos,sizeof(pos),1,f);
00328 b = new Bkmk(nm,anno,pos);
00329 }
00330 }
00331 return b;
00332 }
00333
00334 Bkmk* BkmkFile::read06(BkmkFile* , FILE* f)
00335 {
00336 Bkmk* b = NULL;
00337 if (f != NULL)
00338 {
00339 unsigned short ln;
00340 if (fread(&ln,sizeof(ln),1,f) == 1)
00341 {
00342 b = new Bkmk;
00343 b->m_namelen = ln;
00344 b->m_name = new unsigned char[b->m_namelen];
00345 fread(b->m_name,1,b->m_namelen,f);
00346
00347 fread(&(b->m_annolen),sizeof(b->m_annolen),1,f);
00348 if (b->m_annolen > 0)
00349 {
00350 b->m_anno = new unsigned char[b->m_annolen];
00351 fread(b->m_anno,1,b->m_annolen,f);
00352 }
00353 fread(&(b->m_position),sizeof(b->m_position),1,f);
00354 b->m_position2 = b->m_position+b->m_namelen-1;
00355 b->m_red = b->m_green = b->m_blue = 127;
00356 b->m_level = 0;
00357 }
00358 }
00359 return b;
00360 }
00361
00362 Bkmk* BkmkFile::read07(BkmkFile* _this, FILE* f)
00363 {
00364 Bkmk* b = NULL;
00365 if (f != NULL)
00366 {
00367 unsigned short ln;
00368 if (fread(&ln,sizeof(ln),1,f) == 1)
00369 {
00370 b = new Bkmk;
00371 b->m_namelen = ln;
00372 b->m_name = new unsigned char[b->m_namelen];
00373 fread(b->m_name,1,b->m_namelen,f);
00374
00375 fread(&(b->m_annolen),sizeof(b->m_annolen),1,f);
00376 if (b->m_annolen > 0)
00377 {
00378 b->m_anno = new unsigned char[b->m_annolen];
00379 fread(b->m_anno,1,b->m_annolen,f);
00380 }
00381 fread(&(b->m_position),sizeof(b->m_position),1,f);
00382 if (_this->m_extras)
00383 {
00384 fread(&(b->m_position2),sizeof(b->m_position2),1,f);
00385 fread(&(b->m_red),sizeof(b->m_red),1,f);
00386 fread(&(b->m_green),sizeof(b->m_green),1,f);
00387 fread(&(b->m_blue),sizeof(b->m_blue),1,f);
00388 fread(&(b->m_level),sizeof(b->m_level),1,f);
00389 }
00390 else
00391 {
00392 b->m_position2 = b->m_position;
00393 b->m_red = b->m_green = b->m_blue = 255;
00394 b->m_level = 0;
00395 }
00396 }
00397 }
00398 return b;
00399 }