summaryrefslogtreecommitdiffstats
path: root/kmail/folderjob.h
blob: b1f71251292d223c2c303f7dd925f042ba420a07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/*  -*- mode: C++; c-file-style: "gnu" -*-
 *
 *  This file is part of KMail, the KDE mail client.
 *  Copyright (c) 2003 Zack Rusin <zack@kde.org>
 *
 *  KMail is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License, version 2, as
 *  published by the Free Software Foundation.
 *
 *  KMail 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
 *  General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *  In addition, as a special exception, the copyright holders give
 *  permission to link the code of this program with any edition of
 *  the Qt library by Trolltech AS, Norway (or with modified versions
 *  of Qt that use the same license as Qt), and distribute linked
 *  combinations including the two.  You must obey the GNU General
 *  Public License in all respects for all of the code used other than
 *  Qt.  If you modify this file, you may extend this exception to
 *  your version of the file, but you are not obligated to do so.  If
 *  you do not wish to do so, delete this exception statement from
 *  your version.
 */

#ifndef FOLDERJOB_H
#define FOLDERJOB_H

#include "kmmessage.h"

#include <tqobject.h>
#include <tqptrlist.h>
#include <tqstring.h>

class KMFolder;

namespace KMail {

class FolderJob : public QObject
{
  Q_OBJECT

public:
  enum JobType { tListMessages, tGetFolder, tCreateFolder, tExpungeFolder,
		 tDeleteMessage, tGetMessage, tPutMessage, tAddSubfolders,
		 tDeleteFolders, tCheckUidValidity, tRenameFolder,
                 tCopyMessage, tMoveMessage, tOther /* used by subclasses */ };
  /**
   * Constructs a new job, operating on the message msg, of type
   * @p jt and with a parent folder @p folder.
   */
  FolderJob( KMMessage *msg, JobType jt = tGetMessage, KMFolder *folder = 0,
        TQString partSpecifier = TQString::null );

  /**
   * Constructs a new job, operating on a message list @p msgList,
   * set @sets, JobType @p jt and with the parent folder @p folder.
   *
   */
  FolderJob( const TQPtrList<KMMessage>& msgList, const TQString& sets,
	     JobType jt = tGetMessage, KMFolder *folder = 0 );
  /**
   * This one should ONLY be used in derived folders, when a job
   * does something internal and needs to construct an empty parent
   * FolderJob
   */
  FolderJob( JobType jt );
  virtual ~FolderJob();

  TQPtrList<KMMessage> msgList() const;
  /**
   * Start the job
   */
  void start();

  /**
   * Interrupt the job. Note that the finished() and result() signal
   * will be emitted, unless you called setPassiveDestructor(true) before.
   * This kills the job, don't use it afterwards.
   */
  virtual void kill();

  /**
   * @return the error code of the job. This must only be called from
   * the slot connected to the finished() signal.
   */
  int error() const { return mErrorCode; }

  /**
   * @return true if this job can be cancelled, e.g. to exit the application
   */
  bool isCancellable() const { return mCancellable; }

  /**
   * Call this to change the "cancellable" property of this job.
   * By default, tListMessages, tGetMessage, tGetFolder and tCheckUidValidity
   * are cancellable, the others are not. But when copying, a non-cancellable
   * tGetMessage is needed.
   */
  void setCancellable( bool b ) { mCancellable = b; }

  void setPassiveDestructor( bool passive ) { mPassiveDestructor = passive; }
  bool passiveDestructor() { return mPassiveDestructor; }

signals:
  /**
   * Emitted whenever a KMMessage has been completely
   * retrieved from the server/folder.
   */
  void messageRetrieved( KMMessage * );

  /**
   * Emitted whenever a KMMessage was updated
   */
  void messageUpdated( KMMessage *, TQString );

  /**
   * Emitted whenever a message has been stored in
   * the folder.
   */
  void messageStored( KMMessage * );

  /**
   * Emitted when a list of messages has been
   * copied to the specified location. TQPtrList contains
   * the list of the copied messages.
   */
  void messageCopied( TQPtrList<KMMessage> );

  /**
   * Overloaded signal to the one above. A lot of copying
   * specifies only one message as the argument and this
   * signal is easier to use when this happens.
   */
  void messageCopied( KMMessage * );

  /**
   * Emitted when the job finishes all processing.
   */
  void finished();

  /**
   * Emitted when the job finishes all processing.
   * More convenient signal than finished(), since it provides a pointer to the job.
   * This signal is emitted by the FolderJob destructor => do NOT downcast
   * the job to a subclass!
   */
  void result( KMail::FolderJob* job );

  /**
   * This progress signal contains the "done" and the "total" numbers so
   * that the caller can either make a % out of it, or combine it into
   * a higher-level progress info.
   */
  void progress( unsigned long bytesDownloaded, unsigned long bytesTotal );

private:
  void init();

protected:
  /**
   * Has to be reimplemented. It's called by the start() method. Should
   * start the processing of the specified job function.
   */
  virtual void execute()=0;

  TQPtrList<KMMessage> mMsgList;
  JobType             mType;
  TQString             mSets;
  KMFolder*           mSrcFolder;
  KMFolder*           mDestFolder;
  TQString             mPartSpecifier;
  int                 mErrorCode;

  //finished() won't be emitted when this is set
  bool                mPassiveDestructor;
  bool                mStarted;
  bool                mCancellable;
};

}

#endif