#include "__IMAP_COPY.h" #include "IMAPArgs.h" #include "IMAPServer.h" namespace mail { int copyImpl(coreutils::ZString &request, IMAPSession &session, IMAPServer &server, bool uidMode) { if (session.state != IMAPSession::SELECTED) { session.out << session.tag << " NO No mailbox selected" << CRLF; return 1; } std::vector uids = IMAPArgs::parseSequenceSet(request, session.mailbox, uidMode); coreutils::ZString nameArg = IMAPArgs::nextArgument(request); std::string destName = IMAPArgs::normalizeFolderName(IMAPArgs::unwrap(nameArg)); coreutils::ZString userNameZ(session.userName); if (!IMAPArgs::isValidFolderName(destName) || !server.mailFileSystem.ifFolderExists(userNameZ, destName)) { session.out << session.tag << " NO [TRYCREATE] Destination mailbox does not exist" << CRLF; return 1; } MailFolder destination; destination.load(server.mailFileSystem.getFolderPath(userNameZ, destName).str()); for (uint32_t uid : uids) { MailFolder::Message *message = session.mailbox.find(uid); if (!message) continue; destination.append(session.mailbox.readMessage(uid), message->flags, message->internalDate); } if (session.state == IMAPSession::SELECTED && session.selectedFolderName == destName) session.mailbox = destination; session.out << session.tag << " OK " << (uidMode ? "UID COPY" : "COPY") << " completed" << CRLF; return 1; } int __IMAP_COPY::processCommand(coreutils::ZString &request, IMAPSession &session, IMAPServer &server) { return copyImpl(request, session, server, false); } }