1/*
2 Copyright (c) 2011 Christian Mollekopf <chrigi_1@fastmail.fm>
3
4 This library is free software; you can redistribute it and/or modify it
5 under the terms of the GNU Library General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or (at your
7 option) any later version.
8
9 This library is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12 License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to the
16 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 02110-1301, USA.
18*/
19
20#ifndef AKONADI_TRASHJOB_H
21#define AKONADI_TRASHJOB_H
22
23#include "akonadi_export.h"
24
25#include <akonadi/item.h>
26#include <akonadi/collection.h>
27#include <akonadi/job.h>
28
29namespace Akonadi
30{
31
32/**
33 * @short Job that moves items/collection to trash.
34 *
35 * This job marks the given entites as trash and moves them to a given trash collection, if available.
36 *
37 * Priorities of trash collections are the following:
38 * 1. keepTrashInCollection()
39 * 2. setTrashCollection()
40 * 3. configured collection in TrashSettings
41 * 4. keep in collection if nothing is configured
42 *
43 * If the item is already marked as trash, it will be deleted instead
44 * only if deleteIfInTrash() is set.
45 * The entity is marked as trash with the EntityDeletedAttribute.
46 *
47 * The restore collection in the EntityDeletedAttribute is set the following way:
48 * -If entites are not moved to trash -> no restore collection
49 * -If collection is deleted -> also subentites get collection.parentCollection as restore collection
50 * -If multiple items are deleted -> all items get their parentCollection as restore collection
51 *
52 * Example:
53 *
54 * @code
55 *
56 * const Akonadi::Item::List items = ...
57 *
58 * TrashJob *job = new TrashJob( items );
59 * connect( job, SIGNAL(result(KJob*)), this, SLOT(deletionResult(KJob*)) );
60 *
61 * @endcode
62 *
63 * @author Christian Mollekopf <chrigi_1@fastmail.fm>
64 * @since 4.8
65 */
66class AKONADI_EXPORT TrashJob : public Job
67{
68 Q_OBJECT
69
70public:
71
72 /**
73 * Creates a new trash job that marks @p item as trash, and moves it to the configured trash collection.
74 *
75 * If @p keepTrashInCollection is set, the item will not be moved to the configured trash collection.
76 *
77 * @param item The item to mark as trash.
78 * @param parent The parent object.
79 */
80 explicit TrashJob(const Item &item, QObject *parent = 0);
81
82 /**
83 * Creates a new trash job that marks all items in the list
84 * @p items as trash, and moves it to the configured trash collection.
85 * The items can be in different collections/resources and will still be moved to the correct trash colleciton.
86 *
87 * If @p keepTrashInCollection is set, the item will not be moved to the configured trash collection.
88 *
89 * @param items The items to mark as trash.
90 * @param parent The parent object.
91 */
92 explicit TrashJob(const Item::List &items, QObject *parent = 0);
93
94 /**
95 * Creates a new trash job that marks @p collection as trash, and moves it to the configured trash collection.
96 * The subentities of the collection are also marked as trash.
97 *
98 * If @p keepTrashInCollection is set, the item will not be moved to the configured trash collection.
99 *
100 * @param collection The collection to mark as trash.
101 * @param parent The parent object.
102 */
103 explicit TrashJob(const Collection &collection, QObject *parent = 0);
104
105 ~TrashJob();
106
107 /**
108 * Ignore configured Trash collections and keep all items local
109 */
110 void keepTrashInCollection(bool enable);
111
112 /**
113 * Moves all entities to the give collection
114 */
115 void setTrashCollection(const Collection &trashcollection);
116
117 /**
118 * Delete Items which are already in trash, instead of ignoring them
119 */
120 void deleteIfInTrash(bool enable);
121
122 Item::List items() const;
123
124protected:
125 virtual void doStart();
126
127private:
128 //@cond PRIVATE
129 class TrashJobPrivate;
130 Q_DECLARE_PRIVATE(TrashJob)
131 Q_PRIVATE_SLOT(d_func(), void selectResult(KJob *))
132 Q_PRIVATE_SLOT(d_func(), void setAttribute(const Akonadi::Collection::List &))
133 Q_PRIVATE_SLOT(d_func(), void setAttribute(const Akonadi::Item::List &))
134 Q_PRIVATE_SLOT(d_func(), void setAttribute(KJob *))
135 Q_PRIVATE_SLOT(d_func(), void collectionsReceived(const Akonadi::Collection::List &))
136 Q_PRIVATE_SLOT(d_func(), void itemsReceived(const Akonadi::Item::List &))
137 Q_PRIVATE_SLOT(d_func(), void parentCollectionReceived(const Akonadi::Collection::List &))
138 //@endcond
139};
140
141}
142
143#endif
144