mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-24 19:02:51 +00:00
853 lines
30 KiB
C++
853 lines
30 KiB
C++
/* This file is part of the KDE project
|
|
Copyright (C) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net
|
|
Author: Kevin Krammer, krake@kdab.com
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "abstractlocalstore.h"
|
|
|
|
#include "collectioncreatejob.h"
|
|
#include "collectiondeletejob.h"
|
|
#include "collectionfetchjob.h"
|
|
#include "collectionmodifyjob.h"
|
|
#include "collectionmovejob.h"
|
|
#include "itemcreatejob.h"
|
|
#include "itemdeletejob.h"
|
|
#include "itemfetchjob.h"
|
|
#include "itemmodifyjob.h"
|
|
#include "itemmovejob.h"
|
|
#include "sessionimpls_p.h"
|
|
#include "storecompactjob.h"
|
|
|
|
#include <akonadi/collection.h>
|
|
#include <akonadi/entitydisplayattribute.h>
|
|
|
|
#include <KLocalizedString>
|
|
|
|
#include <QFileInfo>
|
|
|
|
using namespace Akonadi;
|
|
|
|
class JobProcessingAdaptor : public FileStore::Job::Visitor
|
|
{
|
|
public:
|
|
explicit JobProcessingAdaptor( FileStore::AbstractJobSession *session )
|
|
: mSession( session )
|
|
{
|
|
}
|
|
|
|
public: // Job::Visitor interface implementation
|
|
bool visit( FileStore::Job *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::CollectionCreateJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::CollectionDeleteJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::CollectionFetchJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::CollectionModifyJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::CollectionMoveJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::ItemCreateJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::ItemDeleteJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::ItemFetchJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::ItemModifyJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::ItemMoveJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
bool visit( FileStore::StoreCompactJob *job ) { Q_UNUSED( job ); return false ; }
|
|
|
|
protected:
|
|
FileStore::AbstractJobSession *mSession;
|
|
};
|
|
|
|
class TopLevelCollectionFetcher : public JobProcessingAdaptor
|
|
{
|
|
public:
|
|
explicit TopLevelCollectionFetcher( FileStore::AbstractJobSession *session )
|
|
: JobProcessingAdaptor( session )
|
|
{
|
|
}
|
|
|
|
void setTopLevelCollection( const Collection &collection )
|
|
{
|
|
mTopLevelCollection = collection;
|
|
}
|
|
|
|
public:
|
|
using JobProcessingAdaptor::visit;
|
|
|
|
bool visit( FileStore::CollectionFetchJob *job )
|
|
{
|
|
if ( job->type() == FileStore::CollectionFetchJob::Base &&
|
|
job->collection().remoteId() == mTopLevelCollection.remoteId() ) {
|
|
mSession->notifyCollectionsReceived( job, Collection::List() << mTopLevelCollection );
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private:
|
|
Collection mTopLevelCollection;
|
|
};
|
|
|
|
class CollectionsProcessedNotifier : public JobProcessingAdaptor
|
|
{
|
|
public:
|
|
explicit CollectionsProcessedNotifier( FileStore::AbstractJobSession *session )
|
|
: JobProcessingAdaptor( session )
|
|
{
|
|
}
|
|
|
|
void setCollections( const Collection::List &collections )
|
|
{
|
|
mCollections = collections;
|
|
}
|
|
|
|
public:
|
|
using JobProcessingAdaptor::visit;
|
|
|
|
bool visit( FileStore::CollectionCreateJob* job )
|
|
{
|
|
Q_ASSERT( !mCollections.isEmpty() );
|
|
if ( mCollections.count() > 1 ) {
|
|
kError() << "Processing collections for CollectionCreateJob "
|
|
"encountered more than one collection. Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyCollectionCreated( job, mCollections[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::CollectionDeleteJob* job )
|
|
{
|
|
Q_ASSERT( !mCollections.isEmpty() );
|
|
if ( mCollections.count() > 1 ) {
|
|
kError() << "Processing collections for CollectionDeleteJob "
|
|
"encountered more than one collection. Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyCollectionDeleted( job, mCollections[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::CollectionFetchJob* job )
|
|
{
|
|
mSession->notifyCollectionsReceived( job, mCollections );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::CollectionModifyJob* job )
|
|
{
|
|
Q_ASSERT( !mCollections.isEmpty() );
|
|
if ( mCollections.count() > 1 ) {
|
|
kError() << "Processing collections for CollectionModifyJob "
|
|
"encountered more than one collection. Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyCollectionModified( job, mCollections[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::CollectionMoveJob* job )
|
|
{
|
|
Q_ASSERT( !mCollections.isEmpty() );
|
|
if ( mCollections.count() > 1 ) {
|
|
kError() << "Processing collections for CollectionMoveJob "
|
|
"encountered more than one collection. Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyCollectionMoved( job, mCollections[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::StoreCompactJob* job )
|
|
{
|
|
mSession->notifyCollectionsChanged( job, mCollections );
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
Collection::List mCollections;
|
|
};
|
|
|
|
class ItemsProcessedNotifier : public JobProcessingAdaptor
|
|
{
|
|
public:
|
|
explicit ItemsProcessedNotifier( FileStore::AbstractJobSession *session )
|
|
: JobProcessingAdaptor( session )
|
|
{
|
|
}
|
|
|
|
void setItems( const Item::List &items )
|
|
{
|
|
mItems = items;
|
|
}
|
|
|
|
void clearItems()
|
|
{
|
|
mItems.clear();
|
|
}
|
|
|
|
public:
|
|
using JobProcessingAdaptor::visit;
|
|
|
|
bool visit( FileStore::ItemCreateJob* job )
|
|
{
|
|
Q_ASSERT( !mItems.isEmpty() );
|
|
if ( mItems.count() > 1 ) {
|
|
kError() << "Processing items for ItemCreateJob encountered more than one item. "
|
|
"Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyItemCreated( job, mItems[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::ItemFetchJob* job )
|
|
{
|
|
mSession->notifyItemsReceived( job, mItems );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::ItemModifyJob* job )
|
|
{
|
|
Q_ASSERT( !mItems.isEmpty() );
|
|
if ( mItems.count() > 1 ) {
|
|
kError() << "Processing items for ItemModifyJob encountered more than one item. "
|
|
"Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyItemModified( job, mItems[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::ItemMoveJob* job )
|
|
{
|
|
Q_ASSERT( !mItems.isEmpty() );
|
|
if ( mItems.count() > 1 ) {
|
|
kError() << "Processing items for ItemMoveJob encountered more than one item. "
|
|
"Just processing the first one.";
|
|
}
|
|
|
|
mSession->notifyItemMoved( job, mItems[ 0 ] );
|
|
return true;
|
|
}
|
|
|
|
bool visit( FileStore::StoreCompactJob* job )
|
|
{
|
|
mSession->notifyItemsChanged( job, mItems );
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
Item::List mItems;
|
|
};
|
|
|
|
class FileStore::AbstractLocalStore::Private
|
|
{
|
|
AbstractLocalStore *const q;
|
|
|
|
public:
|
|
explicit Private( FileStore::AbstractLocalStore *parent )
|
|
: q( parent ), mSession( new FileStore::FiFoQueueJobSession( q ) ), mCurrentJob( 0 ),
|
|
mTopLevelCollectionFetcher( mSession ), mCollectionsProcessedNotifier( mSession ),
|
|
mItemsProcessedNotifier( mSession )
|
|
{
|
|
}
|
|
|
|
public:
|
|
QFileInfo mPathFileInfo;
|
|
Collection mTopLevelCollection;
|
|
|
|
FileStore::AbstractJobSession *mSession;
|
|
FileStore::Job *mCurrentJob;
|
|
|
|
TopLevelCollectionFetcher mTopLevelCollectionFetcher;
|
|
CollectionsProcessedNotifier mCollectionsProcessedNotifier;
|
|
ItemsProcessedNotifier mItemsProcessedNotifier;
|
|
|
|
public:
|
|
void processJobs( const QList<FileStore::Job*> &jobs );
|
|
};
|
|
|
|
void FileStore::AbstractLocalStore::Private::processJobs( const QList<FileStore::Job*> &jobs )
|
|
{
|
|
Q_FOREACH( FileStore::Job *job, jobs ) {
|
|
mCurrentJob = job;
|
|
|
|
if ( job->error() == 0 ) {
|
|
if ( !job->accept( &mTopLevelCollectionFetcher ) ) {
|
|
q->processJob( job );
|
|
}
|
|
}
|
|
mSession->emitResult( job );
|
|
mCurrentJob = 0;
|
|
}
|
|
}
|
|
|
|
FileStore::AbstractLocalStore::AbstractLocalStore()
|
|
: QObject(), d( new Private( this ) )
|
|
{
|
|
connect( d->mSession, SIGNAL(jobsReady(QList<FileStore::Job*>)), this, SLOT(processJobs(QList<FileStore::Job*>)) );
|
|
}
|
|
|
|
FileStore::AbstractLocalStore::~AbstractLocalStore()
|
|
{
|
|
delete d;
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::setPath( const QString &path )
|
|
{
|
|
QFileInfo pathFileInfo( path );
|
|
if ( pathFileInfo.fileName().isEmpty() ) {
|
|
pathFileInfo = QFileInfo( pathFileInfo.path() );
|
|
}
|
|
pathFileInfo.makeAbsolute();
|
|
|
|
if ( pathFileInfo.absoluteFilePath() == d->mPathFileInfo.absoluteFilePath() ) {
|
|
return;
|
|
}
|
|
|
|
d->mPathFileInfo = pathFileInfo;
|
|
|
|
Collection collection;
|
|
collection.setRemoteId( d->mPathFileInfo.absoluteFilePath() );
|
|
collection.setName( d->mPathFileInfo.fileName() );
|
|
|
|
EntityDisplayAttribute *attribute = collection.attribute<EntityDisplayAttribute>();
|
|
if ( attribute != 0 ) {
|
|
attribute->setDisplayName( d->mPathFileInfo.fileName() );
|
|
}
|
|
|
|
setTopLevelCollection( collection );
|
|
}
|
|
|
|
QString FileStore::AbstractLocalStore::path() const
|
|
{
|
|
return d->mPathFileInfo.absoluteFilePath();
|
|
}
|
|
|
|
Collection FileStore::AbstractLocalStore::topLevelCollection() const
|
|
{
|
|
return d->mTopLevelCollection;
|
|
}
|
|
|
|
FileStore::CollectionCreateJob *FileStore::AbstractLocalStore::createCollection( const Collection &collection, const Collection &targetParent )
|
|
{
|
|
FileStore::CollectionCreateJob *job = new FileStore::CollectionCreateJob( collection, targetParent, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( targetParent.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( targetParent.rights() & Collection::CanCreateCollection ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits folder creation in folder %1", targetParent.name() );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkCollectionCreate( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::CollectionDeleteJob *FileStore::AbstractLocalStore::deleteCollection( const Collection &collection )
|
|
{
|
|
FileStore::CollectionDeleteJob *job = new FileStore::CollectionDeleteJob( collection, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ||
|
|
collection.parentCollection().remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( collection.rights() & Collection::CanDeleteCollection ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits folder deletion in folder %1", collection.name() );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkCollectionDelete( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::CollectionFetchJob *FileStore::AbstractLocalStore::fetchCollections( const Collection &collection, FileStore::CollectionFetchJob::Type type ) const
|
|
{
|
|
FileStore::CollectionFetchJob *job = new FileStore::CollectionFetchJob( collection, type, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection << "FetchType=" << type;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection << "FetchType=" << type;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkCollectionFetch( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::CollectionModifyJob *FileStore::AbstractLocalStore::modifyCollection( const Collection &collection )
|
|
{
|
|
FileStore::CollectionModifyJob *job = new FileStore::CollectionModifyJob( collection, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( collection.rights() & Collection::CanChangeCollection ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits folder modification in folder %1", collection.name() );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkCollectionModify( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::CollectionMoveJob *FileStore::AbstractLocalStore::moveCollection( const Collection &collection, const Collection &targetParent )
|
|
{
|
|
FileStore::CollectionMoveJob *job = new FileStore::CollectionMoveJob( collection, targetParent, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ||
|
|
collection.parentCollection().remoteId().isEmpty() ||
|
|
targetParent.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( targetParent.rights() & Collection::CanCreateCollection ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits folder creation in folder %1", targetParent.name() );
|
|
kError() << message;
|
|
kError() << collection << targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkCollectionMove( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemFetchJob *FileStore::AbstractLocalStore::fetchItems( const Collection &collection ) const
|
|
{
|
|
FileStore::ItemFetchJob *job = new FileStore::ItemFetchJob( collection, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemFetch( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemFetchJob *FileStore::AbstractLocalStore::fetchItem( const Item &item ) const
|
|
{
|
|
FileStore::ItemFetchJob *job = new FileStore::ItemFetchJob( item, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( item.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given item identifier is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemFetch( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemCreateJob *FileStore::AbstractLocalStore::createItem( const Item &item, const Collection &collection )
|
|
{
|
|
FileStore::ItemCreateJob *job = new FileStore::ItemCreateJob( item, collection, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << collection
|
|
<< "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( collection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << collection
|
|
<< "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( collection.rights() & Collection::CanCreateItem ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits item creation in folder %1", collection.name() );
|
|
kError() << message;
|
|
kError() << collection
|
|
<< "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemCreate( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemModifyJob *FileStore::AbstractLocalStore::modifyItem( const Item &item )
|
|
{
|
|
FileStore::ItemModifyJob *job = new FileStore::ItemModifyJob( item, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( item.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given item identifier is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( item.parentCollection().rights() & Collection::CanChangeItem ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits item modification in folder %1", item.parentCollection().name() );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemModify( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemDeleteJob *FileStore::AbstractLocalStore::deleteItem( const Item &item )
|
|
{
|
|
FileStore::ItemDeleteJob *job = new FileStore::ItemDeleteJob( item, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( item.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given item identifier is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( item.parentCollection().rights() & Collection::CanDeleteItem ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits item deletion in folder %1", item.parentCollection().name() );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")";
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemDelete( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::ItemMoveJob *FileStore::AbstractLocalStore::moveItem( const Item &item, const Collection &targetParent )
|
|
{
|
|
FileStore::ItemMoveJob *job = new FileStore::ItemMoveJob( item, targetParent, d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")"
|
|
<< targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
} else if ( item.parentCollection().remoteId().isEmpty() ||
|
|
targetParent.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given folder name is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")"
|
|
<< targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( targetParent.rights() & Collection::CanCreateItem ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits item creation in folder %1", targetParent.name() );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")"
|
|
<< targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( ( item.parentCollection().rights() & Collection::CanDeleteItem ) == 0 ) {
|
|
const QString message = i18nc( "@info:status", "Access control prohibits item deletion in folder %1", item.parentCollection().name() );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")"
|
|
<< targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
} else if ( item.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Given item identifier is empty" );
|
|
kError() << message;
|
|
kError() << "Item(remoteId=" << item.remoteId() << ", mimeType=" << item.mimeType()
|
|
<< ", parentCollection=" << item.parentCollection().remoteId() << ")"
|
|
<< targetParent;
|
|
d->mSession->setError( job, FileStore::Job::InvalidJobContext, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkItemMove( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::StoreCompactJob *FileStore::AbstractLocalStore::compactStore()
|
|
{
|
|
FileStore::StoreCompactJob *job = new FileStore::StoreCompactJob( d->mSession );
|
|
|
|
if ( d->mTopLevelCollection.remoteId().isEmpty() ) {
|
|
const QString message = i18nc( "@info:status", "Configured storage location is empty" );
|
|
kError() << message;
|
|
d->mSession->setError( job, FileStore::Job::InvalidStoreState, message );
|
|
}
|
|
|
|
int errorCode = 0;
|
|
QString errorText;
|
|
checkStoreCompact( job, errorCode, errorText );
|
|
if ( errorCode != 0 ) {
|
|
d->mSession->setError( job, errorCode, errorText );
|
|
}
|
|
|
|
return job;
|
|
}
|
|
|
|
FileStore::Job *FileStore::AbstractLocalStore::currentJob() const
|
|
{
|
|
return d->mCurrentJob;
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::notifyError( int errorCode, const QString &errorText ) const
|
|
{
|
|
Q_ASSERT( d->mCurrentJob != 0);
|
|
|
|
d->mSession->setError( d->mCurrentJob, errorCode, errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::notifyCollectionsProcessed( const Collection::List &collections ) const
|
|
{
|
|
Q_ASSERT( d->mCurrentJob != 0);
|
|
|
|
d->mCollectionsProcessedNotifier.setCollections( collections );
|
|
d->mCurrentJob->accept( &( d->mCollectionsProcessedNotifier ) );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::notifyItemsProcessed( const Item::List &items ) const
|
|
{
|
|
Q_ASSERT( d->mCurrentJob != 0);
|
|
|
|
d->mItemsProcessedNotifier.setItems( items );
|
|
d->mCurrentJob->accept( &( d->mItemsProcessedNotifier ) );
|
|
d->mItemsProcessedNotifier.clearItems(); // save memory
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::setTopLevelCollection( const Collection &collection )
|
|
{
|
|
d->mTopLevelCollection = collection;
|
|
d->mTopLevelCollectionFetcher.setTopLevelCollection( collection );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkCollectionCreate( FileStore::CollectionCreateJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkCollectionDelete( FileStore::CollectionDeleteJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkCollectionFetch( FileStore::CollectionFetchJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkCollectionModify( FileStore::CollectionModifyJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkCollectionMove( FileStore::CollectionMoveJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkItemCreate( FileStore::ItemCreateJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkItemDelete( FileStore::ItemDeleteJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkItemFetch( FileStore::ItemFetchJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkItemModify( FileStore::ItemModifyJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkItemMove( FileStore::ItemMoveJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
void FileStore::AbstractLocalStore::checkStoreCompact( FileStore::StoreCompactJob *job, int &errorCode, QString &errorText ) const
|
|
{
|
|
Q_UNUSED( job );
|
|
Q_UNUSED( errorCode );
|
|
Q_UNUSED( errorText );
|
|
}
|
|
|
|
#include "moc_abstractlocalstore.cpp"
|
|
|
|
// kate: space-indent on; indent-width 2; replace-tabs on;
|