diff --git a/exec/imapservice.js b/exec/imapservice.js index 427f8718463d4ac1df759f97ef90fe38f5eacebe..07d5d798f13b214729ed45b39b4c33d56b212dd4 100644 --- a/exec/imapservice.js +++ b/exec/imapservice.js @@ -1209,6 +1209,7 @@ function sublist(group, match, subscribed) var re; var has_sep=false; var base; + var code; if(match=='') return([""]); @@ -1232,22 +1233,34 @@ function sublist(group, match, subscribed) if(re.test("INBOX")) ret.push("INBOX"); - for(grp in msg_area.grp_list) { - if(re.test(msg_area.grp_list[grp].description)) - ret.push((msg_area.grp_list[grp].description+sepchar).replace(/&/g,'&-')); - - for(sub in msg_area.grp_list[grp].sub_list) { - if(re.test(msg_area.grp_list[grp].description+sepchar+msg_area.grp_list[grp].sub_list[sub].description)) { - if((!subscribed) || (saved_config.hasOwnProperty(msg_area.grp_list[grp].sub_list[sub].code) && saved_config[msg_area.grp_list[grp].sub_list[sub].code].hasOwnProperty('subscribed') && saved_config[msg_area.grp_list[grp].sub_list[sub].code].subscribed)) { - base=new MsgBase(msg_area.grp_list[grp].sub_list[sub].code); - if(base == undefined || sub=="NONE!!!" || (!base.open())) - continue; - base.close(); - ret.push((msg_area.grp_list[grp].description+sepchar+msg_area.grp_list[grp].sub_list[sub].description).replace(/&/g,'&-')); + lock_cfg() + try { + read_cfg('mail', true); + for(grp in msg_area.grp_list) { + if(re.test(msg_area.grp_list[grp].description)) + ret.push((msg_area.grp_list[grp].description+sepchar).replace(/&/g,'&-')); + + for(sub in msg_area.grp_list[grp].sub_list) { + code = msg_area.grp_list[grp].sub_list[sub].code + // TODO: Notyet + //read_cfg(code, false); + if(re.test(msg_area.grp_list[grp].description+sepchar+msg_area.grp_list[grp].sub_list[sub].description)) { + if((!subscribed) || (saved_config.hasOwnProperty(code) && saved_config[code].hasOwnProperty('subscribed') && saved_config[code].subscribed)) { + base=new MsgBase(code); + if(base == undefined || sub=="NONE!!!" || (!base.open())) + continue; + base.close(); + ret.push((msg_area.grp_list[grp].description+sepchar+msg_area.grp_list[grp].sub_list[sub].description).replace(/&/g,'&-')); + } } } } } + catch (error) { + unlock_cfg(); + throw error; + } + unlock_cfg(); return(ret); } @@ -1362,7 +1375,6 @@ function read_index(base) var i; var idx; var index; - var newseen={}; index={offsets:[],idx:{}}; index.first=base.first_msg; @@ -1384,14 +1396,12 @@ function read_index(base) idx.attr &= ~MSG_READ; if(get_seen_flag(index.code, idx) == 1) { idx.attr |= MSG_READ; - newseen[idx.number]=1; } } index.idx[idx.number]=idx; index.offsets.push(idx.number); idx.offset=index.offsets.length; } - saved_config[index.code].Seen=newseen; return(index); } @@ -1841,7 +1851,6 @@ var authenticated_command_handlers = { var base; var mademap=false; var index; - var old_saved; var base_code; var sp; @@ -1854,17 +1863,8 @@ var authenticated_command_handlers = { } 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) - saved_config[base_code] = old_saved; base.close(); for(i in items) { switch(items[i].toUpperCase()) { @@ -3106,34 +3106,36 @@ function read_cfg(sub, lck) catch (error) { newfile = {'__config_epoch__':0, mail:{scan_ptr:0, subscribed:true}}; } - for (newsub in newfile) { - if (newsub == '__config_epoch__') { - saved_config.__config_epoch__ = newfile[newsub]; - } - else { - if (last_saved_file[newsub] == undefined || JSON.stringify(newfile[newsub]) != JSON.stringify(last_saved_file[newsub])) { - saved_config[newsub] = {}; - if (newfile[newsub].hasOwnProperty('scan_ptr')) - saved_config[newsub].scan_ptr = newfile[newsub].scan_ptr; - if (newfile[newsub].hasOwnProperty('seen')) - saved_config[newsub].Seen = newfile[newsub].seen; - else - saved_config[newsub].Seen = {}; - if (newfile[newsub].hasOwnProperty('subscribed')) - saved_config[newsub].subscribed = newfile[newsub].subscribed; - else - saved_config[newsub].subscribed = false; - if (newfile[newsub].hasOwnProperty('bseen')) { - for (i in newfile[newsub].bseen) { - basemsg = parseInt(i, 10); - bstr = base64_decode(newfile[newsub].bseen[i]); - for (byte = 0; byte < bstr.length; byte++) { - asc = ascii(bstr[byte]); - if (asc == 0) - continue; - for (bit=0; bit<8; bit++) { - if (asc & (1<<bit)) - saved_config[newsub].Seen[basemsg+(byte*8+bit)]=1; + if (newfile.__config_epoch__ !== saved_config.__config_epoch__) { + for (newsub in newfile) { + if (newsub == '__config_epoch__') { + saved_config.__config_epoch__ = newfile[newsub]; + } + else { + if (last_saved_file[newsub] == undefined || JSON.stringify(newfile[newsub]) != JSON.stringify(last_saved_file[newsub])) { + saved_config[newsub] = {}; + if (newfile[newsub].hasOwnProperty('scan_ptr')) + saved_config[newsub].scan_ptr = newfile[newsub].scan_ptr; + if (newfile[newsub].hasOwnProperty('seen')) + saved_config[newsub].Seen = newfile[newsub].seen; + else + saved_config[newsub].Seen = {}; + if (newfile[newsub].hasOwnProperty('subscribed')) + saved_config[newsub].subscribed = newfile[newsub].subscribed; + else + saved_config[newsub].subscribed = false; + if (newfile[newsub].hasOwnProperty('bseen')) { + for (i in newfile[newsub].bseen) { + basemsg = parseInt(i, 10); + bstr = base64_decode(newfile[newsub].bseen[i]); + for (byte = 0; byte < bstr.length; byte++) { + asc = ascii(bstr[byte]); + if (asc == 0) + continue; + for (bit=0; bit<8; bit++) { + if (asc & (1<<bit)) + saved_config[newsub].Seen[basemsg+(byte*8+bit)]=1; + } } } } @@ -3153,6 +3155,10 @@ function read_cfg(sub, lck) if(saved_config[sub].Seen==undefined) saved_config[sub].Seen={}; + if (sub != 'mail' && ((saved_config[sub].sub_ptr == undefined) || (msg_area.sub[sub].scan_ptr > saved_config[sub]))) { + saved_config[sub].scan_ptr = msg_area.sub[sub].scan_ptr; + } + apply_seen(index); last_saved_config = JSON.parse(JSON.stringify(saved_config)); last_saved_file = newfile;