mirror of https://github.com/M66B/FairEmail.git
Fixed UTF-8 search
This commit is contained in:
parent
eca46c49ba
commit
0f14ee0fd2
|
@ -38,10 +38,12 @@ import com.sun.mail.imap.IMAPMessage;
|
||||||
import com.sun.mail.imap.IMAPStore;
|
import com.sun.mail.imap.IMAPStore;
|
||||||
import com.sun.mail.imap.protocol.IMAPProtocol;
|
import com.sun.mail.imap.protocol.IMAPProtocol;
|
||||||
import com.sun.mail.imap.protocol.IMAPResponse;
|
import com.sun.mail.imap.protocol.IMAPResponse;
|
||||||
|
import com.sun.mail.imap.protocol.SearchSequence;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.Normalizer;
|
import java.text.Normalizer;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -386,28 +388,53 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback<TupleMe
|
||||||
} else {
|
} else {
|
||||||
Log.i("Boundary server search=" + criteria);
|
Log.i("Boundary server search=" + criteria);
|
||||||
|
|
||||||
boolean utf8 = protocol.supportsUtf8();
|
try {
|
||||||
|
if (protocol.supportsUtf8())
|
||||||
|
return (Message[]) state.ifolder.doCommand(new IMAPFolder.ProtocolCommand() {
|
||||||
|
@Override
|
||||||
|
public Object doCommand(IMAPProtocol protocol) throws ProtocolException {
|
||||||
|
SearchTerm terms = criteria.getTerms(
|
||||||
|
true,
|
||||||
|
state.ifolder.getPermanentFlags(),
|
||||||
|
browsable.keywords);
|
||||||
|
|
||||||
|
try {
|
||||||
|
SearchSequence ss = new SearchSequence(protocol);
|
||||||
|
Argument args = ss.generateSequence(terms, StandardCharsets.UTF_8.name());
|
||||||
|
args.writeAtom("ALL");
|
||||||
|
|
||||||
|
Response[] responses = protocol.command("SEARCH", args);
|
||||||
|
if (responses.length == 0)
|
||||||
|
throw new ProtocolException("No response");
|
||||||
|
if (!responses[responses.length - 1].isOK())
|
||||||
|
throw new ProtocolException(responses[responses.length - 1]);
|
||||||
|
|
||||||
|
List<Integer> msgnums = new ArrayList<>();
|
||||||
|
for (Response response : responses)
|
||||||
|
if (((IMAPResponse) response).keyEquals("SEARCH")) {
|
||||||
|
int msgnum;
|
||||||
|
while ((msgnum = response.readNumber()) != -1)
|
||||||
|
msgnums.add(msgnum);
|
||||||
|
}
|
||||||
|
Message[] imessages = new Message[msgnums.size()];
|
||||||
|
for (int i = 0; i < msgnums.size(); i++)
|
||||||
|
imessages[i] = state.ifolder.getMessage(msgnums.get(i));
|
||||||
|
|
||||||
|
return imessages;
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
throw new ProtocolException("Search", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
Log.w(ex);
|
||||||
|
}
|
||||||
|
|
||||||
SearchTerm terms = criteria.getTerms(
|
SearchTerm terms = criteria.getTerms(
|
||||||
utf8,
|
false,
|
||||||
state.ifolder.getPermanentFlags(),
|
state.ifolder.getPermanentFlags(),
|
||||||
browsable.keywords);
|
browsable.keywords);
|
||||||
if (terms == null)
|
return state.ifolder.search(terms);
|
||||||
return new Message[0];
|
|
||||||
|
|
||||||
try {
|
|
||||||
return state.ifolder.search(terms);
|
|
||||||
} catch (MessagingException ex) {
|
|
||||||
if (utf8) {
|
|
||||||
Log.w(ex);
|
|
||||||
terms = criteria.getTerms(
|
|
||||||
false,
|
|
||||||
state.ifolder.getPermanentFlags(),
|
|
||||||
browsable.keywords);
|
|
||||||
return state.ifolder.search(terms);
|
|
||||||
} else
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (MessagingException ex) {
|
} catch (MessagingException ex) {
|
||||||
ProtocolException pex = new ProtocolException(
|
ProtocolException pex = new ProtocolException(
|
||||||
|
|
Loading…
Reference in New Issue