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.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:37 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003