console/kabcclient
csvtemplate.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "csvtemplate.h"
00021
00022
00023 #include <QtCore/QDateTime>
00024
00025
00026 #include <kconfigbase.h>
00027 #include <kconfiggroup.h>
00028
00029
00030 #include <kabc/address.h>
00031 #include <kabc/addressee.h>
00032
00033 using namespace KABC;
00034
00036
00037 CSVTemplate* CSVTemplate::m_defaultTemplate = 0;
00038
00040
00041 CSVTemplate::CSVTemplate(KConfigBase* config) : m_columns(0)
00042 {
00043 if (config == 0) return;
00044
00045 KConfigGroup columnMap = config->group("csv column map");
00046 const QStringList keyList = columnMap.keyList();
00047
00048 QStringList::const_iterator it = keyList.begin();
00049 QStringList::const_iterator endIt = keyList.end();
00050 for (; it != endIt; ++it)
00051 {
00052 if ((*it).isEmpty()) continue;
00053
00054 bool ok = false;
00055 int column = (*it).toInt(&ok);
00056 if (!ok) continue;
00057
00058 int field = columnMap.readEntry(*it, -1);
00059 if (field < 0) continue;
00060
00061 m_columnToField.insert(column, field);
00062 }
00063
00064 KConfigGroup general = config->group("General");
00065
00066 m_datePattern = general.readEntry("DatePattern");
00067 if (m_datePattern.isEmpty()) m_datePattern = "Y-M-D";
00068 createDateFormat();
00069
00070 m_columns = general.readEntry("Columns", 0);
00071 if (m_columns < 0) m_columns = 0;
00072
00073 switch (general.readEntry("DelimiterType", 0))
00074 {
00075 case 1:
00076 m_delimiter = ";";
00077 break;
00078
00079 case 2:
00080 m_delimiter = "\t";
00081 break;
00082
00083 case 3:
00084 m_delimiter = " ";
00085 break;
00086
00087 case 4:
00088 m_delimiter = general.readEntry("DelimiterOther");
00089 break;
00090
00091 default:
00092 m_delimiter = ",";
00093 }
00094 if (m_delimiter.isEmpty()) m_delimiter = ",";
00095
00096 switch (general.readEntry("QuoteType", 0))
00097 {
00098 case 1:
00099 m_quote = "'";
00100 break;
00101
00102 case 2:
00103 break;
00104
00105 default:
00106 m_quote = "\"";
00107 break;
00108 }
00109 }
00110
00112
00113 QString CSVTemplate::fieldText(int column, const KABC::Addressee& addressee) const
00114 {
00115 if (column < 0 || addressee.isEmpty()) return QString();
00116 if (m_columnToField.isEmpty()) return QString();
00117
00118 QMap<int, int>::const_iterator it = m_columnToField.find(column);
00119 if (it == m_columnToField.end()) return QString();
00120
00121 QString text;
00122 switch (it.value())
00123 {
00124 case 0:
00125 text = addressee.formattedName();
00126 break;
00127 case 1:
00128 text = addressee.familyName();
00129 break;
00130 case 2:
00131 text = addressee.givenName();
00132 break;
00133 case 3:
00134 text = addressee.additionalName();
00135 break;
00136 case 4:
00137 text = addressee.prefix();
00138 break;
00139 case 5:
00140 text = addressee.suffix();
00141 break;
00142 case 6:
00143 text = addressee.nickName();
00144 break;
00145 case 7:
00146 text = formatDate(addressee.birthday());
00147 break;
00148 case 8:
00149 text = addressee.address(Address::Home).street();
00150 break;
00151 case 9:
00152 text = addressee.address(Address::Home).locality();
00153 break;
00154 case 10:
00155 text = addressee.address(Address::Home).region();
00156 break;
00157 case 11:
00158 text = addressee.address(Address::Home).postalCode();
00159 break;
00160 case 12:
00161 text = addressee.address(Address::Home).country();
00162 break;
00163 case 13:
00164 text = addressee.address(Address::Home).label();
00165 break;
00166 case 14:
00167 text = addressee.address(Address::Work).street();
00168 break;
00169 case 15:
00170 text = addressee.address(Address::Work).locality();
00171 break;
00172 case 16:
00173 text = addressee.address(Address::Work).region();
00174 break;
00175 case 17:
00176 text = addressee.address(Address::Work).postalCode();
00177 break;
00178 case 18:
00179 text = addressee.address(Address::Work).country();
00180 break;
00181 case 19:
00182 text = addressee.address(Address::Work).label();
00183 break;
00184 case 20:
00185 text = addressee.phoneNumber(PhoneNumber::Home).number();
00186 break;
00187 case 21:
00188 text = addressee.phoneNumber(PhoneNumber::Work).number();
00189 break;
00190 case 22:
00191 text = addressee.phoneNumber(PhoneNumber::Cell).number();
00192 break;
00193 case 23:
00194 text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Home).number();
00195 break;
00196 case 24:
00197 text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Work).number();
00198 break;
00199 case 25:
00200 text = addressee.phoneNumber(PhoneNumber::Car).number();
00201 break;
00202 case 26:
00203 text = addressee.phoneNumber(PhoneNumber::Isdn).number();
00204 break;
00205 case 27:
00206 text = addressee.phoneNumber(PhoneNumber::Pager).number();
00207 break;
00208 case 28:
00209 text = addressee.preferredEmail();
00210 break;
00211 case 29:
00212 text = addressee.mailer();
00213 break;
00214 case 30:
00215 text = addressee.title();
00216 break;
00217 case 31:
00218 text = addressee.role();
00219 break;
00220 case 32:
00221 text = addressee.organization();
00222 break;
00223 case 33:
00224 text = addressee.note();
00225 break;
00226 case 34:
00227 text = addressee.url().prettyUrl();
00228 break;
00229 case 35:
00230 break;
00231 case 36:
00232 break;
00233 case 37:
00234 break;
00235 case 38:
00236 break;
00237 case 39:
00238 break;
00239 case 40:
00240 break;
00241 case 41:
00242 break;
00243 case 42:
00244 break;
00245
00246 default:
00247 break;
00248 }
00249
00250 return text;
00251 }
00252
00254
00255 void CSVTemplate::setFieldText(int column, KABC::Addressee& addressee, const QString& text) const
00256 {
00257 if (column < 0 || text.isEmpty()) return;
00258 if (m_columnToField.isEmpty()) return;
00259
00260 QMap<int, int>::const_iterator it = m_columnToField.find(column);
00261 if (it == m_columnToField.end()) return;
00262
00263 Address address;
00264 PhoneNumber phone;
00265
00266 switch (it.value())
00267 {
00268 case 0:
00269 addressee.setFormattedName(text);
00270 break;
00271 case 1:
00272 addressee.setFamilyName(text);
00273 break;
00274 case 2:
00275 addressee.setGivenName(text);
00276 break;
00277 case 3:
00278 addressee.setAdditionalName(text);
00279 break;
00280 case 4:
00281 addressee.setPrefix(text);
00282 break;
00283 case 5:
00284 addressee.setSuffix(text);
00285 break;
00286 case 6:
00287 addressee.setNickName(text);
00288 break;
00289 case 7:
00290 addressee.setBirthday(parseDate(text));
00291 break;
00292 case 8:
00293 address = addressee.address(Address::Home);
00294 address.setStreet(text);
00295 addressee.insertAddress(address);
00296 break;
00297 case 9:
00298 address = addressee.address(Address::Home);
00299 address.setLocality(text);
00300 addressee.insertAddress(address);
00301 break;
00302 case 10:
00303 address = addressee.address(Address::Home);
00304 address.setRegion(text);
00305 addressee.insertAddress(address);
00306 break;
00307 case 11:
00308 address = addressee.address(Address::Home);
00309 address.setPostalCode(text);
00310 addressee.insertAddress(address);
00311 break;
00312 case 12:
00313 address = addressee.address(Address::Home);
00314 address.setCountry(text);
00315 addressee.insertAddress(address);
00316 break;
00317 case 13:
00318 address = addressee.address(Address::Home);
00319 address.setLabel(text);
00320 addressee.insertAddress(address);
00321 break;
00322 case 14:
00323 address = addressee.address(Address::Work);
00324 address.setStreet(text);
00325 addressee.insertAddress(address);
00326 break;
00327 case 15:
00328 address = addressee.address(Address::Work);
00329 address.setLocality(text);
00330 addressee.insertAddress(address);
00331 break;
00332 case 16:
00333 address = addressee.address(Address::Work);
00334 address.setRegion(text);
00335 addressee.insertAddress(address);
00336 break;
00337 case 17:
00338 address = addressee.address(Address::Work);
00339 address.setPostalCode(text);
00340 addressee.insertAddress(address);
00341 break;
00342 case 18:
00343 address = addressee.address(Address::Work);
00344 address.setCountry(text);
00345 addressee.insertAddress(address);
00346 break;
00347 case 19:
00348 address = addressee.address(Address::Work);
00349 address.setLabel(text);
00350 addressee.insertAddress(address);
00351 break;
00352 case 20:
00353 phone = PhoneNumber(text, PhoneNumber::Home);
00354 addressee.insertPhoneNumber(phone);
00355 break;
00356 case 21:
00357 phone = PhoneNumber(text, PhoneNumber::Work);
00358 addressee.insertPhoneNumber(phone);
00359 break;
00360 case 22:
00361 phone = PhoneNumber(text, PhoneNumber::Cell);
00362 addressee.insertPhoneNumber(phone);
00363 break;
00364 case 23:
00365 phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Home);
00366 addressee.insertPhoneNumber(phone);
00367 break;
00368 case 24:
00369 phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Work);
00370 addressee.insertPhoneNumber(phone);
00371 break;
00372 case 25:
00373 phone = PhoneNumber(text, PhoneNumber::Car);
00374 addressee.insertPhoneNumber(phone);
00375 break;
00376 case 26:
00377 phone = PhoneNumber(text, PhoneNumber::Isdn);
00378 addressee.insertPhoneNumber(phone);
00379 break;
00380 case 27:
00381 phone = PhoneNumber(text, PhoneNumber::Pager);
00382 addressee.insertPhoneNumber(phone);
00383 break;
00384 case 28:
00385 addressee.insertEmail(text);
00386 break;
00387 case 29:
00388 addressee.setMailer(text);
00389 break;
00390 case 30:
00391 addressee.setTitle(text);
00392 break;
00393 case 31:
00394 addressee.setRole(text);
00395 break;
00396 case 32:
00397 addressee.setOrganization(text);
00398 break;
00399 case 33:
00400 addressee.setNote(text);
00401 break;
00402 case 34:
00403 addressee.setUrl(text);
00404 break;
00405 case 35:
00406 break;
00407 case 36:
00408 break;
00409 case 37:
00410 break;
00411 case 38:
00412 break;
00413 case 39:
00414 break;
00415 case 40:
00416 break;
00417 case 41:
00418 break;
00419 case 42:
00420 break;
00421
00422 default:
00423 break;
00424 }
00425 }
00426
00428
00429 CSVTemplate* CSVTemplate::defaultTemplate()
00430 {
00431 if (m_defaultTemplate == 0)
00432 {
00433 m_defaultTemplate = new CSVTemplate("Y-M-D");
00434
00435 m_defaultTemplate->m_quote = "\"";
00436 m_defaultTemplate->m_delimiter = ",";
00437
00438 m_defaultTemplate->m_columns = 42;
00439 for (int i = 0; i < m_defaultTemplate->m_columns; ++i)
00440 {
00441 m_defaultTemplate->m_columnToField[i] = i + 1;
00442 }
00443 }
00444
00445 return m_defaultTemplate;
00446 }
00447
00449
00450 CSVTemplate::CSVTemplate(const QString& datePattern)
00451 {
00452 m_datePattern = datePattern;
00453 createDateFormat();
00454 }
00455
00457
00458 QString CSVTemplate::formatDate(const QDateTime& date) const
00459 {
00460 if (!date.isValid()) return QString();
00461
00462 return date.toString(m_dateFormat);
00463 }
00464
00466
00467 QDateTime CSVTemplate::parseDate(const QString& text) const
00468 {
00469 if (text.isEmpty()) return QDateTime();
00470
00471 int year = 0;
00472 int month = 0;
00473 int day = 0;
00474
00475 QByteArray pattern = m_datePattern.toAscii();
00476 bool ok = true;
00477 int pos = 0;
00478 for (int i = 0; ok && i < pattern.length(); ++i)
00479 {
00480 switch (pattern[i])
00481 {
00482 case 'Y':
00483 if ((pos + 3) >= text.length())
00484 {
00485 ok = false;
00486 }
00487 else
00488 {
00489 year = text.mid(pos, 4).toInt(&ok);
00490 pos += 4;
00491 }
00492 break;
00493
00494 case 'y':
00495 if ((pos + 1) >= text.length())
00496 {
00497 ok = false;
00498 }
00499 else
00500 {
00501 year = 1900 + text.mid(pos, 2).toInt(&ok);
00502 pos += 2;
00503 }
00504 break;
00505
00506 case 'M':
00507 if ((pos + 1) >= text.length())
00508 {
00509 ok = false;
00510 }
00511 else
00512 {
00513 month = text.mid(pos, 2).toInt(&ok);
00514 pos += 2;
00515 }
00516 break;
00517
00518 case 'm':
00519 if ((pos + 1) < text.length() && text[pos+1].isDigit())
00520 {
00521 month = text.mid(pos, 2).toInt(&ok);
00522 pos += 2;
00523 }
00524 else
00525 {
00526 month = text.mid(pos, 1).toInt(&ok);
00527 pos += 1;
00528 }
00529 break;
00530
00531 case 'D':
00532 if ((pos + 1) >= text.length())
00533 {
00534 ok = false;
00535 }
00536 else
00537 {
00538 day = text.mid(pos, 2).toInt(&ok);
00539 pos += 2;
00540 }
00541 break;
00542
00543 case 'd':
00544 if ((pos + 1) < text.length() && text[pos+1].isDigit())
00545 {
00546 day = text.mid(pos, 2).toInt(&ok);
00547 pos += 2;
00548 }
00549 else
00550 {
00551 day = text.mid(pos, 1).toInt(&ok);
00552 pos += 1;
00553 }
00554 break;
00555
00556 default:
00557 ok = QChar(pattern[i]) == text[pos];
00558 pos++;
00559 break;
00560 }
00561 }
00562
00563 ok = ok && pos >= text.length();
00564
00565 if (ok && year > 0 && month > 0 && day > 0) return QDateTime(QDate(year, month, day));
00566
00567 return QDateTime();
00568 }
00569
00571
00572 void CSVTemplate::createDateFormat()
00573 {
00574 QByteArray datePattern = m_datePattern.toAscii();
00575
00576 for (int i = 0; i < datePattern.length(); ++i)
00577 {
00578 switch (datePattern[i])
00579 {
00580 case 'Y':
00581 m_dateFormat.append("yyyy");
00582 break;
00583
00584 case 'y':
00585 m_dateFormat.append("yy");
00586 break;
00587
00588 case 'M':
00589 m_dateFormat.append("MM");
00590 break;
00591
00592 case 'm':
00593 m_dateFormat.append("m");
00594 break;
00595
00596 case 'D':
00597 m_dateFormat.append("dd");
00598 break;
00599
00600 case 'd':
00601 m_dateFormat.append("d");
00602 break;
00603
00604 default:
00605 m_dateFormat.append(QChar::fromAscii(datePattern[i]));
00606 break;
00607 }
00608 }
00609 }
00610
00611