diff --git a/exec/imapservice.js b/exec/imapservice.js index 92364835e4d2f15c6e706342ed6e4aa9a8861008..46e5d7f44a990007b7d120b9af2dcee07fedecfd 100644 --- a/exec/imapservice.js +++ b/exec/imapservice.js @@ -26,7 +26,6 @@ var base; var index={offsets:[],idx:{}}; var line; var readonly=true; -var orig_ptrs={}; var curr_status={exists:0,recent:0,unseen:0,uidnext:0,uidvalidity:0}; var saved_config={'__config_epoch__':0, mail:{scan_ptr:0, subscribed:true}}; var scan_ptr; @@ -1186,15 +1185,10 @@ function calc_msgflags_arr(attr, netattr, num, msg, readonly) if (netattr & NETMSG_DIRECT) flags.push("DIRECT"); - if (attr==0xffff || orig_ptrs[num] < msg) { + if (attr==0xffff || (scan_ptr < msg)) { flags.push('\\Recent'); } - if (!readonly) { - if (base != undefined && base.is_open) - scan_ptr=msg; - } - return flags; } @@ -1321,7 +1315,7 @@ function update_status() if(base.subnum != index.subnum || base.last_msg != index.last) index=read_index(base); curr_status.exists=index.offsets.length; - curr_status.recent=count_recent(index, orig_ptrs[base.subnum]); + curr_status.recent=count_recent(index, scan_ptr); curr_status.unseen=count_unseen(index); if(index.offsets.length == 0) curr_status.uidnext=1; @@ -1616,6 +1610,7 @@ function open_sub(sub) { var i; var idx; + var code; close_sub(); base=new MsgBase(sub); @@ -1623,14 +1618,26 @@ function open_sub(sub) update_status(); return false; } + code = get_base_code(base); if(base.cfg != undefined) { - if(orig_ptrs[base.subnum]==undefined) { - orig_ptrs[base.subnum]=msg_area.sub[base.cfg.code].scan_ptr; - } + scan_ptr = msg_area.sub[code].scan_ptr; } - read_cfg(sub, true); + lock_cfg(); + try { + read_cfg(sub, false); - scan_ptr=orig_ptrs[base.subnum]; + if (saved_config[code].scan_ptr > scan_ptr) + scan_ptr = saved_config[code].scan_ptr; + if (!readonly) { + saved_config[code].scan_ptr = base.last_msg; + save_cfg(); + } + } + catch (error) { + unlock_cfg(); + throw error; + } + unlock_cfg(); update_status(); sendflags(false); untagged(curr_status.exists+" EXISTS"); @@ -1817,6 +1824,7 @@ var authenticated_command_handlers = { var index; var old_saved; var base_code; + var sp; if(typeof(items)!="object") items=[items]; @@ -1825,13 +1833,15 @@ var authenticated_command_handlers = { tagged(tag, "NO", "Can't find your mailbox"); return; } - if(base.cfg != undefined && orig_ptrs[base.subnum]==undefined) - orig_ptrs[base.subnum]=msg_area.sub[base.cfg.code].scan_ptr; - base_code = get_base_code(base); + if (saved_config[base_code] != undefined) old_saved = saved_config[base_code]; read_cfg(base_code, true); + if (saved_config[base_code].scan_ptr == undefined) { + if (base_code != 'mail') + saved_config[base_code].scan_ptr = msg_area.sub[base.cfg.code].scan_ptr; + } index = read_index(base); delete saved_config[base_code]; if (old_saved != undefined) @@ -1845,7 +1855,7 @@ var authenticated_command_handlers = { break; case 'RECENT': response.push("RECENT"); - response.push(count_recent(index, orig_ptrs[base.subnum])); + response.push(count_recent(index, saved_config[base_code].scan_ptr)); break; case 'UIDNEXT': response.push("UIDNEXT"); @@ -1910,6 +1920,13 @@ function do_store(seq, uid, item, data) for(i in seq) { idx=index.idx[seq[i]]; hdr=base.get_msg_header(seq[i], /* expand_fields: */false); + // Hack in our seen flag... + if (get_seen_flag(index.code, idx)) { + idx.attr |= MSG_READ; + } + else { + idx.attr &= ~MSG_READ; + } flags=parse_flags(data); switch(item.toUpperCase()) { case 'FLAGS.SILENT': @@ -1928,10 +1945,12 @@ function do_store(seq, uid, item, data) chflags={attr:idx.attr^(idx.attr&~flags.attr), netattr:hdr.netattr^(hdr.netattr&~flags.netattr)}; break } - if (((hdr.attr ^ chflags.attr) | MSG_READ) == MSG_READ) + if (((idx.attr ^ chflags.attr) & MSG_READ) == MSG_READ) { set_seen_flag_g(index.code, idx, 1); - else + } + else { set_seen_flag_g(index.code, idx, 0); + } chflags=check_msgflags(chflags.attr, chflags.netattr, base.subnum==-1, hdr.to_net_type==NET_NONE?hdr.to==user.number:false, hdr.from_net_type==NET_NONE?hdr.from==user.number:false,base.is_operator); if(chflags.attr || chflags.netattr) { @@ -2190,7 +2209,7 @@ var search_operators = { return true; } if (arg[0].toUpperCase() == '\\Recent') { - if (msg.idx.offset > orig_ptrs[base.subnum]) + if (msg.idx.offset > scan_ptr) return true; } return false; @@ -2424,17 +2443,14 @@ function parse_arg(str, type) return str.toUpperCase().toSource(); case 'date': m = str.match(dre); - // TODO: Date start and date end... d = new Date(parseInt(m[3], 10), months.indexOf(m[2].toLowerCase()), parseInt(m[1], 10), 12); return Math.floor(d.valueOf() / 1000).toString(); case 'date-start': m = str.match(dre); - // TODO: Date start and date end... d = new Date(parseInt(m[3], 10), months.indexOf(m[2].toLowerCase()), parseInt(m[1], 10), 0); return Math.floor(d.valueOf() / 1000).toString(); case 'date-end': m = str.match(dre); - // TODO: Date start and date end... d = new Date(parseInt(m[3], 10), months.indexOf(m[2].toLowerCase()), parseInt(m[1], 10) + 1, 0); d--; return Math.floor(d.valueOf() / 1000).toString(); @@ -3111,13 +3127,8 @@ function read_cfg(sub, lck) if (lck) unlock_cfg(); - if(sub == 'mail') { - orig_ptrs[-1]=saved_config.mail.scan_ptr; - } - else { - if(saved_config[sub].Seen==undefined) - saved_config[sub].Seen={}; - } + if(saved_config[sub].Seen==undefined) + saved_config[sub].Seen={}; apply_seen(index); }