snappymail/dev/Storage/User/Cache.js

365 lines
8.6 KiB
JavaScript
Raw Normal View History

2014-09-05 06:49:03 +08:00
(function () {
2014-08-25 23:49:01 +08:00
'use strict';
2014-08-21 23:08:34 +08:00
var
2014-08-25 23:49:01 +08:00
_ = require('_'),
2014-08-25 15:10:51 +08:00
2014-09-05 06:49:03 +08:00
Enums = require('Common/Enums'),
Utils = require('Common/Utils'),
2014-10-06 02:37:31 +08:00
Links = require('Common/Links'),
2014-08-21 23:08:34 +08:00
Settings = require('Storage/Settings')
2014-08-21 23:08:34 +08:00
;
/**
* @constructor
*/
2014-10-18 21:43:44 +08:00
function CacheUserStorage()
{
2014-08-21 23:08:34 +08:00
this.oFoldersCache = {};
this.oFoldersNamesCache = {};
this.oFolderHashCache = {};
this.oFolderUidNextCache = {};
this.oMessageListHashCache = {};
this.oMessageFlagsCache = {};
this.oNewMessage = {};
this.oRequestedMessage = {};
2014-08-27 23:59:44 +08:00
this.bCapaGravatar = Settings.capa(Enums.Capa.Gravatar);
}
2014-08-21 23:08:34 +08:00
/**
* @type {boolean}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.bCapaGravatar = false;
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oFoldersCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oFoldersNamesCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oFolderHashCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oFolderUidNextCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oMessageListHashCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oMessageFlagsCache = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oBodies = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oNewMessage = {};
2014-08-21 23:08:34 +08:00
/**
* @type {Object}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.oRequestedMessage = {};
2014-08-21 23:08:34 +08:00
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.clear = function ()
{
2014-08-21 23:08:34 +08:00
this.oFoldersCache = {};
this.oFoldersNamesCache = {};
this.oFolderHashCache = {};
this.oFolderUidNextCache = {};
this.oMessageListHashCache = {};
this.oMessageFlagsCache = {};
this.oBodies = {};
};
/**
* @param {string} sEmail
* @param {Function} fCallback
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getUserPic = function (sEmail, fCallback)
2014-08-21 23:08:34 +08:00
{
sEmail = Utils.trim(sEmail);
2014-10-06 02:37:31 +08:00
fCallback(this.bCapaGravatar && '' !== sEmail ? Links.avatarLink(sEmail) : '', sEmail);
2014-08-21 23:08:34 +08:00
};
/**
* @param {string} sFolderFullNameRaw
* @param {string} sUid
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getMessageKey = function (sFolderFullNameRaw, sUid)
2014-08-21 23:08:34 +08:00
{
return sFolderFullNameRaw + '#' + sUid;
};
/**
* @param {string} sFolder
* @param {string} sUid
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.addRequestedMessage = function (sFolder, sUid)
2014-08-21 23:08:34 +08:00
{
this.oRequestedMessage[this.getMessageKey(sFolder, sUid)] = true;
};
/**
* @param {string} sFolder
* @param {string} sUid
* @return {boolean}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.hasRequestedMessage = function (sFolder, sUid)
2014-08-21 23:08:34 +08:00
{
return true === this.oRequestedMessage[this.getMessageKey(sFolder, sUid)];
};
/**
* @param {string} sFolderFullNameRaw
* @param {string} sUid
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.addNewMessageCache = function (sFolderFullNameRaw, sUid)
2014-08-21 23:08:34 +08:00
{
this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = true;
};
/**
* @param {string} sFolderFullNameRaw
* @param {string} sUid
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.hasNewMessageAndRemoveFromCache = function (sFolderFullNameRaw, sUid)
{
2014-08-21 23:08:34 +08:00
if (this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)])
{
2014-08-21 23:08:34 +08:00
this.oNewMessage[this.getMessageKey(sFolderFullNameRaw, sUid)] = null;
return true;
}
2014-08-21 23:08:34 +08:00
return false;
};
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.clearNewMessageCache = function ()
2014-08-21 23:08:34 +08:00
{
this.oNewMessage = {};
};
/**
* @type {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.sInboxFolderName = '';
/**
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getFolderInboxName = function ()
{
return '' === this.sInboxFolderName ? 'INBOX' : this.sInboxFolderName;
};
2014-08-21 23:08:34 +08:00
/**
* @param {string} sFolderHash
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getFolderFullNameRaw = function (sFolderHash)
2014-08-21 23:08:34 +08:00
{
return '' !== sFolderHash && this.oFoldersNamesCache[sFolderHash] ? this.oFoldersNamesCache[sFolderHash] : '';
};
/**
* @param {string} sFolderHash
* @param {string} sFolderFullNameRaw
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.setFolderFullNameRaw = function (sFolderHash, sFolderFullNameRaw)
2014-08-21 23:08:34 +08:00
{
this.oFoldersNamesCache[sFolderHash] = sFolderFullNameRaw;
if ('INBOX' === sFolderFullNameRaw || '' === this.sInboxFolderName)
{
this.sInboxFolderName = sFolderFullNameRaw;
}
2014-08-21 23:08:34 +08:00
};
/**
* @param {string} sFolderFullNameRaw
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getFolderHash = function (sFolderFullNameRaw)
2014-08-21 23:08:34 +08:00
{
return '' !== sFolderFullNameRaw && this.oFolderHashCache[sFolderFullNameRaw] ? this.oFolderHashCache[sFolderFullNameRaw] : '';
};
/**
* @param {string} sFolderFullNameRaw
* @param {string} sFolderHash
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.setFolderHash = function (sFolderFullNameRaw, sFolderHash)
2014-08-21 23:08:34 +08:00
{
this.oFolderHashCache[sFolderFullNameRaw] = sFolderHash;
};
/**
* @param {string} sFolderFullNameRaw
* @return {string}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getFolderUidNext = function (sFolderFullNameRaw)
2014-08-21 23:08:34 +08:00
{
return '' !== sFolderFullNameRaw && this.oFolderUidNextCache[sFolderFullNameRaw] ? this.oFolderUidNextCache[sFolderFullNameRaw] : '';
};
/**
* @param {string} sFolderFullNameRaw
* @param {string} sUidNext
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.setFolderUidNext = function (sFolderFullNameRaw, sUidNext)
2014-08-21 23:08:34 +08:00
{
this.oFolderUidNextCache[sFolderFullNameRaw] = sUidNext;
};
/**
* @param {string} sFolderFullNameRaw
* @return {?FolderModel}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getFolderFromCacheList = function (sFolderFullNameRaw)
2014-08-21 23:08:34 +08:00
{
return '' !== sFolderFullNameRaw && this.oFoldersCache[sFolderFullNameRaw] ? this.oFoldersCache[sFolderFullNameRaw] : null;
};
/**
* @param {string} sFolderFullNameRaw
* @param {?FolderModel} oFolder
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.setFolderToCacheList = function (sFolderFullNameRaw, oFolder)
2014-08-21 23:08:34 +08:00
{
this.oFoldersCache[sFolderFullNameRaw] = oFolder;
};
/**
* @param {string} sFolderFullNameRaw
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.removeFolderFromCacheList = function (sFolderFullNameRaw)
2014-08-21 23:08:34 +08:00
{
this.setFolderToCacheList(sFolderFullNameRaw, null);
};
/**
* @param {string} sFolderFullName
* @param {string} sUid
* @return {?Array}
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.getMessageFlagsFromCache = function (sFolderFullName, sUid)
2014-08-21 23:08:34 +08:00
{
return this.oMessageFlagsCache[sFolderFullName] && this.oMessageFlagsCache[sFolderFullName][sUid] ?
this.oMessageFlagsCache[sFolderFullName][sUid] : null;
};
/**
* @param {string} sFolderFullName
* @param {string} sUid
* @param {Array} aFlagsCache
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.setMessageFlagsToCache = function (sFolderFullName, sUid, aFlagsCache)
2014-08-21 23:08:34 +08:00
{
if (!this.oMessageFlagsCache[sFolderFullName])
{
2014-08-21 23:08:34 +08:00
this.oMessageFlagsCache[sFolderFullName] = {};
}
2014-08-21 23:08:34 +08:00
this.oMessageFlagsCache[sFolderFullName][sUid] = aFlagsCache;
};
/**
* @param {string} sFolderFullName
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.clearMessageFlagsFromCacheByFolder = function (sFolderFullName)
{
2014-08-21 23:08:34 +08:00
this.oMessageFlagsCache[sFolderFullName] = {};
};
/**
* @param {(MessageModel|null)} oMessage
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.initMessageFlagsFromCache = function (oMessage)
{
2014-08-21 23:08:34 +08:00
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
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.storeMessageFlagsToCache = function (oMessage)
2014-08-21 23:08:34 +08:00
{
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
*/
2014-10-18 21:43:44 +08:00
CacheUserStorage.prototype.storeMessageFlagsToCacheByFolderAndUid = function (sFolder, sUid, aFlags)
2014-08-21 23:08:34 +08:00
{
if (Utils.isArray(aFlags) && 0 < aFlags.length)
{
this.setMessageFlagsToCache(sFolder, sUid, aFlags);
}
};
2014-10-18 21:43:44 +08:00
module.exports = new CacheUserStorage();
2014-08-21 23:08:34 +08:00
2014-09-05 06:49:03 +08:00
}());