mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-11-11 01:23:43 +08:00
366 lines
No EOL
8.7 KiB
JavaScript
366 lines
No EOL
8.7 KiB
JavaScript
/* RainLoop Webmail (c) RainLoop Team | Licensed under CC BY-NC-SA 3.0 */
|
|
|
|
(function () {
|
|
|
|
'use strict';
|
|
|
|
var
|
|
_ = require('_'),
|
|
|
|
Enums = require('Common/Enums'),
|
|
Utils = require('Common/Utils'),
|
|
Links = require('Common/Links'),
|
|
|
|
Settings = require('Storage/Settings')
|
|
;
|
|
|
|
/**
|
|
* @constructor
|
|
*/
|
|
function CacheUserStorage()
|
|
{
|
|
this.oFoldersCache = {};
|
|
this.oFoldersNamesCache = {};
|
|
this.oFolderHashCache = {};
|
|
this.oFolderUidNextCache = {};
|
|
this.oMessageListHashCache = {};
|
|
this.oMessageFlagsCache = {};
|
|
this.oNewMessage = {};
|
|
this.oRequestedMessage = {};
|
|
|
|
this.bCapaGravatar = Settings.capa(Enums.Capa.Gravatar);
|
|
}
|
|
|
|
/**
|
|
* @type {boolean}
|
|
*/
|
|
CacheUserStorage.prototype.bCapaGravatar = false;
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oFoldersCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oFoldersNamesCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oFolderHashCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oFolderUidNextCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oMessageListHashCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oMessageFlagsCache = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oBodies = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oNewMessage = {};
|
|
|
|
/**
|
|
* @type {Object}
|
|
*/
|
|
CacheUserStorage.prototype.oRequestedMessage = {};
|
|
|
|
CacheUserStorage.prototype.clear = function ()
|
|
{
|
|
this.oFoldersCache = {};
|
|
this.oFoldersNamesCache = {};
|
|
this.oFolderHashCache = {};
|
|
this.oFolderUidNextCache = {};
|
|
this.oMessageListHashCache = {};
|
|
this.oMessageFlagsCache = {};
|
|
this.oBodies = {};
|
|
};
|
|
|
|
|
|
/**
|
|
* @param {string} sEmail
|
|
* @param {Function} fCallback
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getUserPic = function (sEmail, fCallback)
|
|
{
|
|
sEmail = Utils.trim(sEmail);
|
|
fCallback(this.bCapaGravatar && '' !== sEmail ? Links.avatarLink(sEmail) : '', sEmail);
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string} sUid
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getMessageKey = function (sFolderFullNameRaw, sUid)
|
|
{
|
|
return sFolderFullNameRaw + '#' + sUid;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolder
|
|
* @param {string} sUid
|
|
*/
|
|
CacheUserStorage.prototype.addRequestedMessage = function (sFolder, sUid)
|
|
{
|
|
this.oRequestedMessage[this.getMessageKey(sFolder, sUid)] = true;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolder
|
|
* @param {string} sUid
|
|
* @return {boolean}
|
|
*/
|
|
CacheUserStorage.prototype.hasRequestedMessage = function (sFolder, sUid)
|
|
{
|
|
return true === this.oRequestedMessage[this.getMessageKey(sFolder, sUid)];
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string} sUid
|
|
*/
|
|
CacheUserStorage.prototype.addNewMessageCache = function (sFolderFullNameRaw, sUid)
|
|
{
|
|
this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = true;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string} sUid
|
|
*/
|
|
CacheUserStorage.prototype.hasNewMessageAndRemoveFromCache = function (sFolderFullNameRaw, sUid)
|
|
{
|
|
if (this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)])
|
|
{
|
|
this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = null;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
CacheUserStorage.prototype.clearNewMessageCache = function ()
|
|
{
|
|
this.oNewMessage = {};
|
|
};
|
|
|
|
/**
|
|
* @type {string}
|
|
*/
|
|
CacheUserStorage.prototype.sInboxFolderName = '';
|
|
|
|
/**
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getFolderInboxName = function ()
|
|
{
|
|
return '' === this.sInboxFolderName ? 'INBOX' : this.sInboxFolderName;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderHash
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getFolderFullNameRaw = function (sFolderHash)
|
|
{
|
|
return '' !== sFolderHash && this.oFoldersNamesCache[sFolderHash] ? this.oFoldersNamesCache[sFolderHash] : '';
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderHash
|
|
* @param {string} sFolderFullNameRaw
|
|
*/
|
|
CacheUserStorage.prototype.setFolderFullNameRaw = function (sFolderHash, sFolderFullNameRaw)
|
|
{
|
|
this.oFoldersNamesCache[sFolderHash] = sFolderFullNameRaw;
|
|
if ('INBOX' === sFolderFullNameRaw || '' === this.sInboxFolderName)
|
|
{
|
|
this.sInboxFolderName = sFolderFullNameRaw;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getFolderHash = function (sFolderFullNameRaw)
|
|
{
|
|
return '' !== sFolderFullNameRaw && this.oFolderHashCache[sFolderFullNameRaw] ? this.oFolderHashCache[sFolderFullNameRaw] : '';
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string} sFolderHash
|
|
*/
|
|
CacheUserStorage.prototype.setFolderHash = function (sFolderFullNameRaw, sFolderHash)
|
|
{
|
|
this.oFolderHashCache[sFolderFullNameRaw] = sFolderHash;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @return {string}
|
|
*/
|
|
CacheUserStorage.prototype.getFolderUidNext = function (sFolderFullNameRaw)
|
|
{
|
|
return '' !== sFolderFullNameRaw && this.oFolderUidNextCache[sFolderFullNameRaw] ? this.oFolderUidNextCache[sFolderFullNameRaw] : '';
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string} sUidNext
|
|
*/
|
|
CacheUserStorage.prototype.setFolderUidNext = function (sFolderFullNameRaw, sUidNext)
|
|
{
|
|
this.oFolderUidNextCache[sFolderFullNameRaw] = sUidNext;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @return {?FolderModel}
|
|
*/
|
|
CacheUserStorage.prototype.getFolderFromCacheList = function (sFolderFullNameRaw)
|
|
{
|
|
return '' !== sFolderFullNameRaw && this.oFoldersCache[sFolderFullNameRaw] ? this.oFoldersCache[sFolderFullNameRaw] : null;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {?FolderModel} oFolder
|
|
*/
|
|
CacheUserStorage.prototype.setFolderToCacheList = function (sFolderFullNameRaw, oFolder)
|
|
{
|
|
this.oFoldersCache[sFolderFullNameRaw] = oFolder;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
*/
|
|
CacheUserStorage.prototype.removeFolderFromCacheList = function (sFolderFullNameRaw)
|
|
{
|
|
this.setFolderToCacheList(sFolderFullNameRaw, null);
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullName
|
|
* @param {string} sUid
|
|
* @return {?Array}
|
|
*/
|
|
CacheUserStorage.prototype.getMessageFlagsFromCache = function (sFolderFullName, sUid)
|
|
{
|
|
return this.oMessageFlagsCache[sFolderFullName] && this.oMessageFlagsCache[sFolderFullName][sUid] ?
|
|
this.oMessageFlagsCache[sFolderFullName][sUid] : null;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullName
|
|
* @param {string} sUid
|
|
* @param {Array} aFlagsCache
|
|
*/
|
|
CacheUserStorage.prototype.setMessageFlagsToCache = function (sFolderFullName, sUid, aFlagsCache)
|
|
{
|
|
if (!this.oMessageFlagsCache[sFolderFullName])
|
|
{
|
|
this.oMessageFlagsCache[sFolderFullName] = {};
|
|
}
|
|
|
|
this.oMessageFlagsCache[sFolderFullName][sUid] = aFlagsCache;
|
|
};
|
|
|
|
/**
|
|
* @param {string} sFolderFullName
|
|
*/
|
|
CacheUserStorage.prototype.clearMessageFlagsFromCacheByFolder = function (sFolderFullName)
|
|
{
|
|
this.oMessageFlagsCache[sFolderFullName] = {};
|
|
};
|
|
|
|
/**
|
|
* @param {(MessageModel|null)} oMessage
|
|
*/
|
|
CacheUserStorage.prototype.initMessageFlagsFromCache = function (oMessage)
|
|
{
|
|
if (oMessage)
|
|
{
|
|
var
|
|
self = this,
|
|
aFlags = this.getMessageFlagsFromCache(oMessage.folderFullNameRaw, oMessage.uid),
|
|
mUnseenSubUid = null,
|
|
mFlaggedSubUid = null
|
|
;
|
|
|
|
if (aFlags && 0 < aFlags.length)
|
|
{
|
|
oMessage.unseen(!!aFlags[0]);
|
|
oMessage.flagged(!!aFlags[1]);
|
|
oMessage.answered(!!aFlags[2]);
|
|
oMessage.forwarded(!!aFlags[3]);
|
|
oMessage.isReadReceipt(!!aFlags[4]);
|
|
}
|
|
|
|
if (0 < oMessage.threads().length)
|
|
{
|
|
mUnseenSubUid = _.find(oMessage.threads(), function (iSubUid) {
|
|
var aFlags = self.getMessageFlagsFromCache(oMessage.folderFullNameRaw, iSubUid);
|
|
return aFlags && 0 < aFlags.length && !!aFlags[0];
|
|
});
|
|
|
|
mFlaggedSubUid = _.find(oMessage.threads(), function (iSubUid) {
|
|
var aFlags = self.getMessageFlagsFromCache(oMessage.folderFullNameRaw, iSubUid);
|
|
return aFlags && 0 < aFlags.length && !!aFlags[1];
|
|
});
|
|
|
|
oMessage.hasUnseenSubMessage(mUnseenSubUid && 0 < Utils.pInt(mUnseenSubUid));
|
|
oMessage.hasFlaggedSubMessage(mFlaggedSubUid && 0 < Utils.pInt(mFlaggedSubUid));
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @param {(MessageModel|null)} oMessage
|
|
*/
|
|
CacheUserStorage.prototype.storeMessageFlagsToCache = function (oMessage)
|
|
{
|
|
if (oMessage)
|
|
{
|
|
this.setMessageFlagsToCache(
|
|
oMessage.folderFullNameRaw,
|
|
oMessage.uid,
|
|
[oMessage.unseen(), oMessage.flagged(), oMessage.answered(), oMessage.forwarded(), oMessage.isReadReceipt()]
|
|
);
|
|
}
|
|
};
|
|
/**
|
|
* @param {string} sFolder
|
|
* @param {string} sUid
|
|
* @param {Array} aFlags
|
|
*/
|
|
CacheUserStorage.prototype.storeMessageFlagsToCacheByFolderAndUid = function (sFolder, sUid, aFlags)
|
|
{
|
|
if (Utils.isArray(aFlags) && 0 < aFlags.length)
|
|
{
|
|
this.setMessageFlagsToCache(sFolder, sUid, aFlags);
|
|
}
|
|
};
|
|
|
|
module.exports = new CacheUserStorage();
|
|
|
|
}()); |