[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