[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/network/choqok
From:       Mehrdad Momeny <mehrdad.momeny () gmail ! com>
Date:       2010-01-18 21:27:08
Message-ID: 1263850028.025896.5778.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1076779 by momeny:

Attach a file to StatusNet (Identi.ca) posts implemented in its microblog plugin!
Note: This feature is available in StatusNet 0.9.x and I hope later :D

 M  +41 -21    libchoqok/ui/composerwidget.cpp  
 M  +11 -1     libchoqok/ui/composerwidget.h  
 M  +1 -0      microblogs/laconica/CMakeLists.txt  
 A             microblogs/laconica/laconicacomposerwidget.cpp   [License: GPL (v2/3)]
 A             microblogs/laconica/laconicacomposerwidget.h   [License: GPL (v2/3)]
 M  +83 -1     microblogs/laconica/laconicamicroblog.cpp  
 M  +2 -0      microblogs/laconica/laconicamicroblog.h  


--- trunk/extragear/network/choqok/libchoqok/ui/composerwidget.cpp #1076778:1076779
@@ -38,20 +38,21 @@
 {
 public:
     Private( Account *account, TextEdit *editW = 0 )
-    :editor(editW), currentAccount(account),btnAbort(0), postToSubmit(0)
+    :editor(editW), currentAccount(account), postToSubmit(0)
     {}
     TextEdit *editor;
     Account *currentAccount;
-    QString replyToId;
-    QPointer<KPushButton> btnAbort;
     Choqok::Post *postToSubmit;
+    QHBoxLayout *editorLayout;
 };
 
 ComposerWidget::ComposerWidget(Choqok::Account* account, QWidget* parent /*= 0*/)
-: QWidget(parent), d(new Private(account, new \
TextEdit(account->microblog()->postCharLimit(), this))) +: QWidget(parent), \
btnAbort(0), d(new Private(account, new \
TextEdit(account->microblog()->postCharLimit(), this)))  {
     QVBoxLayout *layout = new QVBoxLayout(this);
-    layout->addWidget(d->editor);
+    d->editorLayout = new QHBoxLayout;
+    d->editorLayout->addWidget(d->editor);
+    layout->addLayout(d->editorLayout);
     connect(d->editor, SIGNAL(returnPressed(QString)), SLOT(submitPost(QString)));
     connect(d->editor, SIGNAL(textChanged()), SLOT(editorTextChanged()));
     connect(d->editor, SIGNAL(cleared()), SLOT(editorCleared()));
@@ -63,15 +64,16 @@
     delete d;
 }
 
-void ComposerWidget::setText(const QString& text, const QString& replyToId)
+void ComposerWidget::setText(const QString& text, const QString& replyTo)
 {
     d->editor->prependText(text);
-    d->replyToId = replyToId;
+    replyToId = replyTo;
     d->editor->setFocus(Qt::OtherFocusReason);
 }
 
 void ComposerWidget::submitPost( const QString &txt )
 {
+    kDebug();
     editor()->setEnabled(false);
     QString text = txt;
     if( currentAccount()->microblog()->postCharLimit() &&
@@ -80,8 +82,8 @@
     delete d->postToSubmit;
     d->postToSubmit = new Choqok::Post;
     d->postToSubmit->content = text;
-    if( !d->replyToId.isEmpty() ) {
-        d->postToSubmit->replyToPostId = d->replyToId;
+    if( !replyToId.isEmpty() ) {
+        d->postToSubmit->replyToPostId = replyToId;
     }
     connect(d->currentAccount->microblog(), \
SIGNAL(postCreated(Choqok::Account*,Choqok::Post*)),  \
SLOT(slotPostSubmited(Choqok::Account*,Choqok::Post*)) ); @@ -89,14 +91,15 @@
             SIGNAL(errorPost(Choqok::Account*,Choqok::Post*,Choqok::MicroBlog::ErrorType,
  QString,Choqok::MicroBlog::ErrorLevel)),
             SLOT(slotErrorPost(Choqok::Account*,Choqok::Post*)));
-    d->btnAbort = new KPushButton(KIcon("dialog-cancel"), i18n("Abort"), this);
-    layout()->addWidget(d->btnAbort);
-    connect( d->btnAbort, SIGNAL(clicked(bool)), SLOT(abort()) );
+    btnAbort = new KPushButton(KIcon("dialog-cancel"), i18n("Abort"), this);
+    layout()->addWidget(btnAbort);
+    connect( btnAbort, SIGNAL(clicked(bool)), SLOT(abort()) );
     currentAccount()->microblog()->createPost( currentAccount(),d->postToSubmit);
 }
 
 void ComposerWidget::slotPostSubmited(Choqok::Account* theAccount, Choqok::Post* \
post)  {
+    kDebug();
     if( currentAccount() == theAccount && post == d->postToSubmit ) {
         kDebug()<<"Accepted";
         disconnect(d->currentAccount->microblog(), \
SIGNAL(postCreated(Choqok::Account*,Choqok::Post*)), @@ -105,12 +108,12 @@
                     \
SIGNAL(errorPost(Choqok::Account*,Choqok::Post*,Choqok::MicroBlog::ErrorType,  \
                QString,Choqok::MicroBlog::ErrorLevel)),
                     this, SLOT(slotErrorPost(Choqok::Account*,Choqok::Post*)));
-        if(d->btnAbort){
-            d->btnAbort->deleteLater();
+        if(btnAbort){
+            btnAbort->deleteLater();
         }
         NotifyManager::success(i18n("New post submitted successfully"));
         d->editor->clear();
-        d->replyToId.clear();
+        replyToId.clear();
         d->editor->setEnabled(true);
         delete d->postToSubmit;
         d->postToSubmit = 0L;
@@ -120,6 +123,7 @@
 
 void ComposerWidget::slotErrorPost(Account* theAccount, Post* post)
 {
+    kDebug();
     if(theAccount == d->currentAccount && post == d->postToSubmit) {
         kDebug();
         disconnect(d->currentAccount->microblog(), \
SIGNAL(postCreated(Choqok::Account*,Choqok::Post*)), @@ -128,10 +132,10 @@
                    SIGNAL(errorPost(Choqok::Account*,Choqok::Post*,Choqok::MicroBlog::ErrorType,
  QString,Choqok::MicroBlog::ErrorLevel)),
                    this, SLOT(slotErrorPost(Choqok::Account*,Choqok::Post*)));
-        if(d->btnAbort){
-            d->btnAbort->deleteLater();
+        if(btnAbort){
+            btnAbort->deleteLater();
         }
-        editor()->setEnabled(true);
+        editorLayout()->setEnabled(true);
         editor()->setFocus();
     }
 }
@@ -149,6 +153,22 @@
     return d->editor;
 }
 
+QHBoxLayout* ComposerWidget::editorLayout()
+{
+    return d->editorLayout;
+}
+
+Post* ComposerWidget::postToSubmit()
+{
+    return d->postToSubmit;
+}
+
+void ComposerWidget::setPostToSubmit(Post* post)
+{
+    delete d->postToSubmit;
+    d->postToSubmit = post;
+}
+
 Account* ComposerWidget::currentAccount()
 {
     return d->currentAccount;
@@ -156,13 +176,13 @@
 
 void ComposerWidget::editorCleared()
 {
-    d->replyToId.clear();
+    replyToId.clear();
 }
 
 void ComposerWidget::abort()
 {
-    if(d->btnAbort){
-        d->btnAbort->deleteLater();
+    if(btnAbort){
+        btnAbort->deleteLater();
     }
     editor()->setEnabled(true);
     currentAccount()->microblog()->abortCreatePost(currentAccount(), \
                d->postToSubmit);
--- trunk/extragear/network/choqok/libchoqok/ui/composerwidget.h #1076778:1076779
@@ -26,7 +26,10 @@
 #include <QWidget>
 #include "choqok_export.h"
 #include <choqoktypes.h>
+#include <KPushButton>
+#include <QPointer>
 
+class QHBoxLayout;
 namespace Choqok {
 class Account;
 
@@ -51,13 +54,20 @@
 protected slots:
     virtual void submitPost( const QString &text );
     virtual void slotPostSubmited(Choqok::Account *theAccount, Choqok::Post* post);
-    void slotErrorPost(Choqok::Account* theAccount,Choqok::Post* post);
+    virtual void slotErrorPost(Choqok::Account* theAccount,Choqok::Post* post);
     virtual void editorTextChanged();
     virtual void editorCleared();
 
 protected:
     Account *currentAccount();
+    QHBoxLayout *editorLayout();
+    Choqok::Post *postToSubmit();
+    void setPostToSubmit( Choqok::Post *post );
 
+
+    QString replyToId;
+    QPointer<KPushButton> btnAbort;
+
 private:
     class Private;
     Private *d;
--- trunk/extragear/network/choqok/microblogs/laconica/CMakeLists.txt \
#1076778:1076779 @@ -10,6 +10,7 @@
 laconicasearch.cpp
 laconicaeditaccount.cpp
 laconicapostwidget.cpp
+laconicacomposerwidget.cpp
 )
 
 kde4_add_ui_files(choqok_laconica_SRCS laconicaeditaccount_base.ui )
--- trunk/extragear/network/choqok/microblogs/laconica/laconicamicroblog.cpp \
#1076778:1076779 @@ -43,6 +43,10 @@
 #include "laconicapostwidget.h"
 #include <twitterapihelper/twitterapimicroblogwidget.h>
 #include "laconicasearch.h"
+#include <kio/netaccess.h>
+#include <KMessageBox>
+#include <kmimetype.h>
+#include "laconicacomposerwidget.h"
 
 K_PLUGIN_FACTORY( MyPluginFactory, registerPlugin < LaconicaMicroBlog > (); )
 K_EXPORT_PLUGIN( MyPluginFactory( "choqok_laconica" ) )
@@ -101,7 +105,7 @@
 
 Choqok::UI::ComposerWidget* LaconicaMicroBlog::createComposerWidget(Choqok::Account* \
account, QWidget* parent)  {
-    return new Choqok::UI::ComposerWidget(account, parent);
+    return new LaconicaComposerWidget(account, parent);
 }
 
 QString LaconicaMicroBlog::profileUrl( Choqok::Account *account, const QString \
&username) const @@ -133,4 +137,82 @@
     return mSearchBackend;
 }
 
+void LaconicaMicroBlog::createPostWithAttachment(Choqok::Account* theAccount, \
Choqok::Post* post, +                                   const QString& \
mediumToAttach) +{
+    if( mediumToAttach.isEmpty() ){
+        TwitterApiMicroBlog::createPost(theAccount, post);
+    } else {
+        QByteArray picData;
+        QString tmp;
+        KUrl picUrl(mediumToAttach);
+        KIO::TransferJob *picJob = KIO::get( picUrl, KIO::Reload, \
KIO::HideProgressInfo); +        if( !KIO::NetAccess::synchronousRun(picJob, 0, \
&picData) ){ +            kError()<<"Job error: " << picJob->errorString();
+            KMessageBox::detailedError(Choqok::UI::Global::mainWindow(),
+                                       i18n( "Uploading medium failed: cannot read \
the medium file." ), +            picJob->errorString() );
+            return;
+        }
+        if ( picData.count() == 0 ) {
+            kError() << "Cannot read the media file, please check if it exists.";
+            KMessageBox::error( Choqok::UI::Global::mainWindow(),
+                                i18n( "Uploading medium failed: cannot read the \
medium file." ) ); +            return;
+        }
+        ///Documentation: http://identi.ca/notice/17779990
+        KUrl url = apiUrl( qobject_cast<TwitterApiAccount*>(theAccount) );
+        url.addPath ( "/statuses/update.xml" );
+        QByteArray newLine("\r\n");
+        QString formHeader( newLine + "Content-Disposition: form-data; name=\"%1\"" \
); +        QByteArray header(newLine + "--AaB03x");
+        QByteArray footer(newLine + "--AaB03x--");
+        QByteArray fileContentType = KMimeType::findByUrl( picUrl, 0, true \
)->name().toUtf8(); +        QByteArray fileHeader(newLine + "Content-Disposition: \
file; name=\"media\"; filename=\"" + +        picUrl.fileName().toUtf8()+"\"");
+
+        QByteArray data;
+//         if ( !post->replyToPostId.isEmpty() && post->content.indexOf ( '@' ) > -1 \
) { +//             data += "&in_reply_to_status_id=";
+//             data += post->replyToPostId.toLocal8Bit();
+//         }
+//         data += "&source=choqok";
+
+        data.append(header);
+        data.append(fileHeader);
+        data.append(newLine + "Content-Type: " + fileContentType);
+        data.append(newLine);
+        data.append(newLine + picData);
+
+        data.append(header);
+        data.append(formHeader.arg("status").toLatin1());
+        data.append(newLine);
+        data.append(newLine + post->content.toUtf8() );
+
+        data.append(header);
+        data.append(formHeader.arg("in_reply_to_status_id").toLatin1());
+        data.append(newLine);
+        data.append(newLine + post->replyToPostId.toLatin1());
+
+        data.append(header);
+        data.append(formHeader.arg("source").toLatin1());
+        data.append(newLine);
+        data.append(newLine + "choqok");
+
+        data.append(footer);
+
+        KIO::StoredTransferJob *job = KIO::storedHttpPost(data, url, \
KIO::HideProgressInfo) ; +        if ( !job ) {
+            kError() << "Cannot create a http POST request!";
+            return;
+        }
+        job->addMetaData( "content-type", "Content-Type: multipart/form-data; \
boundary=AaB03x" ); +        mCreatePostMap[ job ] = post;
+        mJobsAccount[job] = theAccount;
+        connect( job, SIGNAL( result( KJob* ) ),
+                 SLOT( slotCreatePost(KJob*) ) );
+        job->start();
+    }
+}
+
 #include "laconicamicroblog.moc"
--- trunk/extragear/network/choqok/microblogs/laconica/laconicamicroblog.h \
#1076778:1076779 @@ -59,6 +59,8 @@
 
     virtual TwitterApiSearch* searchBackend();
 
+    virtual void createPostWithAttachment(Choqok::Account* theAccount, Choqok::Post* \
post, +                            const QString &mediumToAttach = QString());
 private:
     QPointer<LaconicaSearch> mSearchBackend;
 };


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic