20 #include "pastehelper_p.h"
22 #include "collectioncopyjob.h"
23 #include "collectionmovejob.h"
25 #include "itemcreatejob.h"
26 #include "itemcopyjob.h"
27 #include "itemmodifyjob.h"
28 #include "itemmovejob.h"
30 #include "transactionsequence.h"
36 #include <QtCore/QByteArray>
37 #include <QtCore/QMimeData>
38 #include <QtCore/QStringList>
40 using namespace Akonadi;
44 if ( !mimeData || !collection.isValid() )
49 Collection::Rights neededRights = Collection::ReadOnly;
50 if ( KUrl::List::canDecode( mimeData ) ) {
51 const KUrl::List urls = KUrl::List::fromMimeData( mimeData );
52 foreach (
const KUrl &url, urls ) {
53 if ( url.hasQueryItem( QLatin1String(
"item" ) ) ) {
54 neededRights |= Collection::CanCreateItem;
55 }
else if ( url.hasQueryItem( QLatin1String(
"collection" ) ) ) {
56 neededRights |= Collection::CanCreateCollection;
60 if ( (collection.rights() & neededRights) == 0 )
65 bool supportsMimeTypes =
true;
66 foreach (
const KUrl &url, urls ) {
68 if ( url.hasQueryItem( QLatin1String(
"collection" ) ) )
71 const QString mimeType = url.queryItemValue( QLatin1String(
"type" ) );
72 if ( !collection.contentMimeTypes().contains( mimeType ) ) {
73 supportsMimeTypes =
false;
78 if ( !supportsMimeTypes )
87 KJob*
PasteHelper::paste(
const QMimeData * mimeData,
const Collection & collection,
bool copy, Session *session )
89 if ( !
canPaste( mimeData, collection ) )
94 foreach (
const QString &type, mimeData->formats() ) {
95 if ( !collection.contentMimeTypes().contains( type ) )
98 QByteArray item = mimeData->data( type );
100 if ( !item.isEmpty() && item.at( item.size() - 1 ) == 0 )
101 item.resize( item.size() - 1 );
104 it.setMimeType( type );
105 it.setPayloadFromData( item );
107 ItemCreateJob *job =
new ItemCreateJob( it, collection );
111 if ( !KUrl::List::canDecode( mimeData ) )
115 return pasteUriList( mimeData, collection, copy ? Qt::CopyAction : Qt::MoveAction, session );
120 if ( !KUrl::List::canDecode( mimeData ) )
123 if ( !
canPaste( mimeData, destination ) )
126 const KUrl::List urls = KUrl::List::fromMimeData( mimeData );
127 Collection::List collections;
129 foreach (
const KUrl &url, urls ) {
130 const Collection collection = Collection::fromUrl( url );
131 if ( collection.isValid() )
132 collections.append( collection );
133 const Item item = Item::fromUrl( url );
134 if ( item.isValid() )
135 items.append( item );
139 TransactionSequence *transaction =
new TransactionSequence( session );
144 transaction->setProperty(
"transactionsDisabled",
true );
148 if ( !items.isEmpty() )
149 new ItemCopyJob( items, destination, transaction );
150 foreach (
const Collection &col, collections )
151 new CollectionCopyJob( col, destination, transaction );
154 if ( !items.isEmpty() )
155 new ItemMoveJob( items, destination, transaction );
156 foreach (
const Collection &col, collections )
157 new CollectionMoveJob( col, destination, transaction );
160 new LinkJob( destination, items, transaction );
163 Q_ASSERT(
"WTF?!" ==
false );