kio
kbookmarkimporter_ns.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "kbookmarkimporter.h"
00024 #include "kbookmarkexporter.h"
00025 #include "kbookmarkmanager.h"
00026 #include <kfiledialog.h>
00027 #include <kstringhandler.h>
00028 #include <klocale.h>
00029 #include <kdebug.h>
00030 #include <kcharsets.h>
00031 #include <qtextcodec.h>
00032 #include <qstylesheet.h>
00033
00034 #include <sys/types.h>
00035 #include <stddef.h>
00036 #include <dirent.h>
00037 #include <sys/stat.h>
00038 #include <assert.h>
00039
00040 void KNSBookmarkImporterImpl::parse()
00041 {
00042 QFile f(m_fileName);
00043 QTextCodec * codec = m_utf8 ? QTextCodec::codecForName("UTF-8") : QTextCodec::codecForLocale();
00044 Q_ASSERT(codec);
00045 if (!codec)
00046 return;
00047
00048 if(f.open(IO_ReadOnly)) {
00049
00050 static const int g_lineLimit = 16*1024;
00051 QCString s(g_lineLimit);
00052
00053 while(f.readLine(s.data(), g_lineLimit) >= 0 && !s.contains("<DL>"));
00054
00055 while(f.readLine(s.data(), g_lineLimit)>=0) {
00056 if ( s[s.length()-1] != '\n' )
00057 {
00058 kdWarning() << "Netscape bookmarks contain a line longer than " << g_lineLimit << ". Skipping." << endl;
00059 continue;
00060 }
00061 QCString t = s.stripWhiteSpace();
00062 if(t.left(12).upper() == "<DT><A HREF=" ||
00063 t.left(16).upper() == "<DT><H3><A HREF=") {
00064 int firstQuotes = t.find('"')+1;
00065 int secondQuotes = t.find('"', firstQuotes);
00066 if (firstQuotes != -1 && secondQuotes != -1)
00067 {
00068 QCString link = t.mid(firstQuotes, secondQuotes-firstQuotes);
00069 int endTag = t.find('>', secondQuotes+1);
00070 QCString name = t.mid(endTag+1);
00071 name = name.left(name.findRev('<'));
00072 if ( name.right(4) == "</A>" )
00073 name = name.left( name.length() - 4 );
00074 QString qname = KCharsets::resolveEntities( codec->toUnicode( name ) );
00075 QCString additionalInfo = t.mid( secondQuotes+1, endTag-secondQuotes-1 );
00076
00077 emit newBookmark( qname,
00078 link, codec->toUnicode(additionalInfo) );
00079 }
00080 }
00081 else if(t.left(7).upper() == "<DT><H3") {
00082 int endTag = t.find('>', 7);
00083 QCString name = t.mid(endTag+1);
00084 name = name.left(name.findRev('<'));
00085 QString qname = KCharsets::resolveEntities( codec->toUnicode( name ) );
00086 QCString additionalInfo = t.mid( 8, endTag-8 );
00087 bool folded = (additionalInfo.left(6) == "FOLDED");
00088 if (folded) additionalInfo.remove(0,7);
00089
00090 emit newFolder( qname,
00091 !folded,
00092 codec->toUnicode(additionalInfo) );
00093 }
00094 else if(t.left(4).upper() == "<HR>")
00095 emit newSeparator();
00096 else if(t.left(8).upper() == "</DL><P>")
00097 emit endFolder();
00098 }
00099
00100 f.close();
00101 }
00102 }
00103
00104 QString KNSBookmarkImporterImpl::findDefaultLocation(bool forSaving) const
00105 {
00106 if (m_utf8)
00107 {
00108 if ( forSaving )
00109 return KFileDialog::getSaveFileName( QDir::homeDirPath() + "/.mozilla",
00110 i18n("*.html|HTML Files (*.html)") );
00111 else
00112 return KFileDialog::getOpenFileName( QDir::homeDirPath() + "/.mozilla",
00113 i18n("*.html|HTML Files (*.html)") );
00114 }
00115 else
00116 {
00117 return QDir::homeDirPath() + "/.netscape/bookmarks.html";
00118 }
00119 }
00120
00122
00123
00124 void KNSBookmarkImporter::parseNSBookmarks( bool utf8 )
00125 {
00126 KNSBookmarkImporterImpl importer;
00127 importer.setFilename(m_fileName);
00128 importer.setUtf8(utf8);
00129 importer.setupSignalForwards(&importer, this);
00130 importer.parse();
00131 }
00132
00133 QString KNSBookmarkImporter::netscapeBookmarksFile( bool forSaving )
00134 {
00135 static KNSBookmarkImporterImpl *p = 0;
00136 if (!p)
00137 {
00138 p = new KNSBookmarkImporterImpl;
00139 p->setUtf8(false);
00140 }
00141 return p->findDefaultLocation(forSaving);
00142 }
00143
00144 QString KNSBookmarkImporter::mozillaBookmarksFile( bool forSaving )
00145 {
00146 static KNSBookmarkImporterImpl *p = 0;
00147 if (!p)
00148 {
00149 p = new KNSBookmarkImporterImpl;
00150 p->setUtf8(true);
00151 }
00152 return p->findDefaultLocation(forSaving);
00153 }
00154
00155
00157
00159
00160 void KNSBookmarkExporter::write(bool utf8) {
00161 KNSBookmarkExporterImpl exporter(m_pManager, m_fileName);
00162 exporter.setUtf8(utf8);
00163 exporter.write(m_pManager->root());
00164 }
00165
00166 void KNSBookmarkExporter::writeFolder(QTextStream &, KBookmarkGroup ) {
00167
00168 }
00169
00171
00172 void KNSBookmarkExporterImpl::setUtf8(bool utf8) {
00173 m_utf8 = utf8;
00174 }
00175
00176 void KNSBookmarkExporterImpl::write(KBookmarkGroup parent) {
00177 if (QFile::exists(m_fileName)) {
00178 ::rename(
00179 QFile::encodeName(m_fileName),
00180 QFile::encodeName(m_fileName + ".beforekde"));
00181 }
00182
00183 QFile file(m_fileName);
00184
00185 if (!file.open(IO_WriteOnly)) {
00186 kdError(7043) << "Can't write to file " << m_fileName << endl;
00187 return;
00188 }
00189
00190 QTextStream fstream(&file);
00191 fstream.setEncoding(m_utf8 ? QTextStream::UnicodeUTF8 : QTextStream::Locale);
00192
00193 QString charset
00194 = m_utf8 ? "UTF-8" : QString::fromLatin1(QTextCodec::codecForLocale()->name()).upper();
00195
00196 fstream << "<!DOCTYPE NETSCAPE-Bookmark-file-1>" << endl
00197 << i18n("<!-- This file was generated by Konqueror -->") << endl
00198 << "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset="
00199 << charset << "\">" << endl
00200 << "<TITLE>" << i18n("Bookmarks") << "</TITLE>" << endl
00201 << "<H1>" << i18n("Bookmarks") << "</H1>" << endl
00202 << "<DL><p>" << endl
00203 << folderAsString(parent)
00204 << "</DL><P>" << endl;
00205 }
00206
00207 QString KNSBookmarkExporterImpl::folderAsString(KBookmarkGroup parent) const {
00208 QString str;
00209 QTextStream fstream(&str, IO_WriteOnly);
00210
00211 for (KBookmark bk = parent.first(); !bk.isNull(); bk = parent.next(bk)) {
00212 if (bk.isSeparator()) {
00213 fstream << "<HR>" << endl;
00214 continue;
00215 }
00216
00217 QString text = QStyleSheet::escape(bk.fullText());
00218
00219 if (bk.isGroup() ) {
00220 fstream << "<DT><H3 "
00221 << (!bk.toGroup().isOpen() ? "FOLDED " : "")
00222 << bk.internalElement().attribute("netscapeinfo") << ">"
00223 << text << "</H3>" << endl
00224 << "<DL><P>" << endl
00225 << folderAsString(bk.toGroup())
00226 << "</DL><P>" << endl;
00227 continue;
00228
00229 } else {
00230
00231 fstream << "<DT><A HREF=\"" << bk.url().url() << "\""
00232 << bk.internalElement().attribute("netscapeinfo") << ">"
00233 << text << "</A>" << endl;
00234 continue;
00235 }
00236 }
00237
00238 return str;
00239 }
00240
00242
00243 #include "kbookmarkimporter_ns.moc"