|
|
|
/***************************************************************************
|
|
|
|
mapihd.cpp - description
|
|
|
|
-------------------
|
|
|
|
begin : Tue Jul 25 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"
|
|
|
|
|
|
|
|
bool operator < (mapitag_t & a,mapitag_t & b) { return a._order<b._order; }
|
|
|
|
bool operator > (mapitag_t & a,mapitag_t & b) { return a._order>b._order; }
|
|
|
|
bool operator == (mapitag_t & a,mapitag_t & b) { return a._order==b._order; }
|
|
|
|
|
|
|
|
static word_t
|
|
|
|
map_givenname[]=
|
|
|
|
{ pr_givenname,
|
|
|
|
SET_MS_GIVEN_NAME,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_email[]=
|
|
|
|
{ pr_email,
|
|
|
|
SET_MS_EMAIL,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_firstname[]=
|
|
|
|
{ pr_firstname,
|
|
|
|
SET_MS_FIRSTNAME,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_lastname[]=
|
|
|
|
{ pr_lastname,
|
|
|
|
SET_MS_LASTNAME,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_additionalname[]=
|
|
|
|
{ pr_additionalname,
|
|
|
|
SET_MS_MIDDLENAME,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_title[]=
|
|
|
|
{ pr_title,
|
|
|
|
SET_MS_TITLE,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_address[]=
|
|
|
|
{ pr_address,
|
|
|
|
SET_MS_ADDRESS,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_zip[]=
|
|
|
|
{ pr_zip,
|
|
|
|
SET_MS_ZIP,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_state[]=
|
|
|
|
{ pr_state,
|
|
|
|
SET_MS_STATE,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_town[]=
|
|
|
|
{ pr_town,
|
|
|
|
SET_MS_TOWN,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_country[]=
|
|
|
|
{ pr_country,
|
|
|
|
SET_MS_COUNTRY,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_tel[]=
|
|
|
|
{ pr_tel,
|
|
|
|
SET_MS_TEL,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_mobile[]=
|
|
|
|
{ pr_mobile,
|
|
|
|
SET_MS_MOBILE,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_fax[]=
|
|
|
|
{ pr_fax,
|
|
|
|
SET_MS_FAX,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_job[]=
|
|
|
|
{ pr_job,
|
|
|
|
HP_OPENMAIL_JOB,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_organization[]=
|
|
|
|
{ pr_organization,
|
|
|
|
SET_MS_ORGANIZATION,
|
|
|
|
HP_OPENMAIL_ORGANIZATION,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_department[]=
|
|
|
|
{ pr_department,
|
|
|
|
SET_MS_DEPARTMENT,
|
|
|
|
HP_OPENMAIL_DEPARTMENT,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_subdep[]=
|
|
|
|
{ pr_subdep,
|
|
|
|
HP_OPENMAIL_SUBDEP,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_notes[]=
|
|
|
|
{ pr_notes,
|
|
|
|
SET_MS_COMMENT,
|
|
|
|
0
|
|
|
|
},
|
|
|
|
map_notused[]=
|
|
|
|
{ pr_notused,
|
|
|
|
HP_OPENMAIL_LOCATION_OF_WORK, // location of work
|
|
|
|
SET_NOT_USED,
|
|
|
|
0
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static word_t *mapi_map[]={ map_givenname, map_email,
|
|
|
|
map_firstname, map_lastname, map_additionalname,map_title,
|
|
|
|
map_address, map_town, map_zip, map_state, map_country,
|
|
|
|
map_tel, map_mobile, map_fax,
|
|
|
|
map_organization, map_department, map_subdep, map_job,
|
|
|
|
map_notes,
|
|
|
|
map_notused,
|
|
|
|
NULL
|
|
|
|
};
|
|
|
|
|
|
|
|
pabrec_entry mapitag_t::matchTag(void)
|
|
|
|
{
|
|
|
|
int i,j;
|
|
|
|
pabrec_entry e=pr_unknown;
|
|
|
|
|
|
|
|
for(i=0;mapi_map[i]!=NULL && e==pr_unknown;i++) {
|
|
|
|
for(j=1;mapi_map[i][j]!=0 && _tag!=mapi_map[i][j];j++);
|
|
|
|
if (mapi_map[i][j]!=0) {
|
|
|
|
e=(pabrec_entry) mapi_map[i][0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
pabfields_t::pabfields_t(pabrec & R, TQWidget * /*parent*/)
|
|
|
|
{
|
|
|
|
// Skip the first two words, because they're always the
|
|
|
|
// same 000c 0014 ==> 0014 gives us the types, so we
|
|
|
|
// parse from 0014 till the next offset and order the tags.
|
|
|
|
|
|
|
|
int mb,me;
|
|
|
|
uint i,k;
|
|
|
|
content_t _tag,_order;
|
|
|
|
|
|
|
|
mb=R[1];
|
|
|
|
me=R[2];
|
|
|
|
|
|
|
|
while (mb<me) {
|
|
|
|
_tag=R.read(mb);mb+=sizeof(_tag);
|
|
|
|
_order=R.read(mb);mb+=sizeof(_order);
|
|
|
|
|
|
|
|
{mapitag_t mt(_tag,_order);
|
|
|
|
tags[tags.size()]=mt;
|
|
|
|
context_tags[context_tags.size()]=mt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
tags.sort();
|
|
|
|
|
|
|
|
// get the right entries now
|
|
|
|
|
|
|
|
for(i=2,k=0;i<R.N() && k<tags.size();i++,k++) {
|
|
|
|
if (!isUsed(k)) { i-=1; }
|
|
|
|
else {pabrec_entry e;
|
|
|
|
TQString E;
|
|
|
|
|
|
|
|
e=isWhat(k);
|
|
|
|
E=R.getEntry(i);
|
|
|
|
{ TQString s=E;
|
|
|
|
s=s.stripWhiteSpace();
|
|
|
|
E=s;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
{ char m[1024];
|
|
|
|
snprintf(m, sizeof(m), "%d %d %04x %08lx %d %s %d %d",i,k,literal(k),order(k),e,E.latin1(),E[0].latin1(),E.length());
|
|
|
|
info->addLog(m);
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
if (!E.isEmpty()) {
|
|
|
|
|
|
|
|
switch (e) {
|
|
|
|
case pr_givenname: givenName=E;
|
|
|
|
break;
|
|
|
|
case pr_email: email=E;
|
|
|
|
break;
|
|
|
|
case pr_firstname: firstName=E;
|
|
|
|
break;
|
|
|
|
case pr_additionalname: additionalName=E;
|
|
|
|
break;
|
|
|
|
case pr_lastname: lastName=E;
|
|
|
|
break;
|
|
|
|
case pr_title: title=E;
|
|
|
|
break;
|
|
|
|
case pr_address: address=E;
|
|
|
|
break;
|
|
|
|
case pr_town: town=E;
|
|
|
|
break;
|
|
|
|
case pr_state: state=E;
|
|
|
|
break;
|
|
|
|
case pr_zip: zip=E;
|
|
|
|
break;
|
|
|
|
case pr_country: country=E;
|
|
|
|
break;
|
|
|
|
case pr_organization: organization=E;
|
|
|
|
break;
|
|
|
|
case pr_department: department=E;
|
|
|
|
break;
|
|
|
|
case pr_subdep: subDep=E;
|
|
|
|
break;
|
|
|
|
case pr_job: job=E;
|
|
|
|
break;
|
|
|
|
case pr_tel: tel=E;
|
|
|
|
break;
|
|
|
|
case pr_fax: fax=E;
|
|
|
|
break;
|
|
|
|
case pr_modem: modem=E;
|
|
|
|
break;
|
|
|
|
case pr_mobile: mobile=E;
|
|
|
|
break;
|
|
|
|
case pr_url: homepage=E;
|
|
|
|
break;
|
|
|
|
case pr_talk: talk=E;
|
|
|
|
break;
|
|
|
|
case pr_notes: comment=E;
|
|
|
|
break;
|
|
|
|
case pr_birthday: birthday=E;
|
|
|
|
break;
|
|
|
|
case pr_notused:
|
|
|
|
break;
|
|
|
|
default: {/*char m[250];
|
|
|
|
snprintf(m,sizeof(m),"unknown tag '%x'",literal(k));
|
|
|
|
info->log(m);*/
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!firstName.isEmpty() && !lastName.isEmpty()) {
|
|
|
|
givenName=lastName+", "+firstName;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Determine if the record is ok.
|
|
|
|
|
|
|
|
OK=true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool pabfields_t::isUsed(int k)
|
|
|
|
{
|
|
|
|
return tags[k].isUsed();
|
|
|
|
}
|
|
|
|
|
|
|
|
pabrec_entry pabfields_t::isWhat(int k)
|
|
|
|
{
|
|
|
|
return tags[k].matchTag();
|
|
|
|
}
|
|
|
|
|
|
|
|
word_t pabfields_t::literal(int k)
|
|
|
|
{
|
|
|
|
return tags[k].literal();
|
|
|
|
}
|
|
|
|
|
|
|
|
content_t pabfields_t::order(int k)
|
|
|
|
{
|
|
|
|
return tags[k].order();
|
|
|
|
}
|
|
|
|
|
|
|
|
KABC::Addressee pabfields_t::get() {
|
|
|
|
KABC::Addressee a;
|
|
|
|
if (!givenName.isEmpty()) a.setFormattedName(givenName);
|
|
|
|
if (!email.isEmpty()) a.insertEmail(email);
|
|
|
|
if (!title.isEmpty()) a.setTitle(title);
|
|
|
|
if (!firstName.isEmpty()) a.setName(firstName);
|
|
|
|
if (!additionalName.isEmpty()) a.setAdditionalName(additionalName);
|
|
|
|
if (!lastName.isEmpty()) a.setFamilyName(lastName);
|
|
|
|
|
|
|
|
KABC::Address addr;
|
|
|
|
if (!address.isEmpty()) addr.setStreet(address);
|
|
|
|
if (!town.isEmpty()) addr.setLocality(town);
|
|
|
|
if (!zip.isEmpty()) addr.setPostalCode(zip);
|
|
|
|
if (!state.isEmpty()) addr.setRegion(state);
|
|
|
|
if (!country.isEmpty()) addr.setCountry(country);
|
|
|
|
a.insertAddress(addr);
|
|
|
|
|
|
|
|
if (!organization.isEmpty()) a.setOrganization(organization);
|
|
|
|
if (!department.isEmpty()) a.setRole(department);
|
|
|
|
// Miss out department, subDep, job
|
|
|
|
if (!tel.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( tel, KABC::PhoneNumber::Voice ) );
|
|
|
|
if (!fax.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( fax, KABC::PhoneNumber::Fax ) );
|
|
|
|
if (!mobile.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( mobile, KABC::PhoneNumber::Cell ) );
|
|
|
|
if (!modem.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( modem, KABC::PhoneNumber::Modem ) );
|
|
|
|
if (!homepage.isEmpty()) a.setUrl(KURL( homepage ));
|
|
|
|
// Miss out talk
|
|
|
|
if (!comment.isEmpty()) a.setNote(comment);
|
|
|
|
// Miss out birthday
|
|
|
|
return a;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* class pabrec {
|
|
|
|
private:
|
|
|
|
char entry[1024];
|
|
|
|
byte *_mem;
|
|
|
|
word_t *_N;
|
|
|
|
word_t *_w;
|
|
|
|
public:
|
|
|
|
pabrec(pab *); // expects record the begin at reading point (ftell).
|
|
|
|
~pabrec();
|
|
|
|
public:
|
|
|
|
word_t N(void) { return _N[0]; }
|
|
|
|
word_t operator[](int i) { return _w[i]; }
|
|
|
|
const char *getEntry(int i);
|
|
|
|
public:
|
|
|
|
content_t read(word_t offset);
|
|
|
|
};
|
|
|
|
*/
|
|
|
|
|
|
|
|
pabrec::pabrec(pab & P)
|
|
|
|
{
|
|
|
|
adr_t A=P.tell();
|
|
|
|
content_t hdr;
|
|
|
|
word_t offset,size,dummy;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
hdr=P.go(A);
|
|
|
|
offset=P.lower(hdr);
|
|
|
|
|
|
|
|
size=offset;
|
|
|
|
_mem=new byte[size];
|
|
|
|
P.read(_mem,size);
|
|
|
|
|
|
|
|
P.go(A+offset);
|
|
|
|
P.read(m_N);
|
|
|
|
m_W=new word_t[m_N+1];
|
|
|
|
|
|
|
|
P.read(dummy);
|
|
|
|
for(i=0;i<=m_N;i++) {
|
|
|
|
P.read(m_W[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pabrec::~pabrec()
|
|
|
|
{
|
|
|
|
delete _mem;
|
|
|
|
delete m_W;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
content_t pabrec::read(word_t offset)
|
|
|
|
{
|
|
|
|
content_t R;
|
|
|
|
R=_mem[offset+3];
|
|
|
|
R<<=8;R+=_mem[offset+2];
|
|
|
|
R<<=8;R+=_mem[offset+1];
|
|
|
|
R<<=8;R+=_mem[offset];
|
|
|
|
return R;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *pabrec::getEntry(int i)
|
|
|
|
{
|
|
|
|
int mb,me;
|
|
|
|
int k;
|
|
|
|
mb=m_W[i];me=m_W[i+1];
|
|
|
|
for(k=0;mb!=me;mb++) {
|
|
|
|
if (_mem[mb]>=' ' || _mem[mb]=='\n' || _mem[mb]==13 || _mem[mb]=='\t') {
|
|
|
|
if (_mem[mb]==13) { entry[k]='\n'; }
|
|
|
|
else { entry[k]=_mem[mb]; }
|
|
|
|
k+=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
entry[k]='\0';
|
|
|
|
return (const char *) entry;
|
|
|
|
}
|