Closed
Bug 43221
Opened 24 years ago
Closed 24 years ago
POP mail search by Body doesn't work if the key string contains non-ASCII chars.
Categories
(MailNews Core :: Internationalization, defect, P3)
Tracking
(Not tracked)
VERIFIED
FIXED
M18
People
(Reporter: ji, Assigned: mozilla)
References
()
Details
(Keywords: intl, Whiteboard: [nsbeta2-][exception feature][nsbeta3-][cut 8/28])
Attachments
(4 files)
12.37 KB,
patch
|
Details | Diff | Splinter Review | |
11.61 KB,
patch
|
Details | Diff | Splinter Review | |
16.99 KB,
patch
|
Details | Diff | Splinter Review | |
27.25 KB,
text/plain
|
Details |
Build: 2000062009 commercial Steps of reproduce: 1. Unzip the smoketest folder shown at the above URL and put it in your mail directory. 2. Lauch Mail. 3. Select Search | Search All Mail 4. Select the smoketest folder as the target folder 5. Select Body from the search list. 6. Enter a non-ASCII string in the key string text field which is contained in the mail body of a mail in the smoketest folder. 7. Click on Search button, you'll see the mail which matches the search criteria is not listed.
Comment 1•24 years ago
|
||
is this the same as bug 43221? did you mean to file two duplicate bugs?
Status: NEW → ASSIGNED
Did you mean 42219? 42219 is for MIME header, and this one is for body.
Comment 3•24 years ago
|
||
Adding taka and jaimejr to cc.
Comment 4•24 years ago
|
||
Please nominate for NSBeta2+. Need to have search functionality in parity to Seamonkey US EN in the JA client, and v4.x. This is not a feature, it is a major bug that needs to be fixed. Naoki, please nominate this bug as nsbeta2.
Comment 6•24 years ago
|
||
I think this is alot of work for nsbeta2, and would recommend waiting on this one. Nominate for nsbeta3 because I think it should be in RTM.
Keywords: nsbeta3
Comment 7•24 years ago
|
||
Putting on [nsbeta2-] radar. Not critical to beta2. Adding "nsbeta3" keyword for consideration of a fix for that milestone.
Whiteboard: [nsbeta2-][exception feature]
Comment 8•24 years ago
|
||
I would like to say that I don't think this is an exception feature. I think this is just a bug in the way we do body searches.
Updated•24 years ago
|
Target Milestone: --- → M18
Comment 10•24 years ago
|
||
Per i18n/mail triage meeting, this bug is marked nsbeta3+.
Whiteboard: [nsbeta2-][exception feature] → [nsbeta2-][exception feature][nsbeta3+]
Comment 12•24 years ago
|
||
second pass: - per mail triage.
Whiteboard: [nsbeta2-][exception feature][nsbeta3+] → [nsbeta2-][exception feature][nsbeta3-][cut 8/28]
Comment 13•24 years ago
|
||
If you could please include us as part of the process when "cutting" bugs that we have all previously agreed should be plus, it would be greatly appreciated. I know, tough calls have to be made to hold the right glide, but we'd like to be part of the discussion, when it comes to cutting bugs that affect I18N users. Actions like this are deflating to our team, when we spent time to traige, nominate, and gain consensus with MailNews on the "bare minimum" ( i think it was 6 bugs) that needed to be fixed. <]8^(
Comment 15•24 years ago
|
||
Alec, can taka take this bug?
Comment 17•24 years ago
|
||
As I mentioned, taka can work on this (he fixed local header search before). David, is that okay to assign this to taka?
Assignee | ||
Comment 19•24 years ago
|
||
Index: nsMsgSearchTerm.cpp =================================================================== RCS file: /cvsroot/mozilla/mailnews/base/search/src/nsMsgSearchTerm.cpp,v retrieving revision 1.55 diff -u -r1.55 nsMsgSearchTerm.cpp --- nsMsgSearchTerm.cpp 2000/08/16 23:19:51 1.55 +++ nsMsgSearchTerm.cpp 2001/01/05 07:18:26 @@ -701,14 +701,6 @@ PRBool endOfFile = PR_FALSE; // if retValue == 0, we've hit the end of the file uint32 lines = 0; - PRBool getConverter = PR_FALSE; -#ifdef DO_I18N - CCCDataObject conv = INTL_CreateCharCodeConverter(); - PRInt16 win_csid = INTL_DocToWinCharSetID(foldcsid); - PRInt16 mail_csid = INTL_DefaultMailCharSetID(win_csid); // to default mail_csid (e.g. JIS for Japanese) - if ((nsnull != conv) && INTL_GetCharCodeConverter(mail_csid, win_csid, conv)) - getConverter = PR_TRUE; -#endif // DO_I18N // Change the sense of the loop so we don't bail out prematurely // on negative terms. i.e. opDoesntContain must look at all lines PRBool boolContinueLoop; @@ -733,27 +725,13 @@ // Do in-place decoding of quoted printable if (isQuotedPrintable) StripQuotedPrintable ((unsigned char*)buf); - - nsCString compare(buf); - if (getConverter) - { -#ifdef DO_I18N - // In here we do I18N conversion if we get the converter - char *newBody = nsnull; - newBody = (char *)INTL_CallCharCodeConverter(conv, (unsigned char *) buf, (int32) PL_strlen(buf)); - if (newBody && (newBody != buf)) - { - // CharCodeConverter return the char* to the orginal string - // we don't want to free body in that case - compare = newBody; - } -#endif - } + nsCString compare(buf); +// ConvertToUnicode(charset, buf, compare); if (compare.Length() > 0) { char startChar = (char) compare.CharAt(0); if (startChar != CR && startChar != LF) { - err = MatchString (compare, nsnull, &result); + err = MatchString (compare, folderCharset, &result); lines++; } } @@ -816,75 +794,80 @@ nsresult err = NS_OK; nsCAutoString n_str; - const char* n_header = nsnull; + const char *utf8 = stringToMatch; if(nsMsgSearchOp::IsEmpty != m_operator) // Save some performance for opIsEmpty { - n_header = stringToMatch; n_str = m_value.string; + nsAutoString srcCharset; + srcCharset.AssignWithConversion(charset); + nsString out; + ConvertToUnicode(srcCharset, stringToMatch ? stringToMatch : "", out); + utf8 = out.ToNewUTF8String(); } + switch (m_operator) { case nsMsgSearchOp::Contains: - if ((nsnull != n_header) && ((n_str.GetBuffer())[0]) && /* INTL_StrContains(csid, n_header, n_str) */ - PL_strcasestr(stringToMatch, n_str)) + if ((nsnull != utf8) && ((n_str.GetBuffer())[0]) && /* INTL_StrContains(csid, n_header, n_str) */ + PL_strcasestr(utf8, n_str)) result = PR_TRUE; break; case nsMsgSearchOp::DoesntContain: - if ((nsnull != n_header) && ((n_str.GetBuffer())[0]) && /* !INTL_StrContains(csid, n_header, n_str) */ - !PL_strcasestr(stringToMatch, n_str)) + if ((nsnull != utf8) && ((n_str.GetBuffer())[0]) && /* !INTL_StrContains(csid, n_header, n_str) */ + !PL_strcasestr(utf8, n_str)) result = PR_TRUE; break; case nsMsgSearchOp::Is: - if(n_header) + if(utf8) { if ((n_str.GetBuffer())[0]) { - if (n_str.EqualsWithConversion(stringToMatch, PR_TRUE /*ignore case*/) /* INTL_StrIs(csid, n_header, n_str)*/ ) + if (n_str.EqualsWithConversion(utf8, PR_TRUE /*ignore case*/) /* INTL_StrIs(csid, n_header, n_str)*/ ) result = PR_TRUE; } - else if (n_header[0] == '\0') // Special case for "is <the empty string>" + else if (utf8[0] == '\0') // Special case for "is <the empty string>" result = PR_TRUE; } break; case nsMsgSearchOp::Isnt: - if(n_header) + if(utf8) { if ((n_str.GetBuffer())[0]) { - if (!n_str.EqualsWithConversion(stringToMatch, PR_TRUE)/* INTL_StrIs(csid, n_header, n_str)*/ ) + if (!n_str.EqualsWithConversion(utf8, PR_TRUE)/* INTL_StrIs(csid, n_header, n_str)*/ ) result = PR_TRUE; } - else if (n_header[0] != '\0') // Special case for "isn't <the empty string>" + else if (utf8[0] != '\0') // Special case for "isn't <the empty string>" result = PR_TRUE; } break; case nsMsgSearchOp::IsEmpty: - if (!PL_strlen(stringToMatch)) + if (!PL_strlen(utf8)) result = PR_TRUE; break; case nsMsgSearchOp::BeginsWith: #ifdef DO_I18N_YET - if((nsnull != n_str) && (nsnull != n_header) && INTL_StrBeginWith(csid, n_header, n_str)) + if((nsnull != n_str) && (nsnull != utf8) && INTL_StrBeginWith(csid, utf8, n_str)) result = PR_TRUE; #else // ### DMB - not the most efficient way to do this. - if (PL_strncmp(stringToMatch, n_str, PL_strlen(n_str)) == 0) + if (PL_strncmp(utf8, n_str, PL_strlen(n_str)) == 0) result = PR_TRUE; #endif break; case nsMsgSearchOp::EndsWith: { - PRUint32 searchStrLen = (PRUint32) PL_strlen(stringToMatch); + PRUint32 searchStrLen = (PRUint32) PL_strlen(utf8); if (n_str.Length() <= searchStrLen) { PRInt32 sourceStrOffset = searchStrLen - n_str.Length(); - if (PL_strcmp(stringToMatch + sourceStrOffset, n_str) == 0) + if (PL_strcmp(utf8 + sourceStrOffset, n_str) == 0) result = PR_TRUE; } } #ifdef DO_I18N_YET { - if((nsnull != n_str) && (nsnull != n_header) && INTL_StrEndWith(csid, n_header, n_str)) + if((nsnull != n_str) && (nsnull != utf8) && INTL_StrEndWith(csid, utf8, n_str)) result = PR_TRUE; } #else @@ -894,6 +877,9 @@ default: NS_ASSERTION(PR_FALSE, "invalid operator matching search results"); } + + if (utf8 != nsnull && utf8 != stringToMatch) + free((void *)utf8); *pResult = result; return err; Index: nsMsgSearchAdapter.cpp =================================================================== RCS file: /cvsroot/mozilla/mailnews/base/search/src/nsMsgSearchAdapter.cpp,v retrieving revision 1.27 diff -u -r1.27 nsMsgSearchAdapter.cpp --- nsMsgSearchAdapter.cpp 2000/09/22 02:52:11 1.27 +++ nsMsgSearchAdapter.cpp 2001/01/05 07:18:28 @@ -137,73 +137,6 @@ char * -nsMsgSearchAdapter::TryToConvertCharset(const PRUnichar *sourceStr, - const PRUnichar * destCharset, - PRBool useMime2) -{ - char *result = nsnull; - - if (sourceStr == nsnull) - return nsnull; - - // Convert from unicode to a destination charset. - if (NS_FAILED(ConvertFromUnicode(nsAutoString(destCharset), nsAutoString(sourceStr), &result))) { - PR_FREEIF(result); - result = nsnull; - } - -#ifdef DO_I18N // I have no idea what we should do here. - if ((src_csid != dest_csid) || (useMime2)) - { - // Need to convert. See if we can. - - // ### mwelch Much of this code is lifted from - // lib/libi18n/mime2fun.c (in particular, - // intl_EncodeMimePartIIStr). - CCCDataObject obj = nsnull; - CCCFunc cvtfunc = nsnull; - int srcLen = XP_STRLEN(sourceStr); - - obj = INTL_CreateCharCodeConverter(); - if (obj == nsnull) - return 0; - - /* setup converter from src_csid --> dest_csid */ -
Status: NEW → ASSIGNED
Assignee | ||
Comment 20•24 years ago
|
||
Do I have to ask somebody to review the code above?
Comment 21•24 years ago
|
||
you need to get two people to review this (one of them is me). You should also indicate what kind of testing you've done (e.g., have you tested pop mail filters that work on message bodies)
Assignee | ||
Comment 22•24 years ago
|
||
I've done local search for message body using Japanese string. No filter testing is done since this was search bug.
Comment 23•24 years ago
|
||
filters use the search backend to evaluate filter conditions.
Comment 24•24 years ago
|
||
I do not see UI for filtering by message body. Is there a way to test it?
Comment 25•24 years ago
|
||
Were you looking at an imap server or a pop3 server? As I indicated before, but did not emphasize(sorry), body applies to a pop3 server message filter.
Comment 26•24 years ago
|
||
Sorry, I was looking at imap filters. Taka, please test your patch for pop fileter.
Assignee | ||
Comment 27•24 years ago
|
||
Assignee | ||
Comment 28•24 years ago
|
||
the attached patch above is a better version of previous one. tested both body search and POP3 filter for several Japanese string. the current code doesn't recognize MIME multi-part body. I use nsMsgI18NGetDefaultMailCharset() if msgToMatch->GetCharset() in nsMsgSearchOfflineMail::MatchTerms() doesn't give any, so that text/* in multi-part messages can be searched as well. Naoki-san, I believe, nsMsgI18NGetDefaultMailCharset() should read "mailnews.view_default_charset" instead of "mailnews.send_default_charset".
Comment 29•24 years ago
|
||
I filed the default charset issue separately as bug 64781.
Comment 30•24 years ago
|
||
Taka, please get reviewes from bienvenu and mscott to checkin.
Comment 31•24 years ago
|
||
sr=bienvenu. While you're at it, do you think you could clean out the obsolete, iffdeffed out i18n code, and remove the comments of the form /* INTL... */ that reference the old routines. Now that you've fixed this (thanks a lot!, by the way) we don't need those comments.
Assignee | ||
Comment 32•24 years ago
|
||
Assignee | ||
Comment 33•24 years ago
|
||
Comment 34•24 years ago
|
||
I'm really not happy with the Recycle((char *)) ... part of nsMsgSearchOfflineMail::MatchTerm(). Is that really the correct useage? I've never seen it used on nsXPIDLCStrings before, and I don't like the cast. Other than that, it looks OK.
Comment 35•24 years ago
|
||
Couple comments 1) why do we define const char * charset twice in ::MatchTerms? 2) the declaration of charset looks fishy here...if charset is declared as a const char * why would it's value ever be freed? That seems very strange. It shouldn't be const if it's something that needs freed. 3) I'm worried about the deletion of memory for the charset string. It seems to be pointing inside the buffer for the XPIDLString: msgCharset. If that's the case, then it's going to get deleted when the idl string gets destroyed. Seems like we'd be double deleting it if you call Recycle on that buffer as well. Or am I just confused because it's declared twice?
Assignee | ||
Comment 36•24 years ago
|
||
Assignee | ||
Comment 37•24 years ago
|
||
attached whole nsMsgLocalSearch.cpp since diff didn't seem to work correctly.
Comment 38•24 years ago
|
||
OK, Scott and I misread the diffs, and thought the Recycle line was in MatchTerms, not Search. My apologies for that. However, doing that cast and Recycle still seems wrong. again, sorry, I misread the diffs - it's impossible to read all diffs correctly without a visual tool like pmdiff - perhaps I should go back to using that.) sr=bienvenu.
Comment 39•24 years ago
|
||
I guess this didn't get through before : sr=bienvenu
Comment 40•24 years ago
|
||
> 2) the declaration of charset looks fishy here...if charset is declared as a
> const char * why would it's value ever be freed? That seems very strange. It
> shouldn't be const if it's something that needs freed.
* I have the same question as mscott, declared and freed in
nsMsgSearchOfflineMail::Search.
* Please check return value of charset conversion. Please change them like below.
+
ConvertToUnicode(srcCharset, stringToMatch ? stringToMatch : "", out);
+
utf8 = out.ToNewUTF8String();
err = ConvertToUnicode(srcCharset, stringToMatch ? stringToMatch : "", out);
if (NS_SUCCEEDED(err))
utf8 = out.ToNewUTF8String();
+
ConvertFromUnicode(nsAutoString(convertedValue), nsAutoString(destCharset), &value);
if (value)
err = ConvertFromUnicode(nsAutoString(convertedValue),
nsAutoString(destCharset), &value);
if (NS_SUCCEEDED(err))
Comment 41•24 years ago
|
||
Sorry, I did not realized that 01/18/01 20:28 attachment changed nsMsgSearchOfflineMail::Search. r=nhotta, please change to check return value of conversions, there are possible conversion errors since the code reagards all the messages use folder charset, in case of conversion error, we at least want to search ASCII strings.
Assignee | ||
Comment 42•24 years ago
|
||
checked in. r=nhotta, a=sr=bienvenu mark as fixed.
Status: ASSIGNED → RESOLVED
Closed: 24 years ago
Resolution: --- → FIXED
Reporter | ||
Comment 43•24 years ago
|
||
Verified with win32 and linux 2001-02-12-06-mtrunk builds. It is fixed. Problem about mail body search in a subfolder is described in bug 68630.
Status: RESOLVED → VERIFIED
Updated•20 years ago
|
Product: MailNews → Core
Updated•16 years ago
|
Product: Core → MailNews Core
You need to log in
before you can comment on or make changes to this bug.
Description
•