--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--