kaddressbook Library API Documentation

pab_mapihd.cpp

00001 /***************************************************************************
00002                           mapihd.cpp  -  description
00003                              -------------------
00004     begin                : Tue Jul 25 2000
00005     copyright            : (C) 2000 by Hans Dijkema
00006     email                : kmailcvt@hum.org
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include "pab_pablib.h"
00019 
00020 bool operator < (mapitag_t & a,mapitag_t & b)  { return a._order<b._order; }
00021 bool operator > (mapitag_t & a,mapitag_t & b)  { return a._order>b._order; }
00022 bool operator == (mapitag_t & a,mapitag_t & b) { return a._order==b._order; }
00023 
00024 static word_t
00025 map_givenname[]=
00026    { pr_givenname,
00027           SET_MS_GIVEN_NAME,
00028           0
00029    },
00030 map_email[]=
00031    { pr_email,
00032           SET_MS_EMAIL,
00033           0
00034    },
00035 map_firstname[]=
00036    { pr_firstname,
00037       SET_MS_FIRSTNAME,
00038           0
00039    },
00040 map_lastname[]=
00041    { pr_lastname,
00042           SET_MS_LASTNAME,
00043           0
00044    },
00045 map_additionalname[]=
00046    { pr_additionalname,
00047           SET_MS_MIDDLENAME,
00048           0
00049    },
00050 map_title[]=
00051    { pr_title,
00052           SET_MS_TITLE,
00053           0
00054    },
00055 map_address[]=
00056    { pr_address,
00057           SET_MS_ADDRESS,
00058           0
00059    },
00060 map_zip[]=
00061    { pr_zip,
00062           SET_MS_ZIP,
00063           0
00064    },
00065 map_state[]=
00066    { pr_state,
00067           SET_MS_STATE,
00068           0
00069    },
00070 map_town[]=
00071    { pr_town,
00072           SET_MS_TOWN,
00073           0
00074    },
00075 map_country[]=
00076    { pr_country,
00077           SET_MS_COUNTRY,
00078           0
00079    },
00080 map_tel[]=
00081    { pr_tel,
00082           SET_MS_TEL,
00083           0
00084    },
00085 map_mobile[]=
00086    { pr_mobile,
00087           SET_MS_MOBILE,
00088           0
00089    },
00090 map_fax[]=
00091    { pr_fax,
00092           SET_MS_FAX,
00093           0
00094    },
00095 map_job[]=
00096    { pr_job,
00097           HP_OPENMAIL_JOB,
00098           0
00099    },
00100 map_organization[]=
00101    { pr_organization,
00102           SET_MS_ORGANIZATION,
00103           HP_OPENMAIL_ORGANIZATION,
00104           0
00105    },
00106 map_department[]=
00107    { pr_department,
00108           SET_MS_DEPARTMENT,
00109           HP_OPENMAIL_DEPARTMENT,
00110           0
00111    },
00112 map_subdep[]=
00113    { pr_subdep,
00114           HP_OPENMAIL_SUBDEP,
00115           0
00116    },
00117 map_notes[]=
00118    { pr_notes,
00119           SET_MS_COMMENT,
00120           0
00121    },
00122 map_notused[]=
00123    { pr_notused,
00124           HP_OPENMAIL_LOCATION_OF_WORK,           // location of work
00125       SET_NOT_USED,
00126           0
00127    };
00128 
00129 
00130 static word_t *mapi_map[]={ map_givenname, map_email,
00131                      map_firstname, map_lastname, map_additionalname,map_title,
00132                      map_address,   map_town, map_zip, map_state, map_country,
00133                      map_tel, map_mobile, map_fax,
00134                      map_organization, map_department, map_subdep, map_job,
00135                      map_notes,
00136                      map_notused,
00137                      NULL
00138                    };
00139 
00140 pabrec_entry mapitag_t::matchTag(void)
00141 {
00142 int          i,j;
00143 pabrec_entry e=pr_unknown;
00144 
00145   for(i=0;mapi_map[i]!=NULL && e==pr_unknown;i++) {
00146     for(j=1;mapi_map[i][j]!=0 && _tag!=mapi_map[i][j];j++);
00147     if (mapi_map[i][j]!=0) {
00148       e=(pabrec_entry) mapi_map[i][0];
00149     }
00150   }
00151 return e;
00152 }
00153 
00154 pabfields_t::pabfields_t(pabrec & R, QWidget * /*parent*/)
00155 {
00156   // Skip the first two words, because they're always the
00157   // same 000c 0014 ==> 0014 gives us the types, so we
00158   // parse from 0014 till the next offset and order the tags.
00159 
00160   int         mb,me;
00161   uint        i,k;
00162   content_t   _tag,_order;
00163 
00164   mb=R[1];
00165   me=R[2];
00166 
00167   while (mb<me) {
00168     _tag=R.read(mb);mb+=sizeof(_tag);
00169     _order=R.read(mb);mb+=sizeof(_order);
00170 
00171     {mapitag_t mt(_tag,_order);
00172      tags[tags.size()]=mt;
00173      context_tags[context_tags.size()]=mt;
00174     }
00175   }
00176   tags.sort();
00177 
00178   // get the right entries now
00179 
00180   for(i=2,k=0;i<R.N() && k<tags.size();i++,k++) {
00181     if (!isUsed(k)) { i-=1; }
00182     else {pabrec_entry e;
00183           QString      E;
00184 
00185        e=isWhat(k);
00186        E=R.getEntry(i);
00187        { QString s=E;
00188            s=s.stripWhiteSpace();
00189            E=s;
00190        }
00191 
00192        /*
00193        {  char m[1024];
00194           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());
00195           info->addLog(m);
00196        }
00197        */
00198 
00199        if (!E.isEmpty()) {
00200 
00201          switch (e) {
00202            case pr_givenname: givenName=E;
00203            break;
00204            case pr_email:     email=E;
00205            break;
00206            case pr_firstname: firstName=E;
00207            break;
00208            case pr_additionalname: additionalName=E;
00209            break;
00210            case pr_lastname:  lastName=E;
00211            break;
00212            case pr_title:     title=E;
00213            break;
00214            case pr_address:   address=E;
00215            break;
00216            case pr_town:      town=E;
00217            break;
00218            case pr_state:     state=E;
00219            break;
00220            case pr_zip:       zip=E;
00221            break;
00222            case pr_country:  country=E;
00223            break;
00224            case pr_organization: organization=E;
00225            break;
00226            case pr_department: department=E;
00227            break;
00228            case pr_subdep:     subDep=E;
00229            break;
00230            case pr_job:        job=E;
00231            break;
00232            case pr_tel:        tel=E;
00233            break;
00234            case pr_fax:        fax=E;
00235            break;
00236            case pr_modem:      modem=E;
00237            break;
00238            case pr_mobile:     mobile=E;
00239            break;
00240            case pr_url:        homepage=E;
00241            break;
00242            case pr_talk:       talk=E;
00243            break;
00244            case pr_notes:      comment=E;
00245            break;
00246            case pr_birthday:   birthday=E;
00247            break;
00248            case pr_notused:
00249            break;
00250            default:            {/*char m[250];
00251                                   snprintf(m,sizeof(m),"unknown tag '%x'",literal(k));
00252                                   info->log(m);*/
00253                                }
00254            break;
00255          }
00256       }
00257     }
00258   }
00259 
00260   if (!firstName.isEmpty() && !lastName.isEmpty()) {
00261     givenName=lastName+", "+firstName;
00262   }
00263 
00264   // Determine if the record is ok.
00265 
00266   OK=true;
00267 }
00268 
00269 bool pabfields_t::isUsed(int k)
00270 {
00271 return tags[k].isUsed();
00272 }
00273 
00274 pabrec_entry pabfields_t::isWhat(int k)
00275 {
00276 return tags[k].matchTag();
00277 }
00278 
00279 word_t pabfields_t::literal(int k)
00280 {
00281 return tags[k].literal();
00282 }
00283 
00284 content_t pabfields_t::order(int k)
00285 {
00286 return tags[k].order();
00287 }
00288 
00289 KABC::Addressee pabfields_t::get() {
00290   KABC::Addressee a;
00291   if (!givenName.isEmpty()) a.setFormattedName(givenName);
00292   if (!email.isEmpty()) a.insertEmail(email);
00293   if (!title.isEmpty()) a.setTitle(title);
00294   if (!firstName.isEmpty()) a.setName(firstName);
00295   if (!additionalName.isEmpty()) a.setAdditionalName(additionalName);
00296   if (!lastName.isEmpty()) a.setFamilyName(lastName);
00297 
00298   KABC::Address addr;
00299   if (!address.isEmpty()) addr.setStreet(address);
00300   if (!town.isEmpty()) addr.setLocality(town);
00301   if (!zip.isEmpty()) addr.setPostalCode(zip);
00302   if (!state.isEmpty()) addr.setRegion(state);
00303   if (!country.isEmpty()) addr.setCountry(country);
00304   a.insertAddress(addr);
00305 
00306   if (!organization.isEmpty()) a.setOrganization(organization);
00307   if (!department.isEmpty()) a.setRole(department);
00308   // Miss out department, subDep, job
00309   if (!tel.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( tel, KABC::PhoneNumber::Voice ) );
00310   if (!fax.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( fax, KABC::PhoneNumber::Fax ) );
00311   if (!mobile.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( mobile, KABC::PhoneNumber::Cell ) );
00312   if (!modem.isEmpty()) a.insertPhoneNumber( KABC::PhoneNumber( modem, KABC::PhoneNumber::Modem ) );
00313   if (!homepage.isEmpty()) a.setUrl(KURL( homepage ));
00314   // Miss out talk
00315   if (!comment.isEmpty()) a.setNote(comment);
00316   // Miss out birthday
00317   return a;
00318 }
00319 
00320 
00321 
00322 
00323 /* class pabrec {
00324    private:
00325      char   entry[1024];
00326      byte   *_mem;
00327      word_t *_N;
00328      word_t *_w;
00329    public:
00330      pabrec(pab *);       // expects record the begin at reading point (ftell).
00331     ~pabrec();
00332    public:
00333      word_t N(void)           { return _N[0]; }
00334      word_t operator[](int i) { return _w[i]; }
00335      const char *getEntry(int i);
00336    public:
00337      content_t read(word_t offset);
00338  };
00339 */
00340 
00341 pabrec::pabrec(pab & P)
00342 {
00343 adr_t     A=P.tell();
00344 content_t hdr;
00345 word_t    offset,size,dummy;
00346 int       i;
00347 
00348   hdr=P.go(A);
00349   offset=P.lower(hdr);
00350 
00351   size=offset;
00352   _mem=new byte[size];
00353   P.read(_mem,size);
00354 
00355   P.go(A+offset);
00356   P.read(m_N);
00357   m_W=new word_t[m_N+1];
00358 
00359   P.read(dummy);
00360   for(i=0;i<=m_N;i++) {
00361     P.read(m_W[i]);
00362   }
00363 }
00364 
00365 pabrec::~pabrec()
00366 {
00367   delete _mem;
00368   delete m_W;
00369 }
00370 
00371 
00372 content_t pabrec::read(word_t offset)
00373 {
00374 content_t R;
00375   R=_mem[offset+3];
00376   R<<=8;R+=_mem[offset+2];
00377   R<<=8;R+=_mem[offset+1];
00378   R<<=8;R+=_mem[offset];
00379 return R;
00380 }
00381 
00382 const char *pabrec::getEntry(int i)
00383 {
00384 int mb,me;
00385 int k;
00386   mb=m_W[i];me=m_W[i+1];
00387   for(k=0;mb!=me;mb++) {
00388     if (_mem[mb]>=' ' || _mem[mb]=='\n' || _mem[mb]==13 || _mem[mb]=='\t') {
00389       if (_mem[mb]==13) { entry[k]='\n'; }
00390       else { entry[k]=_mem[mb]; }
00391       k+=1;
00392     }
00393   }
00394   entry[k]='\0';
00395 return (const char *) entry;
00396 }
KDE Logo
This file is part of the documentation for kaddressbook Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:38:53 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003