diff --git a/src/plugins/cpaster/codepasterprotocol.cpp b/src/plugins/cpaster/codepasterprotocol.cpp index 2e444dcf5295ef5fae6a8c7febb3825216f16297..39b21af8e6441711510a9b0b61ce495e597f7591 100644 --- a/src/plugins/cpaster/codepasterprotocol.cpp +++ b/src/plugins/cpaster/codepasterprotocol.cpp @@ -48,7 +48,8 @@ enum { debug = 0 }; namespace CodePaster { -CodePasterProtocol::CodePasterProtocol() : +CodePasterProtocol::CodePasterProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), m_page(new CodePaster::CodePasterSettingsPage), m_pasteReply(0), m_fetchReply(0), @@ -98,10 +99,7 @@ void CodePasterProtocol::fetch(const QString &id) link.append(hostName); link.append("/?format=raw&id="); link.append(id); - QUrl url(link); - QNetworkRequest r(url); - - m_fetchReply = m_manager.get(r); + m_fetchReply = httpGet(link); connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); m_fetchId = id; } @@ -116,9 +114,7 @@ void CodePasterProtocol::list() QString link = QLatin1String("http://"); link += hostName; link += QLatin1String("/?command=browse&format=raw"); - QUrl url(link); - QNetworkRequest r(url); - m_listReply = m_manager.get(r); + m_listReply = httpGet(link); connect(m_listReply, SIGNAL(finished()), this, SLOT(listFinished())); } @@ -142,9 +138,7 @@ void CodePasterProtocol::paste(const QString &text, data += "&poster="; data += CGI::encodeURL(username).toLatin1(); - QUrl url(QLatin1String("http://") + hostName); - QNetworkRequest r(url); - m_pasteReply = m_manager.post(r, data); + m_pasteReply = httpPost(QLatin1String("http://") + hostName, data); connect(m_pasteReply, SIGNAL(finished()), this, SLOT(pasteFinished())); } diff --git a/src/plugins/cpaster/codepasterprotocol.h b/src/plugins/cpaster/codepasterprotocol.h index f6e6df058a8b61aa42dc4a7697279de7afa7d035..554169fd19463733f2c4cf40fc0c2cc8b854db2a 100644 --- a/src/plugins/cpaster/codepasterprotocol.h +++ b/src/plugins/cpaster/codepasterprotocol.h @@ -32,8 +32,6 @@ #include "protocol.h" -#include <QtNetwork/QNetworkAccessManager> - QT_BEGIN_NAMESPACE class QNetworkReply; QT_END_NAMESPACE @@ -42,11 +40,11 @@ namespace CodePaster { class CodePasterSettingsPage; -class CodePasterProtocol : public Protocol +class CodePasterProtocol : public NetworkProtocol { Q_OBJECT public: - CodePasterProtocol(); + explicit CodePasterProtocol(const NetworkAccessManagerProxyPtr &nw); ~CodePasterProtocol(); QString name() const; @@ -70,7 +68,6 @@ public slots: private: bool isValidHostName(const QString& hostName); CodePasterSettingsPage *m_page; - QNetworkAccessManager m_manager; QNetworkReply *m_pasteReply; QNetworkReply *m_fetchReply; QNetworkReply *m_listReply; diff --git a/src/plugins/cpaster/cpasterplugin.cpp b/src/plugins/cpaster/cpasterplugin.cpp index ea2dccc5173aa02314b556d98c5d960353a52458..2dba25ce13e549d8f5ee34210d6732c655912d17 100644 --- a/src/plugins/cpaster/cpasterplugin.cpp +++ b/src/plugins/cpaster/cpasterplugin.cpp @@ -65,7 +65,9 @@ using namespace CodePaster; using namespace Core; using namespace TextEditor; -CodepasterPlugin::CodepasterPlugin() : m_settings(new Settings) +CodepasterPlugin::CodepasterPlugin() : + m_settings(new Settings), + m_postEditorAction(0), m_postClipboardAction(0), m_fetchAction(0) { } @@ -89,9 +91,10 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *error_m addAutoReleasedObject(settingsPage); // Create the protocols and append them to the Settings - Protocol *protos[] = { new CodePasterProtocol(), - new PasteBinDotComProtocol(), - new PasteBinDotCaProtocol(), + const QSharedPointer<NetworkAccessManagerProxy> networkAccessMgrProxy(new NetworkAccessManagerProxy); + Protocol *protos[] = { new CodePasterProtocol(networkAccessMgrProxy), + new PasteBinDotComProtocol(networkAccessMgrProxy), + new PasteBinDotCaProtocol(networkAccessMgrProxy), 0}; for(int i=0; protos[i] != 0; ++i) { connect(protos[i], SIGNAL(pasteDone(QString)), this, SLOT(finishPost(QString))); @@ -116,10 +119,15 @@ bool CodepasterPlugin::initialize(const QStringList &arguments, QString *error_m Core::Command *command; - m_postAction = new QAction(tr("Paste Snippet..."), this); - command = actionManager->registerAction(m_postAction, "CodePaster.Post", globalcontext); + m_postEditorAction = new QAction(tr("Paste Snippet..."), this); + command = actionManager->registerAction(m_postEditorAction, "CodePaster.Post", globalcontext); command->setDefaultKeySequence(QKeySequence(tr("Alt+C,Alt+P"))); - connect(m_postAction, SIGNAL(triggered()), this, SLOT(post())); + connect(m_postEditorAction, SIGNAL(triggered()), this, SLOT(postEditor())); + cpContainer->addAction(command); + + m_postClipboardAction = new QAction(tr("Paste Clipboard..."), this); + command = actionManager->registerAction(m_postClipboardAction, "CodePaster.PostClipboard", globalcontext); + connect(m_postClipboardAction, SIGNAL(triggered()), this, SLOT(postClipboard())); cpContainer->addAction(command); m_fetchAction = new QAction(tr("Fetch Snippet..."), this); @@ -145,6 +153,28 @@ void CodepasterPlugin::shutdown() } } +void CodepasterPlugin::postEditor() +{ + const IEditor* editor = EditorManager::instance()->currentEditor(); + const BaseTextEditorEditable *textEditor = qobject_cast<const BaseTextEditorEditable *>(editor); + if (!textEditor) + return; + + QString data = textEditor->selectedText(); + if (data.isEmpty()) + data = textEditor->contents(); + if (!data.isEmpty()) + post(data, textEditor->editor()->mimeType()); +} + +void CodepasterPlugin::postClipboard() +{ + QString subtype = QLatin1String("plain"); + const QString text = qApp->clipboard()->text(subtype, QClipboard::Clipboard); + if (!text.isEmpty()) + post(text, QString()); +} + static inline void fixSpecialCharacters(QString &data) { QChar *uc = data.data(); @@ -167,18 +197,8 @@ static inline void fixSpecialCharacters(QString &data) } } -void CodepasterPlugin::post() +void CodepasterPlugin::post(QString data, const QString &mimeType) { - const IEditor* editor = EditorManager::instance()->currentEditor(); - const BaseTextEditorEditable *textEditor = qobject_cast<const BaseTextEditorEditable *>(editor); - if (!textEditor) - return; - - QString data = textEditor->selectedText(); - if (data.isEmpty()) - data = textEditor->contents(); - if (data.isEmpty()) - return; fixSpecialCharacters(data); FileDataList lst = splitDiffToFiles(data.toLatin1()); QString username = m_settings->username; @@ -199,7 +219,7 @@ void CodepasterPlugin::post() protocolName = view.protocol(); foreach(Protocol *protocol, m_protocols) { if (protocol->name() == protocolName) { - const Protocol::ContentType ct = Protocol::contentType(textEditor->editor()->mimeType()); + const Protocol::ContentType ct = Protocol::contentType(mimeType); protocol->paste(data, ct, username, comment, description); break; } diff --git a/src/plugins/cpaster/cpasterplugin.h b/src/plugins/cpaster/cpasterplugin.h index c07695c28aac44e255bee6e1936970c4bdccf7b7..6278cd1473ed9720dcaadb3c140876dfd447d4e5 100644 --- a/src/plugins/cpaster/cpasterplugin.h +++ b/src/plugins/cpaster/cpasterplugin.h @@ -58,7 +58,8 @@ public: virtual void shutdown(); public slots: - void post(); + void postEditor(); + void postClipboard(); void fetch(); void finishPost(const QString &link); void finishFetch(const QString &titleDescription, @@ -66,8 +67,11 @@ public slots: bool error); private: + void post(QString data, const QString &mimeType); + const QSharedPointer<Settings> m_settings; - QAction *m_postAction; + QAction *m_postEditorAction; + QAction *m_postClipboardAction; QAction *m_fetchAction; QList<Protocol*> m_protocols; QStringList m_fetchedSnippets; diff --git a/src/plugins/cpaster/pastebindotcaprotocol.cpp b/src/plugins/cpaster/pastebindotcaprotocol.cpp index c40276cd169c906475936927ba1134712746acb7..7984ee64c8a4afc8fcb3b43470d6d6bc0d8a0fa3 100644 --- a/src/plugins/cpaster/pastebindotcaprotocol.cpp +++ b/src/plugins/cpaster/pastebindotcaprotocol.cpp @@ -32,11 +32,13 @@ #include <QtNetwork/QNetworkReply> -using namespace Core; namespace CodePaster { -PasteBinDotCaProtocol::PasteBinDotCaProtocol() +PasteBinDotCaProtocol::PasteBinDotCaProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), + m_fetchReply(0), + m_postId(-1) { - connect(&http, SIGNAL(requestFinished(int,bool)), + connect(&m_http, SIGNAL(requestFinished(int,bool)), this, SLOT(postRequestFinished(int,bool))); } @@ -44,12 +46,9 @@ void PasteBinDotCaProtocol::fetch(const QString &id) { QString link = QLatin1String("http://pastebin.ca/raw/"); link.append(id); - QUrl url(link); - QNetworkRequest r(url); - - reply = manager.get(r); - connect(reply, SIGNAL(finished()), this, SLOT(fetchFinished())); - fetchId = id; + m_fetchReply = httpGet(link); + connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); + m_fetchId = id; } void PasteBinDotCaProtocol::paste(const QString &text, @@ -69,20 +68,20 @@ void PasteBinDotCaProtocol::paste(const QString &text, QHttpRequestHeader header("POST", "/quiet-paste.php"); header.setValue("host", "pastebin.ca" ); header.setContentType("application/x-www-form-urlencoded"); - http.setHost("pastebin.ca", QHttp::ConnectionModeHttp); + m_http.setHost("pastebin.ca", QHttp::ConnectionModeHttp); header.setValue("User-Agent", "CreatorPastebin"); - postId = http.request(header, data.toAscii()); + m_postId = m_http.request(header, data.toAscii()); } void PasteBinDotCaProtocol::postRequestFinished(int id, bool error) { QString link; - if (id == postId) { + if (id == m_postId) { if (!error) { - QByteArray data = http.readAll(); + QByteArray data = m_http.readAll(); link = QString::fromLatin1("http://pastebin.ca/") + QString(data).remove("SUCCESS:"); } else - link = http.errorString(); + link = m_http.errorString(); emit pasteDone(link); } } @@ -91,15 +90,15 @@ void PasteBinDotCaProtocol::fetchFinished() { QString title; QString content; - bool error = reply->error(); + bool error = m_fetchReply->error(); if (error) { - content = reply->errorString(); + content = m_fetchReply->errorString(); } else { - title = QString::fromLatin1("Pastebin.ca: %1").arg(fetchId); - content = reply->readAll(); + title = QString::fromLatin1("Pastebin.ca: %1").arg(m_fetchId); + content = m_fetchReply->readAll(); } - reply->deleteLater(); - reply = 0; + m_fetchReply->deleteLater(); + m_fetchReply = 0; emit fetchDone(title, content, error); } } // namespace CodePaster diff --git a/src/plugins/cpaster/pastebindotcaprotocol.h b/src/plugins/cpaster/pastebindotcaprotocol.h index b1d0c07bd0cf542d803b4845d2462b93c4d765cc..4cc766d4b016f665011523ce7fe7c3ebc80638d9 100644 --- a/src/plugins/cpaster/pastebindotcaprotocol.h +++ b/src/plugins/cpaster/pastebindotcaprotocol.h @@ -32,15 +32,14 @@ #include "protocol.h" -#include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QHttp> namespace CodePaster { -class PasteBinDotCaProtocol : public Protocol +class PasteBinDotCaProtocol : public NetworkProtocol { Q_OBJECT public: - PasteBinDotCaProtocol(); + explicit PasteBinDotCaProtocol(const NetworkAccessManagerProxyPtr &nw); QString name() const { return QLatin1String("Pastebin.Ca"); } bool hasSettings() const { return false; } @@ -58,12 +57,11 @@ public slots: void postRequestFinished(int id, bool error); private: - QNetworkAccessManager manager; - QNetworkReply *reply; - QString fetchId; + QNetworkReply *m_fetchReply; + QString m_fetchId; - QHttp http; - int postId; + QHttp m_http; + int m_postId; }; } // namespace CodePaster diff --git a/src/plugins/cpaster/pastebindotcomprotocol.cpp b/src/plugins/cpaster/pastebindotcomprotocol.cpp index 5e6f8498cb8be1d7eed43b451f14c95cbb9528c9..eb8d631f3f56def9c27492c09d55cf1fd76f49da 100644 --- a/src/plugins/cpaster/pastebindotcomprotocol.cpp +++ b/src/plugins/cpaster/pastebindotcomprotocol.cpp @@ -38,6 +38,7 @@ #include <QtCore/QTextStream> #include <QtCore/QXmlStreamReader> #include <QtCore/QXmlStreamAttributes> +#include <QtCore/QByteArray> #include <QtNetwork/QNetworkReply> @@ -47,7 +48,8 @@ static const char pastePhpScriptpC[] = "api_public.php"; static const char fetchPhpScriptpC[] = "raw.php"; namespace CodePaster { -PasteBinDotComProtocol::PasteBinDotComProtocol() : +PasteBinDotComProtocol::PasteBinDotComProtocol(const NetworkAccessManagerProxyPtr &nw) : + NetworkProtocol(nw), m_settings(new PasteBinDotComSettings), m_fetchReply(0), m_pasteReply(0), @@ -105,31 +107,29 @@ void PasteBinDotComProtocol::paste(const QString &text, QTC_ASSERT(!m_pasteReply, return;) // Format body - m_pasteData = format(ct); - if (!m_pasteData.isEmpty()) - m_pasteData.append('&'); - m_pasteData += "paste_name="; - m_pasteData += QUrl::toPercentEncoding(username); + QByteArray pasteData = format(ct); + if (!pasteData.isEmpty()) + pasteData.append('&'); + pasteData += "paste_name="; + pasteData += QUrl::toPercentEncoding(username); const QString subDomain = m_settings->hostPrefix(); if (!subDomain.isEmpty()) { - m_pasteData += "&paste_subdomain="; - m_pasteData += QUrl::toPercentEncoding(subDomain); + pasteData += "&paste_subdomain="; + pasteData += QUrl::toPercentEncoding(subDomain); } - m_pasteData += "&paste_code="; - m_pasteData += QUrl::toPercentEncoding(fixNewLines(text)); + pasteData += "&paste_code="; + pasteData += QUrl::toPercentEncoding(fixNewLines(text)); // fire request QString link; QTextStream(&link) << "http://" << hostName(false) << '/' << pastePhpScriptpC; - QUrl url(link); - QNetworkRequest r(url); - m_pasteReply = m_manager.post(r, m_pasteData); + m_pasteReply = httpPost(link, pasteData); connect(m_pasteReply, SIGNAL(finished()), this, SLOT(pasteFinished())); if (debug) - qDebug() << "paste: sending " << m_pasteReply << link << m_pasteData; + qDebug() << "paste: sending " << m_pasteReply << link << pasteData; } void PasteBinDotComProtocol::pasteFinished() @@ -164,10 +164,8 @@ void PasteBinDotComProtocol::fetch(const QString &id) if (debug) qDebug() << "fetch: sending " << link; - QUrl url(link); - QNetworkRequest r(url); - m_fetchReply = m_manager.get(r); + m_fetchReply = httpGet(link); connect(m_fetchReply, SIGNAL(finished()), this, SLOT(fetchFinished())); m_fetchId = id; } @@ -212,9 +210,7 @@ void PasteBinDotComProtocol::list() QTC_ASSERT(!m_listReply, return;) // fire request - QUrl url(QLatin1String("http://") + hostName(true)); - QNetworkRequest r(url); - m_listReply = m_manager.get(r); + m_listReply = httpGet(QLatin1String("http://") + hostName(true)); connect(m_listReply, SIGNAL(finished()), this, SLOT(listFinished())); if (debug) qDebug() << "list: sending " << m_listReply; diff --git a/src/plugins/cpaster/pastebindotcomprotocol.h b/src/plugins/cpaster/pastebindotcomprotocol.h index a7e2d30513726546294c22aac0fbf487527fd0f3..612fff7ac02f2dc6f0676f427850c510f3204dcc 100644 --- a/src/plugins/cpaster/pastebindotcomprotocol.h +++ b/src/plugins/cpaster/pastebindotcomprotocol.h @@ -32,19 +32,14 @@ #include "protocol.h" -#include <QtNetwork/QNetworkAccessManager> -#include <QtNetwork/QHttp> - -#include <QtCore/QByteArray> - namespace CodePaster { class PasteBinDotComSettings; -class PasteBinDotComProtocol : public Protocol +class PasteBinDotComProtocol : public NetworkProtocol { Q_OBJECT public: - PasteBinDotComProtocol(); + explicit PasteBinDotComProtocol(const NetworkAccessManagerProxyPtr &nw); QString name() const { return QLatin1String("Pastebin.Com"); } @@ -69,11 +64,9 @@ private: QString hostName(bool withSubDomain) const; PasteBinDotComSettings *m_settings; - QNetworkAccessManager m_manager; QNetworkReply *m_fetchReply; QNetworkReply *m_pasteReply; QNetworkReply *m_listReply; - QByteArray m_pasteData; QString m_fetchId; int m_postId; diff --git a/src/plugins/cpaster/protocol.cpp b/src/plugins/cpaster/protocol.cpp index be649f06775cded8a9655a1917ed7178ce477995..0f6e58a7e911ea0de2ef5a919194e0dc50a35641 100644 --- a/src/plugins/cpaster/protocol.cpp +++ b/src/plugins/cpaster/protocol.cpp @@ -31,6 +31,11 @@ #include <cpptools/cpptoolsconstants.h> #include <qmljseditor/qmljseditorconstants.h> +#include <QtNetwork/QNetworkAccessManager> +#include <QtNetwork/QNetworkRequest> + +#include <QtCore/QUrl> + namespace CodePaster { Protocol::Protocol() @@ -108,4 +113,46 @@ QString Protocol::textFromHtml(QString data) data.replace(QLatin1String("&"), QString(QLatin1Char('&'))); return data; } + +// ------------ NetworkAccessManagerProxy +NetworkAccessManagerProxy::NetworkAccessManagerProxy() +{ +} + +NetworkAccessManagerProxy::~NetworkAccessManagerProxy() +{ +} + +QNetworkReply *NetworkAccessManagerProxy::httpGet(const QString &link) +{ + QUrl url(link); + QNetworkRequest r(url); + return networkAccessManager()->get(r); +} + +QNetworkReply *NetworkAccessManagerProxy::httpPost(const QString &link, const QByteArray &data) +{ + QUrl url(link); + QNetworkRequest r(url); + return networkAccessManager()->post(r, data); +} + +QNetworkAccessManager *NetworkAccessManagerProxy::networkAccessManager() +{ + if (m_networkAccessManager.isNull()) + m_networkAccessManager.reset(new QNetworkAccessManager); + return m_networkAccessManager.data(); +} + +// --------- NetworkProtocol + +NetworkProtocol::NetworkProtocol(const NetworkAccessManagerProxyPtr &nw) : + m_networkAccessManager(nw) +{ +} + +NetworkProtocol::~NetworkProtocol() +{ +} + } //namespace CodePaster diff --git a/src/plugins/cpaster/protocol.h b/src/plugins/cpaster/protocol.h index 914a5748a4e58639c23d84bea87e4ff6ddd3d227..6ee95f9fdd61204b00b42e0df73b38b8d12e8289 100644 --- a/src/plugins/cpaster/protocol.h +++ b/src/plugins/cpaster/protocol.h @@ -31,6 +31,13 @@ #define PROTOCOL_H #include <QtCore/QObject> +#include <QtCore/QScopedPointer> +#include <QtCore/QSharedPointer> + +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; +QT_END_NAMESPACE namespace Core { class IOptionsPage; @@ -50,7 +57,7 @@ public: PostCommentCapability = 0x2, PostDescriptionCapability = 0x4 }; - Protocol(); + virtual ~Protocol(); virtual QString name() const = 0; @@ -82,9 +89,54 @@ signals: void listDone(const QString &name, const QStringList &result); protected: + Protocol(); static QString textFromHtml(QString data); static QString fixNewLines(QString in); +}; + +/* Proxy for NetworkAccessManager that can be shared with + * delayed initialization and conveniences + * for HTTP-requests. */ + +class NetworkAccessManagerProxy { + Q_DISABLE_COPY(NetworkAccessManagerProxy) +public: + NetworkAccessManagerProxy(); + ~NetworkAccessManagerProxy(); + + QNetworkReply *httpGet(const QString &url); + QNetworkReply *httpPost(const QString &link, const QByteArray &data); + QNetworkAccessManager *networkAccessManager(); + +private: + QScopedPointer<QNetworkAccessManager> m_networkAccessManager; +}; + +/* Network-based protocol: Provides access with delayed + * initialization to a QNetworkAccessManager and conveniences + * for HTTP-requests. */ + +class NetworkProtocol : public Protocol { + Q_OBJECT +public: + virtual ~NetworkProtocol(); + +protected: + typedef QSharedPointer<NetworkAccessManagerProxy> NetworkAccessManagerProxyPtr; + + explicit NetworkProtocol(const NetworkAccessManagerProxyPtr &nw); + + inline QNetworkReply *httpGet(const QString &url) + { return m_networkAccessManager->httpGet(url); } + + inline QNetworkReply *httpPost(const QString &link, const QByteArray &data) + { return m_networkAccessManager->httpPost(link, data); } + + inline QNetworkAccessManager *networkAccessManager() + { return m_networkAccessManager->networkAccessManager(); } +private: + const NetworkAccessManagerProxyPtr m_networkAccessManager; }; } //namespace CodePaster