/** * @file operator-unsubscribe.cc * @brief Implementation of the UNSUBSCRIBE command. * @author Andreas Aardal Hanssen * @date 2002-2005 */ #include "convert.h" #include "depot.h" #include "operators.h" #include "recursivedescent.h" #include "session.h" #include #include #include #include using namespace Binc; using std::string; UnsubscribeOperator::UnsubscribeOperator() {} UnsubscribeOperator::~UnsubscribeOperator() {} const string UnsubscribeOperator::getName() const { return "UNSUBSCRIBE"; } Session::State UnsubscribeOperator::getState() const { return Session::State(Session::AUTHENTICATED | Session::SELECTED); } Operator::ProcessResult UnsubscribeOperator::process(Depot &depot, Request &command) { const string &mailbox = command.getMailbox(); const string &canonmailbox = toCanonMailbox(mailbox); depot.loadSubscribes(); if (!depot.unsubscribeTo(canonmailbox)) { Session &session = Session::getInstance(); session.setLastError("Not subscribed to " + toImapString(mailbox)); return ProcessResult::NO; } depot.saveSubscribes(); return ProcessResult::OK; } Parser::ParseResult UnsubscribeOperator::parse(Request &c_in, Parser &p) { Session &session = Session::getInstance(); if (c_in.getUidMode()) return Parser::ParseResult::REJECT; Parser::ParseResult res; if ((res = p.expectSPACE()) != Parser::ParseResult::ACCEPT) { session.setLastError("Expected SPACE"); return res; } string mailbox; if ((res = p.expectMailbox(mailbox)) != Parser::ParseResult::ACCEPT) { session.setLastError("Expected mailbox"); return res; } if ((res = p.expectCRLF()) != Parser::ParseResult::ACCEPT) { session.setLastError("Expected CRLF"); return res; } c_in.setMailbox(mailbox); return Parser::ParseResult::ACCEPT; }