KNewStuff
entryhandler.cpp
Go to the documentation of this file.
00001 /* 00002 This file is part of KNewStuff2. 00003 Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> 00004 Copyright (c) 2003 - 2007 Josef Spillner <spillner@kde.org> 00005 Copyright (c) 2007 Dirk Mueller <mueller@kde.org> 00006 00007 This library is free software; you can redistribute it and/or 00008 modify it under the terms of the GNU Lesser General Public 00009 License as published by the Free Software Foundation; either 00010 version 2.1 of the License, or (at your option) any later version. 00011 00012 This library is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 Lesser General Public License for more details. 00016 00017 You should have received a copy of the GNU Lesser General Public 00018 License along with this library. If not, see <http://www.gnu.org/licenses/>. 00019 */ 00020 00021 #include "entryhandler.h" 00022 00023 #include <kdebug.h> 00024 00025 using namespace KNS; 00026 00027 EntryHandler::EntryHandler(const Entry& entry) 00028 { 00029 init(); 00030 mEntry = entry; 00031 mEntryXML = serializeElement(entry); 00032 } 00033 00034 EntryHandler::EntryHandler(const QDomElement& entryxml) 00035 { 00036 init(); 00037 mEntryXML = entryxml; 00038 mEntry = deserializeElement(entryxml); 00039 } 00040 00041 void EntryHandler::init() 00042 { 00043 mValid = false; 00044 mCompat = false; 00045 } 00046 00047 void EntryHandler::setCompatibilityFormat() 00048 { 00049 mCompat = true; 00050 } 00051 00052 bool EntryHandler::isValid() 00053 { 00054 return mValid; 00055 } 00056 00057 QDomElement EntryHandler::entryXML() 00058 { 00059 return mEntryXML; 00060 } 00061 00062 Entry EntryHandler::entry() 00063 { 00064 return mEntry; 00065 } 00066 00067 Entry *EntryHandler::entryptr() 00068 { 00069 Entry *entry = new Entry(); 00070 entry->setName(mEntry.name()); 00071 entry->setAuthor(mEntry.author()); 00072 entry->setCategory(mEntry.category()); 00073 entry->setLicense(mEntry.license()); 00074 entry->setSummary(mEntry.summary()); 00075 entry->setVersion(mEntry.version()); 00076 entry->setRelease(mEntry.release()); 00077 entry->setReleaseDate(mEntry.releaseDate()); 00078 entry->setPayload(mEntry.payload()); 00079 entry->setPreview(mEntry.preview()); 00080 entry->setRating(mEntry.rating()); 00081 entry->setDownloads(mEntry.downloads()); 00082 entry->setInstalledFiles(mEntry.installedFiles()); 00083 entry->setIdNumber(mEntry.idNumber()); 00084 return entry; 00085 } 00086 00087 QDomElement EntryHandler::serializeElement(const Entry& entry) 00088 { 00089 QDomDocument doc; 00090 00091 QDomElement el = doc.createElement("stuff"); 00092 el.setAttribute("category", entry.category()); 00093 00094 KTranslatable name = entry.name(); 00095 00096 QStringList::ConstIterator it; 00097 QDomElement e; 00098 QStringList langs; 00099 00100 langs = name.languages(); 00101 for (it = langs.constBegin(); it != langs.constEnd(); ++it) { 00102 e = addElement(doc, el, "name", name.translated(*it)); 00103 e.setAttribute("lang", *it); 00104 } 00105 00106 QDomElement author = addElement(doc, el, "author", entry.author().name()); 00107 if (!entry.author().email().isEmpty()) 00108 author.setAttribute("email", entry.author().email()); 00109 if (!entry.author().homepage().isEmpty()) 00110 author.setAttribute("homepage", entry.author().homepage()); 00111 if (!entry.author().jabber().isEmpty()) 00112 author.setAttribute("im", entry.author().jabber()); 00113 // FIXME: 'jabber' or 'im'? consult with kopete guys... 00114 00115 (void)addElement(doc, el, "licence", entry.license()); // krazy:exclude=spelling 00116 (void)addElement(doc, el, "version", entry.version()); 00117 if (mCompat) 00118 (void)addElement(doc, el, "release", QString::number(entry.release())); 00119 if ((entry.rating() > 0) || (entry.downloads() > 0)) { 00120 (void)addElement(doc, el, "rating", QString::number(entry.rating())); 00121 (void)addElement(doc, el, "downloads", QString::number(entry.downloads())); 00122 } 00123 if (!entry.signature().isEmpty()) { 00124 (void)addElement(doc, el, "signature", entry.signature()); 00125 } 00126 if (!entry.checksum().isEmpty()) { 00127 (void)addElement(doc, el, "checksum", entry.checksum()); 00128 } 00129 foreach(const QString &file, entry.installedFiles()) { 00130 (void)addElement(doc, el, "installedfile", file); 00131 } 00132 if (entry.idNumber() > 0) { 00133 addElement(doc, el, "id", QString::number(entry.idNumber())); 00134 } 00135 00136 (void)addElement(doc, el, "releasedate", 00137 entry.releaseDate().toString(Qt::ISODate)); 00138 00139 KTranslatable summary = entry.summary(); 00140 KTranslatable preview = entry.preview(); 00141 KTranslatable payload = entry.payload(); 00142 00143 langs = summary.languages(); 00144 for (it = langs.constBegin(); it != langs.constEnd(); ++it) { 00145 e = addElement(doc, el, "summary", summary.translated(*it)); 00146 e.setAttribute("lang", *it); 00147 } 00148 00149 langs = preview.languages(); 00150 for (it = langs.constBegin(); it != langs.constEnd(); ++it) { 00151 e = addElement(doc, el, "preview", KUrl(preview.translated(*it)).fileName()); 00152 e.setAttribute("lang", *it); 00153 } 00154 00155 langs = payload.languages(); 00156 for (it = langs.constBegin(); it != langs.constEnd(); ++it) { 00157 e = addElement(doc, el, "payload", KUrl(payload.translated(*it)).fileName()); 00158 e.setAttribute("lang", *it); 00159 } 00160 00161 return el; 00162 } 00163 00164 Entry EntryHandler::deserializeElement(const QDomElement& entryxml) 00165 { 00166 Entry entry; 00167 KTranslatable name, summary, preview, payload; 00168 int idNumber = 0; 00169 QStringList installedFiles; 00170 00171 if (entryxml.tagName() != "stuff") return entry; 00172 00173 if (!mCompat) { 00174 QString category = entryxml.attribute("category"); 00175 entry.setCategory(category); 00176 } 00177 00178 QDomNode n; 00179 for (n = entryxml.firstChild(); !n.isNull(); n = n.nextSibling()) { 00180 QDomElement e = n.toElement(); 00181 if (e.tagName() == "name") { 00182 QString lang = e.attribute("lang"); 00183 name.addString(lang, e.text().trimmed()); 00184 } else if (e.tagName() == "author") { 00185 Author author; 00186 QString email = e.attribute("email"); 00187 QString jabber = e.attribute("im"); 00188 QString homepage = e.attribute("homepage"); 00189 author.setName(e.text().trimmed()); 00190 author.setEmail(email); 00191 author.setJabber(jabber); 00192 author.setHomepage(homepage); 00193 entry.setAuthor(author); 00194 } else if (e.tagName() == "licence") { // krazy:exclude=spelling 00195 entry.setLicense(e.text().trimmed()); 00196 } else if (e.tagName() == "summary") { 00197 QString lang = e.attribute("lang"); 00198 //kDebug() << "adding " << e.tagName() << " to summary as language " << lang; 00199 summary.addString(lang, e.text().trimmed()); 00200 } else if (e.tagName() == "version") { 00201 entry.setVersion(e.text().trimmed()); 00202 } else if (e.tagName() == "release") { 00203 if (mCompat) { 00204 entry.setRelease(e.text().toInt()); 00205 } 00206 } else if (e.tagName() == "releasedate") { 00207 QDate date = QDate::fromString(e.text().trimmed(), Qt::ISODate); 00208 entry.setReleaseDate(date); 00209 } else if (e.tagName() == "preview") { 00210 QString lang = e.attribute("lang"); 00211 preview.addString(lang, e.text().trimmed()); 00212 } else if (e.tagName() == "payload") { 00213 QString lang = e.attribute("lang"); 00214 payload.addString(lang, e.text().trimmed()); 00215 } else if (e.tagName() == "rating") { 00216 entry.setRating(e.text().toInt()); 00217 } else if (e.tagName() == "downloads") { 00218 entry.setDownloads(e.text().toInt()); 00219 } else if (e.tagName() == "category") { 00220 if (mCompat) { 00221 entry.setCategory(e.text()); 00222 } 00223 } else if (e.tagName() == "signature") { 00224 entry.setSignature(e.text()); 00225 } else if (e.tagName() == "checksum") { 00226 entry.setChecksum(e.text()); 00227 } else if (e.tagName() == "installedfile") { 00228 installedFiles << e.text(); 00229 } else if (e.tagName() == "id") { 00230 idNumber = e.text().toInt(); 00231 //kDebug() << "got id number: " << idNumber; 00232 } 00233 } 00234 00235 entry.setName(name); 00236 entry.setSummary(summary); 00237 entry.setPreview(preview); 00238 entry.setPayload(payload); 00239 entry.setInstalledFiles(installedFiles); 00240 entry.setIdNumber(idNumber); 00241 00242 // Validation 00243 00244 if (entry.name().isEmpty()) { 00245 kWarning(550) << "EntryHandler: no name given"; 00246 return entry; 00247 } 00248 00249 if (entry.payload().isEmpty()) { 00250 kWarning(550) << "EntryHandler: no payload URL given"; 00251 return entry; 00252 } 00253 00254 // Entry is valid 00255 00256 mValid = true; 00257 return entry; 00258 } 00259 00260 QDomElement EntryHandler::addElement(QDomDocument& doc, QDomElement& parent, 00261 const QString& tag, const QString& value) 00262 { 00263 QDomElement n = doc.createElement(tag); 00264 n.appendChild(doc.createTextNode(value)); 00265 parent.appendChild(n); 00266 00267 return n; 00268 }
KDE 4.6 API Reference