• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

KBlog Client Library

wordpressbuggy.cpp

00001 /*
00002   This file is part of the kblog library.
00003 
00004   Copyright (c) 2006-2007 Christian Weilbach <christian_weilbach@web.de>
00005 
00006   This library is free software; you can redistribute it and/or
00007   modify it under the terms of the GNU Library General Public
00008   License as published by the Free Software Foundation; either
00009   version 2 of the License, or (at your option) any later version.
00010 
00011   This library is distributed in the hope that it will be useful,
00012   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014   Library General Public License for more details.
00015 
00016   You should have received a copy of the GNU Library General Public License
00017   along with this library; see the file COPYING.LIB.  If not, write to
00018   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019   Boston, MA 02110-1301, USA.
00020 */
00021 
00022 #include "wordpressbuggy.h"
00023 #include "wordpressbuggy_p.h"
00024 
00025 #include "blogpost.h"
00026 
00027 #include <KDebug>
00028 #include <KLocale>
00029 #include <KDateTime>
00030 
00031 #include <kio/http.h>
00032 #include <kio/job.h>
00033 
00034 #include <QtCore/QStringList>
00035 
00036 using namespace KBlog;
00037 
00038 WordpressBuggy::WordpressBuggy( const KUrl &server, QObject *parent )
00039   : MovableType( server, *new WordpressBuggyPrivate, parent )
00040 {
00041   kDebug() << "WordpressBuggy()";
00042 }
00043 
00044 WordpressBuggy::WordpressBuggy( const KUrl &server, WordpressBuggyPrivate &dd,
00045                                 QObject *parent )
00046   : MovableType( server, dd, parent )
00047 {
00048   kDebug() << "WordpressBuggy()";
00049 }
00050 
00051 WordpressBuggy::~WordpressBuggy()
00052 {
00053   kDebug() << "~WordpressBuggy()";
00054 }
00055 
00056 void WordpressBuggy::createPost( KBlog::BlogPost *post )
00057 {
00058   kDebug() << "createPost()";
00059   Q_D( WordpressBuggy );
00060   if ( !post ) {
00061     kError() << "WordpressBuggy::createPost: post is a null pointer";
00062     emit error ( Other, i18n( "Post is a null pointer." ) );
00063     return;
00064   }
00065   kDebug() << "Creating new Post with blogId" << blogId();
00066 
00067   QString xmlMarkup = "<?xml version=\"1.0\"?>";
00068   xmlMarkup += "<methodCall>";
00069   xmlMarkup += "<methodName>metaWeblog.newPost</methodName>";
00070   xmlMarkup += "<params><param>";
00071   xmlMarkup += "<value><string><![CDATA["+blogId()+"]]></string></value>";
00072   xmlMarkup += "</param>";
00073   xmlMarkup += "<param>";
00074   xmlMarkup += "<value><string><![CDATA["+username()+"]]></string></value>";
00075   xmlMarkup += "</param><param>";
00076   xmlMarkup += "<value><string><![CDATA["+password()+"]]></string></value>";
00077   xmlMarkup += "</param>";
00078   xmlMarkup += "<param><struct>";
00079   xmlMarkup += "<member><name>description</name>";
00080   xmlMarkup += "<value><string><![CDATA["+post->content()+"]]></string></value>";
00081   xmlMarkup += "</member><member>";
00082   xmlMarkup += "<name>title</name>";
00083   xmlMarkup += "<value><string><![CDATA["+post->title()+"]]></string></value>";
00084   xmlMarkup += "</member><member>";
00085 
00086   QList<QString> catList = post->categories();
00087   if ( !catList.empty() ){
00088     xmlMarkup += "<name>categories</name>";
00089     xmlMarkup += "<value><array>";
00090     QList<QString>::ConstIterator it = catList.constBegin();
00091     QList<QString>::ConstIterator end = catList.constEnd();
00092     for ( ; it != end; ++it ){
00093       xmlMarkup += "<data><string><![CDATA[" + ( *it ) + "]]></string></data>";
00094     }
00095     xmlMarkup += "</array></value>";
00096     xmlMarkup += "</member><member>";
00097   }
00098 
00099   xmlMarkup += "<name>dateCreated</name>";
00100   xmlMarkup += "<value><dateTime.iso8601>" +
00101                post->creationDateTime().toUtc().dateTime().toString( "yyyyMMddThh:mm:ss" ) +
00102                "</dateTime.iso8601></value>";
00103   xmlMarkup += "</member><member>";
00104   xmlMarkup += "<name>mt_allow_comments</name>";
00105   xmlMarkup += QString( "<value><int>%1</int></value>" ).arg( (int)post->isCommentAllowed() );
00106   xmlMarkup += "</member><member>";
00107   xmlMarkup += "<name>mt_allow_pings</name>";
00108   xmlMarkup += QString( "<value><int>%1</int></value>" ).arg( (int)post->isTrackBackAllowed() );
00109   xmlMarkup += "</member><member>";
00110   xmlMarkup += "<name>mt_excerpt</name>";
00111   xmlMarkup += "<value><string><![CDATA[" + post->summary() + "]]></string></value>";
00112   xmlMarkup += "</member><member>";
00113   xmlMarkup += "<name>mt_keywords</name>";
00114   xmlMarkup += "<value><string><![CDATA[" + post->tags().join(",") + "]]></string></value>";
00115   xmlMarkup += "</member></struct></param>";
00116   xmlMarkup += "<param><value><boolean>" +
00117                QString( "%1" ).arg( (int)(!post->isPrivate() ) ) +
00118                "</boolean></value></param>";
00119   xmlMarkup += "</params></methodCall>";
00120 
00121   QByteArray postData;
00122   QDataStream stream( &postData, QIODevice::WriteOnly );
00123   stream.writeRawData( xmlMarkup.toUtf8(), xmlMarkup.toUtf8().length() );
00124 
00125   KIO::StoredTransferJob *job = KIO::storedHttpPost( postData, url(), KIO::HideProgressInfo );
00126 
00127   d->mCreatePostMap[ job ] = post;
00128 
00129   if ( !job ) {
00130     kWarning() << "Failed to create job for: " << url().url();
00131   }
00132 
00133   job->addMetaData(
00134     "customHTTPHeader", "X-hacker: Shame on you Wordpress, " + QString() +
00135     "you took another 4 hours of my life to work around the stupid dateTime bug." );
00136   job->addMetaData( "content-type", "Content-Type: text/xml; charset=utf-8" );
00137   job->addMetaData( "ConnectTimeout", "50" );
00138   job->addMetaData( "UserAgent", userAgent() );
00139 
00140   connect( job, SIGNAL(result(KJob *)),
00141            this, SLOT(slotCreatePost(KJob *)) );
00142 }
00143 
00144 void WordpressBuggy::modifyPost( KBlog::BlogPost *post )
00145 {
00146   kDebug() << "modifyPost()";
00147   Q_D( WordpressBuggy );
00148   if ( !post ) {
00149     kError() << "WordpressBuggy::modifyPost: post is a null pointer";
00150     emit error ( Other, i18n( "Post is a null pointer." ) );
00151     return;
00152   }
00153 
00154   kDebug() << "Uploading Post with postId" << post->postId();
00155 
00156   QString xmlMarkup = "<?xml version=\"1.0\"?>";
00157   xmlMarkup += "<methodCall>";
00158   xmlMarkup += "<methodName>metaWeblog.editPost</methodName>";
00159   xmlMarkup += "<params><param>";
00160   xmlMarkup += "<value><string><![CDATA["+post->postId()+"]]></string></value>";
00161   xmlMarkup += "</param>";
00162   xmlMarkup += "<param>";
00163   xmlMarkup += "<value><string><![CDATA["+username()+"]]></string></value>";
00164   xmlMarkup += "</param><param>";
00165   xmlMarkup += "<value><string><![CDATA["+password()+"]]></string></value>";
00166   xmlMarkup += "</param>";
00167   xmlMarkup += "<param><struct>";
00168   xmlMarkup += "<member><name>description</name>";
00169   xmlMarkup += "<value><string><![CDATA["+post->content()+"]]></string></value>";
00170   xmlMarkup += "</member><member>";
00171   xmlMarkup += "<name>title</name>";
00172   xmlMarkup += "<value><string><![CDATA["+post->title()+"]]></string></value>";
00173   xmlMarkup += "</member><member>";
00174 
00175   QList<QString> catList = post->categories();
00176   if ( !catList.empty() ){
00177     xmlMarkup += "<name>categories</name>";
00178     xmlMarkup += "<value><array>";
00179     QList<QString>::ConstIterator it = catList.constBegin();
00180     QList<QString>::ConstIterator end = catList.constEnd();
00181     for ( ; it != end; ++it ){
00182       xmlMarkup += "<data><string><![CDATA[" + ( *it ) + "]]></string></data>";
00183     }
00184     xmlMarkup += "</array></value>";
00185     xmlMarkup += "</member><member>";
00186   }
00187 
00188   xmlMarkup += "<name>lastModified</name>";
00189   xmlMarkup += "<value><dateTime.iso8601>" +
00190                post->modificationDateTime().toUtc().dateTime().toString( "yyyyMMddThh:mm:ss" ) +
00191                "</dateTime.iso8601></value>";
00192   xmlMarkup += "</member><member>";
00193   xmlMarkup += "<name>dateCreated</name>";
00194   xmlMarkup += "<value><dateTime.iso8601>" +
00195                post->creationDateTime().toUtc().dateTime().toString( "yyyyMMddThh:mm:ss" ) +
00196                "</dateTime.iso8601></value>";
00197   xmlMarkup += "</member><member>";
00198   xmlMarkup += "<name>mt_allow_comments</name>";
00199   xmlMarkup += QString( "<value><int>%1</int></value>" ).arg( (int)post->isCommentAllowed() );
00200   xmlMarkup += "</member><member>";
00201   xmlMarkup += "<name>mt_allow_pings</name>";
00202   xmlMarkup += QString( "<value><int>%1</int></value>" ).arg( (int)post->isTrackBackAllowed() );
00203   xmlMarkup += "</member><member>";
00204   xmlMarkup += "<name>mt_excerpt</name>";
00205   xmlMarkup += "<value><string><![CDATA[" + post->summary() + "]]></string></value>";
00206   xmlMarkup += "</member><member>";
00207   xmlMarkup += "<name>mt_keywords</name>";
00208   xmlMarkup += "<value><string><![CDATA[" + post->tags().join( "," ) + "]]></string></value>";
00209   xmlMarkup += "</member></struct></param>";
00210   xmlMarkup += "<param><value><boolean>" +
00211                QString( "%1" ).arg( (int)( !post->isPrivate() ) ) +
00212                "</boolean></value></param>";
00213   xmlMarkup += "</params></methodCall>";
00214 
00215   QByteArray postData;
00216   QDataStream stream( &postData, QIODevice::WriteOnly );
00217   stream.writeRawData( xmlMarkup.toUtf8(), xmlMarkup.toUtf8().length() );
00218 
00219   KIO::StoredTransferJob *job = KIO::storedHttpPost( postData, url(), KIO::HideProgressInfo );
00220 
00221   d->mModifyPostMap[ job ] = post;
00222 
00223   if ( !job ) {
00224     kWarning() << "Failed to create job for: " << url().url();
00225   }
00226 
00227   job->addMetaData(
00228     "customHTTPHeader", "X-hacker: Shame on you Wordpress, " + QString() +
00229     "you took another 4 hours of my life to work around the stupid dateTime bug." );
00230   job->addMetaData( "content-type", "Content-Type: text/xml; charset=utf-8" );
00231   job->addMetaData( "ConnectTimeout", "50" );
00232   job->addMetaData( "UserAgent", userAgent() );
00233 
00234   connect( job, SIGNAL(result(KJob*)),
00235            this, SLOT(slotModifyPost(KJob*)) );
00236 }
00237 
00238 QString WordpressBuggy::interfaceName() const
00239 {
00240   return QLatin1String( "Movable Type" );
00241 }
00242 
00243 WordpressBuggyPrivate::WordpressBuggyPrivate()
00244 {
00245 }
00246 
00247 WordpressBuggyPrivate::~WordpressBuggyPrivate()
00248 {
00249   kDebug() << "~WordpressBuggyPrivate()";
00250 }
00251 
00252 QList<QVariant> WordpressBuggyPrivate::defaultArgs( const QString &id )
00253 {
00254   Q_Q( WordpressBuggy );
00255   QList<QVariant> args;
00256   if ( !id.isEmpty() ) {
00257     args << QVariant( id );
00258   }
00259   args << QVariant( q->username() )
00260        << QVariant( q->password() );
00261   return args;
00262 }
00263 
00264 void WordpressBuggyPrivate::slotCreatePost( KJob *job )
00265 {
00266   kDebug() << "slotCreatePost()";
00267 
00268   KIO::StoredTransferJob *stj = qobject_cast<KIO::StoredTransferJob*>(job);
00269   const QString data = QString::fromUtf8( stj->data(), stj->data().size() );
00270 
00271   Q_Q( WordpressBuggy );
00272 
00273   KBlog::BlogPost *post = mCreatePostMap[ job ];
00274   mCreatePostMap.remove( job );
00275 
00276   if ( job->error() != 0 ) {
00277     kError() << "slotCreatePost error:" << job->errorString();
00278     emit q->errorPost( WordpressBuggy::Atom, job->errorString(), post );
00279     return;
00280   }
00281 
00282   QRegExp rxError( "faultString" );
00283   if ( rxError.indexIn( data ) != -1 ){
00284     rxError = QRegExp( "<string>(.+)</string>" );
00285     if ( rxError.indexIn( data ) != -1 ) {
00286       kDebug() << "RegExp of faultString failed.";
00287     }
00288     kDebug() << rxError.cap(1);
00289     emit q->errorPost( WordpressBuggy::XmlRpc, rxError.cap(1), post );
00290     return;
00291   }
00292 
00293   QRegExp rxId( "<string>(.+)</string>" );
00294   if ( rxId.indexIn( data ) == -1 ){
00295     kError() << "Could not regexp the id out of the result:" << data;
00296     emit q->errorPost( WordpressBuggy::XmlRpc,
00297                        i18n( "Could not regexp the id out of the result." ), post );
00298     return;
00299   }
00300   kDebug() << "QRegExp rx( \"<string>(.+)</string>\" ) matches" << rxId.cap( 1 );
00301 
00302   post->setPostId( rxId.cap( 1 ) );
00303   post->setStatus( BlogPost::Created );
00304   kDebug() << "Emitting createdPost()";
00305   emit q->createdPost( post );
00306 }
00307 
00308 void WordpressBuggyPrivate::slotModifyPost( KJob *job )
00309 {
00310   kDebug() << "slotModifyPost()";
00311   
00312   KIO::StoredTransferJob *stj = qobject_cast<KIO::StoredTransferJob*>(job);
00313   const QString data = QString::fromUtf8( stj->data(), stj->data().size() );
00314 
00315   KBlog::BlogPost *post = mModifyPostMap[ job ];
00316   mModifyPostMap.remove( job );
00317   Q_Q( WordpressBuggy );
00318   if ( job->error() != 0 ) {
00319     kError() << "slotModifyPost error:" << job->errorString();
00320     emit q->errorPost( WordpressBuggy::Atom, job->errorString(), post );
00321     return;
00322   }
00323 
00324   QRegExp rxError( "faultString" );
00325   if ( rxError.indexIn( data ) != -1 ){
00326     rxError = QRegExp( "<string>(.+)</string>" );
00327     if ( rxError.indexIn( data ) != -1 ) {
00328       kDebug() << "RegExp of faultString failed.";
00329     }
00330     kDebug() << rxError.cap(1);
00331     emit q->errorPost( WordpressBuggy::XmlRpc, rxError.cap(1), post );
00332     return;
00333   }
00334 
00335   QRegExp rxId( "<boolean>(.+)</boolean>" );
00336   if ( rxId.indexIn( data ) == -1 ) {
00337     kError() << "Could not regexp the id out of the result:" << data;
00338     emit q->errorPost( WordpressBuggy::XmlRpc,
00339                        i18n( "Could not regexp the id out of the result." ), post );
00340     return;
00341   }
00342   kDebug() << "QRegExp rx( \"<boolean>(.+)</boolean>\" ) matches" << rxId.cap( 1 );
00343 
00344   if ( rxId.cap( 1 ).toInt() == 1 ) {
00345     kDebug() << "Post successfully updated.";
00346     post->setStatus( BlogPost::Modified );
00347     emit q->modifiedPost( post );
00348   }
00349 }
00350 
00351 #include "wordpressbuggy.moc"

KBlog Client Library

Skip menu "KBlog Client Library"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.7.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal