Diffstat (limited to 'noncore/apps/opie-reader/Bkmks.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/Bkmks.cpp | 236 |
1 files changed, 159 insertions, 77 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,2 +1,3 @@ +#include "name.h" #include <qmessagebox.h> @@ -10,24 +11,54 @@ const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned long)'t' << 16) | ((unsigned long)'r' << 8) | ((unsigned long)BKMKTYPE); +Bkmk::Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p) : m_position(_p) +{ + init(_nm, _nmlen, _anno, _annolen, _p); +} + +Bkmk::Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short annolen, unsigned int _p) : m_position(_p) +{ + init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, annolen, _p); +} Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_p) { - int len = ustrlen(_nm)+1; - m_name = new tchar[len]; - for (int i = 0; i < len; i++) m_name[i] = _nm[i]; if (_anno == NULL) { - m_anno = new tchar[1]; - m_anno[0] = 0; + tchar t = 0; + init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p); } else { - len = ustrlen(_anno)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = _anno[i]; + init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, sizeof(tchar)*(ustrlen(_anno)+1), _p); } } +void Bkmk::init(const void* _nm, unsigned short _nmlen, const void* _anno, unsigned short _annolen, unsigned int _p) +{ + m_namelen = _nmlen; + if (m_namelen > 0) + { + m_name = new unsigned char[m_namelen]; + memcpy(m_name, _nm, m_namelen); + } + else + { + m_name = NULL; + } + + m_annolen = _annolen; + if (m_annolen > 0) + { + m_anno = new unsigned char[m_annolen]; + memcpy(m_anno, _anno, m_annolen); + } + else + { + m_anno = NULL; + } + m_position = _p; +} + Bkmk::~Bkmk() { @@ -52,7 +83,7 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) if (rhs.m_name != NULL) { - int len = ustrlen(rhs.m_name)+1; - m_name = new tchar[len]; - for (int i = 0; i < len; i++) m_name[i] = rhs.m_name[i]; + m_namelen = rhs.m_namelen; + m_name = new unsigned char[m_namelen]; + memcpy(m_name, rhs.m_name, m_namelen); } else @@ -60,7 +91,7 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) if (rhs.m_anno != NULL) { - int len = ustrlen(rhs.m_anno)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = rhs.m_anno[i]; + m_annolen = rhs.m_annolen; + m_anno = new unsigned char[m_annolen]; + memcpy(m_anno, rhs.m_anno, m_annolen); } else @@ -72,8 +103,8 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) bool Bkmk::operator==(const Bkmk& rhs) { - return (m_position == rhs.m_position && ustrcmp(m_name,rhs.m_name) == 0); + return (m_position == rhs.m_position && (rhs.m_namelen == m_namelen) && memcmp(m_name,rhs.m_name,m_namelen) == 0); } -void Bkmk::setAnno(tchar* t) +void Bkmk::setAnno(unsigned char* t, unsigned short len) { if (m_anno != NULL) @@ -84,13 +115,39 @@ void Bkmk::setAnno(tchar* t) if (t != NULL) { - int len = ustrlen(t)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = t[i]; + m_annolen = len; + m_anno = new unsigned char[m_annolen]; + memcpy(m_anno, t, m_annolen); } else + { + m_annolen = sizeof(tchar); + m_anno = new unsigned char[m_annolen]; + *((tchar*)m_anno) = 0; + } +} + +void Bkmk::setAnno(tchar* t) +{ + if (m_anno != NULL) + { + delete [] m_anno; m_anno = NULL; } + if (t != NULL) + { + unsigned short len = ustrlen(t)+1; + m_annolen = sizeof(tchar)*len; + m_anno = new unsigned char[m_annolen]; + memcpy(m_anno, t, m_annolen); + } + else + { + m_annolen = sizeof(tchar); + m_anno = new unsigned char[m_annolen]; + *((tchar*)m_anno) = 0; + } +} -BkmkFile::BkmkFile(const char *fnm, bool w ) +BkmkFile::BkmkFile(const char *fnm, bool w = false) : wt(w), isUpgraded(false) @@ -111,20 +168,16 @@ BkmkFile::~BkmkFile() } -void BkmkFile::write(tchar* nm, tchar* an, const unsigned int& pos) +void BkmkFile::write(const Bkmk& b) { if (f != NULL) { - unsigned short ln = ustrlen(nm); - fwrite(&ln,sizeof(ln),1,f); - fwrite(nm,sizeof(tchar),ln,f); - ln = ustrlen(an); - fwrite(&ln,sizeof(ln),1,f); - if (ln > 0) fwrite(an,sizeof(tchar),ln,f); - fwrite(&pos,sizeof(pos),1,f); + fwrite(&b.m_namelen, sizeof(b.m_namelen),1,f); + fwrite(b.m_name,1,b.m_namelen,f); + fwrite(&b.m_annolen, sizeof(b.m_annolen),1,f); + fwrite(b.m_anno,1,b.m_annolen,f); + fwrite(&b.m_position,sizeof(b.m_position),1,f); } } -void BkmkFile::write(const Bkmk& b) { write(b.name(), b.anno(), b.value()); } - void BkmkFile::write(CList<Bkmk>& bl) { @@ -139,27 +192,4 @@ void BkmkFile::write(CList<Bkmk>& bl) } -Bkmk* BkmkFile::read() -{ - Bkmk* b = NULL; - if (f != NULL) - { - unsigned short ln; - if (fread(&ln,sizeof(ln),1,f) == 1) - { - b = new Bkmk; - b->m_name = new tchar[ln+1]; - fread(b->m_name,sizeof(tchar),ln,f); - b->m_name[ln] = 0; - - fread(&ln,sizeof(ln),1,f); - b->m_anno = new tchar[ln+1]; - if (ln > 0) fread(b->m_anno,sizeof(tchar),ln,f); - b->m_anno[ln] = 0; - fread(&b->m_position,sizeof(b->m_position),1,f); - } - } - return b; -} - CList<Bkmk>* BkmkFile::readall() { @@ -169,15 +199,15 @@ CList<Bkmk>* BkmkFile::readall() unsigned long newmagic; fread(&newmagic, sizeof(newmagic), 1, f); - if (newmagic != magic) + if ((newmagic & 0xffffff00) != (magic & 0xffffff00)) { - if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of OpieReader\ndid you upgrade from?", "0_4*", "Any other version") == 0) + if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of " PROGNAME "\ndid you upgrade from?", "0_4*", "Any other version") == 0) { fseek(f,0,SEEK_SET); - bl = readall04(); + bl = readall00(&read05); } else { fseek(f,0,SEEK_SET); - bl = readall03(); + bl = readall00(&read03); } isUpgraded = true; @@ -185,5 +215,21 @@ CList<Bkmk>* BkmkFile::readall() else { - bl = readall04(); + switch(newmagic & 0xff) + { + case 6: + isUpgraded = false; + bl = readall00(read06); + qDebug("Correct version!"); + break; + case 5: + isUpgraded = true; + bl = readall00(read05); + qDebug("Known version!"); + break; + default: + qDebug("Unknown version!"); + isUpgraded = true; + bl = readall00(read05); + } } } @@ -191,10 +237,10 @@ CList<Bkmk>* BkmkFile::readall() } -CList<Bkmk>* BkmkFile::readall04() +CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(FILE*)) { CList<Bkmk>* bl = new CList<Bkmk>; while (1) { - Bkmk* b = read(); + Bkmk* b = (*readfn)(f); if (b == NULL) break; bl->push_back(*b); @@ -204,18 +250,29 @@ CList<Bkmk>* BkmkFile::readall04() } -CList<Bkmk>* BkmkFile::readall03() +Bkmk* BkmkFile::read03(FILE* f) { - CList<Bkmk>* bl = new CList<Bkmk>; - while (1) + Bkmk* b = NULL; + if (f != NULL) { - Bkmk* b = read03(); - if (b == NULL) break; - bl->push_back(*b); - delete b; + unsigned short ln; + if (fread(&ln,sizeof(ln),1,f) == 1) + { + tchar* name = new tchar[ln+1]; + fread(name,sizeof(tchar),ln,f); + name[ln] = 0; + + ln = 0; + tchar* anno = new tchar[ln+1]; + anno[ln] = 0; + + unsigned int pos; + fread(&pos,sizeof(pos),1,f); + b = new Bkmk(name,anno,pos); } - return bl; + } + return b; } -Bkmk* BkmkFile::read03() +Bkmk* BkmkFile::read05(FILE* f) { Bkmk* b = NULL; @@ -225,14 +282,39 @@ Bkmk* BkmkFile::read03() if (fread(&ln,sizeof(ln),1,f) == 1) { - b = new Bkmk; - b->m_name = new tchar[ln+1]; - fread(b->m_name,sizeof(tchar),ln,f); - b->m_name[ln] = 0; + tchar* nm = new tchar[ln+1]; + fread(nm,sizeof(tchar),ln,f); + nm[ln] = 0; + fread(&ln,sizeof(ln),1,f); + tchar* anno = new tchar[ln+1]; + if (ln > 0) fread(anno,sizeof(tchar),ln,f); + anno[ln] = 0; + unsigned int pos; + fread(&pos,sizeof(pos),1,f); + b = new Bkmk(nm,anno,pos); + } + } + return b; +} - ln = 0; - b->m_anno = new tchar[ln+1]; - b->m_anno[ln] = 0; +Bkmk* BkmkFile::read06(FILE* f) +{ + Bkmk* b = NULL; + if (f != NULL) + { + unsigned short ln; + if (fread(&ln,sizeof(ln),1,f) == 1) + { + b = new Bkmk; + b->m_namelen = ln; + b->m_name = new unsigned char[b->m_namelen]; + fread(b->m_name,1,b->m_namelen,f); - fread(&b->m_position,sizeof(b->m_position),1,f); + fread(&(b->m_annolen),sizeof(b->m_annolen),1,f); + if (b->m_annolen > 0) + { + b->m_anno = new unsigned char[b->m_annolen]; + fread(b->m_anno,1,b->m_annolen,f); + } + fread(&(b->m_position),sizeof(b->m_position),1,f); } } |