summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpaster/fileshareprotocol.cpp218
-rw-r--r--src/plugins/cpaster/fileshareprotocol.h71
-rw-r--r--src/plugins/cpaster/fileshareprotocolsettingspage.cpp138
-rw-r--r--src/plugins/cpaster/fileshareprotocolsettingspage.h95
-rw-r--r--src/plugins/cpaster/fileshareprotocolsettingswidget.ui69
5 files changed, 591 insertions, 0 deletions
diff --git a/src/plugins/cpaster/fileshareprotocol.cpp b/src/plugins/cpaster/fileshareprotocol.cpp
new file mode 100644
index 0000000000..ef253ace69
--- /dev/null
+++ b/src/plugins/cpaster/fileshareprotocol.cpp
@@ -0,0 +1,218 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "fileshareprotocol.h"
+#include "fileshareprotocolsettingspage.h"
+
+#include <coreplugin/icore.h>
+#include <coreplugin/messagemanager.h>
+#include <coreplugin/messageoutputwindow.h>
+
+#include <utils/qtcassert.h>
+
+#include <QtCore/QXmlStreamReader>
+#include <QtCore/QXmlStreamAttribute>
+#include <QtCore/QTemporaryFile>
+#include <QtCore/QDir>
+#include <QtCore/QFileInfo>
+#include <QtCore/QDebug>
+
+enum { debug = 0 };
+
+static const char tempPatternC[] = "pasterXXXXXX.xml";
+static const char tempGlobPatternC[] = "paster*.xml";
+static const char pasterElementC[] = "paster";
+static const char userElementC[] = "user";
+static const char descriptionElementC[] = "description";
+static const char textElementC[] = "text";
+
+namespace CodePaster {
+
+FileShareProtocol::FileShareProtocol() :
+ m_settings(new FileShareProtocolSettings),
+ m_settingsPage(new FileShareProtocolSettingsPage(m_settings))
+{
+ m_settings->fromSettings(Core::ICore::instance()->settings());
+}
+
+FileShareProtocol::~FileShareProtocol()
+{
+}
+
+QString FileShareProtocol::name() const
+{
+ return m_settingsPage->displayName();
+}
+
+unsigned FileShareProtocol::capabilities() const
+{
+ return ListCapability|PostDescriptionCapability;
+}
+
+bool FileShareProtocol::hasSettings() const
+{
+ return true;
+}
+
+Core::IOptionsPage *FileShareProtocol::settingsPage() const
+{
+ return m_settingsPage;
+}
+
+static bool parse(const QString &fileName,
+ QString *errorMessage,
+ QString *user = 0, QString *description = 0, QString *text = 0)
+{
+ unsigned elementCount = 0;
+
+ errorMessage->clear();
+ if (user)
+ user->clear();
+ if (description)
+ description->clear();
+ if (text)
+ text->clear();
+
+ QFile file(fileName);
+ if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) {
+ *errorMessage = FileShareProtocol::tr("Cannot open %1: %2").arg(fileName, file.errorString());
+ return false;
+ }
+ QXmlStreamReader reader(&file);
+ while (!reader.atEnd()) {
+ if (reader.readNext() == QXmlStreamReader::StartElement) {
+ const QStringRef elementName = reader.name();
+ // Check start element
+ if (elementCount == 0 && elementName != QLatin1String(pasterElementC)) {
+ *errorMessage = FileShareProtocol::tr("%1 does not appear to be a paster file.").arg(fileName);
+ return false;
+ }
+ // Parse elements
+ elementCount++;
+ if (user && elementName == QLatin1String(userElementC)) {
+ *user = reader.readElementText();
+ } else if (description && elementName == QLatin1String(descriptionElementC)) {
+ *description = reader.readElementText();
+ } else if (text && elementName == QLatin1String(textElementC)) {
+ *text = reader.readElementText();
+ }
+ }
+ }
+ if (reader.hasError()) {
+ *errorMessage = FileShareProtocol::tr("Error in %1 at %2: %3")
+ .arg(fileName).arg(reader.lineNumber()).arg(reader.errorString());
+ return false;
+ }
+ return true;
+}
+
+bool FileShareProtocol::checkConfiguration(QString *errorMessage) const
+{
+ if (m_settings->path.isEmpty()) {
+ if (errorMessage)
+ *errorMessage = tr("Please configure a path.");
+ return false;
+ }
+ return true;
+}
+
+void FileShareProtocol::fetch(const QString &id)
+{
+ // Absolute or relative path name.
+ QFileInfo fi(id);
+ if (fi.isRelative())
+ fi = QFileInfo(m_settings->path + QLatin1Char('/') + id);
+ QString errorMessage;
+ QString text;
+ if (parse(fi.absoluteFilePath(), &errorMessage, 0, 0, &text)) {
+ emit fetchDone(id, text, false);
+ } else {
+ emit fetchDone(id, errorMessage, true);
+ }
+}
+
+void FileShareProtocol::list()
+{
+ // Read out directory, display by date (latest first)
+ QDir dir(m_settings->path, QLatin1String(tempGlobPatternC),
+ QDir::Time, QDir::Files|QDir::NoDotAndDotDot|QDir::Readable);
+ QStringList entries;
+ QString user;
+ QString description;
+ QString errorMessage;
+ const QChar blank = QLatin1Char(' ');
+ const QFileInfoList entryInfoList = dir.entryInfoList();
+ const int count = qMin(m_settings->displayCount, entryInfoList.size());
+ for (int i = 0; i < count; i++) {
+ const QFileInfo& entryFi = entryInfoList.at(i);
+ if (parse(entryFi.absoluteFilePath(), &errorMessage, &user, &description)) {
+ QString entry = entryFi.fileName();
+ entry += blank;
+ entry += user;
+ entry += blank;
+ entry += description;
+ entries.push_back(entry);
+ }
+ if (debug)
+ qDebug() << entryFi.absoluteFilePath() << errorMessage;
+ }
+ emit listDone(name(), entries);
+}
+
+void FileShareProtocol::paste(const QString &text,
+ ContentType /* ct */,
+ const QString &username,
+ const QString & /* comment */,
+ const QString &description)
+{
+ // Write out temp XML file
+ QTemporaryFile tempFile(m_settings->path + QLatin1Char('/') + QLatin1String(tempPatternC));
+ tempFile.setAutoRemove(false);
+ if (!tempFile.open()) {
+ const QString msg = tr("Unable to open a file for writing in %1: %2").arg(m_settings->path, tempFile.errorString());
+ Core::ICore::instance()->messageManager()->printToOutputPanePopup(msg);
+ return;
+ }
+ // Flat text sections embedded into pasterElement
+ QXmlStreamWriter writer(&tempFile);
+ writer.writeStartDocument();
+ writer.writeStartElement(QLatin1String(pasterElementC));
+
+ writer.writeTextElement(QLatin1String(userElementC), username);
+ writer.writeTextElement(QLatin1String(descriptionElementC), description);
+ writer.writeTextElement(QLatin1String(textElementC), text);
+
+ writer.writeEndElement();
+ writer.writeEndDocument();
+ tempFile.close();
+
+ const QString msg = tr("Pasted: %1").arg(tempFile.fileName());
+ Core::ICore::instance()->messageManager()->printToOutputPanePopup(msg);
+}
+} // namespace CodePaster
diff --git a/src/plugins/cpaster/fileshareprotocol.h b/src/plugins/cpaster/fileshareprotocol.h
new file mode 100644
index 0000000000..bcb892eca0
--- /dev/null
+++ b/src/plugins/cpaster/fileshareprotocol.h
@@ -0,0 +1,71 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef FILESHAREPROTOCOL_H
+#define FILESHAREPROTOCOL_H
+
+#include "protocol.h"
+
+#include <QtCore/QSharedPointer>
+
+namespace CodePaster {
+
+class FileShareProtocolSettingsPage;
+struct FileShareProtocolSettings;
+
+/* FileShareProtocol: Allows for pasting via a shared network
+ * drive by writing XML files. */
+
+class FileShareProtocol : public Protocol
+{
+ Q_DISABLE_COPY(FileShareProtocol)
+public:
+ FileShareProtocol();
+ virtual ~FileShareProtocol();
+
+ virtual QString name() const;
+ virtual unsigned capabilities() const;
+ virtual bool hasSettings() const;
+ virtual Core::IOptionsPage *settingsPage() const;
+
+ virtual bool checkConfiguration(QString *errorMessage = 0) const;
+ virtual void fetch(const QString &id);
+ virtual void list();
+ virtual void paste(const QString &text,
+ ContentType ct = Text,
+ const QString &username = QString(),
+ const QString &comment = QString(),
+ const QString &description = QString());
+private:
+ const QSharedPointer<FileShareProtocolSettings> m_settings;
+ FileShareProtocolSettingsPage *m_settingsPage;
+};
+} // namespace CodePaster
+
+#endif // FILESHAREPROTOCOL_H
diff --git a/src/plugins/cpaster/fileshareprotocolsettingspage.cpp b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp
new file mode 100644
index 0000000000..f678e7a015
--- /dev/null
+++ b/src/plugins/cpaster/fileshareprotocolsettingspage.cpp
@@ -0,0 +1,138 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#include "fileshareprotocolsettingspage.h"
+#include "cpasterconstants.h"
+
+#include <coreplugin/icore.h>
+
+#include <QtCore/QDir>
+#include <QtCore/QSettings>
+#include <QtCore/QCoreApplication>
+
+static const char settingsGroupC[] = "FileSharePasterSettings";
+static const char pathKeyC[] = "Path";
+static const char displayCountKeyC[] = "DisplayCount";
+
+namespace CodePaster {
+
+FileShareProtocolSettings::FileShareProtocolSettings() :
+ path(QDir::tempPath()), displayCount(10)
+{
+}
+
+void FileShareProtocolSettings::toSettings(QSettings *s) const
+{
+ s->beginGroup(QLatin1String(settingsGroupC));
+ s->setValue(QLatin1String(pathKeyC), path);
+ s->setValue(QLatin1String(displayCountKeyC), displayCount);
+ s->endGroup();
+}
+
+void FileShareProtocolSettings::fromSettings(const QSettings *s)
+{
+ FileShareProtocolSettings defaultValues;
+ const QString keyRoot = QLatin1String(settingsGroupC) + QLatin1Char('/');
+ path = s->value(keyRoot + QLatin1String(pathKeyC), defaultValues.path).toString();
+ displayCount = s->value(keyRoot + QLatin1String(displayCountKeyC), defaultValues.displayCount).toInt();
+}
+
+bool FileShareProtocolSettings::equals(const FileShareProtocolSettings &rhs) const
+{
+ return displayCount == rhs.displayCount && path == rhs.path;
+}
+
+FileShareProtocolSettingsWidget::FileShareProtocolSettingsWidget(QWidget *parent) :
+ QWidget(parent)
+{
+ m_ui.setupUi(this);
+}
+
+void FileShareProtocolSettingsWidget::setSettings(const FileShareProtocolSettings &s)
+{
+ m_ui.pathChooser->setPath(s.path);
+ m_ui.displayCountSpinBox->setValue(s.displayCount);
+}
+
+FileShareProtocolSettings FileShareProtocolSettingsWidget::settings() const
+{
+ FileShareProtocolSettings rc;
+ rc.path = m_ui.pathChooser->path();
+ rc.displayCount = m_ui.displayCountSpinBox->value();
+ return rc;
+}
+
+// ----------FileShareProtocolSettingsPage
+FileShareProtocolSettingsPage::FileShareProtocolSettingsPage(const QSharedPointer<FileShareProtocolSettings> &s,
+ QObject *parent) :
+ Core::IOptionsPage(parent), m_settings(s)
+{
+}
+
+QString FileShareProtocolSettingsPage::id() const
+{
+ return QLatin1String("X.FileSharePaster");
+}
+
+QString FileShareProtocolSettingsPage::displayName() const
+{
+ return tr("Fileshare");
+}
+
+QString FileShareProtocolSettingsPage::category() const
+{
+ return QLatin1String(Constants::CPASTER_SETTINGS_CATEGORY);
+}
+
+QString FileShareProtocolSettingsPage::displayCategory() const
+{
+ return QCoreApplication::translate("CodePaster", Constants::CPASTER_SETTINGS_TR_CATEGORY);
+}
+
+QIcon FileShareProtocolSettingsPage::categoryIcon() const
+{
+ return QIcon();
+}
+
+QWidget *FileShareProtocolSettingsPage::createPage(QWidget *parent)
+{
+ m_widget = new FileShareProtocolSettingsWidget(parent);
+ m_widget->setSettings(*m_settings);
+ return m_widget;
+}
+
+void FileShareProtocolSettingsPage::apply()
+{
+ const FileShareProtocolSettings newSettings = m_widget->settings();
+ if (newSettings != *m_settings) {
+ *m_settings = newSettings;
+ m_settings->toSettings(Core::ICore::instance()->settings());
+ }
+}
+} // namespace CodePaster
diff --git a/src/plugins/cpaster/fileshareprotocolsettingspage.h b/src/plugins/cpaster/fileshareprotocolsettingspage.h
new file mode 100644
index 0000000000..9705e3c848
--- /dev/null
+++ b/src/plugins/cpaster/fileshareprotocolsettingspage.h
@@ -0,0 +1,95 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://qt.nokia.com/contact.
+**
+**************************************************************************/
+
+#ifndef FILESHAREPROTOCOLSETTINGSPAGE_H
+#define FILESHAREPROTOCOLSETTINGSPAGE_H
+
+#include <coreplugin/dialogs/ioptionspage.h>
+#include "ui_fileshareprotocolsettingswidget.h"
+
+#include <QtCore/QSharedPointer>
+#include <QtCore/QPointer>
+#include <QtGui/QWidget>
+
+QT_BEGIN_NAMESPACE
+class QSettings;
+QT_END_NAMESPACE
+
+namespace CodePaster {
+
+struct FileShareProtocolSettings {
+ FileShareProtocolSettings();
+ void toSettings(QSettings *) const;
+ void fromSettings(const QSettings *);
+ bool equals(const FileShareProtocolSettings &rhs) const;
+
+ QString path;
+ int displayCount;
+};
+
+inline bool operator==(const FileShareProtocolSettings &s1, const FileShareProtocolSettings &s2)
+{ return s1.equals(s2); }
+inline bool operator!=(const FileShareProtocolSettings &s1, const FileShareProtocolSettings &s2)
+{ return !s1.equals(s2); }
+
+class FileShareProtocolSettingsWidget : public QWidget {
+ Q_OBJECT
+public:
+ explicit FileShareProtocolSettingsWidget(QWidget *parent = 0);
+
+ void setSettings(const FileShareProtocolSettings &);
+ FileShareProtocolSettings settings() const;
+
+private:
+ Ui::FileShareProtocolSettingsWidget m_ui;
+};
+class FileShareProtocolSettingsPage : public Core::IOptionsPage
+{
+ Q_OBJECT
+public:
+ explicit FileShareProtocolSettingsPage(const QSharedPointer<FileShareProtocolSettings> &s,
+ QObject *parent = 0);
+
+ QString id() const;
+ QString displayName() const;
+ QString category() const;
+ QString displayCategory() const;
+ QIcon categoryIcon() const;
+
+ QWidget *createPage(QWidget *parent);
+ void apply();
+ void finish() { }
+
+private:
+ const QSharedPointer<FileShareProtocolSettings> m_settings;
+ QPointer<FileShareProtocolSettingsWidget> m_widget;
+};
+} // namespace CodePaster
+
+#endif // FILESHAREPROTOCOLSETTINGSPAGE_H
diff --git a/src/plugins/cpaster/fileshareprotocolsettingswidget.ui b/src/plugins/cpaster/fileshareprotocolsettingswidget.ui
new file mode 100644
index 0000000000..e36e79f982
--- /dev/null
+++ b/src/plugins/cpaster/fileshareprotocolsettingswidget.ui
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CodePaster::FileShareProtocolSettingsWidget</class>
+ <widget class="QWidget" name="CodePaster::FileShareProtocolSettingsWidget">
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="1" column="0">
+ <widget class="QLabel" name="pathLabel">
+ <property name="text">
+ <string>&amp;Path:</string>
+ </property>
+ <property name="buddy">
+ <cstring>pathChooser</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="Utils::PathChooser" name="pathChooser"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="displayCountLabel">
+ <property name="text">
+ <string>&amp;Display:</string>
+ </property>
+ <property name="buddy">
+ <cstring>displayCountSpinBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="displayCountSpinBox">
+ <property name="suffix">
+ <string>entries</string>
+ </property>
+ <property name="minimum">
+ <number>2</number>
+ </property>
+ <property name="maximum">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>11</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="helpLabel">
+ <property name="text">
+ <string>The fileshare-based paster protocol allows for sharing code snippets using simple files on a shared network drive. Files are never deleted.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>Utils::PathChooser</class>
+ <extends>QWidget</extends>
+ <header location="global">utils/pathchooser.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>