/* * Mail Archive JS API * * This JavaScript file is the core to use MailArchiver embeded at Expresso suite. * It contains all the resources used to handle local messages stored at the brand * new solution Mail Archiver (a embeded application server running at client side). * * This feature is a replacement for Google Gears(obsolete by now), used by * Expresso to store local messages at user workstation hard disk. * * @author Fernando Wendt [fernando-alberto.wendt@serpro.gov.br] * * @status under development */ var sessid = 'sessionId'; function IterateIt(){ var deph = 0; var returnstr = ""; for (i in arguments[0]){ if((arguments[0][i]) && (arguments[0][i].visited == null)){ arguments[0][i].visited = true; if(typeof(arguments[0][i]) == 'object'){ returnstr += '+ Property "' + i + '"[object ' + deph + ']\n
'; //returnstr += IterateIt(arguments[0][i]); deph++; } } else returnstr += 'Property "' + i + '" -> ' + arguments[0][i] + ' [' + typeof(i) + ']\n
'; } return (returnstr); } function dump(arr,level) { var dumped_text = ""; if(!level) level = 0; //The padding given at the beginning of the line. var level_padding = ""; for(var j=0;j"; dumped_text += dump(value,level+1); } else { dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n
"; } } } else { //Stings/Chars/Numbers etc. dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; } return dumped_text; } function zeroFill(d){ if(parseInt(d) < 10) return('0' + d); else return(d); } /** * Concatenates the values of a variable into an easily readable string * by Matt Hackett [scriptnode.com] * @param {Object} x The variable to debug * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10] * @param {String} sep The separator to use between [default: a single space ' '] * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use */ function print_r(x, max, sep, l) { l = l || 0; max = max || 100; sep = sep || ' '; if (l > max) { return "[WARNING: Too much recursion]\n"; } var i, r = '', t = typeof x, tab = ''; if (x === null) { r += "(null)\n"; } else if (t == 'object') { l++; for (i = 0; i < l; i++) { tab += sep; } if (x && x.length) { t = 'array'; } r += '(' + t + ") :\n"; for (i in x) { try { r += tab + '[' + i + '] : ' + print_r(x[i], max, sep, (l + 1)); } catch(e) { return "[ERROR: " + e + "]\n"; } } } else { if (t == 'string') { if (x == '') { x = '(empty)'; } } r += '(' + t + ') ' + x + "\n"; } return r; }; var_dump = print_r; //Main object structure: object property data definition function MailArchiver() { this.enabled = null; this.interval = 500; this.timer = null; this.counter = 0; this.message_list = new Array(); this.total_messages = 0; this.messages_processed = 0; this.messages_fail = 0; this.folder_origin = null; this.folder_destination = null; this.folders = null; this.currentfolder = 'local_root'; this.drawdata = null; this.onprocess = false; } //Invoked at some possible MA crash issue MailArchiver.prototype.resetObject = function(){ expresso_mail_archive.message_list = new Array(); expresso_mail_archive.total_messages = 0; expresso_mail_archive.messages_processed = 0; expresso_mail_archive.messages_fail = 0; expresso_mail_archive.folder_origin = null; expresso_mail_archive.folder_destination = null; expresso_mail_archive.folder = null; } /*SystemCheck method: test if MailArchive is installed and/or running at user workstation *Try to get a instance of ArchiveServices object - the handler of services provided by *the MailArchive services provider interface, from user workstation. */ MailArchiver.prototype.SystemCheck = function(){ expresso_mail_archive.enabled = ((ArchiveServices) ? true : false); } //Turns on the listener timer to check services availability MailArchiver.prototype.ActivateStatusListener = function(obj){ if (document.getElementById('mail_archiver_retry')) tem_tag = true; else tem_tag = false; try{ if (obj.enabled){ obj.interval = 500; //set default timer to 1ms (imediate lauching) draw_footer_box(get_current_folder()); obj.getServicesStatus(obj); } else{ throw "this is not enabled: " + obj; window.alert('Nope: obj.enabled is not true...'); } } catch (e){ window.alert('ActivateStatusListener error: ' + e); } } //Turns off the service status listener, at a crash issue MailArchiver.prototype.DeactivateStatusListener = function(obj){ window.clearInterval(obj.timer); obj.enabled = null; obj.timer=null; obj.interval = 500; ArchiveServices = null; connector.purgeCache(); draw_footer_box(get_current_folder()); auto_refresh(); if(document.getElementById('mail_archiver_retry')){ document.getElementById('mail_archiver_retry').parentNode.removeChild(document.getElementById('mail_archiver_retry')); } else{ //to do, by now, means nothing } } //ServiceStatus callback OK MailArchiver.prototype.getServicesStatusOK = function(serviceData){ if ((serviceData.getReturn() == "STARTED") || (serviceData.getReturn() == "RUNNING")){ //If there is no timer activated to services check interval, set it up. if(expresso_mail_archive.enabled){ if(expresso_mail_archive.timer == null){ expresso_mail_archive.interval = 5000; expresso_mail_archive.timer = window.setInterval(expresso_mail_archive.getServicesStatus, expresso_mail_archive.interval); var drawinginfo = {treeObject: tree_folders, treeName: 'tree_folders', folderName: 'local_root'}; expresso_mail_archive.currentfolder = 'local_root'; expresso_mail_archive.drawdata = drawinginfo; expresso_mail_archive.getFoldersList(); } } else{ window.clearInterval(expresso_mail_archive.timer); write_msg(get_lang('Your preferences are setting to use local messages, but Mail Archiver does not seems to be running or installed at this workstation. By now, we are turning off this feature. Check it out!'),true); } } else{ expresso_mail_archive.enabled = false; window.clearInterval(expresso_mail_archive.timer); write_msg(get_lang('Your preferences are setting to use local messages, but Mail Archiver does not seems to be running or installed at this workstation. By now, we are turning off this feature. Check it out!'),true); } } //Dettach resources handler MailArchiver.prototype.DeactivateResources = function(obj){ if(obj.timer) window.clearInterval(obj.timer); write_msg(get_lang('3Mail Archiver is not responding. There is some communicating issue hang it up. Some services may not work properly. Check it out!')); obj.DeactivateStatusListener(obj); return; } //Services Status Fail callback MailArchiver.prototype.getServicesStatusFailure = function(serviceData){ window.alert('getServicesStatusFailure feature: ' + serviceData); } //Service Status handler MailArchiver.prototype.getServicesStatus = function(obj){ try{ if(ArchiveServices){ try{ ArchiveServices.getState(expresso_mail_archive.getServicesStatusOK, expresso_mail_archive.getServicesStatusFailure, "true"); }catch (e){ throw "Service failure status: getState"; } } else { throw "No ArchiveServices object present. Sorry, but leaving now..."; } }catch (e){ window.alert('getServiceStatus exception:' + e); } expresso_mail_archive.counter = expresso_mail_archive.counter +1; } /*Restart method: re-initializes all the Mail Archive structure **/ MailArchiver.prototype.Restart = function(obj){ obj.SystemCheck(); obj.ActivateStatusListener(obj); auto_refresh(); } /*Startup method: initializes all the Mail Archive structure to work so far as possible *Looks like the old 'gears_init', from Gears **/ MailArchiver.prototype.Startup = function(){ this.SystemCheck(); } MailArchiver.prototype.serializeToExpresso = function(data){ return(connector.serialize(data)); } MailArchiver.prototype.unserializeFromExpresso = function(data){ return(connector.unserialize(data)); } MailArchiver.prototype.CreateMessageList = function(msg_list){ if((msg_list != null) && (msg_list != "") && (msg_list != " ")){ if (expresso_mail_archive.message_list.length == 0){ //Get all the messages ids by pass at msgs_id to "message_list" object array propertie - if more than one exists if(msg_list.indexOf(',') != -1){ var tmp_list = msg_list.split(','); for(var i=0; i < tmp_list.length; i++){ expresso_mail_archive.message_list.push(tmp_list[i]); } } //Push message list to process the only one else expresso_mail_archive.message_list.push(msg_list); } } //msg_list is corrupted. aborting population else expresso_mail_archive.message_list = new Array(); } //Archive Operation MailArchiver.prototype.Archive = function(source_folder,destination_folder,msgs_id){ //window.alert('tentando arquivar a mensagem [' + msgs_id + '], do folder ['+source_folder+'] para a pasta destino ['+destination_folder+']'); try{ document.getElementById('main_title').innerHTML = get_lang("Starting to archive messages"); expresso_mail_archive.CreateMessageList(msgs_id); if((expresso_mail_archive.message_list.length > 0) && (expresso_mail_archive.message_list[0] != '')){ //Sets the message counter expresso_mail_archive.total_messages = expresso_mail_archive.message_list.length; //Sets the folders properties: destination and origin expresso_mail_archive.folder_origin = source_folder; //window.alert('substr(0,5) = ' + destination_folder.substr(0,5)); if(destination_folder.substr(0,5) == 'local') expresso_mail_archive.folder_destination = destination_folder.substr(6,destination_folder.length); else expresso_mail_archive.folder_destination = destination_folder; //window.alert('destination_folder = ' + expresso_mail_archive.folder_destination); var arch_handler = function(data){ //Store the message source from Ajax request by now (string data) var js_var = new String(data); try{ //Archive services needs session id, message source and destination folder document.getElementById('main_title').innerHTML = get_lang("Archiving message on folder") + " " + expresso_mail_archive.folder_destination +"..."; ArchiveServices.archive(expresso_mail_archive.getArchiveOperationOK, expresso_mail_archive.getArchiveOperationFailure, sessid, data ,expresso_mail_archive.folder_destination); } catch(e){ window.alert('ArchiveServices.archive eror: ' + e); } } document.getElementById('main_title').innerHTML = get_lang("Archiving messages " + expresso_mail_archive.messages_processed + " of " + expresso_mail_archive.message_list.length); cExecute("$this.exporteml.js_source_var",arch_handler,"folder="+url_decode(source_folder)+"&msgs_to_export="+expresso_mail_archive.message_list[0]); } else throw('Ops. Message list stack is empty!'); } catch(e){ window.alert('Archive error: ' + e); } } //Archive callback OK MailArchiver.prototype.getArchiveOperationOK = function(status_message){ expresso_mail_archive.messages_processed++; if(expresso_mail_archive.message_list.length > 1){ document.getElementById('main_title').innerHTML = get_lang("Message " + expresso_mail_archive.messages_processed + " of " + expresso_mail_archive.total_messages + " successfully archived."); expresso_mail_archive.message_list.shift(); expresso_mail_archive.Archive(expresso_mail_archive.folder_origin, expresso_mail_archive.folder_destination, expresso_mail_archive.message_list); } else{ document.getElementById('main_title').innerHTML = get_lang("All done. End of archive messages operation."); expresso_mail_archive.resetObject(); window.setTimeout("eval('document.getElementById(\"main_title\").innerHTML =\"Expresso Mail\"')",3000); } } //Archive callback Fail MailArchiver.prototype.getArchiveOperationFailure = function(error_message){ window.alert('Hi! getArchiveOperationFailure comes with ' + error_message.getReturn()); window.setTimeout("eval('document.getElementById(\"main_title\").innerHTML =\"Expresso Mail\"')",3000); } //getFolderList Operation MailArchiver.prototype.getFoldersList = function(basefolder){ try{ ArchiveServices.listFolders(expresso_mail_archive.getFoldersListOperationOK, expresso_mail_archive.getFoldersListOperationFailure, sessid, basefolder); } catch (e){ window.alert('AQUI MESMO\nOps...List folders fails at:\n' + e.description); } } //getFolderList callback OK MailArchiver.prototype.getFoldersListOperationOK = function(folderlist){ //Internal variable used to map all XML data return from WS invokated var lfolders = new Array(); //Mapping XML data to a handler data structure if(folderlist.getReturn().length > 0){ var lfolders = new Array(); for(i=0; i 0 ) ? folderChild = 1 : folderChild = 0; //Store folder data at this format: {folder name, number of messages contained, folder has child nodes, folder id, folder parent id, folder full path} //var folderData = new Array(folderlist.getReturn()[i].getName(), folderlist.getReturn()[i].getMessageCount(), folderChild, folderlist.getReturn()[i].getId(), folderlist.getReturn()[i].getParentId(), folderlist.getReturn()[i].getPath()); var folderData = {name: folderlist.getReturn()[i].getName(), messages: folderlist.getReturn()[i].getMessageCount(), haschild: folderChild, id: folderlist.getReturn()[i].getId(), parentid: folderlist.getReturn()[i].getParentId(), path: folderlist.getReturn()[i].getPath()}; lfolders.push(folderData); } //Sets folders property at main object expresso_mail_archive.folders = lfolders; if(expresso_mail_archive.folders[0]["parentid"] == "") expresso_mail_archive.currentfolder = 'local_root'; else expresso_mail_archive.currentfolder = expresso_mail_archive.folders[0]["parentid"]; //Folders dumping :) /*var strFolders = '---'; for (var w=0; w < expresso_mail_archive.folders.length; w++){ strFolders += '\nFolder ' + w + ' -->'; for (x in expresso_mail_archive.folders[w]){ strFolders += '\n----------' + x + ':= ' + expresso_mail_archive.folders[w][x]; } strFolders += '\n<---'; } strFolders += '\n---'; alert(lfolders.length + ' folders mapeados, com default = ' + expresso_mail_archive.currentfolder + '\nfolders list:\n\n' + strFolders); */ //If something UI related have been flagged, handle it if (expresso_mail_archive.drawdata){ //window.alert('com drawdata'); expresso_mail_archive.drawFolderTree(); } } } //getFolderList callback Fail MailArchiver.prototype.getFoldersListOperationFailure = function(error, http_msg){ window.alert('List folders mistake:' + error + '\nhttp_error = ' + http_msg); } //drawFolderTree operation, if requested to MailArchiver.prototype.drawFolderTree = function(){ //window.alert('na api de foldertree'); var localBaseName = 'local_'; var objectTree = expresso_mail_archive.drawdata.treeObject; var evalobjectTree = eval(expresso_mail_archive.drawdata.treeName); //Add nodes to tree if(expresso_mail_archive.folders.length > 0){ for(i=0; i' + message.getReturn()); } //deleteFolder operation MailArchiver.prototype.deleteFolder = function(folderName){ try{ ArchiveServices.deleteFolder(expresso_mail_archive.deleteFolderOperationOK, expresso_mail_archive.deleteFolderOperationFailure, sessid, folderName, true); } catch (e){ window.alert('Ops...delete folder fails at:\n' + e); } } //deleteFolder callback OK MailArchiver.prototype.deleteFolderOperationOK = function (folderObject){ var fo = IterateIt(folderObject); write_msg(get_lang("The folder " + expresso_mail_archive.drawdata.folderName + " was successfully removed")); draw_tree_local_folders(); ttreeBox.update_folder(); } //deleteFolder callback Fail MailArchiver.prototype.deleteFolderOperationFailure = function (message){ window.alert('Folder deletion fails...\n->' + message.getReturn()); } //renameFolder operation MailArchiver.prototype.renameFolder = function(folderId, newFolderName){ try{ ArchiveServices.renameFolder(expresso_mail_archive.renameFolderOperationOK, expresso_mail_archive.renameFolderOperationFailure, sessid, folderId, newFolderName); } catch (e){ window.alert('Ops...renaming folder fails at:\n' + e); } } //renameFolder callback OK MailArchiver.prototype.renameFolderOperationOK = function (returnService){ var evalobjectTree = eval(expresso_mail_archive.drawdata.treeName); evalobjectTree.update_folder(); } //renameFolder callback Fail MailArchiver.prototype.renameFolderOperationFailure = function (ServiceFault){ window.alert('Folder rename fails...\n->' + ServiceFault.getReturn()); alert(get_lang("cannot rename folder. try other folder name")); } //getFolderInfo operation MailArchiver.prototype.getFolderInfo = function (folderId){ try{ ArchiveServices.getFolderInfo(expresso_mail_archive.getFolderInfoOperationOK, expresso_mail_archive.getFolderInfoOperationFailure, sessid, folderId); } catch (e){ window.alert('Ops...getFolderInfo fails at:\n' + e); } } //getFolderInfo callback OK MailArchiver.prototype.getFolderInfoOperationOK = function(returnService){ var folder_info = {id : returnService.getReturn().getId(), name : returnService.getReturn().getName(), parent : returnService.getReturn().getParentId(), numfolders: returnService.getReturn().getFolderCount(), nummessages: returnService.getReturn().getMessageCount()}; expresso_mail_archive.folder = folder_info; } //getFolderInfo callback Fail MailArchiver.prototype.getFolderInfoOperationFailure = function (ServiceFault){ window.alert('getFolderInfo service fails...\n->' + ServiceFault.getReturn()); } //listMessages operation MailArchiver.prototype.listMessages = function(){ try{ var folderid = expresso_mail_archive.currentfolder; var testing_data_xml = ''; var testing_data_json_mapped = '{"query":{"@lowerIndex":"0", "@upperIndex":"50", "folder":[{"@id":"'+folderid+'"}], "order":[{"@asc":"date", "@desc":"subject"}]}}'; var testing_data = testing_data_json_mapped; //window.alert('vai chamar o listMessages com testing_data = ' + testing_data); ArchiveServices.listMessages(expresso_mail_archive.listMessagesOperationOK, expresso_mail_archive.listMessagesOperationFailure, sessid, testing_data); } catch (e){ window.alert('Ops...listMessages fails at:\n' + e); } } //listMessages callback OK MailArchiver.prototype.listMessagesOperationOK = function(returnService){ var msglist = new Array(); /*window.alert('Dados da mensagem:\n->From ' + returnService.getReturn()[0].getFrom() +'\n->To ' + returnService.getReturn()[0].getTo() +'\n->Subject ' + returnService.getReturn()[0].getSubject() +'\n->Date ' + returnService.getReturn()[0].getDate() +'\n->Date ' + returnService.getReturn()[0].getSize() +'\n->ID ' + returnService.getReturn()[0].getId()); */ for(var i=0; i< returnService.getReturn().length; i++){ //window.alert('quer deserializar:\n\n' + print_r(returnService.getReturn()[i])); var ExpSerialized = expresso_mail_archive.toExpressoHeader(returnService.getReturn()[i]); //window.alert('expSerialized ' + i + '\n\n --\n\n' + print_r(ExpSerialized)); //var test = connector.unserialize(ExpSerialized); //window.alert('unserialized = \n\n' + test); msglist.push(connector.unserialize(ExpSerialized));//usando connector.unserialize sobre o header mapeado no layout abaixo } msglist["num_msgs"] = returnService.getReturn().length; //window.alert('print_r\n\n' + print_r(msglist)); expresso_mail_archive.drawdata = {messagesList:msglist}; expresso_mail_archive.drawMessagesList(); } //listMessages callback Fail MailArchiver.prototype.listMessagesOperationFailure = function(ServiceFault){ window.alert('listmessages FALHOU!\n' + ServiceFault.getReturn()); } MailArchiver.prototype.drawMessagesList = function(){ var data_to_draw = expresso_mail_archive.drawdata.messagesList; //window.alert('data to draw = ' + data_to_draw.length + '\ndata_to_draw[0].from.full = ' + print_r(data_to_draw)); alternate_border(0); Element("border_id_0").innerHTML = " " + lang_folder(expresso_mail_archive.currentfolder) + ' [  / ]'; draw_box(data_to_draw, expresso_mail_archive.currentfolder, true); draw_paging(expresso_mail_archive.drawdata.messagesList.length); Element("tot_m").innerHTML = expresso_mail_archive.drawdata.messagesList.length; //update_menu(); } // -----------------------------------SERIALIZED DATA TEMPLATES ---------------- MailArchiver.prototype.toExpressoAddress = function(data){ /*var dataFormat = expresso_mail_archive.toExpressoFormatNameMail(data); var dataName = dataFormat[0]; var dataEmail = dataFormat[1]; */ //window.alert('em toExpressoFrom com data = \n' + data + '[' + typeof(data) + ']('+data.length+')'); var Fromdata = eval("(" + data + ")"); var dataName = Fromdata.mailbox.name.$; var dataEmail = Fromdata.mailbox.localPart.$ + '@' + Fromdata.mailbox.domain.$; //window.alert('name = ' + Fromdata.mailbox.name.$ + '\nlocal part = ' + Fromdata.mailbox.localPart.$ + '\ndomain = ' + Fromdata.mailbox.domain.$); var tplFrom = 'a:2:{' + 's:4:"name";' + 's:'+dataName.length+':"'+dataName+'";' + 's:5:"email";' + 's:'+dataEmail.length+':"'+dataEmail+'";' + 's:4:"full";' + 's:'+(dataName.length + dataEmail.length + 3)+':"'+dataName+'" <'+dataEmail+'>;' + '}'; //window.alert('retorno do email: ' + tplFrom); return(tplFrom); } MailArchiver.prototype.toExpressoDate = function(data){ var ndate = new Date(data); var odate = zeroFill(ndate.getDay()) + '/' + zeroFill(ndate.getMonth()) + '/' + zeroFill(ndate.getFullYear()); return(odate); } MailArchiver.prototype.toExpressoHour = function(data){ var ndate = new Date(data); var ohour = zeroFill(ndate.getHours()) + ':' + zeroFill(ndate.getMinutes()) + ':' + zeroFill(ndate.getSeconds()); return(ohour); } MailArchiver.prototype.toExpressoCC = function(data){ var tplCC = "s:"+data.getCC().length+":\""+data.getCC()+"\";"; return(tplCC); } MailArchiver.prototype.toExpressoTo = function(data){ var tplTo = "s:"+data.getTo().length+":\""+data.getTo()+"\";"; return(tplTo); } /** *+ 's:'+expresso_mail_archive.toExpressoDate(data.getDate()).length+':"'+expresso_mail_archive.toExpressoDate(data.getDate())+'";' + 's:7:"msg_day";' + 's:'+expresso_mail_archive.toExpressoDate(data.getDate()).length+':"'+expresso_mail_archive.toExpressoDate(data.getDate())+'";' + 's:8:"msg_hour";' + 's:'+expresso_mail_archive.toExpressoHour(data.getDate()).length+':"'+expresso_mail_archive.toExpressoHour(data.getDate())+'";' + 's:8:"fulldate";' + 's:'+(expresso_mail_archive.toExpressoDate(data.getDate()).length+expresso_mail_archive.toExpressoHour(data.getDate()).length+1)+':"'+expresso_mail_archive.toExpressoDate(data.getDate())+' '+expresso_mail_archive.toExpressoHour(data.getDate())+'";' + 's:9:"smalldate";' + 's:'+expresso_mail_archive.toExpressoDate(data.getDate()).length+':"'+expresso_mail_archive.toExpressoDate(data.getDate())+'";' + 's:8:"aux_date";' + 's:1:"N";' */ MailArchiver.prototype.toExpressoHeader = function(data){ var tplHeader = 'a:16:{' + 's:11:"ContentType";' + 's:6:"normal";' + 's:10:"Importance";' + 's:6:"Normal";' + 's:6:"Recent";' + 's:1:" ";' + 's:6:"Unseen";' + 's:1:"N";' + 's:8:"Answered";' + 's:1:" ";' + 's:5:"Draft";' + 's:1:" ";' + 's:7:"Deleted";' + 's:1:" ";' + 's:7:"Flagged";' + 'b:0;' + 's:10:"msg_number";' + 's:'+data.getId().length+':"'+data.getId()+'";' + 's:4:"from";' + expresso_mail_archive.toExpressoAddress(data.getFrom()) + 's:2:"to";' + expresso_mail_archive.toExpressoAddress(data.getTo()) + 's:7:"subject";' + 's:'+data.getSubject().length+':"'+data.getSubject()+'";' + 's:4:"Size";' + 'i:'+data.getSize()+';' + 's:5:"udate";' + 's:10:"01/04/2011";' + 's:7:"msg_day";' + 's:10:"01/04/2011";' + 's:8:"msg_hour";' + 's:8:"01:01:59";' + 's:8:"fulldate";' + 's:19:"01/04/2011 01:01:59";' + 's:9:"smalldate";' + 's:10:"01/04/2011";' + 's:10:"attachment";' + 'a:2:{' + 's:5:"names";' + 'b:0;' + 's:18:"number_attachments";' + 'i:0;' + '}' + 's:8:"aux_date";' + 's:10:"01/04/2011";' + '}'; //window.alert('Expresso Header draw data = ' + tplHeader); return(tplHeader); } MailArchiver.prototype.toExpressoMail = function(data){ } /* *The all pourpose JavaScript variable, used by all related functionalityes at *Expresso Mail to handle this object at user gui. */ var expresso_mail_archive; expresso_mail_archive = new MailArchiver();