3 #include "attributeitem.h"
4 #include "branchitem.h"
6 #include "linkablemapobj.h"
7 #include "mainwindow.h"
12 #include <QMessageBox>
14 extern Main *mainWindow;
15 extern QDir vymBaseDir;
17 ImportBase::ImportBase()
23 ImportBase::ImportBase(VymModel *m)
29 ImportBase::~ImportBase()
35 void ImportBase::init()
38 tmpDir.setPath(makeTmpDir(ok, "vym-import"));
39 if (!tmpDir.exists() || !ok)
40 QMessageBox::critical(
41 0, QObject::tr("Error"),
42 QObject::tr("Couldn't access temporary directory\n"));
45 void ImportBase::setDir(const QString &p) { inputDir = p; }
47 void ImportBase::setFile(const QString &p) { inputFile = p; }
49 bool ImportBase::transform() { return true; }
51 QString ImportBase::getTransformedFile() { return transformedFile; }
53 /////////////////////////////////////////////////
54 ImportFirefoxBookmarks::ImportFirefoxBookmarks(VymModel *m) : ImportBase(m)
56 totalBookmarks = currentBookmarks = 0;
59 bool ImportFirefoxBookmarks::transform()
62 QFile file(inputFile);
64 progressDialog.setAutoReset(false);
65 progressDialog.setAutoClose(false);
66 progressDialog.setMinimumWidth(600);
67 progressDialog.setCancelButton(NULL);
68 progressDialog.setWindowTitle(QObject::tr("Import Firefox bookmarks","Import dialog"));
69 progressDialog.setLabelText(
70 QObject::tr("Loading bookmarks:", "Progress dialog while importing bookmarks"));
72 if (file.open(QIODevice::ReadOnly)) {
73 QJsonDocument jsdoc = QJsonDocument::fromJson(file.readAll());
76 QJsonObject jsobj = jsdoc.object();
78 QJsonArray jsarr = jsobj["children"].toArray();
79 foreach (const QJsonValue &value, jsarr) {
80 parseJson (value, ParseMode::countBookmarks);
83 progressDialog.setRange(0, totalBookmarks);
84 progressDialog.setValue(1);
85 progressDialog.setWindowModality(Qt::WindowModal);
86 progressDialog.show();
87 QApplication::processEvents();
89 model->blockReposition();
91 parseJson (jsobj, ParseMode::buildMap);
93 model->unblockReposition();
95 mainWindow->statusMessage(
96 QObject::tr("Imported %1 bookmarks", "Import dialog").arg(totalBookmarks));
102 bool ImportFirefoxBookmarks::parseJson(QJsonValue jsval, ParseMode mode, BranchItem *selbi)
105 selbi = model->getSelectedBranch();
107 qWarning() << "ImportFirefoxBookmarks: No branch selected!";
112 QJsonObject jsobj = jsval.toObject();
114 if (mode == countBookmarks) {
116 if (jsobj.contains("uri") && jsobj["uri"].isString())
120 selbi = model->addNewBranch(selbi);
121 selbi->setHeadingPlainText(jsobj["title"].toString());
123 if (jsobj.contains("uri") && jsobj["uri"].isString()) {
125 progressDialog.setValue(currentBookmarks);
126 selbi->setURL(jsobj["uri"].toString());
131 foreach (QString key, jsobj.keys())
133 if (key != "children") {
134 ai = new AttributeItem();
136 // Integer types: dateAdded, id, index, lastModified, typeCode
138 if (key == "dateAdded" || key == "lastModified") {
139 qlonglong l = jsobj[key].toVariant().toLongLong();
141 dt.setMSecsSinceEpoch(l / 1000);
143 ai->setAttributeType(AttributeItem::DateTime);
144 } else if (key == "id" || key == "index" ||
145 key == "lastModified" || key == "typeCode" ) {
146 ai->setValue(jsobj[key].toInt());
147 } else if (key == "postData")
148 ai->setValue(QString("null"));
149 else if (jsobj[key].isString())
150 ai->setValue(jsobj[key].toString());
152 // Ignore only the "postdata: null" field for now
153 qWarning() << "Firefox import, unknown key type: " << jsobj[key].type();
154 qDebug() << " Firefox bookmark: " << key << jsobj[key].toString();
155 ai->setValue(QString("unknown type."));
158 model->setAttribute(selbi, ai); // FIXME-3 deep copy?
162 model->emitDataChanged(selbi); // FIXME-2 required, but can reposition in between be blocked?
165 if (jsobj.contains("children") && jsobj["children"].isArray()) {
167 QJsonArray jsarr = jsobj["children"].toArray();
168 foreach (const QJsonValue &val, jsarr) {
169 parseJson (val, mode, selbi);
172 if (selbi->depth() > 2) {
174 model->emitDataChanged(selbi); // FIXME-2 required, but can reposition in between be blocked?
181 /////////////////////////////////////////////////
182 bool ImportMM::transform()
185 if (File::Success == unzipDir(tmpDir, inputFile)) {
187 // Set short name, too. Search from behind:
188 transformedFile = inputFile;
189 int i = transformedFile.lastIndexOf("/");
191 transformedFile = transformedFile.remove(0, i + 1);
192 transformedFile.replace(".mmap", ".xml");
193 transformedFile = tmpDir.path() + "/" + transformedFile;
196 p.setInputFile(tmpDir.path() + "/Document.xml");
197 p.setOutputFile(transformedFile);
198 p.setXSLFile(vymBaseDir.path() + "/styles/mmap2vym.xsl");