/****************************************************************************** * Copyright (C) 2014 by Olivier Goffart #include #include #include #include #include #include "ownclouddolphinpluginhelper.h" class OwncloudDolphinPlugin : public KOverlayIconPlugin { Q_PLUGIN_METADATA(IID "com.owncloud.ovarlayiconplugin" FILE "ownclouddolphinoverlayplugin.json") Q_OBJECT using StatusMap = QHash; StatusMap m_status; public: OwncloudDolphinPlugin() { auto helper = OwncloudDolphinPluginHelper::instance(); QObject::connect(helper, &OwncloudDolphinPluginHelper::commandRecieved, this, &OwncloudDolphinPlugin::slotCommandRecieved); } QStringList getOverlays(const QUrl& url) override { auto helper = OwncloudDolphinPluginHelper::instance(); if (!helper->isConnected()) return QStringList(); if (!url.isLocalFile()) return QStringList(); QDir localPath(url.toLocalFile()); const QByteArray localFile = localPath.canonicalPath().toUtf8(); helper->sendCommand(QByteArray("RETRIEVE_FILE_STATUS:" + localFile + "\n")); StatusMap::iterator it = m_status.find(localFile); if (it != m_status.constEnd()) { return overlaysForString(*it); } return QStringList(); } private: QStringList overlaysForString(const QByteArray &status) { QStringList r; if (status.startsWith("NOP")) return r; if (status.startsWith("OK")) r << "vcs-normal"; if (status.startsWith("SYNC") || status.startsWith("NEW")) r << "vcs-update-required"; if (status.startsWith("IGNORE") || status.startsWith("WARN")) r << "vcs-locally-modified-unstaged"; if (status.startsWith("ERROR")) r << "vcs-conflicting"; if (status.contains("+SWM")) r << "document-share"; return r; } void slotCommandRecieved(const QByteArray &line) { QList tokens = line.split(':'); if (tokens.count() < 3) return; if (tokens[0] != "STATUS" && tokens[0] != "BROADCAST") return; if (tokens[2].isEmpty()) return; // We can't use tokens[2] because the filename might contain ':' int secondColon = line.indexOf(":", line.indexOf(":") + 1); const QByteArray name = line.mid(secondColon + 1); QByteArray &status = m_status[name]; // reference to the item in the hash if (status == tokens[1]) return; status = tokens[1]; emit overlaysChanged(QUrl::fromLocalFile(QString::fromUtf8(name)), overlaysForString(status)); } }; #include "ownclouddolphinoverlayplugin.moc"