kabc Library API Documentation

VCard.cpp

00001 /*
00002     libvcard - vCard parsing library for vCard version 3.0
00003 
00004     Copyright (C) 1998 Rik Hemsley rik@kde.org
00005 
00006   Permission is hereby granted, free of charge, to any person obtaining a copy
00007   of this software and associated documentation files (the "Software"), to
00008   deal in the Software without restriction, including without limitation the
00009   rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
00010   sell copies of the Software, and to permit persons to whom the Software is
00011   furnished to do so, subject to the following conditions:
00012 
00013   The above copyright notice and this permission notice shall be included in
00014   all copies or substantial portions of the Software.
00015 
00016   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00017   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00018   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
00019   AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
00020   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00021   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00022 */
00023 
00024 #include <qcstring.h>
00025 #include <qstrlist.h>
00026 
00027 #include <VCardEntity.h>
00028 #include <VCardVCard.h>
00029 #include <VCardContentLine.h>
00030 #include <VCardRToken.h>
00031 
00032 #include <VCardDefines.h>
00033 
00034 using namespace VCARD;
00035 
00036 VCard::VCard()
00037     :   Entity()
00038 {
00039 }
00040 
00041 VCard::VCard(const VCard & x)
00042     :   Entity(x),
00043         group_(x.group_),
00044         contentLineList_(x.contentLineList_)
00045 {
00046 }
00047 
00048 VCard::VCard(const QCString & s)
00049     :   Entity(s)
00050 {
00051 }
00052 
00053     VCard &
00054 VCard::operator = (VCard & x)
00055 {
00056     if (*this == x) return *this;
00057 
00058     group_              = x.group();
00059     contentLineList_    = x.contentLineList_;
00060 
00061     Entity::operator = (x);
00062     return *this;
00063 }
00064 
00065     VCard &
00066 VCard::operator = (const QCString & s)
00067 {
00068     Entity::operator = (s);
00069     return *this;
00070 }
00071 
00072     bool
00073 VCard::operator == (VCard & x)
00074 {
00075     x.parse();
00076     return false;
00077 }
00078 
00079 VCard::~VCard()
00080 {
00081 }
00082 
00083     void
00084 VCard::_parse()
00085 {
00086     vDebug("parse() called");
00087     QStrList l;
00088 
00089     RTokenise(strRep_, "\r\n", l);
00090 
00091     if (l.count() < 3) { // Invalid VCARD !
00092         vDebug("Invalid vcard");
00093         return;
00094     }
00095 
00096     // Get the first line
00097     QCString beginLine = QCString(l.at(0)).stripWhiteSpace();
00098 
00099     vDebug("Begin line == \"" + beginLine + "\"");
00100 
00101     // Remove extra blank lines
00102     while (QCString(l.last()).isEmpty())
00103         l.remove(l.last());
00104 
00105     // Now we know this is the last line
00106     QCString endLine = l.last();
00107 
00108     // Trash the first and last lines as we have seen them.
00109     l.remove(0u);
00110     l.remove(l.last());
00111 
00113     // FIRST LINE
00114 
00115     int split = beginLine.find(':');
00116 
00117     if (split == -1) { // invalid, no BEGIN
00118         vDebug("No split");
00119         return;
00120     }
00121 
00122     QCString firstPart(beginLine.left(split));
00123     QCString valuePart(beginLine.mid(split + 1));
00124 
00125     split = firstPart.find('.');
00126 
00127     if (split != -1) {
00128         group_      = firstPart.left(split);
00129         firstPart   = firstPart.right(firstPart.length() - split - 1);
00130     }
00131 
00132     if (qstrnicmp(firstPart, "BEGIN", 5) != 0) { // No BEGIN !
00133         vDebug("No BEGIN");
00134         return;
00135     }
00136 
00137     if (qstrnicmp(valuePart, "VCARD", 5) != 0) { // Not a vcard !
00138         vDebug("No VCARD");
00139         return;
00140     }
00141 
00143     // CONTENT LINES
00144     //
00145     vDebug("Content lines");
00146 
00147     // Handle folded lines.
00148 
00149     QStrList refolded;
00150 
00151     QStrListIterator it(l);
00152 
00153     QCString cur;
00154 
00155     for (; it.current(); ++it) {
00156 
00157         cur = it.current();
00158 
00159         ++it;
00160 
00161         while (
00162             it.current()        &&
00163             it.current()[0] == ' '  &&
00164             strlen(it.current()) != 1)
00165         {
00166             cur += it.current() + 1;
00167             ++it;
00168         }
00169 
00170         --it;
00171 
00172         refolded.append(cur);
00173     }
00174 
00175     QStrListIterator it2(refolded);
00176 
00177     for (; it2.current(); ++it2) {
00178 
00179         vDebug("New contentline using \"" + QCString(it2.current()) + "\"");
00180         ContentLine * cl = new ContentLine(it2.current());
00181 
00182         cl->parse();
00183 
00184         contentLineList_.append(cl);
00185     }
00186 
00188     // LAST LINE
00189 
00190     split = endLine.find(':');
00191 
00192     if (split == -1) // invalid, no END
00193         return;
00194 
00195     firstPart = endLine.left(split);
00196     valuePart = endLine.right(firstPart.length() - split - 1);
00197 
00198     split = firstPart.find('.');
00199 
00200     if (split != -1) {
00201         group_      = firstPart.left(split);
00202         firstPart   = firstPart.right(firstPart.length() - split - 1);
00203     }
00204 
00205     if (qstricmp(firstPart, "END") != 0) // No END !
00206         return;
00207 
00208     if (qstricmp(valuePart, "VCARD") != 0) // Not a vcard !
00209         return;
00210 }
00211 
00212     void
00213 VCard::_assemble()
00214 {
00215     vDebug("Assembling vcard");
00216     strRep_ = "BEGIN:VCARD\r\n";
00217     strRep_ += "VERSION:3.0\r\n";
00218 
00219     QPtrListIterator<ContentLine> it(contentLineList_);
00220 
00221     for (; it.current(); ++it)
00222         strRep_ += it.current()->asString() + "\r\n";
00223 
00224     strRep_ += "END:VCARD\r\n";
00225 }
00226 
00227     bool
00228 VCard::has(EntityType t)
00229 {
00230     parse();
00231     return contentLine(t) == 0 ? false : true;
00232 }
00233 
00234     bool
00235 VCard::has(const QCString & s)
00236 {
00237     parse();
00238     return contentLine(s) == 0 ? false : true;
00239 }
00240 
00241     void
00242 VCard::add(const ContentLine & cl)
00243 {
00244     parse();
00245     ContentLine * c = new ContentLine(cl);
00246     contentLineList_.append(c);
00247 }
00248 
00249     void
00250 VCard::add(const QCString & s)
00251 {
00252     parse();
00253     ContentLine * c = new ContentLine(s);
00254     contentLineList_.append(c);
00255 }
00256 
00257     ContentLine *
00258 VCard::contentLine(EntityType t)
00259 {
00260     parse();
00261     QPtrListIterator<ContentLine> it(contentLineList_);
00262 
00263     for (; it.current(); ++it)
00264         if (it.current()->entityType() == t)
00265             return it.current();
00266 
00267     return 0;
00268 }
00269 
00270     ContentLine *
00271 VCard::contentLine(const QCString & s)
00272 {
00273     parse();
00274     QPtrListIterator<ContentLine> it(contentLineList_);
00275 
00276     for (; it.current(); ++it)
00277         if (it.current()->entityType() == EntityNameToEntityType(s))
00278             return it.current();
00279 
00280     return 0;
00281 }
00282 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.0.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Oct 8 12:22:08 2003 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2001