VCard.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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) {
00092 vDebug("Invalid vcard");
00093 return;
00094 }
00095
00096
00097 QCString beginLine = QCString(l.at(0)).stripWhiteSpace();
00098
00099 vDebug("Begin line == \"" + beginLine + "\"");
00100
00101
00102 while (QCString(l.last()).isEmpty())
00103 l.remove(l.last());
00104
00105
00106 QCString endLine = l.last();
00107
00108
00109 l.remove(0u);
00110 l.remove(l.last());
00111
00113
00114
00115 int split = beginLine.find(':');
00116
00117 if (split == -1) {
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) {
00133 vDebug("No BEGIN");
00134 return;
00135 }
00136
00137 if (qstrnicmp(valuePart, "VCARD", 5) != 0) {
00138 vDebug("No VCARD");
00139 return;
00140 }
00141
00143
00144
00145 vDebug("Content lines");
00146
00147
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
00189
00190 split = endLine.find(':');
00191
00192 if (split == -1)
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)
00206 return;
00207
00208 if (qstricmp(valuePart, "VCARD") != 0)
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
This file is part of the documentation for kdelibs Version 3.1.4.