• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdepim
  • Sitemap
  • Contact Us
 

console/kabcclient

csvtemplate.cpp

Go to the documentation of this file.
00001 //
00002 //  Copyright (C) 2005 - 2006 Kevin Krammer <kevin.krammer@gmx.at>
00003 //
00004 //  This program is free software; you can redistribute it and/or modify
00005 //  it under the terms of the GNU General Public License as published by
00006 //  the Free Software Foundation; either version 2 of the License, or
00007 //  (at your option) any later version.
00008 //
00009 //  This program is distributed in the hope that it will be useful,
00010 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 //  GNU General Public License for more details.
00013 //
00014 //  You should have received a copy of the GNU General Public License
00015 //  along with this program; if not, write to the Free Software
00016 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00017 //
00018 
00019 // local includes
00020 #include "csvtemplate.h"
00021 
00022 // Qt includes
00023 #include <QtCore/QDateTime>
00024 
00025 // KDE includes
00026 #include <kconfigbase.h>
00027 #include <kconfiggroup.h>
00028 
00029 // KABC includes
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: // "Formatted Name"
00125             text = addressee.formattedName();
00126             break;
00127         case  1: // "Family Name"
00128             text = addressee.familyName();
00129             break;
00130         case  2: // "Given Name"
00131             text = addressee.givenName();
00132             break;
00133         case  3: // "Additional Names"
00134             text = addressee.additionalName();
00135             break;
00136         case  4: // "Honorific Prefixes"
00137             text = addressee.prefix();
00138             break;
00139         case  5: // "Honorific Suffixes"
00140             text = addressee.suffix();
00141             break;
00142         case  6: // "Nick Name"
00143             text = addressee.nickName();
00144             break;
00145         case  7: // "Birthday"
00146             text = formatDate(addressee.birthday());
00147             break;
00148         case  8: // "Home Address Street"
00149             text = addressee.address(Address::Home).street();
00150             break;
00151         case  9: // "Home Address Locality"
00152             text = addressee.address(Address::Home).locality();
00153             break;
00154         case 10: // "Home Address Region"
00155             text = addressee.address(Address::Home).region();
00156             break;
00157         case 11: // "Home Address Postal Code"
00158             text = addressee.address(Address::Home).postalCode();
00159             break;
00160         case 12: // "Home Address Country"
00161             text = addressee.address(Address::Home).country();
00162             break;
00163         case 13: // "Home Address Label"
00164             text = addressee.address(Address::Home).label();
00165             break;
00166         case 14: // "Business Address Street"
00167             text = addressee.address(Address::Work).street();
00168             break;
00169         case 15: // "Business Address Locality"
00170             text = addressee.address(Address::Work).locality();
00171             break;
00172         case 16: // "Business Address Region"
00173             text = addressee.address(Address::Work).region();
00174             break;
00175         case 17: // "Business Address Postal Code"
00176             text = addressee.address(Address::Work).postalCode();
00177             break;
00178         case 18: // "Business Address Country"
00179             text = addressee.address(Address::Work).country();
00180             break;
00181         case 19: // "Business Address Label"
00182             text = addressee.address(Address::Work).label();
00183             break;
00184         case 20: // "Home Phone"
00185             text = addressee.phoneNumber(PhoneNumber::Home).number();
00186             break;
00187         case 21: // "Business Phone"
00188             text = addressee.phoneNumber(PhoneNumber::Work).number();
00189             break;
00190         case 22: // "Mobile Phone"
00191             text = addressee.phoneNumber(PhoneNumber::Cell).number();
00192             break;
00193         case 23: // "Home Fax"
00194             text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Home).number();
00195             break;
00196         case 24: // "Business Fax"
00197             text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Work).number();
00198             break;
00199         case 25: // "Car Phone"
00200             text = addressee.phoneNumber(PhoneNumber::Car).number();
00201             break;
00202         case 26: // "Isdn"
00203             text = addressee.phoneNumber(PhoneNumber::Isdn).number();
00204             break;
00205         case 27: // "Pager"
00206             text = addressee.phoneNumber(PhoneNumber::Pager).number();
00207             break;
00208         case 28: // "Email Address"
00209             text = addressee.preferredEmail();
00210             break;
00211         case 29: // "Mail Client"
00212             text = addressee.mailer();
00213             break;
00214         case 30: // "Title"
00215             text = addressee.title();
00216             break;
00217         case 31: // "Role"
00218             text = addressee.role();
00219             break;
00220         case 32: // "Organization"
00221             text = addressee.organization();
00222             break;
00223         case 33: // "Note"
00224             text = addressee.note();
00225             break;
00226         case 34: // "URL"
00227             text = addressee.url().prettyUrl();
00228             break;
00229         case 35: // "Department"
00230             break;
00231         case 36: // "Profession"
00232             break;
00233         case 37: // "Assistant's Name"
00234             break;
00235         case 38: // "Manager's Name"
00236             break;
00237         case 39: // "Spouse's Name"
00238             break;
00239         case 40: // "Office"
00240             break;
00241         case 41: // "IM Address"
00242             break;
00243         case 42: // "Anniversary"
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: // "Formatted Name"
00269             addressee.setFormattedName(text);
00270             break;
00271         case  1: // "Family Name"
00272             addressee.setFamilyName(text);
00273             break;
00274         case  2: // "Given Name"
00275             addressee.setGivenName(text);
00276             break;
00277         case  3: // "Additional Names"
00278             addressee.setAdditionalName(text);
00279             break;
00280         case  4: // "Honorific Prefixes"
00281             addressee.setPrefix(text);
00282             break;
00283         case  5: // "Honorific Suffixes"
00284             addressee.setSuffix(text);
00285             break;
00286         case  6: // "Nick Name"
00287             addressee.setNickName(text);
00288             break;
00289         case  7: // "Birthday"
00290             addressee.setBirthday(parseDate(text));
00291             break;
00292         case  8: // "Home Address Street"
00293             address = addressee.address(Address::Home);
00294             address.setStreet(text);
00295             addressee.insertAddress(address);
00296             break;
00297         case  9: // "Home Address Locality"
00298             address = addressee.address(Address::Home);
00299             address.setLocality(text);
00300             addressee.insertAddress(address);
00301             break;
00302         case 10: // "Home Address Region"
00303             address = addressee.address(Address::Home);
00304             address.setRegion(text);
00305             addressee.insertAddress(address);
00306             break;
00307         case 11: // "Home Address Postal Code"
00308             address = addressee.address(Address::Home);
00309             address.setPostalCode(text);
00310             addressee.insertAddress(address);
00311             break;
00312         case 12: // "Home Address Country"
00313             address = addressee.address(Address::Home);
00314             address.setCountry(text);
00315             addressee.insertAddress(address);
00316             break;
00317         case 13: // "Home Address Label"
00318             address = addressee.address(Address::Home);
00319             address.setLabel(text);
00320             addressee.insertAddress(address);
00321             break;
00322         case 14: // "Business Address Street"
00323             address = addressee.address(Address::Work);
00324             address.setStreet(text);
00325             addressee.insertAddress(address);
00326             break;
00327         case 15: // "Business Address Locality"
00328             address = addressee.address(Address::Work);
00329             address.setLocality(text);
00330             addressee.insertAddress(address);
00331             break;
00332         case 16: // "Business Address Region"
00333             address = addressee.address(Address::Work);
00334             address.setRegion(text);
00335             addressee.insertAddress(address);
00336             break;
00337         case 17: // "Business Address Postal Code"
00338             address = addressee.address(Address::Work);
00339             address.setPostalCode(text);
00340             addressee.insertAddress(address);
00341             break;
00342         case 18: // "Business Address Country"
00343             address = addressee.address(Address::Work);
00344             address.setCountry(text);
00345             addressee.insertAddress(address);
00346             break;
00347         case 19: // "Business Address Label"
00348             address = addressee.address(Address::Work);
00349             address.setLabel(text);
00350             addressee.insertAddress(address);
00351             break;
00352         case 20: // "Home Phone"
00353             phone = PhoneNumber(text, PhoneNumber::Home);
00354             addressee.insertPhoneNumber(phone);
00355             break;
00356         case 21: // "Business Phone"
00357             phone = PhoneNumber(text, PhoneNumber::Work);
00358             addressee.insertPhoneNumber(phone);
00359             break;
00360         case 22: // "Mobile Phone"
00361             phone = PhoneNumber(text, PhoneNumber::Cell);
00362             addressee.insertPhoneNumber(phone);
00363             break;
00364         case 23: // "Home Fax"
00365             phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Home);
00366             addressee.insertPhoneNumber(phone);
00367             break;
00368         case 24: // "Business Fax"
00369             phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Work);
00370             addressee.insertPhoneNumber(phone);
00371             break;
00372         case 25: // "Car Phone"
00373             phone = PhoneNumber(text, PhoneNumber::Car);
00374             addressee.insertPhoneNumber(phone);
00375             break;
00376         case 26: // "Isdn"
00377             phone = PhoneNumber(text, PhoneNumber::Isdn);
00378             addressee.insertPhoneNumber(phone);
00379             break;
00380         case 27: // "Pager"
00381             phone = PhoneNumber(text, PhoneNumber::Pager);
00382             addressee.insertPhoneNumber(phone);
00383             break;
00384         case 28: // "Email Address"
00385             addressee.insertEmail(text);
00386             break;
00387         case 29: // "Mail Client"
00388             addressee.setMailer(text);
00389             break;
00390         case 30: // "Title"
00391             addressee.setTitle(text);
00392             break;
00393         case 31: // "Role"
00394             addressee.setRole(text);
00395             break;
00396         case 32: // "Organization"
00397             addressee.setOrganization(text);
00398             break;
00399         case 33: // "Note"
00400             addressee.setNote(text);
00401             break;
00402         case 34: // "URL"
00403             addressee.setUrl(text);
00404             break;
00405         case 35: // "Department"
00406             break;
00407         case 36: // "Profession"
00408             break;
00409         case 37: // "Assistant's Name"
00410             break;
00411         case 38: // "Manager's Name"
00412             break;
00413         case 39: // "Spouse's Name"
00414             break;
00415         case 40: // "Office"
00416             break;
00417         case 41: // "IM Address"
00418             break;
00419         case 42: // "Anniversary"
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': // four digit year
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': // two digit 19xx year
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': // two digit month
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': // one or two digit month
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': // two digit day
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': // one or two digit day
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 // End of file

console/kabcclient

Skip menu "console/kabcclient"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kdepim

Skip menu "kdepim"
  • akonadi
  •   clients
  •   kabc
  •   kcal
  •   kcm
  • akregator
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt
  • kdgantt1
  • kjots
  • kleopatra
  • kmail
  • kmobiletools
  • knode
  • knotes
  • kontact
  • kontactinterfaces
  • korganizer
  •   korgac
  • kpilot
  • ktimetracker
  •   doc
  • libkdepim
  • libkholidays
  • libkleo
  • libkpgp
  • maildir
Generated for kdepim by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal