#include "__IMAP_STATUS.h" #include "IMAPArgs.h" #include "IMAPServer.h" #include "MailFolder.h" #include namespace mail { int __IMAP_STATUS::processCommand(coreutils::ZString &request, IMAPSession &session, IMAPServer &server) { if (session.state == IMAPSession::NOT_AUTHENTICATED) { session.out << session.tag << " NO Not authenticated" << CRLF; return 1; } coreutils::ZString nameArg = IMAPArgs::nextArgument(request); coreutils::ZString itemsArg = IMAPArgs::nextArgument(request); std::string folderName = IMAPArgs::normalizeFolderName(IMAPArgs::unwrap(nameArg)); std::string itemsText = IMAPArgs::unwrap(itemsArg); coreutils::ZString userNameZ(session.userName); if (!IMAPArgs::isValidFolderName(folderName) || !server.mailFileSystem.ifFolderExists(userNameZ, folderName)) { session.out << session.tag << " NO Mailbox does not exist" << CRLF; return 1; } MailFolder folder; folder.load(server.mailFileSystem.getFolderPath(userNameZ, folderName).str()); std::istringstream itemStream(itemsText); std::string item; std::ostringstream reply; bool first = true; while (itemStream >> item) { if (!first) reply << " "; first = false; std::string upper = item; for (char &c : upper) c = std::toupper((unsigned char)c); if (upper == "MESSAGES") reply << "MESSAGES " << (int)folder.size(); else if (upper == "RECENT") reply << "RECENT " << (int)folder.recentCount(); else if (upper == "UIDNEXT") reply << "UIDNEXT " << (int)folder.uidNext(); else if (upper == "UIDVALIDITY") reply << "UIDVALIDITY " << (int)folder.uidValidity(); else if (upper == "UNSEEN") reply << "UNSEEN " << (int)folder.unseenCount(); else first = true; // unrecognized item - skip without leaving a dangling separator } session.out << "* STATUS \"" << folderName << "\" (" << reply.str() << ")" << CRLF; session.out << session.tag << " OK STATUS completed" << CRLF; return 1; } }