Refactoring

pull/162/head
M66B 5 years ago
parent 924be0dd79
commit a3237cb1e0

@ -375,6 +375,7 @@ class Core {
private static void ensureUid(Context context, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws MessagingException {
if (message == null || message.uid != null)
return;
if (EntityOperation.ADD.equals(op.name))
return;
if (EntityOperation.FETCH.equals(op.name))
@ -387,25 +388,47 @@ class Core {
Log.i(folder.name + " ensure uid op=" + op.name + " msgid=" + message.msgid);
if (TextUtils.isEmpty(message.msgid))
throw new IllegalArgumentException("Message without ID for " + op.name);
throw new IllegalArgumentException("Message without msgid for " + op.name);
Message[] imessages = ifolder.search(new MessageIDTerm(message.msgid));
if (imessages == null || imessages.length == 0)
message.uid = findUid(ifolder, message.msgid, false);
if (message.uid == null)
throw new IllegalArgumentException("Message not found for " + op.name);
long uid = -1;
for (Message iexisting : imessages) {
long muid = ifolder.getUID(iexisting);
Log.i(folder.name + " found uid=" + muid);
// RFC3501: Unique identifiers are assigned in a strictly ascending fashion
if (muid > uid)
uid = muid;
}
DB db = DB.getInstance(context);
db.message().setMessageUid(message.id, message.uid);
}
message.uid = uid;
private static Long findUid(IMAPFolder ifolder, String msgid, boolean purge) throws MessagingException {
String name = ifolder.getFullName();
Log.i(name + " searching for msgid=" + msgid);
DB db = DB.getInstance(context);
db.message().setMessageUid(message.id, uid);
Long uid = null;
Message[] imessages = ifolder.search(new MessageIDTerm(msgid));
if (imessages != null) {
for (Message iexisting : imessages) {
long muid = ifolder.getUID(iexisting);
Log.i(name + " found uid=" + muid + " for msgid=" + msgid);
// RFC3501: Unique identifiers are assigned in a strictly ascending fashion
if (uid == null || muid > uid)
uid = muid;
}
if (uid != null && purge)
for (Message iexisting : imessages) {
long muid = ifolder.getUID(iexisting);
if (muid != uid)
try {
Log.i(name + " deleting uid=" + muid + " for msgid=" + msgid);
iexisting.setFlag(Flags.Flag.DELETED, true);
} catch (MessageRemovedException ignored) {
Log.w(name + " existing gone uid=" + muid + " for msgid=" + msgid);
}
}
}
Log.i(name + " got uid=" + uid + " for msgid=" + msgid);
return uid;
}
private static void onSeen(Context context, JSONArray jargs, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, JSONException {
@ -588,59 +611,31 @@ class Core {
// Add message
ifolder.appendMessages(new Message[]{imessage});
if (folder.id.equals(message.folder)) {
if (message.uid != null) {
db.message().setMessageUid(message.id, null);
// External draft might have a uid only
Message iexisting = ifolder.getMessageByUID(message.uid);
if (iexisting == null)
Log.w(folder.name + " existing not found uid=" + message.uid);
else
try {
Log.i(folder.name + " deleting uid=" + message.uid);
iexisting.setFlag(Flags.Flag.DELETED, true);
} catch (MessageRemovedException ignored) {
Log.w(folder.name + " existing gone uid=" + message.uid);
}
}
Log.i(folder.name + " searching for msgid=" + message.msgid);
Message[] imessages = ifolder.search(new MessageIDTerm(message.msgid));
if (imessages == null)
Log.w(folder.name + " search for msgid=" + message.msgid + " returned null");
else {
long uid = -1;
// Delete previous (external) version
if (message.uid != null) {
db.message().setMessageUid(message.id, null);
for (Message iexisting : imessages) {
long muid = ifolder.getUID(iexisting);
Log.i(folder.name + " found uid=" + muid);
// RFC3501: Unique identifiers are assigned in a strictly ascending fashion
if (muid > uid)
uid = muid;
Message iexisting = ifolder.getMessageByUID(message.uid);
if (iexisting == null)
Log.w(folder.name + " existing not found uid=" + message.uid);
else
try {
Log.i(folder.name + " deleting uid=" + message.uid);
iexisting.setFlag(Flags.Flag.DELETED, true);
} catch (MessageRemovedException ignored) {
Log.w(folder.name + " existing gone uid=" + message.uid);
}
}
if (uid < 0)
Log.w(folder.name + " appended msgid=" + message.msgid + " not found");
else {
Log.i(folder.name + " appended uid=" + uid);
db.message().setMessageUid(message.id, uid);
List<EntityRule> rules = db.rule().getEnabledRules(folder.id);
runRules(context, imessage, message, rules);
updateContactInfo(context, folder, message);
if (folder.id.equals(message.folder)) {
message.uid = findUid(ifolder, message.msgid, true);
if (message.uid != null) {
Log.i(folder.name + " appended uid=" + message.uid);
db.message().setMessageUid(message.id, message.uid);
for (Message iexisting : imessages) {
long muid = ifolder.getUID(iexisting);
if (muid != uid)
try {
Log.i(folder.name + " deleting uid=" + muid);
iexisting.setFlag(Flags.Flag.DELETED, true);
} catch (MessageRemovedException ignored) {
Log.w(folder.name + " existing gone uid=" + muid);
}
}
}
List<EntityRule> rules = db.rule().getEnabledRules(folder.id);
runRules(context, imessage, message, rules);
updateContactInfo(context, folder, message);
}
ifolder.expunge();

Loading…
Cancel
Save