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();
}
}