File indexing completed on 2024-09-22 04:52:48

0001 /* Copyright (C) 2006 - 2014 Jan Kundrát <jkt@flaska.net>
0002 
0003    This file is part of the Trojita Qt IMAP e-mail client,
0004    http://trojita.flaska.net/
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public License as
0008    published by the Free Software Foundation; either version 2 of
0009    the License or (at your option) version 3 or any later version
0010    accepted by the membership of KDE e.V. (or its successor approved
0011    by the membership of KDE e.V.), which shall act as a proxy
0012    defined in Section 14 of version 3 of the license.
0013 
0014    This program is distributed in the hope that it will be useful,
0015    but WITHOUT ANY WARRANTY; without even the implied warranty of
0016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017    GNU General Public License for more details.
0018 
0019    You should have received a copy of the GNU General Public License
0020    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0021 */
0022 #include <ctype.h>
0023 #include <QStringList>
0024 #include "Command.h"
0025 
0026 namespace Imap
0027 {
0028 namespace Commands
0029 {
0030 
0031 QTextStream &operator<<(QTextStream &stream, const Command &cmd)
0032 {
0033     for (QList<PartOfCommand>::const_iterator it = cmd.cmds.begin(); it != cmd.cmds.end(); ++it) {
0034         if (it != cmd.cmds.begin()) {
0035             stream << " ";
0036         }
0037         stream << *it;
0038     }
0039     return stream << Qt::endl;
0040 }
0041 
0042 TokenType howToTransmit(const QByteArray &str)
0043 {
0044     if (str.length() > 100)
0045         return LITERAL;
0046 
0047     if (str.isEmpty())
0048         return QUOTED_STRING;
0049 
0050     TokenType res = ATOM;
0051 
0052     for (int i = 0; i < str.size(); ++i) {
0053         char c = str.at(i);
0054 
0055         if (!isalnum(c) && c != '-' && c != '_')
0056             res = QUOTED_STRING;
0057 
0058         if (!isascii(c) || c == '\r' || c == '\n' || c == '\0' || c == '"') {
0059             return LITERAL;
0060         }
0061     }
0062     return res;
0063 }
0064 
0065 QTextStream &operator<<(QTextStream &stream, const PartOfCommand &part)
0066 {
0067     switch (part.kind) {
0068     case ATOM:
0069         stream << part.text;
0070         break;
0071     case QUOTED_STRING: {
0072         QByteArray item = part.text;
0073         item.replace('\\', "\\\\");
0074         stream << '"' << item << '"';
0075     }
0076     break;
0077     case LITERAL:
0078         stream << "{" << part.text.length() << "}" << Qt::endl << part.text;
0079         break;
0080     case IDLE:
0081         stream << "IDLE" << Qt::endl << "[Entering IDLE mode...]";
0082         break;
0083     case IDLE_DONE:
0084         stream << "DONE" << Qt::endl << "[Leaving IDLE mode...]";
0085         break;
0086     case STARTTLS:
0087         stream << "STARTTLS" << Qt::endl << "[Starting TLS...]";
0088         break;
0089     case COMPRESS_DEFLATE:
0090         stream << "COMPRESS DEFLATE" << Qt::endl << "[Starting deflate...]";
0091         break;
0092     case ATOM_NO_SPACE_AROUND:
0093         stream << part.text;
0094     }
0095     return stream;
0096 }
0097 
0098 }
0099 }