fix 243625 imap search on non-7bit ascii chars

git-svn-id: svn://10.0.0.236/branches/AVIARY_1_0_20040515_BRANCH@158412 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bienvenu%nventure.com
2004-06-24 16:11:51 +00:00
parent 4b70115eb6
commit e2491daa68
3 changed files with 73 additions and 49 deletions

View File

@@ -111,55 +111,55 @@ nsresult nsMsgSearchOnlineMail::Encode (nsCString& pEncoding,
nsISupportsArray *searchTerms,
const PRUnichar *destCharset)
{
nsXPIDLCString imapTerms;
//check if searchTerms are ascii only
PRBool asciiOnly = PR_TRUE;
nsXPIDLCString imapTerms;
//check if searchTerms are ascii only
PRBool asciiOnly = PR_TRUE;
// ### what's this mean in the NWO?????
if (PR_TRUE) // !(srcCharset & CODESET_MASK == STATEFUL || srcCharset & CODESET_MASK == WIDECHAR) ) //assume all single/multiple bytes charset has ascii as subset
{
PRUint32 termCount;
if (PR_TRUE) // !(srcCharset & CODESET_MASK == STATEFUL || srcCharset & CODESET_MASK == WIDECHAR) ) //assume all single/multiple bytes charset has ascii as subset
{
PRUint32 termCount;
searchTerms->Count(&termCount);
PRUint32 i = 0;
for (i = 0; i < termCount && asciiOnly; i++)
{
PRUint32 i = 0;
for (i = 0; i < termCount && asciiOnly; i++)
{
nsCOMPtr<nsIMsgSearchTerm> pTerm;
searchTerms->QueryElementAt(i, NS_GET_IID(nsIMsgSearchTerm),
(void **)getter_AddRefs(pTerm));
(void **)getter_AddRefs(pTerm));
nsMsgSearchAttribValue attribute;
pTerm->GetAttrib(&attribute);
if (IsStringAttribute(attribute))
{
if (IsStringAttribute(attribute))
{
nsXPIDLString pchar;
nsCOMPtr <nsIMsgSearchValue> searchValue;
nsresult rv = pTerm->GetValue(getter_AddRefs(searchValue));
if (NS_FAILED(rv) || !searchValue)
continue;
rv = searchValue->GetStr(getter_Copies(pchar));
if (NS_FAILED(rv) || !pchar)
continue;
if (NS_FAILED(rv) || !pchar)
continue;
asciiOnly = nsCRT::IsAscii(pchar.get());
}
}
}
else
asciiOnly = PR_FALSE;
}
}
}
else
asciiOnly = PR_FALSE;
nsAutoString usAsciiCharSet(NS_LITERAL_STRING("us-ascii"));
// Get the optional CHARSET parameter, in case we need it.
// Get the optional CHARSET parameter, in case we need it.
char *csname = GetImapCharsetParam(asciiOnly ? usAsciiCharSet.get() : destCharset);
// We do not need "srcCharset" since the search term in always unicode.
// I just pass destCharset for both src and dest charset instead of removing srcCharst from the arguemnt.
nsresult err = nsMsgSearchAdapter::EncodeImap (getter_Copies(imapTerms), searchTerms,
asciiOnly ? usAsciiCharSet.get(): destCharset,
asciiOnly ? usAsciiCharSet.get(): destCharset, PR_FALSE);
asciiOnly ? usAsciiCharSet.get(): destCharset,
asciiOnly ? usAsciiCharSet.get(): destCharset, PR_FALSE);
if (NS_SUCCEEDED(err))
{
pEncoding.Append("SEARCH");

View File

@@ -641,7 +641,7 @@ nsresult nsMsgSearchAdapter::EncodeImapTerm (nsIMsgSearchTerm *term, PRBool real
int len = strlen(whichMnemonic) + strlen(value) + (useNot ? strlen(m_kImapNot) : 0) +
(useQuotes ? 2 : 0) + strlen(m_kImapHeader) +
(orHeaderMnemonic ? (strlen(m_kImapHeader) + strlen(m_kImapOr) + (useNot ? strlen(m_kImapNot) : 0) +
strlen(orHeaderMnemonic) + strlen(value) + 2 /*""*/) : 0) + 1;
strlen(orHeaderMnemonic) + strlen(value) + 2 /*""*/) : 0) + 10;
char *encoding = new char[len];
if (encoding)
{
@@ -687,24 +687,33 @@ nsresult nsMsgSearchAdapter::EncodeImapTerm (nsIMsgSearchTerm *term, PRBool real
nsresult nsMsgSearchAdapter::EncodeImapValue(char *encoding, const char *value, PRBool useQuotes, PRBool reallyDredd)
{
// By NNTP RFC, SEARCH HEADER SUBJECT "" is legal and means 'find messages without a subject header'
if (!reallyDredd)
{
// By IMAP RFC, SEARCH HEADER SUBJECT "" is illegal and will generate an error from the server
if (!value || !value[0])
return NS_ERROR_NULL_POINTER;
}
if (useQuotes)
PL_strcat(encoding, "\"");
PL_strcat (encoding, value);
if (useQuotes)
PL_strcat(encoding, "\"");
return NS_OK;
// By NNTP RFC, SEARCH HEADER SUBJECT "" is legal and means 'find messages without a subject header'
if (!reallyDredd)
{
// By IMAP RFC, SEARCH HEADER SUBJECT "" is illegal and will generate an error from the server
if (!value || !value[0])
return NS_ERROR_NULL_POINTER;
}
if (!nsCRT::IsAscii(value))
{
nsCAutoString lengthStr;
PL_strcat(encoding, "{");
lengthStr.AppendInt((PRInt32) strlen(value));
PL_strcat(encoding, lengthStr.get());
PL_strcat(encoding, "}"CRLF);
PL_strcat(encoding, value);
return NS_OK;
}
if (useQuotes)
PL_strcat(encoding, "\"");
PL_strcat (encoding, value);
if (useQuotes)
PL_strcat(encoding, "\"");
return NS_OK;
}
nsresult nsMsgSearchAdapter::EncodeImap (char **ppOutEncoding, nsISupportsArray *searchTerms, const PRUnichar *srcCharset, const PRUnichar *destCharset, PRBool reallyDredd)
{
// i've left the old code (before using CBoolExpression for debugging purposes to make sure that

View File

@@ -6860,9 +6860,24 @@ void nsImapProtocol::Search(const char * searchCriteria,
protocolString.Append(" uid");
protocolString.Append(" ");
protocolString.Append(searchCriteria);
// the search criteria can contain string literals, which means we
// need to break up the protocol string by CRLF's, and after sending CRLF,
// wait for the server to respond OK before sending more data
nsresult rv;
PRInt32 crlfIndex;
while (crlfIndex = protocolString.Find(CRLF), crlfIndex != kNotFound && !DeathSignalReceived())
{
nsCAutoString tempProtocolString;
protocolString.Left(tempProtocolString, crlfIndex + 2);
rv = SendData(tempProtocolString.get());
if (NS_FAILED(rv))
return;
ParseIMAPandCheckForNewMail();
protocolString.Cut(0, crlfIndex + 2);
}
protocolString.Append(CRLF);
nsresult rv = SendData(protocolString.get());
rv = SendData(protocolString.get());
if (NS_SUCCEEDED(rv))
ParseIMAPandCheckForNewMail();
}