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

kioslave/imap4

  • sources
  • kde-4.14
  • kdepimlibs
  • 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() ) {
60  return QByteArray();
61  }
62  return QByteArray( data.data() + pos, data.size() - pos );
63  }
64  int find(char c, int index = 0) const
65  {
66  int res = data.indexOf( c, index + pos );
67  return ( res == -1 ) ? res : ( res - pos );
68  }
69  // Warning: does not check for going past end of "data"
70  void takeLeftNoResize(QByteArray& dest, uint len) const
71  {
72  memmove( dest.data(), data.data() + pos, len );
73  }
74  // Warning: does not check for going past end of "data"
75  void takeMidNoResize(QByteArray& dest, uint start, uint len) const
76  {
77  memmove( dest.data(), data.data() + pos + start, len );
78  }
79  void clear()
80  {
81  data.resize( 0 );
82  pos = 0;
83  }
84  uint length()
85  {
86  return data.size() - pos;
87  }
88  void fromString(const QString &s)
89  {
90  clear();
91  data = s.toLatin1();
92  }
93  QByteArray data;
94  int pos;
95 };
96 
97 class imapCache
98 {
99 public:
100  imapCache ()
101  {
102  myHeader = NULL;
103  mySize = 0;
104  myFlags = 0;
105  myUid = 0;
106  }
107 
108  ~imapCache ()
109  {
110  delete myHeader;
111  }
112 
113  mailHeader *getHeader ()
114  {
115  return myHeader;
116  }
117  void setHeader (mailHeader * inHeader)
118  {
119  myHeader = inHeader;
120  }
121 
122  ulong getSize ()
123  {
124  return mySize;
125  }
126  void setSize (ulong inSize)
127  {
128  mySize = inSize;
129  }
130 
131  ulong getUid ()
132  {
133  return myUid;
134  }
135  void setUid (ulong inUid)
136  {
137  myUid = inUid;
138  }
139 
140  ulong getFlags ()
141  {
142  return myFlags;
143  }
144  void setFlags (ulong inFlags)
145  {
146  myFlags = inFlags;
147  }
148 
149  QByteArray getDate ()
150  {
151  return myDate;
152  }
153  void setDate (const QByteArray & _str)
154  {
155  myDate = _str;
156  }
157  void clear()
158  {
159  delete myHeader;
160  myHeader = NULL;
161  mySize = 0;
162  myFlags = 0;
163  myDate = QByteArray();
164  myUid = 0;
165  }
166 
167 protected:
168  mailHeader * myHeader;
169  ulong mySize;
170  ulong myFlags;
171  ulong myUid;
172  QByteArray myDate;
173 };
174 
175 
176 class imapParser
177 {
178 
179 public:
180 
182  enum IMAP_STATE {
183  ISTATE_NO,
184  ISTATE_CONNECT,
185  ISTATE_LOGIN,
186  ISTATE_SELECT
187  };
188 
189 public:
190  imapParser ();
191  virtual ~ imapParser ();
192 
194  enum IMAP_STATE getState () { return currentState; }
196  void setState(enum IMAP_STATE state) { currentState = state; }
197 
198  /* @brief return the currently selected mailbox */
199  const QString getCurrentBox ()
200  {
201  return KIMAP::decodeImapFolderName( currentBox );
202  }
203 
209  CommandPtr sendCommand (CommandPtr aCmd);
215  CommandPtr doCommand (CommandPtr aCmd);
216 
217 
225  bool clientLogin (const QString & aUser, const QString & aPass, QString & resultInfo);
235  bool clientAuthenticate (KIO::SlaveBase *slave, KIO::AuthInfo &ai, const QString & aFQDN,
236  const QString & aAuth, bool isSSL, QString & resultInfo);
237 
242  int parseLoop ();
243 
248  void parseUntagged (parseString & result);
249 
251  void parseRecent (ulong value, parseString & result);
253  void parseResult (QByteArray & result, parseString & rest,
254  const QString & command = QString());
256  void parseCapability (parseString & result);
258  void parseFlags (parseString & result);
260  void parseList (parseString & result);
262  void parseLsub (parseString & result);
264  void parseListRights (parseString & result);
266  void parseMyRights (parseString & result);
268  void parseSearch (parseString & result);
270  void parseStatus (parseString & result);
272  void parseExists (ulong value, parseString & result);
274  void parseExpunge (ulong value, parseString & result);
276  void parseAcl (parseString & result);
278  void parseAnnotation (parseString & result);
280  void parseNamespace (parseString & result);
282  void parseQuotaRoot (parseString & result);
284  void parseQuota (parseString & result);
286  void parseCustom (parseString & result);
288  void parseOtherUser (parseString & result);
290  void parseDelegate (parseString & result);
292  void parseOutOfOffice (parseString & result);
293 
298  void parseFetch (ulong value, parseString & inWords);
299 
301  mailHeader *parseEnvelope (parseString & inWords);
303  void parseAddressList (parseString & inWords, QList<mailAddress *>& list);
305  const mailAddress& parseAddress (parseString & inWords, mailAddress& buffer);
306 
308  void parseBody (parseString & inWords);
309 
311  mimeHeader *parseBodyStructure (parseString & inWords,
312  QString & section, mimeHeader * inHeader = 0);
313 
315  mimeHeader *parseSimplePart (parseString & inWords, QString & section,
316  mimeHeader * localPart = 0);
317 
319  QHash< QByteArray, QString > parseParameters (parseString & inWords);
320 
325  QHash< QByteArray, QString > parseDisposition (parseString & inWords);
326 
327  // reimplement these
328 
330  virtual void parseRelay (const QByteArray & buffer);
331 
334  virtual void parseRelay (ulong);
335 
337  virtual bool parseRead (QByteArray & buffer, long len, long relay = 0);
338 
340  virtual bool parseReadLine (QByteArray & buffer, long relay = 0);
341 
343  virtual void parseWriteLine (const QString &);
344 
345  // generic parser routines
346 
348  void parseSentence (parseString & inWords);
349 
351  QByteArray parseLiteral(parseString & inWords, bool relay = false,
352  bool stopAtBracket = false);
353 
354  // static parser routines, can be used elsewhere
355 
357  static QByteArray parseOneWord (parseString & inWords,
358  bool stopAtBracket = false);
359 
361  static bool parseOneNumber (parseString & inWords, ulong & num);
362 
364  static void parseURL (const KUrl & _url, QString & _box, QString & _section,
365  QString & _type, QString & _uid, QString & _validity,
366  QString & _info);
367 
368 
372  imapCache *getLastHandled ()
373  {
374  return lastHandled;
375  }
376 
378  const QStringList & getResults ()
379  {
380  return lastResults;
381  }
382 
384  const imapInfo & getStatus ()
385  {
386  return lastStatus;
387  }
389  const imapInfo & getSelected ()
390  {
391  return selectInfo;
392  }
393 
394  const QByteArray & getContinuation ()
395  {
396  return continuation;
397  }
398 
400  bool hasCapability (const QString &);
401 
402  void removeCapability (const QString & cap);
403 
404  static inline void skipWS (parseString & inWords)
405  {
406  char c;
407  while ( !inWords.isEmpty() &&
408  ( ( c = inWords[0] ) == ' ' || c == '\t' || c == '\r' || c == '\n' ) ) {
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
QByteArray
mimeHeader
Definition: mimeheader.h:35
mailHeader
Definition: mailheader.h:33
QMap< QString, QString >
QByteArray::length
int length() const
QByteArray::resize
void resize(int size)
parseString
a string used during parsing the string allows you to move the effective start of the string using st...
Definition: imapparser.h:51
QByteArray::indexOf
int indexOf(char ch, int from) const
QHash
QString
QList< mailAddress * >
QStringList
QString::toLatin1
QByteArray toLatin1() const
QByteArray::data
char * data()
QByteArray::size
int size() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:37:08 by doxygen 1.8.7 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 API Reference

Skip menu "kdepimlibs API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2

Search



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