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) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/Aportis.cpp163
1 files changed, 123 insertions, 40 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
@@ -1,14 +1,60 @@
#include <stdio.h>
#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>;
size_t cur = ftell(fin);
for (int i = 0; i < nRecs2; i++)
{
DWORD dwPos;
@@ -31,111 +77,144 @@ CList<Bkmk>* Aportis::getbkmklist()
tchar tname[17];
memset(tname, 0, sizeof(tname));
for (int i = 0; name[i] != 0; i++)
{
tname[i] = name[i];
}
- t->push_back(Bkmk(tname,lcn));
+ t->push_back(Bkmk(tname, NULL, lcn));
#else
t->push_back(Bkmk(name,lcn));
#endif
}
}
fseek(fin, cur, SEEK_SET);
return t;
}
int Aportis::openfile(const char *src)
{
-
// printf("In openfile\n");
int ret = 0;
if (!Cpdb::openfile(src)) return -1;
if (head.creator != 0x64414552 // 'dAER'
|| head.type != 0x74584554) // 'tXET')
{
- return -2;
+
+ if (memcmp(&head.creator, "PPrs", 4) == 0 && memcmp(&head.type, "PNRd", 4) == 0)
+ {
+ peanutfile = true;
+ }
+ else
+ {
+ return -2;
+ }
}
- gotorecordnumber(0);
- tDocRecord0 hdr0;
- fread(&hdr0, sizeof(hdr0), 1, fin);
- bCompressed = SwapWord(hdr0.wVersion);
- if (bCompressed!=1 && bCompressed!=2 && bCompressed != 4) {
- ret = bCompressed;
- bCompressed = 2;
- }
-
+ nRecs2 = nRecs = SwapWord(head.recordList.numRecords) - 1;
fseek(fin,0,SEEK_END);
dwLen = ftell(fin);
- nRecs2 = nRecs = SwapWord(head.recordList.numRecords) - 1;
- switch (bCompressed)
- {
- case 4:
+ if (peanutfile)
+ {
+
+ PeanutHeader hdr0;
+ gotorecordnumber(0);
+ fread(&hdr0, sizeof(hdr0), 1, fin);
+ qDebug("Version:%x", ntohs(hdr0.Version));
+ if (hdr0.Version && 0x0200)
{
- dwTLen = 0;
- int i;
- for (i = 0; i < nRecs; i++)
+ bCompressed = 2;
+ }
+ else
+ {
+ bCompressed = 1;
+ }
+ BlockSize = 4096;
+ nRecs = SwapWord(hdr0.Records)-1;
+ dwTLen = nRecs*BlockSize;
+ }
+ else
+ {
+ gotorecordnumber(0);
+ tDocRecord0 hdr0;
+ fread(&hdr0, sizeof(hdr0), 1, fin);
+ bCompressed = SwapWord(hdr0.wVersion);
+ if (bCompressed!=1 && bCompressed!=2 && bCompressed != 4) {
+ ret = bCompressed;
+ bCompressed = 2;
+ }
+ switch (bCompressed)
+ {
+ case 4:
{
- unsigned int bs = GetBS(i);
- if (bs == 0) break;
- else dwTLen += bs;
+ dwTLen = 0;
+ int i;
+ for (i = 0; i < nRecs; i++)
+ {
+ unsigned int bs = GetBS(i);
+ if (bs == 0) break;
+ else dwTLen += bs;
+ }
+ nRecs = i;
+ BlockSize = 0;
}
- nRecs = i;
- BlockSize = 0;
+ break;
+ case 1:
+ case 2:
+ default:
+ nRecs = SwapWord(hdr0.wNumRecs);
+ dwTLen = SwapLong(hdr0.dwStoryLen);
+ BlockSize = SwapWord(hdr0.wRecSize);
+ if (BlockSize == 0)
+ {
+ BlockSize = 4096;
+ printf("WARNING: Blocksize not set in source file\n");
+ }
}
- break;
- case 1:
- case 2:
- default:
- dwTLen = SwapLong(hdr0.dwStoryLen);
- BlockSize = SwapWord(hdr0.wRecSize);
- if (BlockSize == 0)
- {
- BlockSize = 4096;
- printf("WARNING: Blocksize not set in source file\n");
- }
- }
+ }
+
// this is the main record buffer
// it knows how to stretch to accomodate the decompress
currentrec = 0;
cbptr = 0;
outptr = 0;
refreshbuffer();
+ qDebug("Number of records:[%u,%u]", nRecs, nRecs2);
return ret;
}
int Aportis::getch()
{
if (bCompressed == 1)
{
if ((dwRecLen == 0) && !refreshbuffer()) return EOF;
else
{
int c = getc(fin);
+ dePeanut(c);
dwRecLen--;
currentpos++;
return c;
}
}
if (outptr != cbptr)
{
currentpos++;
return (circbuf[outptr = (outptr + 1) % 2048]);
}
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
// codes 1...8 mean copy that many chars; for accented chars & binary
if (c == 0)
{
@@ -149,21 +228,25 @@ int Aportis::getch()
}
else if (c >= 0x01 && c <= 0x08)
{
dwRecLen -= c;
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];
}
else if (c >= 0x80 && c <= 0xBF)
{
int m,n;
c <<= 8;
- c += getc(fin);
+ int c1 = getc(fin);
+ dePeanut(c1);
+ c += c1;
dwRecLen--;
m = (c & 0x3FFF) >> COUNT_BITS;
n = c & ((1<<COUNT_BITS) - 1);
n += 3;
while (n--)
{