VCard.cpp00001
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 contentLineList_.setAutoDelete( true );
00040 }
00041
00042 VCard::VCard(const VCard & x)
00043 : Entity(x),
00044 group_(x.group_),
00045 contentLineList_(x.contentLineList_)
00046 {
00047 }
00048
00049 VCard::VCard(const QCString & s)
00050 : Entity(s)
00051 {
00052 }
00053
00054 VCard &
00055 VCard::operator = (VCard & x)
00056 {
00057 if (*this == x) return *this;
00058
00059 group_ = x.group();
00060 contentLineList_ = x.contentLineList_;
00061
00062 Entity::operator = (x);
00063 return *this;
00064 }
00065
00066 VCard &
00067 VCard::operator = (const QCString & s)
00068 {
00069 Entity::operator = (s);
00070 return *this;
00071 }
00072
00073 bool
00074 VCard::operator == (VCard & x)
00075 {
00076 x.parse();
00077 return false;
00078 }
00079
00080 VCard::~VCard()
00081 {
00082 }
00083
00084 void
00085 VCard::_parse()
00086 {
00087 vDebug("parse() called");
00088 QStrList l;
00089
00090 RTokenise(strRep_, "\r\n", l);
00091
00092 if (l.count() < 3) {
00093 vDebug("Invalid vcard");
00094 return;
00095 }
00096
00097
00098 QCString beginLine = QCString(l.at(0)).stripWhiteSpace();
00099
00100 vDebug("Begin line == \"" + beginLine + "\"");
00101
00102
00103 while (QCString(l.last()).isEmpty())
00104 l.remove(l.last());
00105
00106
00107 QCString endLine = l.last();
00108
00109
00110 l.remove(0u);
00111 l.remove(l.last());
00112
00114
00115
00116 int split = beginLine.find(':');
00117
00118 if (split == -1) {
00119 vDebug("No split");
00120 return;
00121 }
00122
00123 QCString firstPart(beginLine.left(split));
00124 QCString valuePart(beginLine.mid(split + 1));
00125
00126 split = firstPart.find('.');
00127
00128 if (split != -1) {
00129 group_ = firstPart.left(split);
00130 firstPart = firstPart.right(firstPart.length() - split - 1);
00131 }
00132
00133 if (qstrnicmp(firstPart, "BEGIN", 5) != 0) {
00134 vDebug("No BEGIN");
00135 return;
00136 }
00137
00138 if (qstrnicmp(valuePart, "VCARD", 5) != 0) {
00139 vDebug("No VCARD");
00140 return;
00141 }
00142
00144
00145
00146 vDebug("Content lines");
00147
00148
00149
00150 QStrList refolded;
00151
00152 QStrListIterator it(l);
00153
00154 QCString cur;
00155
00156 for (; it.current(); ++it) {
00157
00158 cur = it.current();
00159
00160 ++it;
00161
00162 while (
00163 it.current() &&
00164 it.current()[0] == ' ' &&
00165 strlen(it.current()) != 1)
00166 {
00167 cur += it.current() + 1;
00168 ++it;
00169 }
00170
00171 --it;
00172
00173 refolded.append(cur);
00174 }
00175
00176 QStrListIterator it2(refolded);
00177
00178 for (; it2.current(); ++it2) {
00179
00180 vDebug("New contentline using \"" + QCString(it2.current()) + "\"");
00181 ContentLine * cl = new ContentLine(it2.current());
00182
00183 cl->parse();
00184
00185 contentLineList_.append(cl);
00186 }
00187
00189
00190
00191 split = endLine.find(':');
00192
00193 if (split == -1)
00194 return;
00195
00196 firstPart = endLine.left(split);
00197 valuePart = endLine.right(firstPart.length() - split - 1);
00198
00199 split = firstPart.find('.');
00200
00201 if (split != -1) {
00202 group_ = firstPart.left(split);
00203 firstPart = firstPart.right(firstPart.length() - split - 1);
00204 }
00205
00206 if (qstricmp(firstPart, "END") != 0)
00207 return;
00208
00209 if (qstricmp(valuePart, "VCARD") != 0)
00210 return;
00211 }
00212
00213 void
00214 VCard::_assemble()
00215 {
00216 vDebug("Assembling vcard");
00217 strRep_ = "BEGIN:VCARD\r\n";
00218 strRep_ += "VERSION:3.0\r\n";
00219
00220 QPtrListIterator<ContentLine> it(contentLineList_);
00221
00222 for (; it.current(); ++it)
00223 strRep_ += it.current()->asString() + "\r\n";
00224
00225 strRep_ += "END:VCARD\r\n";
00226 }
00227
00228 bool
00229 VCard::has(EntityType t)
00230 {
00231 parse();
00232 return contentLine(t) == 0 ? false : true;
00233 }
00234
00235 bool
00236 VCard::has(const QCString & s)
00237 {
00238 parse();
00239 return contentLine(s) == 0 ? false : true;
00240 }
00241
00242 void
00243 VCard::add(const ContentLine & cl)
00244 {
00245 parse();
00246 ContentLine * c = new ContentLine(cl);
00247 contentLineList_.append(c);
00248 }
00249
00250 void
00251 VCard::add(const QCString & s)
00252 {
00253 parse();
00254 ContentLine * c = new ContentLine(s);
00255 contentLineList_.append(c);
00256 }
00257
00258 ContentLine *
00259 VCard::contentLine(EntityType t)
00260 {
00261 parse();
00262 QPtrListIterator<ContentLine> it(contentLineList_);
00263
00264 for (; it.current(); ++it)
00265 if (it.current()->entityType() == t)
00266 return it.current();
00267
00268 return 0;
00269 }
00270
00271 ContentLine *
00272 VCard::contentLine(const QCString & s)
00273 {
00274 parse();
00275 QPtrListIterator<ContentLine> it(contentLineList_);
00276
00277 for (; it.current(); ++it)
00278 if (it.current()->entityType() == EntityNameToEntityType(s))
00279 return it.current();
00280
00281 return 0;
00282 }
00283
|