summaryrefslogtreecommitdiffstats
path: root/kaddressbook/xxport/pab_pablib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaddressbook/xxport/pab_pablib.cpp')
-rw-r--r--kaddressbook/xxport/pab_pablib.cpp333
1 files changed, 333 insertions, 0 deletions
diff --git a/kaddressbook/xxport/pab_pablib.cpp b/kaddressbook/xxport/pab_pablib.cpp
new file mode 100644
index 00000000..c56c4e9a
--- /dev/null
+++ b/kaddressbook/xxport/pab_pablib.cpp
@@ -0,0 +1,333 @@
+/***************************************************************************
+ pablib.cxx - description
+ -------------------
+ begin : Tue Jul 4 2000
+ copyright : (C) 2000 by Hans Dijkema
+ email : kmailcvt@hum.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "pab_pablib.h"
+
+#define REC_OK PAB_REC_OK
+
+
+pab::pab(const char *_pabfile)
+{
+ pabfile=_pabfile;
+ in.setName(pabfile);
+ in.open(IO_ReadOnly);
+ cap=i18n("Import MS Exchange Personal Address Book (.PAB)");
+}
+
+
+pab::~pab()
+{
+ if (in.isOpen()) { in.close(); }
+}
+
+//////////////////////////////////////////////////////////////////////
+//
+// Main conversion
+//
+//////////////////////////////////////////////////////////////////////
+
+bool pab::convert(void)
+{
+adr_t A;
+bool ret;
+
+ if (!in.isOpen()) {QString msg;
+ msg=i18n("Cannot open %1 for reading").arg(pabfile);
+ // info->alert(msg);
+ return false;
+ }
+ if (!knownPAB()) {
+ return false;
+ }
+
+/*
+ if (!f->openAddressBook(info)) {
+ return false;
+ }
+*/
+
+ A=go(INDEX_OF_INDEX);
+ ret=convert(A,0,0);
+
+ // f->closeAddressBook();
+
+return ret;
+}
+
+bool pab::convert(adr_t A,content_t ,content_t )
+{
+adr_t table;
+content_t start,stop,T;
+int n, N = 0;
+
+ go(A);
+ T=read();
+
+ // Now we have to decide if this is a distribution list
+ // or an addressbook container. If it is the last just
+ // jump directly to dotable().
+
+ //if (upper(T)==PAB_REC_OK) {
+ // dotable(A,strt,stp);
+ // return true;
+ //}
+
+ // OK, it's not an addressbook container,
+ // handle it like a distribution list
+
+ start=T;
+ while(start!=0) {
+ N+=1;
+ stop=read();
+ table=read();
+ start=read();
+ }
+ if (N==0) { N=1; }
+/* {char m[100];
+ sprintf(m,"%d",N);
+ info->alert("",m);
+ }*/
+
+ //A=go(INDEX_OF_INDEX);
+ //printf("IoI=%08lx\n",A);
+ go(A);
+ start=read();
+ n=0;
+ while(start!=0) {adr_t cp;
+ stop=read();
+ table=read();
+ cp=tell();
+ dotable(table,start,stop);
+ //convert(table,start,stop);
+ go(cp);
+ start=read();
+ n+=1;
+ // info->setOverall( 100 * n / N );
+ }
+
+return true;
+}
+
+
+void pab::dotable(adr_t T,content_t start,content_t stop)
+{
+adr_t REC,pREC,cp;
+content_t cmp,skip;
+int N,n;
+
+ go(T);
+ cp=tell();
+
+ REC=0xffffffff;
+ pREC=0;
+ cmp=read();
+ if (cmp!=start) {
+ // first try processing as if this was a record. I.e. at the stop thing
+ processRec(stop);
+ // Then exit
+ // info->setCurrent();
+ // info->setCurrent(100);
+ return;
+ } // This is not a table.
+
+ // info->setCurrent();
+ N=0;
+ while (cmp!=stop && REC!=pREC) {
+ pREC=REC;
+ REC=read();
+ if (REC!=pREC) {
+ skip=read();
+ cmp=read();
+ }
+ N+=1;
+ }
+
+ go(cp);
+ REC=0xffffffff;
+ pREC=0;
+
+ cmp=read();
+
+ n=0;
+ while(cmp!=stop && REC!=pREC) {adr_t cp;
+ pREC=REC;
+ REC=read();
+ if (REC!=pREC) {
+ skip=read();
+ cp=tell();
+ processRec(REC);
+ go(cp);
+ cmp=read();
+ }
+ n+=1;
+ // info->setCurrent(100 * n / N);
+ }
+
+ // info->setCurrent();
+ // info->setCurrent(100);
+}
+
+
+void pab::processRec(adr_t REC)
+{
+content_t hdr;
+
+ hdr=go(REC);
+ if (upper(hdr)==REC_OK) { // Now read a record and instantiate!
+ pabrec rec(*this);
+ pabfields_t fields(rec, NULL);
+
+ if (fields.isOK() && fields.isUsable()) {
+ // f->addContact( fields.get() );
+ }
+ }
+}
+
+void pab::prt(unsigned char *,pabrec &,pabrec_entry )
+{
+}
+
+#define PABREC_N (sizeof(pabrec)/sizeof(word_t))
+
+void pab::rdPabRec(pabrec & )
+{
+}
+
+//////////////////////////////////////////////////////////////////////
+//
+// Here's where we recognize the record types
+//
+//////////////////////////////////////////////////////////////////////
+
+bool pab::recUnknown(pabrec &)
+{
+return false;
+}
+
+bool pab::recNoFunction(pabrec & )
+{
+return false;
+}
+
+const char *pab::get(unsigned char *,pabrec_entry ,pabrec & )
+{
+return "";
+}
+
+void pab::getrange(pabrec & ,pabrec_entry ,word_t & ,word_t & )
+{
+}
+
+//////////////////////////////////////////////////////////////////////
+//
+// Here's where we recognize the PAB files
+//
+//////////////////////////////////////////////////////////////////////
+
+bool pab::knownPAB(void)
+{
+content_t id;
+ id=go(0);
+ if (id!=PAB_FILE_ID) {QString msg;
+ msg=i18n("%1 has no PAB id that I know of, cannot convert this").arg(pabfile);
+ // info->alert(msg);
+ return false;
+ }
+return true;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+//
+// Functions to do file reading/positioning
+//
+//////////////////////////////////////////////////////////////////////
+
+content_t pab::go(adr_t a)
+{
+content_t A;
+ in.at(a);
+ A=read();
+ in.at(a);
+return A;
+}
+
+content_t pab::read(void)
+{
+unsigned char mem[4];
+content_t A;
+ in.readBlock((char *) &mem, sizeof(A)); // WinTel unsigned long opslag
+ A=mem[3];
+ A<<=8;A|=mem[2];
+ A<<=8;A|=mem[1];
+ A<<=8;A|=mem[0];
+return A;
+}
+
+void pab::read(word_t & w)
+{
+unsigned char mem[2];
+ in.readBlock((char *) &mem, sizeof(w));
+ w=mem[1];
+ w<<=8;w|=mem[0];
+}
+
+content_t pab::relative(int words)
+{
+adr_t a;
+ a=in.at();
+return go(a+(words*sizeof(content_t)));
+}
+
+content_t pab::add(adr_t & A,int words)
+{
+ A+=(words*sizeof(content_t));
+return go(A);
+}
+
+pabsize_t pab::size(content_t A)
+{
+return A&0xFFFF;
+}
+
+word_t pab::lower(content_t A)
+{
+return A&0xFFFF;
+}
+
+word_t pab::upper(content_t A)
+{
+return A>>16;
+}
+
+void pab::size(content_t A,pabsize_t & s1,pabsize_t & s2)
+{
+ s1=A&0xFFFF;
+ s2>>=16;
+}
+
+byte_t pab::readbyte(void)
+{
+byte_t c;
+ c=in.getch();
+return c;
+}
+
+void pab::read(unsigned char *mem,content_t size)
+{
+ in.readBlock((char *) mem, size);
+}