summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/Bkmks.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/Bkmks.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/Bkmks.cpp236
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,3 +1,4 @@
+#include "name.h"
#include <qmessagebox.h>
#include "Bkmks.h"
@@ -9,26 +10,56 @@
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()
{
if (m_name != NULL) delete [] m_name;
@@ -51,17 +82,17 @@ 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
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;
@@ -71,10 +102,10 @@ 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)
{
@@ -83,15 +114,41 @@ 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)
{
@@ -110,22 +167,18 @@ BkmkFile::~BkmkFile()
if (f != NULL) fclose(f);
}
-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)
{
if (f != NULL)
@@ -138,29 +191,6 @@ 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()
{
CList<Bkmk>* bl = NULL;
@@ -168,34 +198,50 @@ 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;
}
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);
+ }
}
}
return bl;
}
-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);
delete b;
@@ -203,20 +249,31 @@ CList<Bkmk>* BkmkFile::readall04()
return bl;
}
-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;
if (f != NULL)
@@ -224,16 +281,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;
+ 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);
}
}
return b;