--Boundary-00=_w/LqIdYfrS7uUmq
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Hello KDE!
I've created a patch for KSnapshot, adding a "Upload to Imageshack"-button.
Its my first patch for KDE, so I have no idea how this is usually handled...
greetings,
Benjamin Adler
--Boundary-00=_w/LqIdYfrS7uUmq
Content-Type: text/x-diff;
charset="us-ascii";
name="ksnapshot_upload_to_imageshack.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="ksnapshot_upload_to_imageshack.diff"
Index: ksnapshotwidget.ui
===================================================================
--- ksnapshotwidget.ui (Revision 848441)
+++ ksnapshotwidget.ui (Arbeitskopie)
@@ -219,6 +219,13 @@
+ -
+
+
+ Upload to imageshack
+
+
+
Index: ksnapshot.cpp
===================================================================
--- ksnapshot.cpp (Revision 848441)
+++ ksnapshot.cpp (Arbeitskopie)
@@ -70,12 +70,12 @@
btnSave->setIcon(KIcon("document-save"));
btnOpen->setIcon(KIcon("document-open"));
btnCopy->setIcon(KIcon("edit-copy"));
-
+ btnUpload->setIcon(KIcon("document-open-remote"));
}
};
KSnapshot::KSnapshot(QWidget *parent, KSnapshotObject::CaptureMode mode )
- : KDialog(parent), KSnapshotObject(), modified(false)
+ : KDialog(parent), KSnapshotObject(), http(0), modified(false)
{
setCaption( "" );
setModal( true );
@@ -99,6 +99,7 @@
connect( mainWidget->btnNew, SIGNAL( clicked() ), SLOT( slotGrab() ) );
connect( mainWidget->btnSave, SIGNAL( clicked() ), SLOT( slotSaveAs() ) );
connect( mainWidget->btnCopy, SIGNAL( clicked() ), SLOT( slotCopy() ) );
+ connect( mainWidget->btnUpload, SIGNAL( clicked() ), SLOT( slotUploadToImageshack() ) );
// connect( mainWidget->btnOpen, SIGNAL( clicked() ), SLOT( slotOpen() ) );
connect( mainWidget->comboMode, SIGNAL( activated(int) ), SLOT( slotModeChanged(int) ) );
@@ -206,6 +207,8 @@
KSnapshot::~KSnapshot()
{
delete mainWidget;
+ delete progressDialog;
+ delete http;
}
void KSnapshot::resizeEvent( QResizeEvent * )
@@ -298,6 +301,163 @@
KRun::run(application, list, this);
}
+void KSnapshot::slotUploadToImageshack()
+{
+ if(KMessageBox::Yes != KMessageBox::questionYesNo(this,
+ i18n("Are you sure you want to upload this image to imageshack?"),
+ i18n("Upload to imageshack"),
+ KStandardGuiItem::yes(),
+ KStandardGuiItem::no(),
+ "doNotConfirmUploading")
+ )
+ return;
+
+ if(!http)
+ {
+ progressDialog = new KProgressDialog(this, i18n("Uploading to imageshack"), i18n("Please wait while the image is being uploaded to imageshack."));
+ progressDialog->setAutoClose(false);
+ progressDialog->setMinimumDuration(0);
+ http = new QHttp(this);
+ connect(http, SIGNAL(requestFinished(int, bool)), SLOT(slotUploadFinished(int, bool)));
+ connect(http, SIGNAL(dataSendProgress (int, int)), SLOT(slotUploadProgress(int, int)));
+// connect(http, SIGNAL(stateChanged (int)), SLOT(slotHttpStateChanged(int)));
+ connect(progressDialog, SIGNAL(cancelClicked()), SLOT(slotCancelUpload()));
+ }
+
+ progressDialog->setLabelText(i18n("Please wait while the image is being uploaded to imageshack."));
+
+ QByteArray image;
+ QBuffer buffer(&image);
+ buffer.open(QIODevice::WriteOnly);
+ snapshot.save(&buffer, "PNG");
+ buffer.close();
+
+ const QString host("www.imageshack.us");
+ QHttpRequestHeader header("POST", "/index.php");
+ header.setValue("Host", host);
+ header.setValue("User-Agent", "KSnapshot from KDE");
+ header.setValue("Accept-Charset", "ISO-8859-1,utf-8");
+ header.setContentLength(1234); // We somehow NEED a dummy value here, it won't work without it!
+ header.setValue("Content-Type", "multipart/form-data; boundary=---------------------------123456789012345\r\n");
+
+ QByteArray bytes;
+ bytes.append("-----------------------------123456789012345\r\n");
+ bytes.append("Content-Disposition: form-data; name=\"xml\"\r\n\r\nyes\r\n");
+ bytes.append("-----------------------------123456789012345\r\n");
+ bytes.append("Content-Disposition: form-data; name=\"fileupload\"; filename=\"snapshot.png\"\r\n");
+ bytes.append("Content-Type: image/png\r\n\r\n");
+ bytes.append(image);
+ bytes.append("\r\n-----------------------------123456789012345--\r\n\r\n");
+
+ http->setHost(host, QHttp::ConnectionModeHttp, 80);
+ http->request(header, bytes);
+
+ progressDialog->exec();
+}
+
+void KSnapshot::slotUploadProgress(int done, int total)
+{
+// qDebug() << "KSnapshot::slotUploadProgress()" << done << total;
+ progressDialog->progressBar()->setRange(0, total);
+ progressDialog->progressBar()->setValue(done);
+
+ if(done == total)
+ progressDialog->setLabelText(i18n("Upload complete, waiting for reply..."));
+}
+
+void KSnapshot::slotCancelUpload()
+{
+// qDebug() << "KSnapshot::slotCancelUpload()";
+ http->abort();
+ slotUploadProgress(0,1);
+}
+
+void KSnapshot::slotUploadFinished(int /*id*/, bool error)
+{
+
+// qDebug() << "KSnapshot::slotUploadFinished()";
+
+ // If the user pressed cancel while uploading, we called http->abort() which emits a
+ // requestFinished()-signal with error=true; Catch this condition here.
+ if(http->error() == QHttp::Aborted)
+ return;
+
+ QHttpRequestHeader header = http->currentRequest();
+
+ if(http->error() != QHttp::NoError || error)
+ {
+ KMessageBox::error(this, i18n("KSnapshot was unable to upload the image:\n\n%1", http->errorString()), i18n("Unable to Upload Image"));
+ // flush uninteresting data.
+ http->readAll();
+ return;
+ }
+
+ if(header.path().endsWith("/index.php"))
+ {
+ // reset the progressbar
+ slotUploadProgress(0,1);
+ progressDialog->accept();
+ QByteArray xml = http->readAll();
+
+ QDomDocument doc;
+ QString errorMessage;
+ int line, column;
+ if(!doc.setContent(xml, &errorMessage, &line, &column))
+ {
+ KMessageBox::error(this, i18n("KSnapshot was unable to upload the image, because Imageshack answered with invalid XML:\n\n%1\n\nxml was:\n%2", errorMessage, QString(xml)), i18n("Unable to Upload Image"));
+ //qDebug() << "KSnapshot::slotUploadFinished(): The XML obtained from the server is invalid: " << errorMessage << ", line" << QString::number(line) << ":" << QString::number(column) << "\n\n" << doc.toString(2) << "\nraw:" << xml;
+ return;
+ }
+
+ if(doc.documentElement().tagName() != "links")
+ {
+ KMessageBox::error(this, i18n("KSnapshot was unable to upload the image: Imageshack answered with invalid XML:\n\n%1", QString(xml)), i18n("Unable to Upload Image"));
+ return;
+ }
+
+ const QDomNodeList list = doc.documentElement().childNodes();
+
+ for(int i=0; i < list.size(); i++)
+ {
+ QDomNode currentNode = list.at(i);
+ if(currentNode.isElement())
+ {
+ if(currentNode.toElement().tagName() == "ad_link")
+ {
+ //qDebug() << "opening webpage:" << currentNode.toElement().text();
+ KRun::runUrl(KUrl(currentNode.toElement().text()), "text/html", this, false, false, QString(), "");
+ return;
+ }
+ }
+ }
+ }
+}
+
+void KSnapshot::slotHttpStateChanged(int state)
+{
+ switch(state)
+ {
+ case QHttp::Unconnected:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Unconnected";
+ break;
+ case QHttp::Connecting:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Connecting";
+ break;
+ case QHttp::Sending:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Sending";
+ break;
+ case QHttp::Reading:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Reading";
+ break;
+ case QHttp::Connected:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Connected";
+ break;
+ case QHttp::Closing:
+ qDebug() << "KSnapshot::slotHttpStateChanged(): QHttp::Closing";
+ break;
+ }
+}
+
void KSnapshot::slotOpen(QAction* action)
{
KSnapshotServiceAction* serviceAction =
Index: ksnapshot.h
===================================================================
--- ksnapshot.h (Revision 848441)
+++ ksnapshot.h (Arbeitskopie)
@@ -28,6 +28,9 @@
#include
#include
#include
+#include
+#include
+#include
#include
#include
#include
@@ -36,6 +39,7 @@
#include
#include
+#include
#include
#include
#include "ksnapshotobject.h"
@@ -153,6 +157,7 @@
void slotSaveAs();
void slotCopy();
void slotOpen(const QString& application);
+ void slotUploadToImageshack();
void slotMovePointer( int x, int y );
void setTime( int newTime );
void setURL( const QString &newURL );
@@ -180,6 +185,10 @@
void setDelay( int i );
void setIncludeDecorations( bool b );
void setMode( int mode );
+ void slotUploadFinished(int id, bool error);
+ void slotUploadProgress(int done, int total);
+ void slotHttpStateChanged(int state);
+ void slotCancelUpload();
int delay() const;
bool includeDecorations() const;
int mode() const;
@@ -198,6 +207,8 @@
QTimer updateTimer;
QMenu* openMenu;
KSnapshotWidget *mainWidget;
+ QHttp* http;
+ KProgressDialog* progressDialog;
bool modified;
};
--Boundary-00=_w/LqIdYfrS7uUmq
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
--Boundary-00=_w/LqIdYfrS7uUmq--