Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

Bkmks.cpp

Go to the documentation of this file.
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 //                  qDebug("Correct version!");
00253                     break;
00254                 case 6:
00255                     isUpgraded = true;
00256                     bl = readall00(read06);
00257 //                  qDebug("Correct version!");
00258                     break;
00259                 case 5:
00260                     isUpgraded = true;
00261                     bl = readall00(read05);
00262 //                  qDebug("Known version!");
00263                     break;
00264                 default:
00265 //                  qDebug("Unknown version!");
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* /*_this*/, 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* /*_this*/, 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* /*_this*/, 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 }

Generated on Sat Nov 5 16:16:53 2005 for OPIE by  doxygen 1.4.2