• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.9.4 API Reference
  • KDE Home
  • Contact Us
 

kioslave/imap4

  • kioslave
  • imap4
imapparser.h
1 #ifndef _IMAPPARSER_H
2 #define _IMAPPARSER_H
3 /**********************************************************************
4  *
5  * imapparser.h - IMAP4rev1 Parser
6  * Copyright (C) 2001-2002 Michael Haeckel <haeckel@kde.org>
7  * Copyright (C) 2000 Sven Carstens <s.carstens@gmx.de>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22  *
23  * Send comments and bug fixes to s.carstens@gmx.de
24  *
25  *********************************************************************/
26 
27 #include "imap4-config.h"
28 #include "imaplist.h"
29 #include "imapcommand.h"
30 #include "imapinfo.h"
31 #include "mailheader.h"
32 
33 #include <kio/authinfo.h>
34 #include <kio/slavebase.h>
35 
36 #include <QHash>
37 #include <QList>
38 #include <QStringList>
39 #include <QByteArray>
40 
41 class KUrl;
42 class QString;
43 class mailAddress;
44 class mimeHeader;
45 
51 class parseString
52 {
53 public:
54  parseString() : pos(0) {}
55  char operator[](int i) const { return data.length() > (i + pos) ? data[i + pos] : '\0'; }
56  bool isEmpty() const { return pos >= data.size(); }
57  QByteArray cstr() const
58  {
59  if (pos >= data.size()) return QByteArray();
60  return QByteArray(data.data() + pos, data.size() - pos);
61  }
62  int find(char c, int index = 0) const
63  {
64  int res = data.indexOf(c, index + pos);
65  return (res == -1) ? res : (res - pos);
66  }
67  // Warning: does not check for going past end of "data"
68  void takeLeftNoResize(QByteArray& dest, uint len) const
69  {
70  memmove(dest.data(), data.data() + pos, len);
71  }
72  // Warning: does not check for going past end of "data"
73  void takeMidNoResize(QByteArray& dest, uint start, uint len) const
74  {
75  memmove(dest.data(), data.data() + pos + start, len);
76  }
77  void clear()
78  {
79  data.resize(0);
80  pos = 0;
81  }
82  uint length()
83  {
84  return data.size() - pos;
85  }
86  void fromString(const QString &s)
87  {
88  clear();
89  data = s.toLatin1();
90  }
91  QByteArray data;
92  int pos;
93 };
94 
95 class imapCache
96 {
97 public:
98  imapCache ()
99  {
100  myHeader = NULL;
101  mySize = 0;
102  myFlags = 0;
103  myUid = 0;
104  }
105 
106  ~imapCache ()
107  {
108  delete myHeader;
109  }
110 
111  mailHeader *getHeader ()
112  {
113  return myHeader;
114  }
115  void setHeader (mailHeader * inHeader)
116  {
117  myHeader = inHeader;
118  }
119 
120  ulong getSize ()
121  {
122  return mySize;
123  }
124  void setSize (ulong inSize)
125  {
126  mySize = inSize;
127  }
128 
129  ulong getUid ()
130  {
131  return myUid;
132  }
133  void setUid (ulong inUid)
134  {
135  myUid = inUid;
136  }
137 
138  ulong getFlags ()
139  {
140  return myFlags;
141  }
142  void setFlags (ulong inFlags)
143  {
144  myFlags = inFlags;
145  }
146 
147  QByteArray getDate ()
148  {
149  return myDate;
150  }
151  void setDate (const QByteArray & _str)
152  {
153  myDate = _str;
154  }
155  void clear()
156  {
157  delete myHeader;
158  myHeader = NULL;
159  mySize = 0;
160  myFlags = 0;
161  myDate = QByteArray();
162  myUid = 0;
163  }
164 
165 protected:
166  mailHeader * myHeader;
167  ulong mySize;
168  ulong myFlags;
169  ulong myUid;
170  QByteArray myDate;
171 };
172 
173 
174 class imapParser
175 {
176 
177 public:
178 
180  enum IMAP_STATE
181  {
182  ISTATE_NO,
183  ISTATE_CONNECT,
184  ISTATE_LOGIN,
185  ISTATE_SELECT
186  };
187 
188 public:
189  imapParser ();
190  virtual ~ imapParser ();
191 
193  enum IMAP_STATE getState () { return currentState; }
195  void setState(enum IMAP_STATE state) { currentState = state; }
196 
197  /* @brief return the currently selected mailbox */
198  const QString getCurrentBox ()
199  {
200  return KIMAP::decodeImapFolderName(currentBox);
201  }
202 
208  CommandPtr sendCommand (CommandPtr aCmd);
214  CommandPtr doCommand (CommandPtr aCmd);
215 
216 
224  bool clientLogin (const QString & aUser, const QString & aPass, QString & resultInfo);
234  bool clientAuthenticate (KIO::SlaveBase *slave, KIO::AuthInfo &ai, const QString & aFQDN,
235  const QString & aAuth, bool isSSL, QString & resultInfo);
236 
241  int parseLoop ();
242 
247  void parseUntagged (parseString & result);
248 
250  void parseRecent (ulong value, parseString & result);
252  void parseResult (QByteArray & result, parseString & rest,
253  const QString & command = QString());
255  void parseCapability (parseString & result);
257  void parseFlags (parseString & result);
259  void parseList (parseString & result);
261  void parseLsub (parseString & result);
263  void parseListRights (parseString & result);
265  void parseMyRights (parseString & result);
267  void parseSearch (parseString & result);
269  void parseStatus (parseString & result);
271  void parseExists (ulong value, parseString & result);
273  void parseExpunge (ulong value, parseString & result);
275  void parseAcl (parseString & result);
277  void parseAnnotation (parseString & result);
279  void parseNamespace (parseString & result);
281  void parseQuotaRoot (parseString & result);
283  void parseQuota (parseString & result);
285  void parseCustom (parseString & result);
287  void parseOtherUser (parseString & result);
289  void parseDelegate (parseString & result);
291  void parseOutOfOffice (parseString & result);
292 
297  void parseFetch (ulong value, parseString & inWords);
298 
300  mailHeader *parseEnvelope (parseString & inWords);
302  void parseAddressList (parseString & inWords, QList<mailAddress *>& list);
304  const mailAddress& parseAddress (parseString & inWords, mailAddress& buffer);
305 
307  void parseBody (parseString & inWords);
308 
310  mimeHeader *parseBodyStructure (parseString & inWords,
311  QString & section, mimeHeader * inHeader = 0);
312 
314  mimeHeader *parseSimplePart (parseString & inWords, QString & section,
315  mimeHeader * localPart = 0);
316 
318  QHash< QByteArray, QString > parseParameters (parseString & inWords);
319 
324  QHash< QByteArray, QString > parseDisposition (parseString & inWords);
325 
326  // reimplement these
327 
329  virtual void parseRelay (const QByteArray & buffer);
330 
333  virtual void parseRelay (ulong);
334 
336  virtual bool parseRead (QByteArray & buffer, long len, long relay = 0);
337 
339  virtual bool parseReadLine (QByteArray & buffer, long relay = 0);
340 
342  virtual void parseWriteLine (const QString &);
343 
344  // generic parser routines
345 
347  void parseSentence (parseString & inWords);
348 
350  QByteArray parseLiteral(parseString & inWords, bool relay = false,
351  bool stopAtBracket = false);
352 
353  // static parser routines, can be used elsewhere
354 
356  static QByteArray parseOneWord (parseString & inWords,
357  bool stopAtBracket = false);
358 
360  static bool parseOneNumber (parseString & inWords, ulong & num);
361 
363  static void parseURL (const KUrl & _url, QString & _box, QString & _section,
364  QString & _type, QString & _uid, QString & _validity,
365  QString & _info);
366 
367 
371  imapCache *getLastHandled ()
372  {
373  return lastHandled;
374  }
375 
377  const QStringList & getResults ()
378  {
379  return lastResults;
380  }
381 
383  const imapInfo & getStatus ()
384  {
385  return lastStatus;
386  }
388  const imapInfo & getSelected ()
389  {
390  return selectInfo;
391  }
392 
393  const QByteArray & getContinuation ()
394  {
395  return continuation;
396  }
397 
399  bool hasCapability (const QString &);
400 
401  void removeCapability (const QString & cap);
402 
403  static inline void skipWS (parseString & inWords)
404  {
405  char c;
406  while (!inWords.isEmpty() &&
407  ((c = inWords[0]) == ' ' || c == '\t' || c == '\r' || c == '\n'))
408  {
409  inWords.pos++;
410  }
411  }
412 
414  QString namespaceForBox( const QString & box );
415 
416 
417 protected:
418 
420  enum IMAP_STATE currentState;
421 
423  QString currentBox;
424 
426  imapInfo selectInfo;
427 
429  imapInfo lastStatus;
430 
432  QStringList imapCapabilities;
433 
435  QList < imapList > listResponses;
436 
438  QList <CommandPtr> sentQueue;
439  QList <CommandPtr> completeQueue;
440 
444  QStringList unhandled;
445 
447  QByteArray continuation;
448 
450  QString seenUid;
451  imapCache *lastHandled;
452 
453  ulong commandCounter;
454 
456  QStringList lastResults;
457 
462  QMap<QString, QString> namespaceToDelimiter;
463 
468  QStringList imapNamespaces;
469 
470 private:
471 
473  imapParser & operator = (const imapParser &); // hide the copy ctor
474 
475 };
476 #endif
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Tue Dec 4 2012 14:35:12 by doxygen 1.8.1.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kioslave/imap4

Skip menu "kioslave/imap4"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

kdepimlibs-4.9.4 API Reference

Skip menu "kdepimlibs-4.9.4 API Reference"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal