Refactoring

pull/162/head
M66B 6 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 { private static void ensureUid(Context context, EntityFolder folder, EntityMessage message, EntityOperation op, IMAPFolder ifolder) throws MessagingException {
if (message == null || message.uid != null) if (message == null || message.uid != null)
return; return;
if (EntityOperation.ADD.equals(op.name)) if (EntityOperation.ADD.equals(op.name))
return; return;
if (EntityOperation.FETCH.equals(op.name)) if (EntityOperation.FETCH.equals(op.name))
@ -387,25 +388,47 @@ class Core {
Log.i(folder.name + " ensure uid op=" + op.name + " msgid=" + message.msgid); Log.i(folder.name + " ensure uid op=" + op.name + " msgid=" + message.msgid);
if (TextUtils.isEmpty(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)); message.uid = findUid(ifolder, message.msgid, false);
if (imessages == null || imessages.length == 0) if (message.uid == null)
throw new IllegalArgumentException("Message not found for " + op.name); throw new IllegalArgumentException("Message not found for " + op.name);
long uid = -1; DB db = DB.getInstance(context);
for (Message iexisting : imessages) { db.message().setMessageUid(message.id, message.uid);
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.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); Long uid = null;
db.message().setMessageUid(message.id, uid);
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 { 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 // Add message
ifolder.appendMessages(new Message[]{imessage}); ifolder.appendMessages(new Message[]{imessage});
if (folder.id.equals(message.folder)) { // Delete previous (external) version
if (message.uid != null) { if (message.uid != null) {
db.message().setMessageUid(message.id, 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;
for (Message iexisting : imessages) { Message iexisting = ifolder.getMessageByUID(message.uid);
long muid = ifolder.getUID(iexisting); if (iexisting == null)
Log.i(folder.name + " found uid=" + muid); Log.w(folder.name + " existing not found uid=" + message.uid);
// RFC3501: Unique identifiers are assigned in a strictly ascending fashion else
if (muid > uid) try {
uid = muid; 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) if (folder.id.equals(message.folder)) {
Log.w(folder.name + " appended msgid=" + message.msgid + " not found"); message.uid = findUid(ifolder, message.msgid, true);
else { if (message.uid != null) {
Log.i(folder.name + " appended uid=" + uid); Log.i(folder.name + " appended uid=" + message.uid);
db.message().setMessageUid(message.id, uid); db.message().setMessageUid(message.id, message.uid);
List<EntityRule> rules = db.rule().getEnabledRules(folder.id);
runRules(context, imessage, message, rules);
updateContactInfo(context, folder, message);
for (Message iexisting : imessages) { List<EntityRule> rules = db.rule().getEnabledRules(folder.id);
long muid = ifolder.getUID(iexisting); runRules(context, imessage, message, rules);
if (muid != uid) updateContactInfo(context, folder, message);
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);
}
}
}
} }
ifolder.expunge(); ifolder.expunge();

Loading…
Cancel
Save