KIMAP

idlejob.cpp
1 /*
2  SPDX-FileCopyrightText: 2009 Kevin Ottens <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "idlejob.h"
8 
9 #include <KLocalizedString>
10 #include <QTimer>
11 
12 #include "job_p.h"
13 #include "response_p.h"
14 #include "session_p.h"
15 
16 namespace KIMAP
17 {
18 class IdleJobPrivate : public JobPrivate
19 {
20 public:
21  IdleJobPrivate(IdleJob *job, Session *session, const QString &name)
22  : JobPrivate(session, name)
23  , q(job)
24  {
25  }
26  ~IdleJobPrivate()
27  {
28  }
29 
30  void emitStats()
31  {
32  emitStatsTimer.stop();
33 
34  Q_EMIT q->mailBoxStats(q, m_session->selectedMailBox(), messageCount, recentCount);
35 
36  lastMessageCount = messageCount;
37  lastRecentCount = recentCount;
38 
39  messageCount = -1;
40  recentCount = -1;
41  }
42 
43  void resetTimeout()
44  {
45  sessionInternal()->setSocketTimeout(originalSocketTimeout);
46  }
47 
48  IdleJob *const q;
49 
50  QTimer emitStatsTimer;
51 
52  int messageCount = -1;
53  int recentCount = -1;
54 
55  int lastMessageCount = -1;
56  int lastRecentCount = -1;
57 
58  int originalSocketTimeout = -1;
59 };
60 }
61 
62 using namespace KIMAP;
63 
64 IdleJob::IdleJob(Session *session)
65  : Job(*new IdleJobPrivate(this, session, i18nc("name of the idle job", "Idle")))
66 {
67  Q_D(IdleJob);
68  connect(&d->emitStatsTimer, &QTimer::timeout, this, [d]() {
69  d->emitStats();
70  });
71 
72  connect(this, &KJob::result, this, [d]() {
73  d->resetTimeout();
74  });
75 }
76 
77 IdleJob::~IdleJob()
78 {
79 }
80 
82 {
83  Q_D(IdleJob);
84  d->sessionInternal()->setSocketTimeout(d->originalSocketTimeout);
85  d->sessionInternal()->sendData("DONE");
86 }
87 
88 void IdleJob::doStart()
89 {
90  Q_D(IdleJob);
91  d->originalSocketTimeout = d->sessionInternal()->socketTimeout();
92  d->sessionInternal()->setSocketTimeout(-1);
93  d->tags << d->sessionInternal()->sendCommand("IDLE");
94 }
95 
96 void IdleJob::handleResponse(const Response &response)
97 {
98  Q_D(IdleJob);
99 
100  // We can predict it'll be handled by handleErrorReplies() so Q_EMIT
101  // pending signals now (if needed) so that result() will really be
102  // the last emitted signal.
103  if (!response.content.isEmpty() && d->tags.size() == 1 && d->tags.contains(response.content.first().toString())
104  && (d->messageCount >= 0 || d->recentCount >= 0)) {
105  d->emitStats();
106  }
107 
108  if (handleErrorReplies(response) == NotHandled) {
109  if (!response.content.isEmpty() && response.content[0].toString() == "+") {
110  // Got the continuation all is fine
111  return;
112 
113  } else if (response.content.size() > 2) {
114  const QByteArray ba = response.content[2].toString();
115  if (ba == "EXISTS") {
116  if (d->messageCount >= 0) {
117  d->emitStats();
118  }
119 
120  d->messageCount = response.content[1].toString().toInt();
121  } else if (ba == "RECENT") {
122  if (d->recentCount >= 0) {
123  d->emitStats();
124  }
125 
126  d->recentCount = response.content[1].toString().toInt();
127  } else if (ba == "FETCH") {
128  const qint64 uid = response.content[1].toString().toLongLong();
130  }
131  }
132 
133  if (d->messageCount >= 0 && d->recentCount >= 0) {
134  d->emitStats();
135  } else if (d->messageCount >= 0 || d->recentCount >= 0) {
136  d->emitStatsTimer.start(200);
137  }
138  }
139 }
140 
142 {
143  Q_D(const IdleJob);
144  return d->m_session->selectedMailBox();
145 }
146 
148 {
149  Q_D(const IdleJob);
150  return d->lastMessageCount;
151 }
152 
154 {
155  Q_D(const IdleJob);
156  return d->lastRecentCount;
157 }
158 
159 #include "moc_idlejob.cpp"
Q_EMITQ_EMIT
void result(KJob *job)
int lastRecentCount() const
The last recent message count that was reported.
Definition: idlejob.cpp:153
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void mailBoxMessageFlagsChanged(KIMAP::IdleJob *job, qint64 uid)
Signals that the server has notified that the some messages flags have changed.
void timeout()
QString lastMailBox() const
The last mailbox status that was reported.
Definition: idlejob.cpp:141
int toInt(bool *ok, int base) const const
Idles the connection to the IMAP server.
Definition: idlejob.h:47
int lastMessageCount() const
The last message count that was reported.
Definition: idlejob.cpp:147
const char * name(StandardAction id)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void stop()
Stops the idle job.
Definition: idlejob.cpp:81
Q_D(Todo)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Sun Dec 3 2023 03:51:44 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.