void nsImapServerResponseParser::response_data()

in mailnews/imap/src/nsImapServerResponseParser.cpp [454:657]


void nsImapServerResponseParser::response_data() {
  AdvanceToNextToken();

  if (ContinueParse()) {
    // Instead of comparing lots of strings and make function calls, try to
    // pre-flight the possibilities based on the first letter of the token.
    switch (NS_ToUpper(fNextToken[0])) {
      case 'O':  // OK
        if (NS_ToUpper(fNextToken[1]) == 'K')
          resp_cond_state(false);
        else
          SetSyntaxError(true);
        break;
      case 'N':  // NO
        if (NS_ToUpper(fNextToken[1]) == 'O')
          resp_cond_state(false);
        else if (!PL_strcasecmp(fNextToken, "NAMESPACE"))
          namespace_data();
        else
          SetSyntaxError(true);
        break;
      case 'B':  // BAD
        if (!PL_strcasecmp(fNextToken, "BAD"))
          resp_cond_state(false);
        else if (!PL_strcasecmp(fNextToken, "BYE"))
          resp_cond_bye();
        else
          SetSyntaxError(true);
        break;
      case 'F':
        if (!PL_strcasecmp(fNextToken, "FLAGS"))
          mailbox_data();
        else
          SetSyntaxError(true);
        break;
      case 'P':
        if (PL_strcasecmp(fNextToken, "PERMANENTFLAGS"))
          mailbox_data();
        else
          SetSyntaxError(true);
        break;
      case 'L':
        if (!PL_strcasecmp(fNextToken, "LIST") ||
            !PL_strcasecmp(fNextToken, "LSUB"))
          mailbox_data();
        else if (!PL_strcasecmp(fNextToken, "LANGUAGE"))
          language_data();
        else
          SetSyntaxError(true);
        break;
      case 'M':
        if (!PL_strcasecmp(fNextToken, "MAILBOX"))
          mailbox_data();
        else if (!PL_strcasecmp(fNextToken, "MYRIGHTS"))
          myrights_data(false);
        else
          SetSyntaxError(true);
        break;
      case 'S':
        if (!PL_strcasecmp(fNextToken, "SEARCH"))
          mailbox_data();
        else if (!PL_strcasecmp(fNextToken, "STATUS")) {
          AdvanceToNextToken();
          if (fNextToken) {
            char* mailboxName = CreateAstring();
            PL_strfree(mailboxName);
          }
          while (ContinueParse() && !fAtEndOfLine) {
            AdvanceToNextToken();
            if (!fNextToken) break;

            if (*fNextToken == '(') fNextToken++;
            if (!PL_strcasecmp(fNextToken, "UIDNEXT")) {
              AdvanceToNextToken();
              if (fNextToken) {
                fStatusNextUID = strtoul(fNextToken, nullptr, 10);
                // if this token ends in ')', then it is the last token
                // else we advance
                if (*(fNextToken + strlen(fNextToken) - 1) == ')')
                  fNextToken += strlen(fNextToken) - 1;
              }
            } else if (!PL_strcasecmp(fNextToken, "MESSAGES")) {
              AdvanceToNextToken();
              if (fNextToken) {
                fStatusExistingMessages = strtoul(fNextToken, nullptr, 10);
                // if this token ends in ')', then it is the last token
                // else we advance
                if (*(fNextToken + strlen(fNextToken) - 1) == ')')
                  fNextToken += strlen(fNextToken) - 1;
              }
            } else if (!PL_strcasecmp(fNextToken, "UNSEEN")) {
              AdvanceToNextToken();
              if (fNextToken) {
                fStatusUnseenMessages = strtoul(fNextToken, nullptr, 10);
                // if this token ends in ')', then it is the last token
                // else we advance
                if (*(fNextToken + strlen(fNextToken) - 1) == ')')
                  fNextToken += strlen(fNextToken) - 1;
              }
            } else if (!PL_strcasecmp(fNextToken, "RECENT")) {
              AdvanceToNextToken();
              if (fNextToken) {
                fStatusRecentMessages = strtoul(fNextToken, nullptr, 10);
                // if this token ends in ')', then it is the last token
                // else we advance
                if (*(fNextToken + strlen(fNextToken) - 1) == ')')
                  fNextToken += strlen(fNextToken) - 1;
              }
            } else if (*fNextToken == ')')
              break;
            else if (!fAtEndOfLine)
              SetSyntaxError(true);
          }
        } else
          SetSyntaxError(true);
        break;
      case 'C':
        if (!PL_strcasecmp(fNextToken, "CAPABILITY"))
          capability_data();
        else
          SetSyntaxError(true);
        break;
      case 'V':
        if (!PL_strcasecmp(fNextToken, "VERSION")) {
          // figure out the version of the Netscape server here
          PR_FREEIF(fNetscapeServerVersionString);
          AdvanceToNextToken();
          if (!fNextToken)
            SetSyntaxError(true);
          else {
            fNetscapeServerVersionString = CreateAstring();
            AdvanceToNextToken();
            if (fNetscapeServerVersionString) {
              fServerIsNetscape3xServer =
                  (*fNetscapeServerVersionString == '3');
            }
          }
          skip_to_CRLF();
        } else
          SetSyntaxError(true);
        break;
      case 'A':
        if (!PL_strcasecmp(fNextToken, "ACL")) {
          acl_data();
        } else if (!PL_strcasecmp(fNextToken, "ACCOUNT-URL")) {
          fMailAccountUrl.Truncate();
          AdvanceToNextToken();
          if (!fNextToken)
            SetSyntaxError(true);
          else {
            fMailAccountUrl.Adopt(CreateAstring());
            AdvanceToNextToken();
          }
        } else
          SetSyntaxError(true);
        break;
      case 'E':
        if (!PL_strcasecmp(fNextToken, "ENABLED")) enable_data();
        break;
      case 'X':
        if (!PL_strcasecmp(fNextToken, "XSERVERINFO"))
          xserverinfo_data();
        else if (!PL_strcasecmp(fNextToken, "XMAILBOXINFO"))
          xmailboxinfo_data();
        else if (!PL_strcasecmp(fNextToken, "XLIST"))
          mailbox_data();
        else {
          // check if custom command
          nsAutoCString customCommand;
          fServerConnection.GetCurrentUrl()->GetCommand(customCommand);
          if (customCommand.Equals(fNextToken)) {
            nsAutoCString customCommandResponse;
            while (Connected() && !fAtEndOfLine) {
              AdvanceToNextToken();
              customCommandResponse.Append(fNextToken);
              customCommandResponse.Append(' ');
            }
            fServerConnection.GetCurrentUrl()->SetCustomCommandResult(
                customCommandResponse);
          } else
            SetSyntaxError(true);
        }
        break;
      case 'Q':
        if (!PL_strcasecmp(fNextToken, "QUOTAROOT") ||
            !PL_strcasecmp(fNextToken, "QUOTA"))
          quota_data();
        else
          SetSyntaxError(true);
        break;
      case 'I':
        id_data();
        break;
      default:
        if (IsNumericString(fNextToken))
          numeric_mailbox_data();
        else
          SetSyntaxError(true);
        break;
    }

    if (ContinueParse()) PostProcessEndOfLine();
  }
}