/****************************************************************************** * Copyright (C) 2014 by Olivier Goffart #include #include #include #include #include class OwncloudDolphinPlugin : public KOverlayIconPlugin { Q_OBJECT QLocalSocket m_socket; typedef QHash StatusMap; StatusMap m_status; QByteArray m_line; public: explicit OwncloudDolphinPlugin(QObject* parent, const QList&) : KOverlayIconPlugin(parent) { connect(&m_socket, SIGNAL(readyRead()), this, SLOT(readyRead())); tryConnect(); } virtual QStringList getOverlays(const KFileItem& item) { auto url = item.url(); if (!url.isLocalFile()) return QStringList(); const QByteArray localFile = url.toLocalFile().toUtf8(); kDebug() << localFile; tryConnect(); if (m_socket.state() == QLocalSocket::ConnectingState) { if (!m_socket.waitForConnected(100)) { kWarning() << "not connected" << m_socket.errorString(); } } if (m_socket.state() == QLocalSocket::ConnectedState) { m_socket.write("RETRIEVE_FILE_STATUS:"); m_socket.write(localFile); m_socket.write("\n"); } StatusMap::iterator it = m_status.find(localFile); if (it != m_status.constEnd()) { return overlaysForString(*it); } return QStringList(); } private: void tryConnect() { if (m_socket.state() != QLocalSocket::UnconnectedState) return; QString runtimeDir = QFile::decodeName(qgetenv("XDG_RUNTIME_DIR")); QString socketPath = runtimeDir + "/" + "ownCloud" + "/socket"; m_socket.connectToServer(socketPath); } QStringList overlaysForString(const QByteArray status) { QStringList r; if (status.startsWith("NOP")) return r; if (status.startsWith("OK")) r << "dialog-ok"; if (status.startsWith("SYNC") || status.startsWith("NEW")) r << "view-refresh"; if (status.contains("+SWM")) r << "document-share"; kDebug() << status << r; return r; } private slots: void readyRead() { while (m_socket.bytesAvailable()) { m_line += m_socket.readLine(); if (!m_line.endsWith("\n")) continue; QByteArray line; qSwap(line, m_line); line.chop(1); kDebug() << "got line " << line; if (line.isEmpty()) continue; QList tokens = line.split(':'); if (tokens.count() != 3) continue; if (tokens[0] != "STATUS" && tokens[0] != "BROADCAST") continue; if (tokens[2].isEmpty()) continue; const QByteArray name = tokens[2]; QByteArray &status = m_status[name]; // reference to the item in the hash if (status == tokens[1]) continue; status = tokens[1]; emit this->overlaysChanged(QUrl::fromLocalFile(QString::fromUtf8(name)), overlaysForString(status)); } } }; K_PLUGIN_FACTORY(OwncloudDolphinPluginFactory, registerPlugin();) K_EXPORT_PLUGIN(OwncloudDolphinPluginFactory("ownclouddolhpinplugin")) #include "ownclouddolphinplugin.moc"