KIO
kbookmarkimporter_ie.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 #include "kbookmarkimporter_ie.h"
00022
00023 #include <kfiledialog.h>
00024 #include <kstringhandler.h>
00025 #include <klocale.h>
00026 #include <kdebug.h>
00027 #include <qtextcodec.h>
00028 #include <QtGui/QApplication>
00029
00030 #include <sys/types.h>
00031 #include <stddef.h>
00032 #include <dirent.h>
00033 #include <sys/stat.h>
00034
00035 #include "kbookmarkimporter.h"
00036
00041 class KIEBookmarkImporter : public QObject
00042 {
00043 Q_OBJECT
00044 public:
00045 KIEBookmarkImporter( const QString & fileName ) : m_fileName(fileName) {}
00046 ~KIEBookmarkImporter() {}
00047
00048 void parseIEBookmarks();
00049
00050
00051 static QString IEBookmarksDir();
00052
00053 Q_SIGNALS:
00054 void newBookmark( const QString & text, const QString & url, const QString & additionalInfo );
00055 void newFolder( const QString & text, bool open, const QString & additionalInfo );
00056 void newSeparator();
00057 void endFolder();
00058
00059 protected:
00060 void parseIEBookmarks_dir( const QString &dirname, const QString &name = QString() );
00061 void parseIEBookmarks_url_file( const QString &filename, const QString &name );
00062
00063 QString m_fileName;
00064 };
00065
00066 void KIEBookmarkImporter::parseIEBookmarks_url_file( const QString &filename, const QString &name ) {
00067 static const int g_lineLimit = 16*1024;
00068
00069 QFile f(filename);
00070
00071 if(f.open(QIODevice::ReadOnly)) {
00072
00073 QByteArray s(g_lineLimit,0);
00074
00075 while(f.readLine(s.data(), g_lineLimit)>=0) {
00076 if ( s[s.length()-1] != '\n' )
00077 {
00078 kWarning() << "IE bookmarks contain a line longer than " << g_lineLimit << ". Skipping.";
00079 continue;
00080 }
00081 QByteArray t = s.trimmed();
00082 QRegExp rx( "URL=(.*)" );
00083 if (rx.exactMatch(t)) {
00084 emit newBookmark( name, rx.cap(1), QString("") );
00085 }
00086 }
00087
00088 f.close();
00089 }
00090 }
00091
00092 void KIEBookmarkImporter::parseIEBookmarks_dir( const QString &dirname, const QString &foldername )
00093 {
00094
00095 QDir dir(dirname);
00096 dir.setFilter( QDir::Files | QDir::Dirs | QDir::AllDirs );
00097 dir.setSorting( QFlags<QDir::SortFlag>(QDir::Name | QDir::DirsFirst) );
00098 dir.setNameFilters(QStringList("*.url"));
00099
00100 QFileInfoList list = dir.entryInfoList();
00101 if (list.isEmpty()) return;
00102
00103 if (dirname != m_fileName)
00104 emit newFolder( foldername, false, "" );
00105
00106 foreach (const QFileInfo &fi, list) {
00107 if (fi.fileName() == "." || fi.fileName() == "..") continue;
00108
00109 if (fi.isDir()) {
00110 parseIEBookmarks_dir(fi.absoluteFilePath(), fi.fileName());
00111
00112 } else if (fi.isFile()) {
00113 if (fi.fileName().endsWith(".url")) {
00114 QString name = fi.fileName();
00115 name.truncate(name.length() - 4);
00116 parseIEBookmarks_url_file(fi.absoluteFilePath(), name);
00117 }
00118
00119 }
00120 }
00121
00122 if (dirname != m_fileName)
00123 emit endFolder();
00124 }
00125
00126
00127 void KIEBookmarkImporter::parseIEBookmarks( )
00128 {
00129 parseIEBookmarks_dir( m_fileName );
00130 }
00131
00132 QString KIEBookmarkImporter::IEBookmarksDir()
00133 {
00134 static KIEBookmarkImporterImpl* p = 0;
00135 if (!p)
00136 p = new KIEBookmarkImporterImpl;
00137 return p->findDefaultLocation();
00138 }
00139
00140 void KIEBookmarkImporterImpl::parse() {
00141 KIEBookmarkImporter importer(m_fileName);
00142 setupSignalForwards(&importer, this);
00143 importer.parseIEBookmarks();
00144 }
00145
00146 QString KIEBookmarkImporterImpl::findDefaultLocation(bool) const
00147 {
00148
00149
00150
00151
00152
00153
00154 return KFileDialog::getExistingDirectory(KUrl(), QApplication::activeWindow());
00155 }
00156
00158
00159 class IEExporter : private KBookmarkGroupTraverser {
00160 public:
00161 IEExporter( const QString & );
00162 void write( const KBookmarkGroup &grp ) { traverse(grp); }
00163 private:
00164 virtual void visit( const KBookmark & );
00165 virtual void visitEnter( const KBookmarkGroup & );
00166 virtual void visitLeave( const KBookmarkGroup & );
00167 private:
00168 QDir m_currentDir;
00169 };
00170
00171 static QString ieStyleQuote( const QString &str ) {
00172 QString s(str);
00173 s.replace(QRegExp("[/\\:*?\"<>|]"), "_");
00174 return s;
00175 }
00176
00177 IEExporter::IEExporter( const QString & dname ) {
00178 m_currentDir.setPath( dname );
00179 }
00180
00181 void IEExporter::visit( const KBookmark &bk ) {
00182 QString fname = m_currentDir.path() + '/' + ieStyleQuote( bk.fullText() ) + ".url";
00183
00184 QFile file( fname );
00185 file.open( QIODevice::WriteOnly );
00186 QTextStream ts( &file );
00187 ts << "[InternetShortcut]\r\n";
00188 ts << "URL=" << bk.url().url().toUtf8() << "\r\n";
00189 }
00190
00191 void IEExporter::visitEnter( const KBookmarkGroup &grp ) {
00192 QString dname = m_currentDir.path() + '/' + ieStyleQuote( grp.fullText() );
00193
00194 m_currentDir.mkdir( dname );
00195 m_currentDir.cd( dname );
00196 }
00197
00198 void IEExporter::visitLeave( const KBookmarkGroup & ) {
00199
00200 m_currentDir.cdUp();
00201 }
00202
00203 void KIEBookmarkExporterImpl::write(const KBookmarkGroup& parent) {
00204 IEExporter exporter( m_fileName );
00205 exporter.write( parent );
00206 }
00207
00208 #include "kbookmarkimporter_ie.moc"