42
42
#include <kio/job.h>
43
43
#include <settings.h>
45
Backend::Backend( int blog_id, QObject* parent ): QObject( parent )
45
const QRegExp splitRX("((<hr/?>)?<!--split-->)");
47
class Backend::Private
51
:categoryListNotSet(false)
56
// QString mediaLocalUrl;
57
QList<Category> mCreatePostCategories;
58
QMap<QString, KBlog::BlogPost *> mSetPostCategoriesMap;
59
QMap<KBlog::BlogPost *, BilboPost::Status> mSubmitPostStatusMap;
60
QMap<KBlog::BlogMedia *, BilboMedia *> mPublishMediaMap;
61
bool categoryListNotSet;
64
Backend::Backend( int blog_id, QObject* parent )
65
: QObject( parent ), d(new Private)
47
67
kDebug() << "with blog id: " << blog_id;
48
mBBlog = new BilboBlog( DBMan::self()->blog( blog_id ) );
49
switch ( mBBlog->api() ) {
50
case BilboBlog::BLOGGER1_API:
51
mKBlog = new KBlog::Blogger1( KUrl(), this );
53
case BilboBlog::GDATA_API:
54
mKBlog = new KBlog::GData( KUrl(), this );
56
case BilboBlog::METAWEBLOG_API:
57
mKBlog = new KBlog::MetaWeblog( KUrl(), this );
59
case BilboBlog::MOVABLETYPE_API:
60
mKBlog = new KBlog::MovableType( KUrl(), this );
62
case BilboBlog::WORDPRESSBUGGY_API:
63
mKBlog = new KBlog::WordpressBuggy( KUrl(), this );
65
mKBlog->setUserAgent(APPNAME, VERSION);
66
mKBlog->setUsername( mBBlog->username() );
67
mKBlog->setPassword( mBBlog->password() );
68
mKBlog->setUrl( KUrl( mBBlog->url() ) );
69
mKBlog->setBlogId( mBBlog->blogid() );
70
categoryListNotSet = false;
68
d->bBlog = DBMan::self()->blog( blog_id );
69
d->kBlog = d->bBlog->blogBackend();
72
connect( mKBlog, SIGNAL( error( KBlog::Blog::ErrorType, const QString& ) ),
73
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
74
connect( mKBlog, SIGNAL( errorPost( KBlog::Blog::ErrorType, const QString &, KBlog::BlogPost* ) ),
75
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
76
connect( mKBlog, SIGNAL( errorComment( KBlog::Blog::ErrorType, const QString &, KBlog::BlogPost*,
71
connect( d->kBlog, SIGNAL( error( KBlog::Blog::ErrorType, const QString& ) ),
72
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
73
connect( d->kBlog, SIGNAL( errorPost( KBlog::Blog::ErrorType, const QString &, KBlog::BlogPost* ) ),
74
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
75
connect( d->kBlog, SIGNAL( errorComment( KBlog::Blog::ErrorType, const QString &, KBlog::BlogPost*,
77
76
KBlog::BlogComment* ) ),
78
77
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
79
connect( mKBlog, SIGNAL( errorMedia( KBlog::Blog::ErrorType, const QString &, KBlog::BlogMedia* ) ),
78
connect( d->kBlog, SIGNAL( errorMedia( KBlog::Blog::ErrorType, const QString &, KBlog::BlogMedia* ) ),
80
79
this, SLOT( error( KBlog::Blog::ErrorType, const QString& ) ) );
83
82
Backend::~Backend()
86
mBBlog->deleteLater();
89
88
void Backend::getCategoryListFromServer()
91
kDebug() << "Blog Id: " << mBBlog->id();
92
if ( mBBlog->api() == BilboBlog::METAWEBLOG_API || mBBlog->api() == BilboBlog::MOVABLETYPE_API ||
93
mBBlog->api() == BilboBlog::WORDPRESSBUGGY_API ) {
94
KBlog::MetaWeblog *tmp = dynamic_cast<KBlog::MetaWeblog*>( mKBlog );
90
kDebug() << "Blog Id: " << d->bBlog->id();
91
if ( d->bBlog->api() == BilboBlog::METAWEBLOG_API || d->bBlog->api() == BilboBlog::MOVABLETYPE_API ||
92
d->bBlog->api() == BilboBlog::WORDPRESSBUGGY_API ) {
93
KBlog::MetaWeblog *tmp = dynamic_cast<KBlog::MetaWeblog*>( d->kBlog );
95
94
connect( tmp, SIGNAL( listedCategories( const QList< QMap< QString, QString > > & ) ),
96
95
this, SLOT( categoriesListed( const QList< QMap< QString, QString > > & ) ) );
97
96
tmp->listCategories();
99
98
char err[] = "Blog API doesn't support getting Category list.";
101
QString tmp = i18n( err );
102
error( KBlog::Blog::NotSupported, tmp );
100
error( KBlog::Blog::NotSupported, i18n( err ) );
106
104
void Backend::categoriesListed( const QList< QMap < QString , QString > > & categories )
108
kDebug() << "Blog Id: " << mBBlog->id();
109
DBMan::self()->clearCategories( mBBlog->id() );
106
kDebug() << "Blog Id: " << d->bBlog->id();
107
DBMan::self()->clearCategories( d->bBlog->id() );
111
109
for ( int i = 0; i < categories.count(); ++i ) {
112
110
QString name, description, htmlUrl, rssUrl, categoryId, parentId;
123
121
categoryId = QString::number(i);
126
DBMan::self()->addCategory( name, description, htmlUrl, rssUrl, categoryId, parentId, mBBlog->id() );
124
DBMan::self()->addCategory( name, description, htmlUrl, rssUrl, categoryId, parentId, d->bBlog->id() );
128
126
kDebug() << "Emitting sigCategoryListFetched...";
129
Q_EMIT sigCategoryListFetched( mBBlog->id() );
127
Q_EMIT sigCategoryListFetched( d->bBlog->id() );
132
130
void Backend::getEntriesListFromServer( int count )
134
kDebug() << "Blog Id: " << mBBlog->id();
135
connect( mKBlog, SIGNAL( listedRecentPosts( const QList<KBlog::BlogPost> & ) ),
132
kDebug() << "Blog Id: " << d->bBlog->id();
133
connect( d->kBlog, SIGNAL( listedRecentPosts( const QList<KBlog::BlogPost> & ) ),
136
134
this, SLOT( entriesListed( const QList<KBlog::BlogPost >& ) ) );
137
mKBlog->listRecentPosts( count );
135
d->kBlog->listRecentPosts( count );
140
138
void Backend::entriesListed( const QList< KBlog::BlogPost > & posts )
142
kDebug() << "Blog Id: " << mBBlog->id();
143
// DBMan::self()->clearPosts( mBBlog->id() );
140
kDebug() << "Blog Id: " << d->bBlog->id();
141
// DBMan::self()->clearPosts( d->bBlog->id() );
145
143
for ( int i = 0; i < posts.count(); i++ ) {
146
144
BilboPost tempPost( posts[i] );
148
146
tempPost.setContent( tempPost.content().replace( '\n', "<br/>" ) );
149
147
tempPost.setAdditionalContent( tempPost.additionalContent().replace( '\n', "<br/>" ) );
151
DBMan::self()->addPost( tempPost, mBBlog->id() );
149
DBMan::self()->addPost( tempPost, d->bBlog->id() );
153
151
kDebug() << "Emitting sigEntriesListFetched ...";
154
Q_EMIT sigEntriesListFetched( mBBlog->id() );
152
Q_EMIT sigEntriesListFetched( d->bBlog->id() );
157
void Backend::publishPost( const BilboPost &post )
155
void Backend::publishPost( BilboPost* post )
159
kDebug() << "Blog Id: " << mBBlog->id();
160
BilboPost tmpPost = post;
157
kDebug() << "Blog Id: " << d->bBlog->id();
158
// BilboPost tmpPost = post;
161
159
if( Settings::addPoweredBy() ) {
162
160
QString poweredStr = "<p>=-=-=-=-=<br/>"
163
161
"<i>Powered by <b><a href='http://blogilo.gnufolks.org/'>Blogilo</a></b></i></p>";
164
tmpPost.setContent(post.content() + poweredStr);
162
post->setContent(post->content() + poweredStr);
166
KBlog::BlogPost *bp = preparePost( tmpPost );
167
connect( mKBlog, SIGNAL( createdPost( KBlog::BlogPost * ) ),
165
connect( d->kBlog, SIGNAL( createdPost( KBlog::BlogPost * ) ),
168
166
this, SLOT( postPublished( KBlog::BlogPost * ) ) );
169
mKBlog->createPost( bp );
167
d->kBlog->createPost( post );
172
170
void Backend::postPublished( KBlog::BlogPost *post )
174
kDebug() << "Blog Id: " << mBBlog->id();
172
kDebug() << "Blog Id: " << d->bBlog->id();
175
173
if ( post->status() == KBlog::BlogPost::Error ) {
176
174
kDebug() << "Publishing/Modifying Failed";
177
175
const QString tmp( i18n( "Publishing/Modifying post failed: %1", post->error() ) );
179
177
Q_EMIT sigError( tmp );
182
// if ( categoryListNotSet ) {
183
// categoryListNotSet = false;
184
// mSetPostCategoriesMap[ post->postId()] = post;
185
// QMap<QString, bool> cats;
186
// int count = mCreatePostCategories.count();
187
// for ( int i = 0; i < count; ++i ) {
188
// cats.insert( mCreatePostCategories[i].categoryId, false );
190
// setPostCategories( post->postId(), cats );
192
kDebug()<<"isPrivate: "<<post->isPrivate();
193
mSubmitPostStatusMap[ post ] = post->status();
194
connect( mKBlog, SIGNAL( fetchedPost(KBlog::BlogPost*)),
195
this, SLOT( savePostInDbAndEmitResult(KBlog::BlogPost*)) );
196
mKBlog->fetchPost( post );
180
kDebug()<<"isPrivate: "<<post->isPrivate();
181
if(post->isPrivate() && d->bBlog->api() == BilboBlog::GDATA_API){
182
//GData do not support fetching drafts!
183
savePostInDbAndEmitResult(post);
186
d->mSubmitPostStatusMap[ post ] = post->status();
187
connect( d->kBlog, SIGNAL( fetchedPost(KBlog::BlogPost*)),
188
this, SLOT( savePostInDbAndEmitResult(KBlog::BlogPost*)) );
189
d->kBlog->fetchPost( post );
200
192
void Backend::uploadMedia( BilboMedia * media )
202
kDebug() << "Blog Id: " << mBBlog->id();
194
kDebug() << "Blog Id: " << d->bBlog->id();
204
switch ( mBBlog->api() ) {
196
switch ( d->bBlog->api() ) {
205
197
case BilboBlog::BLOGGER1_API:
206
198
case BilboBlog::GDATA_API:
207
199
kDebug() << "The Blogger1 and GData API type doesn't support uploading Media files.";
308
300
Q_EMIT sigMediaUploaded( m );
311
void Backend::modifyPost( const BilboPost &post )
303
void Backend::modifyPost( BilboPost* post )
313
kDebug() << "Blog Id: " << mBBlog->id();
314
BilboPost tmpPost = post;
315
KBlog::BlogPost *bp = preparePost( tmpPost );
316
connect( mKBlog, SIGNAL( modifiedPost(KBlog::BlogPost*)),
305
kDebug() << "Blog Id: " << d->bBlog->id();
306
// BilboPost tmpPost = post;
308
connect( d->kBlog, SIGNAL( modifiedPost(KBlog::BlogPost*)),
317
309
this, SLOT( postPublished(KBlog::BlogPost*)) );
318
mKBlog->modifyPost( bp );
310
d->kBlog->modifyPost( post );
321
void Backend::removePost( BilboPost &post )
313
void Backend::removePost( BilboPost* post )
323
kDebug() << "Blog Id: " << mBBlog->id();
315
kDebug() << "Blog Id: " << d->bBlog->id();
325
KBlog::BlogPost *bp = post.toKBlogPost();
326
connect( mKBlog, SIGNAL( removedPost(KBlog::BlogPost*)),
317
// KBlog::BlogPost *bp = post.toKBlogPost();
318
connect( d->kBlog, SIGNAL( removedPost(KBlog::BlogPost*)),
327
319
this, SLOT( slotPostRemoved(KBlog::BlogPost*)) );
328
mKBlog->removePost( bp );
320
d->kBlog->removePost( post );
331
323
void Backend::slotPostRemoved( KBlog::BlogPost *post )
334
326
kDebug()<<"post returned from server is NULL";
337
if( !DBMan::self()->removePost(mBBlog->id(), post->postId()) ) {
329
if( !DBMan::self()->removePost(d->bBlog->id(), post->postId()) ) {
338
330
kDebug()<<"cannot remove post from database, error: "<<DBMan::self()->lastErrorText();
340
emit sigPostRemoved(mBBlog->id(), BilboPost(*post));
332
emit sigPostRemoved(d->bBlog->id(), BilboPost(*post));
343
void Backend::fetchPost( BilboPost &post )
335
void Backend::fetchPost( BilboPost* post )
345
KBlog::BlogPost *bp = post.toKBlogPost();
346
connect( mKBlog, SIGNAL( fetchedPost(KBlog::BlogPost*)),
337
// KBlog::BlogPost *bp = post.toKBlogPost();
338
connect( d->kBlog, SIGNAL( fetchedPost(KBlog::BlogPost*)),
347
339
this, SLOT( slotPostFetched(KBlog::BlogPost*)) );
348
mKBlog->fetchPost( bp );
340
d->kBlog->fetchPost( post );
351
343
void Backend::slotPostFetched( KBlog::BlogPost *post )
353
345
emit sigPostFetched( new BilboPost(*post) );
357
349
void Backend::error( KBlog::Blog::ErrorType type, const QString & errorMessage )
359
kDebug() << "Blog Id: " << mBBlog->id();
351
kDebug() << "Blog Id: " << d->bBlog->id();
360
352
QString errType = errorTypeToString( type );
361
353
errType += errorMessage;
362
354
kDebug() << errType;
410
403
kDebug()<<"isPrivate: "<<post->isPrivate();
411
404
BilboPost *pp = new BilboPost( *post );
413
if( mSubmitPostStatusMap[ post ] == KBlog::BlogPost::Modified) {
414
post_id = DBMan::self()->editPost( *pp, mBBlog->id() );
406
if( d->mSubmitPostStatusMap[ post ] == KBlog::BlogPost::Modified) {
407
post_id = DBMan::self()->editPost( *pp, d->bBlog->id() );
416
post_id = DBMan::self()->addPost( *pp, mBBlog->id() );
409
post_id = DBMan::self()->addPost( *pp, d->bBlog->id() );
418
mSubmitPostStatusMap.remove(post);
411
d->mSubmitPostStatusMap.remove(post);
419
412
if ( post_id != -1 ) {
420
413
pp->setPrivate( post->isPrivate() );
421
414
pp->setId( post_id );
422
415
kDebug() << "Emitting sigPostPublished ...";
423
Q_EMIT sigPostPublished( mBBlog->id(), pp );
416
Q_EMIT sigPostPublished( d->bBlog->id(), pp );
425
418
// TODO crashes stylegetter on GData. Somehow the post gets deleted before
426
419
// slotFetchedPost as it seems. Don't get all the pointer copies done here.
430
KBlog::BlogPost * Backend::preparePost( BilboPost &post )
423
KBlog::BlogPost* Backend::preparePost( KBlog::BlogPost* post )
432
QString content = post.content();
425
QString content = post->content();
433
426
QString html1 = QString();
435
428
int found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
436
429
while ( found != -1 )
438
html1 += content.mid( i, found-i).remove('\n');
440
found = content.indexOf("</pre>", i, Qt::CaseInsensitive);
442
html1 += content.mid( i, found+5-i);
444
found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
446
html1 += content.mid( i, content.length()-i );
431
html1 += content.mid( i, found-i).remove('\n');
433
found = content.indexOf("</pre>", i, Qt::CaseInsensitive);
435
html1 += content.mid( i, found+5-i);
437
found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
439
html1 += content.mid( i, content.length()-i );
451
html1 += content.mid( i, content.length()-i).remove('\n');
452
post.setContent( html1 );
454
content = post.additionalContent();
444
html1 += content.mid( i, content.length()-i).remove('\n');
445
post->setContent( html1 );
447
content = post->additionalContent();
455
448
QString html2 = QString();
457
450
found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
458
451
while ( found != -1 )
460
html2 += content.mid( i, found-i).remove('\n');
462
found = content.indexOf("</pre>", i, Qt::CaseInsensitive);
464
html2 += content.mid( i, found+5-i);
466
found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
468
html2 += content.mid( i, content.length()-i );
453
html2 += content.mid( i, found-i).remove('\n');
455
found = content.indexOf("</pre>", i, Qt::CaseInsensitive);
457
html2 += content.mid( i, found+5-i);
459
found = content.indexOf("<pre>", i, Qt::CaseInsensitive);
461
html2 += content.mid( i, content.length()-i );
473
html2 += content.mid( i, content.length()-i).remove('\n');
474
post.setAdditionalContent( html2 );
466
html2 += content.mid( i, content.length()-i).remove('\n');
467
post->setAdditionalContent( html2 );
476
469
//the following two lines are replaced by the above code, because '\n' characters shouldn't
477
//be ommited inside <pre> blocks.
470
//be omitted inside <pre> blocks.
479
472
//post.setContent( post.content().remove('\n') );
480
473
//post.setAdditionalContent( post.additionalContent().remove( '\n' ) );
481
if ( mBBlog->api() == BilboBlog::MOVABLETYPE_API || mBBlog->api() == BilboBlog::WORDPRESSBUGGY_API ) {
482
QStringList content = post.content().split("<!--split-->");
474
if ( d->bBlog->api() == BilboBlog::MOVABLETYPE_API || d->bBlog->api() == BilboBlog::WORDPRESSBUGGY_API ) {
475
QStringList content = post->content().split(splitRX);
483
476
if( content.count() == 2 ) {
484
post.setContent(content[0]);
485
post.setAdditionalContent( content[1] );
477
post->setContent(content[0]);
478
post->setAdditionalContent( content[1] );
488
// if( mBBlog->api() == BilboBlog::MOVABLETYPE_API && post.categoryList().count() > 0 ) {
481
// if( d->bBlog->api() == BilboBlog::MOVABLETYPE_API && post.categoryList().count() > 0 ) {
489
482
// mCreatePostCategories = post.categoryList();
490
483
// categoryListNotSet = true;
492
return post.toKBlogPost();
485
return post;//.toKBlogPost();
495
488
#include "backend.moc"