Diffstat (limited to 'noncore/apps/opie-reader/Aportis.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/Aportis.cpp | 105 |
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; |