summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/Aportis.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/Aportis.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/Aportis.cpp105
1 files changed, 94 insertions, 11 deletions
diff --git a/noncore/apps/opie-reader/Aportis.cpp b/noncore/apps/opie-reader/Aportis.cpp
index 595b385..1327ff8 100644
--- a/noncore/apps/opie-reader/Aportis.cpp
+++ b/noncore/apps/opie-reader/Aportis.cpp
@@ -2,9 +2,55 @@
#include <string.h>
#include "Aportis.h"
+#include "my_list.h"
+#include "Bkmks.h"
-Aportis::Aportis() { /*printf("constructing:%x\n",fin);*/ }
+Aportis::Aportis() : peanutfile(false) { /*printf("constructing:%x\n",fin);*/ }
+
+void Aportis::dePeanut(int& ch)
+{
+ if (peanutfile && ch != EOF)
+ {
+ unsigned char c = ch;
+ if (peanutfile) c ^= 0xa5;
+ ch = c;
+ }
+}
CList<Bkmk>* Aportis::getbkmklist()
{
+/*
+ if (peanutfile)
+ {
+ if (nRecs2 > nRecs)
+ {
+ CList<Bkmk>* t = new CList<Bkmk>;
+ for (int i = nRecs; i < nRecs2; i++)
+ {
+ char name[17];
+ name[16] = '\0';
+ qDebug("Record:%d, Length:%u",i,recordlength(i));
+ gotorecordnumber(i);
+ fread(name,1,16,fin);
+ unsigned long lcn;
+ fread(&lcn,sizeof(lcn),1,fin);
+ lcn ^= 0xa5a5a5a5;
+ lcn = SwapLong(lcn);
+ qDebug("Bookmark:%s:%u", name,lcn);
+ tchar tname[17];
+ memset(tname, 0, sizeof(tname));
+ for (int i = 0; name[i] != 0; i++)
+ {
+ tname[i] = name[i] ^ 0xa5;
+ }
+ t->push_back(Bkmk(tname, NULL, lcn));
+ }
+ return t;
+ }
+ else
+ {
+ return NULL;
+ }
+ }
+*/
if (bCompressed != 4) return NULL;
CList<Bkmk>* t = new CList<Bkmk>;
@@ -35,5 +81,5 @@ CList<Bkmk>* Aportis::getbkmklist()
tname[i] = name[i];
}
- t->push_back(Bkmk(tname,lcn));
+ t->push_back(Bkmk(tname, NULL, lcn));
#else
t->push_back(Bkmk(name,lcn));
@@ -47,5 +93,4 @@ CList<Bkmk>* Aportis::getbkmklist()
int Aportis::openfile(const char *src)
{
-
// printf("In openfile\n");
int ret = 0;
@@ -56,7 +101,40 @@ int Aportis::openfile(const char *src)
|| head.type != 0x74584554) // 'tXET')
{
+
+ if (memcmp(&head.creator, "PPrs", 4) == 0 && memcmp(&head.type, "PNRd", 4) == 0)
+ {
+ peanutfile = true;
+ }
+ else
+ {
return -2;
}
+ }
+
+ nRecs2 = nRecs = SwapWord(head.recordList.numRecords) - 1;
+ fseek(fin,0,SEEK_END);
+ dwLen = ftell(fin);
+
+ if (peanutfile)
+ {
+ PeanutHeader hdr0;
+ gotorecordnumber(0);
+ fread(&hdr0, sizeof(hdr0), 1, fin);
+ qDebug("Version:%x", ntohs(hdr0.Version));
+ if (hdr0.Version && 0x0200)
+ {
+ bCompressed = 2;
+ }
+ else
+ {
+ bCompressed = 1;
+ }
+ BlockSize = 4096;
+ nRecs = SwapWord(hdr0.Records)-1;
+ dwTLen = nRecs*BlockSize;
+ }
+ else
+ {
gotorecordnumber(0);
tDocRecord0 hdr0;
@@ -67,9 +145,4 @@ int Aportis::openfile(const char *src)
bCompressed = 2;
}
-
- fseek(fin,0,SEEK_END);
- dwLen = ftell(fin);
- nRecs2 = nRecs = SwapWord(head.recordList.numRecords) - 1;
-
switch (bCompressed)
{
@@ -91,4 +164,5 @@ int Aportis::openfile(const char *src)
case 2:
default:
+ nRecs = SwapWord(hdr0.wNumRecs);
dwTLen = SwapLong(hdr0.dwStoryLen);
BlockSize = SwapWord(hdr0.wRecSize);
@@ -99,4 +173,6 @@ int Aportis::openfile(const char *src)
}
}
+ }
+
@@ -107,4 +183,5 @@ int Aportis::openfile(const char *src)
outptr = 0;
refreshbuffer();
+ qDebug("Number of records:[%u,%u]", nRecs, nRecs2);
return ret;
}
@@ -118,4 +195,5 @@ int Aportis::getch()
{
int c = getc(fin);
+ dePeanut(c);
dwRecLen--;
currentpos++;
@@ -130,8 +208,9 @@ int Aportis::getch()
if ((dwRecLen == 0) && !refreshbuffer()) return EOF;
currentpos++;
- unsigned int c;
+ int c;
// take a char from the input buffer
c = getc(fin);
+ dePeanut(c);
dwRecLen--;
// separate the char into zones: 0, 1...8, 9...0x7F, 0x80...0xBF, 0xC0...0xFF
@@ -153,5 +232,7 @@ int Aportis::getch()
while(c--)
{
- circbuf[cbptr = (cbptr+1)%2048] = getc(fin);
+ int c = getc(fin);
+ dePeanut(c);
+ circbuf[cbptr = (cbptr+1)%2048] = c;
}
return circbuf[outptr = (outptr+1)%2048];
@@ -161,5 +242,7 @@ int Aportis::getch()
int m,n;
c <<= 8;
- c += getc(fin);
+ int c1 = getc(fin);
+ dePeanut(c1);
+ c += c1;
dwRecLen--;
m = (c & 0x3FFF) >> COUNT_BITS;