Diffstat (limited to 'noncore/apps/opie-reader/Bkmks.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/Bkmks.cpp | 310 |
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 +1,2 @@ +#include "name.h" #include <qmessagebox.h> @@ -11,2 +12,11 @@ const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned lo +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); +} @@ -14,5 +24,2 @@ Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_ { - int len = ustrlen(_nm)+1; - m_name = new tchar[len]; - for (int i = 0; i < len; i++) m_name[i] = _nm[i]; @@ -20,4 +27,4 @@ Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_ { - m_anno = new tchar[1]; - m_anno[0] = 0; + tchar t = 0; + init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p); } @@ -25,5 +32,3 @@ Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_ { - 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); } @@ -31,2 +36,28 @@ Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_ +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() @@ -43,4 +74,4 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) { - delete [] m_name; - m_name = NULL; + delete [] m_name; + m_name = NULL; } @@ -48,4 +79,4 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) { - delete [] m_anno; - m_anno = NULL; + delete [] m_anno; + m_anno = NULL; } @@ -53,16 +84,16 @@ Bkmk& Bkmk::operator=(const Bkmk& rhs) { - 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 - m_name = NULL; + m_name = NULL; 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 - m_anno = NULL; + m_anno = NULL; m_position = rhs.m_position; @@ -73,3 +104,24 @@ 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(unsigned char* t, unsigned short len) +{ + if (m_anno != NULL) + { + delete [] m_anno; + m_anno = NULL; + } + if (t != NULL) + { + 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; + } } @@ -80,4 +132,4 @@ void Bkmk::setAnno(tchar* t) { - delete [] m_anno; - m_anno = NULL; + delete [] m_anno; + m_anno = NULL; } @@ -85,11 +137,16 @@ void Bkmk::setAnno(tchar* t) { - int len = ustrlen(t)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = t[i]; + 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_anno = NULL; + { + 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) : @@ -99,3 +156,3 @@ BkmkFile::BkmkFile(const char *fnm, bool w ) { - f = fopen(fnm, "wb"); + f = fopen(fnm, "wb"); } @@ -103,3 +160,3 @@ BkmkFile::BkmkFile(const char *fnm, bool w ) { - f = fopen(fnm, "rb"); + f = fopen(fnm, "rb"); } @@ -112,3 +169,3 @@ BkmkFile::~BkmkFile() -void BkmkFile::write(tchar* nm, tchar* an, const unsigned int& pos) +void BkmkFile::write(const Bkmk& b) { @@ -116,9 +173,7 @@ void BkmkFile::write(tchar* nm, tchar* an, const unsigned int& pos) { - 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); } @@ -126,4 +181,2 @@ void BkmkFile::write(tchar* nm, tchar* an, const unsigned int& pos) -void BkmkFile::write(const Bkmk& b) { write(b.name(), b.anno(), b.value()); } - void BkmkFile::write(CList<Bkmk>& bl) @@ -132,31 +185,8 @@ void BkmkFile::write(CList<Bkmk>& bl) { - fwrite(&magic, sizeof(magic), 1, f); - for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++) - { - write(*i); - } - } -} - -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); - } + fwrite(&magic, sizeof(magic), 1, f); + for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++) + { + write(*i); + } } - return b; } @@ -168,22 +198,38 @@ CList<Bkmk>* BkmkFile::readall() { - unsigned long newmagic; - fread(&newmagic, sizeof(newmagic), 1, f); - if (newmagic != magic) - { - if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of OpieReader\ndid you upgrade from?", "0_4*", "Any other version") == 0) - { - fseek(f,0,SEEK_SET); - bl = readall04(); - } - else - { - fseek(f,0,SEEK_SET); - bl = readall03(); - } - isUpgraded = true; - } - else - { - bl = readall04(); - } + unsigned long newmagic; + fread(&newmagic, sizeof(newmagic), 1, f); + if ((newmagic & 0xffffff00) != (magic & 0xffffff00)) + { + 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 = readall00(&read05); + } + else + { + fseek(f,0,SEEK_SET); + bl = readall00(&read03); + } + isUpgraded = true; + } + else + { + 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); + } + } } @@ -192,3 +238,3 @@ CList<Bkmk>* BkmkFile::readall() -CList<Bkmk>* BkmkFile::readall04() +CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(FILE*)) { @@ -197,6 +243,6 @@ CList<Bkmk>* BkmkFile::readall04() { - Bkmk* b = read(); - if (b == NULL) break; - bl->push_back(*b); - delete b; + Bkmk* b = (*readfn)(f); + if (b == NULL) break; + bl->push_back(*b); + delete b; } @@ -205,16 +251,27 @@ 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) { @@ -223,16 +280,41 @@ Bkmk* BkmkFile::read03() { - 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; + unsigned short ln; + if (fread(&ln,sizeof(ln),1,f) == 1) + { + 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); + } } |