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

console/kabcclient

  • sources
  • kde-4.12
  • kdepim
  • console
  • kabcclient
  • src
csvtemplate.cpp
Go to the documentation of this file.
1 //
2 // Copyright (C) 2005 - 2006 Kevin Krammer <kevin.krammer@gmx.at>
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 //
18 
19 // local includes
20 #include "csvtemplate.h"
21 
22 // Qt includes
23 #include <QtCore/QDateTime>
24 
25 // KDE includes
26 #include <kconfigbase.h>
27 #include <kconfiggroup.h>
28 
29 // KABC includes
30 #include <kabc/address.h>
31 #include <kabc/addressee.h>
32 
33 using namespace KABC;
34 
36 
37 CSVTemplate* CSVTemplate::m_defaultTemplate = 0;
38 
40 
41 CSVTemplate::CSVTemplate(KConfigBase* config) : m_columns(0)
42 {
43  if (config == 0) return;
44 
45  KConfigGroup columnMap = config->group("csv column map");
46  const QStringList keyList = columnMap.keyList();
47 
48  QStringList::const_iterator it = keyList.begin();
49  QStringList::const_iterator endIt = keyList.end();
50  for (; it != endIt; ++it)
51  {
52  if ((*it).isEmpty()) continue;
53 
54  bool ok = false;
55  int column = (*it).toInt(&ok);
56  if (!ok) continue;
57 
58  int field = columnMap.readEntry(*it, -1);
59  if (field < 0) continue;
60 
61  m_columnToField.insert(column, field);
62  }
63 
64  KConfigGroup general = config->group("General");
65 
66  m_datePattern = general.readEntry("DatePattern");
67  if (m_datePattern.isEmpty()) m_datePattern = QLatin1String("Y-M-D");
68  createDateFormat();
69 
70  m_columns = general.readEntry("Columns", 0);
71  if (m_columns < 0) m_columns = 0;
72 
73  switch (general.readEntry("DelimiterType", 0))
74  {
75  case 1:
76  m_delimiter = QLatin1String(";");
77  break;
78 
79  case 2:
80  m_delimiter = QLatin1String("\t");
81  break;
82 
83  case 3:
84  m_delimiter = QLatin1String(" ");
85  break;
86 
87  case 4:
88  m_delimiter = general.readEntry("DelimiterOther");
89  break;
90 
91  default:
92  m_delimiter = QLatin1String(",");
93  }
94  if (m_delimiter.isEmpty()) m_delimiter = QLatin1String(",");
95 
96  switch (general.readEntry("QuoteType", 0))
97  {
98  case 1:
99  m_quote = QLatin1String("'");
100  break;
101 
102  case 2:
103  break;
104 
105  default:
106  m_quote = QLatin1String("\"");
107  break;
108  }
109 }
110 
112 
113 QString CSVTemplate::fieldText(int column, const KABC::Addressee& addressee) const
114 {
115  if (column < 0 || addressee.isEmpty()) return QString();
116  if (m_columnToField.isEmpty()) return QString();
117 
118  QMap<int, int>::const_iterator it = m_columnToField.find(column);
119  if (it == m_columnToField.end()) return QString();
120 
121  QString text;
122  switch (it.value())
123  {
124  case 0: // "Formatted Name"
125  text = addressee.formattedName();
126  break;
127  case 1: // "Family Name"
128  text = addressee.familyName();
129  break;
130  case 2: // "Given Name"
131  text = addressee.givenName();
132  break;
133  case 3: // "Additional Names"
134  text = addressee.additionalName();
135  break;
136  case 4: // "Honorific Prefixes"
137  text = addressee.prefix();
138  break;
139  case 5: // "Honorific Suffixes"
140  text = addressee.suffix();
141  break;
142  case 6: // "Nick Name"
143  text = addressee.nickName();
144  break;
145  case 7: // "Birthday"
146  text = formatDate(addressee.birthday());
147  break;
148  case 8: // "Home Address Street"
149  text = addressee.address(Address::Home).street();
150  break;
151  case 9: // "Home Address Locality"
152  text = addressee.address(Address::Home).locality();
153  break;
154  case 10: // "Home Address Region"
155  text = addressee.address(Address::Home).region();
156  break;
157  case 11: // "Home Address Postal Code"
158  text = addressee.address(Address::Home).postalCode();
159  break;
160  case 12: // "Home Address Country"
161  text = addressee.address(Address::Home).country();
162  break;
163  case 13: // "Home Address Label"
164  text = addressee.address(Address::Home).label();
165  break;
166  case 14: // "Business Address Street"
167  text = addressee.address(Address::Work).street();
168  break;
169  case 15: // "Business Address Locality"
170  text = addressee.address(Address::Work).locality();
171  break;
172  case 16: // "Business Address Region"
173  text = addressee.address(Address::Work).region();
174  break;
175  case 17: // "Business Address Postal Code"
176  text = addressee.address(Address::Work).postalCode();
177  break;
178  case 18: // "Business Address Country"
179  text = addressee.address(Address::Work).country();
180  break;
181  case 19: // "Business Address Label"
182  text = addressee.address(Address::Work).label();
183  break;
184  case 20: // "Home Phone"
185  text = addressee.phoneNumber(PhoneNumber::Home).number();
186  break;
187  case 21: // "Business Phone"
188  text = addressee.phoneNumber(PhoneNumber::Work).number();
189  break;
190  case 22: // "Mobile Phone"
191  text = addressee.phoneNumber(PhoneNumber::Cell).number();
192  break;
193  case 23: // "Home Fax"
194  text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Home).number();
195  break;
196  case 24: // "Business Fax"
197  text = addressee.phoneNumber(PhoneNumber::Fax | PhoneNumber::Work).number();
198  break;
199  case 25: // "Car Phone"
200  text = addressee.phoneNumber(PhoneNumber::Car).number();
201  break;
202  case 26: // "Isdn"
203  text = addressee.phoneNumber(PhoneNumber::Isdn).number();
204  break;
205  case 27: // "Pager"
206  text = addressee.phoneNumber(PhoneNumber::Pager).number();
207  break;
208  case 28: // "Email Address"
209  text = addressee.preferredEmail();
210  break;
211  case 29: // "Mail Client"
212  text = addressee.mailer();
213  break;
214  case 30: // "Title"
215  text = addressee.title();
216  break;
217  case 31: // "Role"
218  text = addressee.role();
219  break;
220  case 32: // "Organization"
221  text = addressee.organization();
222  break;
223  case 33: // "Note"
224  text = addressee.note();
225  break;
226  case 34: // "URL"
227  text = addressee.url().prettyUrl();
228  break;
229  case 35: // "Department"
230  break;
231  case 36: // "Profession"
232  break;
233  case 37: // "Assistant's Name"
234  break;
235  case 38: // "Manager's Name"
236  break;
237  case 39: // "Spouse's Name"
238  break;
239  case 40: // "Office"
240  break;
241  case 41: // "IM Address"
242  break;
243  case 42: // "Anniversary"
244  break;
245 
246  default:
247  break;
248  }
249 
250  return text;
251 }
252 
254 
255 void CSVTemplate::setFieldText(int column, KABC::Addressee& addressee, const QString& text) const
256 {
257  if (column < 0 || text.isEmpty()) return;
258  if (m_columnToField.isEmpty()) return;
259 
260  QMap<int, int>::const_iterator it = m_columnToField.find(column);
261  if (it == m_columnToField.end()) return;
262 
263  Address address;
264  PhoneNumber phone;
265 
266  switch (it.value())
267  {
268  case 0: // "Formatted Name"
269  addressee.setFormattedName(text);
270  break;
271  case 1: // "Family Name"
272  addressee.setFamilyName(text);
273  break;
274  case 2: // "Given Name"
275  addressee.setGivenName(text);
276  break;
277  case 3: // "Additional Names"
278  addressee.setAdditionalName(text);
279  break;
280  case 4: // "Honorific Prefixes"
281  addressee.setPrefix(text);
282  break;
283  case 5: // "Honorific Suffixes"
284  addressee.setSuffix(text);
285  break;
286  case 6: // "Nick Name"
287  addressee.setNickName(text);
288  break;
289  case 7: // "Birthday"
290  addressee.setBirthday(parseDate(text));
291  break;
292  case 8: // "Home Address Street"
293  address = addressee.address(Address::Home);
294  address.setStreet(text);
295  addressee.insertAddress(address);
296  break;
297  case 9: // "Home Address Locality"
298  address = addressee.address(Address::Home);
299  address.setLocality(text);
300  addressee.insertAddress(address);
301  break;
302  case 10: // "Home Address Region"
303  address = addressee.address(Address::Home);
304  address.setRegion(text);
305  addressee.insertAddress(address);
306  break;
307  case 11: // "Home Address Postal Code"
308  address = addressee.address(Address::Home);
309  address.setPostalCode(text);
310  addressee.insertAddress(address);
311  break;
312  case 12: // "Home Address Country"
313  address = addressee.address(Address::Home);
314  address.setCountry(text);
315  addressee.insertAddress(address);
316  break;
317  case 13: // "Home Address Label"
318  address = addressee.address(Address::Home);
319  address.setLabel(text);
320  addressee.insertAddress(address);
321  break;
322  case 14: // "Business Address Street"
323  address = addressee.address(Address::Work);
324  address.setStreet(text);
325  addressee.insertAddress(address);
326  break;
327  case 15: // "Business Address Locality"
328  address = addressee.address(Address::Work);
329  address.setLocality(text);
330  addressee.insertAddress(address);
331  break;
332  case 16: // "Business Address Region"
333  address = addressee.address(Address::Work);
334  address.setRegion(text);
335  addressee.insertAddress(address);
336  break;
337  case 17: // "Business Address Postal Code"
338  address = addressee.address(Address::Work);
339  address.setPostalCode(text);
340  addressee.insertAddress(address);
341  break;
342  case 18: // "Business Address Country"
343  address = addressee.address(Address::Work);
344  address.setCountry(text);
345  addressee.insertAddress(address);
346  break;
347  case 19: // "Business Address Label"
348  address = addressee.address(Address::Work);
349  address.setLabel(text);
350  addressee.insertAddress(address);
351  break;
352  case 20: // "Home Phone"
353  phone = PhoneNumber(text, PhoneNumber::Home);
354  addressee.insertPhoneNumber(phone);
355  break;
356  case 21: // "Business Phone"
357  phone = PhoneNumber(text, PhoneNumber::Work);
358  addressee.insertPhoneNumber(phone);
359  break;
360  case 22: // "Mobile Phone"
361  phone = PhoneNumber(text, PhoneNumber::Cell);
362  addressee.insertPhoneNumber(phone);
363  break;
364  case 23: // "Home Fax"
365  phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Home);
366  addressee.insertPhoneNumber(phone);
367  break;
368  case 24: // "Business Fax"
369  phone = PhoneNumber(text, PhoneNumber::Fax | PhoneNumber::Work);
370  addressee.insertPhoneNumber(phone);
371  break;
372  case 25: // "Car Phone"
373  phone = PhoneNumber(text, PhoneNumber::Car);
374  addressee.insertPhoneNumber(phone);
375  break;
376  case 26: // "Isdn"
377  phone = PhoneNumber(text, PhoneNumber::Isdn);
378  addressee.insertPhoneNumber(phone);
379  break;
380  case 27: // "Pager"
381  phone = PhoneNumber(text, PhoneNumber::Pager);
382  addressee.insertPhoneNumber(phone);
383  break;
384  case 28: // "Email Address"
385  addressee.insertEmail(text);
386  break;
387  case 29: // "Mail Client"
388  addressee.setMailer(text);
389  break;
390  case 30: // "Title"
391  addressee.setTitle(text);
392  break;
393  case 31: // "Role"
394  addressee.setRole(text);
395  break;
396  case 32: // "Organization"
397  addressee.setOrganization(text);
398  break;
399  case 33: // "Note"
400  addressee.setNote(text);
401  break;
402  case 34: // "URL"
403  addressee.setUrl(text);
404  break;
405  case 35: // "Department"
406  break;
407  case 36: // "Profession"
408  break;
409  case 37: // "Assistant's Name"
410  break;
411  case 38: // "Manager's Name"
412  break;
413  case 39: // "Spouse's Name"
414  break;
415  case 40: // "Office"
416  break;
417  case 41: // "IM Address"
418  break;
419  case 42: // "Anniversary"
420  break;
421 
422  default:
423  break;
424  }
425 }
426 
428 
429 CSVTemplate* CSVTemplate::defaultTemplate()
430 {
431  if (m_defaultTemplate == 0)
432  {
433  m_defaultTemplate = new CSVTemplate(QLatin1String("Y-M-D"));
434 
435  m_defaultTemplate->m_quote = QLatin1String("\"");
436  m_defaultTemplate->m_delimiter = QLatin1String(",");
437 
438  m_defaultTemplate->m_columns = 42;
439  for (int i = 0; i < m_defaultTemplate->m_columns; ++i)
440  {
441  m_defaultTemplate->m_columnToField[i] = i + 1;
442  }
443  }
444 
445  return m_defaultTemplate;
446 }
447 
449 
450 CSVTemplate::CSVTemplate(const QString& datePattern)
451 {
452  m_datePattern = datePattern;
453  createDateFormat();
454 }
455 
457 
458 QString CSVTemplate::formatDate(const QDateTime& date) const
459 {
460  if (!date.isValid()) return QString();
461 
462  return date.toString(m_dateFormat);
463 }
464 
466 
467 QDateTime CSVTemplate::parseDate(const QString& text) const
468 {
469  if (text.isEmpty()) return QDateTime();
470 
471  int year = 0;
472  int month = 0;
473  int day = 0;
474 
475  QByteArray pattern = m_datePattern.toLatin1();
476  bool ok = true;
477  int pos = 0;
478  for (int i = 0; ok && i < pattern.length(); ++i)
479  {
480  switch (pattern[i])
481  {
482  case 'Y': // four digit year
483  if ((pos + 3) >= text.length())
484  {
485  ok = false;
486  }
487  else
488  {
489  year = text.mid(pos, 4).toInt(&ok);
490  pos += 4;
491  }
492  break;
493 
494  case 'y': // two digit 19xx year
495  if ((pos + 1) >= text.length())
496  {
497  ok = false;
498  }
499  else
500  {
501  year = 1900 + text.mid(pos, 2).toInt(&ok);
502  pos += 2;
503  }
504  break;
505 
506  case 'M': // two digit month
507  if ((pos + 1) >= text.length())
508  {
509  ok = false;
510  }
511  else
512  {
513  month = text.mid(pos, 2).toInt(&ok);
514  pos += 2;
515  }
516  break;
517 
518  case 'm': // one or two digit month
519  if ((pos + 1) < text.length() && text[pos+1].isDigit())
520  {
521  month = text.mid(pos, 2).toInt(&ok);
522  pos += 2;
523  }
524  else
525  {
526  month = text.mid(pos, 1).toInt(&ok);
527  pos += 1;
528  }
529  break;
530 
531  case 'D': // two digit day
532  if ((pos + 1) >= text.length())
533  {
534  ok = false;
535  }
536  else
537  {
538  day = text.mid(pos, 2).toInt(&ok);
539  pos += 2;
540  }
541  break;
542 
543  case 'd': // one or two digit day
544  if ((pos + 1) < text.length() && text[pos+1].isDigit())
545  {
546  day = text.mid(pos, 2).toInt(&ok);
547  pos += 2;
548  }
549  else
550  {
551  day = text.mid(pos, 1).toInt(&ok);
552  pos += 1;
553  }
554  break;
555 
556  default:
557  ok = QLatin1Char(pattern[i]) == text[pos];
558  pos++;
559  break;
560  }
561  }
562 
563  ok = ok && pos >= text.length();
564 
565  if (ok && year > 0 && month > 0 && day > 0) return QDateTime(QDate(year, month, day));
566 
567  return QDateTime();
568 }
569 
571 
572 void CSVTemplate::createDateFormat()
573 {
574  QByteArray datePattern = m_datePattern.toLatin1();
575 
576  for (int i = 0; i < datePattern.length(); ++i)
577  {
578  switch (datePattern[i])
579  {
580  case 'Y':
581  m_dateFormat.append(QLatin1String("yyyy"));
582  break;
583 
584  case 'y':
585  m_dateFormat.append(QLatin1String("yy"));
586  break;
587 
588  case 'M':
589  m_dateFormat.append(QLatin1String("MM"));
590  break;
591 
592  case 'm':
593  m_dateFormat.append(QLatin1String("m"));
594  break;
595 
596  case 'D':
597  m_dateFormat.append(QLatin1String("dd"));
598  break;
599 
600  case 'd':
601  m_dateFormat.append(QLatin1String("d"));
602  break;
603 
604  default:
605  m_dateFormat.append(QChar::fromLatin1(datePattern[i]));
606  break;
607  }
608  }
609 }
610 
611 // End of file
CSVTemplate::setFieldText
void setFieldText(int column, KABC::Addressee &addressee, const QString &text) const
Sets an addressee field using the data of a given text.
Definition: csvtemplate.cpp:255
CSVTemplate
Class for handling KAddressBook's CSV templates.
Definition: csvtemplate.h:88
CSVTemplate::fieldText
QString fieldText(int column, const KABC::Addressee &addressee) const
Returns the specified field of the given addressee formatted as a string.
Definition: csvtemplate.cpp:113
CSVTemplate::defaultTemplate
static CSVTemplate * defaultTemplate()
Returns the template with default setup.
Definition: csvtemplate.cpp:429
CSVTemplate::CSVTemplate
CSVTemplate(KConfigBase *config)
Creates a template handler for the given description.
Definition: csvtemplate.cpp:41
csvtemplate.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:02 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

console/kabcclient

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal