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 }