merge of '6e077ed907974bc4e78dbdf12a128ba170de5a38'

and 'a216f87669942e793f9124b63661a5ae82105c1d'

Monotone-Parent: 6e077ed907974bc4e78dbdf12a128ba170de5a38
Monotone-Parent: a216f87669942e793f9124b63661a5ae82105c1d
Monotone-Revision: bdc770e039bce1273bf76acc5e48dd7006974831

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2008-02-01T16:30:00
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau 2008-02-01 16:30:00 +00:00
commit 480dc6ff86
10 changed files with 174 additions and 112 deletions

View file

@ -1,3 +1,13 @@
2008-02-01 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/MailerUI/UIxMailMainFrame.m ([UIxMailMainFrame
-quotaSupport]): new json string that lists the quota support
among the user's mail accounts.
* SoObjects/Mailer/SOGoMailAccount.m ([SOGoMailAccount
-supportsQuotas]): new method that returns whether the current
account server has support for quotas.
2008-01-29 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder

View file

@ -48,6 +48,8 @@
SOGoTrashFolder *trashFolder;
}
- (BOOL) supportsQuotas;
/* folder pathes */
- (NSArray *) allFolderPaths;

View file

@ -31,6 +31,8 @@
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSNull+misc.h>
#import <NGImap4/NGImap4Connection.h>
#import <NGImap4/NGImap4Client.h>
#import <NGImap4/NGImap4Context.h>
#import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/SOGoUser.h>
@ -170,6 +172,15 @@ static NSString *otherUsersFolderName = @""; // TODO: add English default
return folders;
}
- (BOOL) supportsQuotas
{
NGImap4Client *imapClient;
imapClient = [[self imap4Connection] client];
return [[imapClient context] canQuota];
}
/* hierarchy */
- (SOGoMailAccount *) mailAccountFolder

View file

@ -41,6 +41,8 @@
@interface SOGoMailAccounts : SOGoFolder
- (NSArray *) toManyRelationshipKeys;
@end
#endif /* __Mailer_SOGoMailAccounts_H__ */

View file

@ -76,6 +76,7 @@ static NSString *AgenorShareLoginMarker = @".-.";
}
ct = [[ctClass alloc] initWithName:_key inContainer:self];
return [ct autorelease];
}

View file

@ -20,6 +20,7 @@
*/
#import <Foundation/NSUserDefaults.h>
#import <Foundation/NSValue.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WORequest.h>
@ -28,6 +29,7 @@
#import <NGExtensions/NSString+misc.h>
#import <SoObjects/Mailer/SOGoMailObject.h>
#import <SoObjects/Mailer/SOGoMailAccount.h>
#import <SoObjects/Mailer/SOGoMailAccounts.h>
#import <SoObjects/SOGo/NSDictionary+URL.h>
#import <SoObjects/SOGo/NSArray+Utilities.h>
@ -71,6 +73,29 @@
return [accountNames jsonRepresentation];
}
- (NSString *) quotaSupport
{
NSEnumerator *accountNames;
NSMutableArray *quotas;
NSString *currentAccount;
SOGoMailAccounts *co;
BOOL supportsQuota;
co = [self clientObject];
accountNames = [[co toManyRelationshipKeys] objectEnumerator];
quotas = [NSMutableArray array];
while ((currentAccount = [accountNames nextObject]))
{
supportsQuota = [[co lookupName: currentAccount
inContext: context
acquire: NO] supportsQuotas];
[quotas addObject: [NSNumber numberWithInt: supportsQuota]];
}
return [quotas jsonRepresentation];
}
- (NSString *) pageFormURL
{
NSString *u;
@ -127,7 +152,9 @@
accounts = [[context activeUser] mailAccounts];
firstAccount = [[accounts objectsForKey: @"name"] objectAtIndex: 0];
formValues = [[context request] formValues];
parameters = [formValues count] > 0 ? [formValues asURLParameters] : @"?mailto=";
parameters = ([formValues count] > 0
? [formValues asURLParameters]
: @"?mailto=");
newLocation = [NSString stringWithFormat: @"%@/%@/compose%@",
[co baseURLInContext: context],
firstAccount,

View file

@ -10,6 +10,7 @@
const:jsFiles="dtree.js,MailerUI+dTree.js">
<script type="text/javascript">
var textMailAccounts = '<var:string value="mailAccounts" const:escapeHTML="NO"/>';
var textQuotaSupport = '<var:string value="quotaSupport" const:escapeHTML="NO"/>';
</script>
<div class="menu" id="accountIconMenu">
<ul>

View file

@ -2,12 +2,19 @@
var accounts = {};
var mailboxTree;
var mailAccounts;
var quotaSupport;
if (typeof textMailAccounts != 'undefined') {
if (textMailAccounts.length > 0)
mailAccounts = textMailAccounts.evalJSON(true);
else
mailAccounts = new Array();
}
if (typeof textQuotaSupport != 'undefined') {
if (textQuotaSupport.length > 0)
quotaSupport = textQuotaSupport.evalJSON(true);
else
quotaSupport = new Array();
}
var Mailer = {
currentMailbox: null,
@ -179,15 +186,14 @@ function mailListMarkMessage(event) {
}
function mailListMarkMessageCallback(http) {
if (http.readyState == 4)
if (isHttpStatus204(http.status)) {
var data = http.callbackData;
markMailInWindow(data["window"], data["msguid"], data["markread"]);
}
else {
alert("Message Mark Failed (" + http.status + "): " + http.statusText);
window.location.reload();
}
if (isHttpStatus204(http.status)) {
var data = http.callbackData;
markMailInWindow(data["window"], data["msguid"], data["markread"]);
}
else {
alert("Message Mark Failed (" + http.status + "): " + http.statusText);
window.location.reload();
}
}
/* maillist row highlight */
@ -235,31 +241,29 @@ function deleteSelectedMessages(sender) {
}
function deleteSelectedMessagesCallback(http) {
if (http.readyState == 4) {
if (isHttpStatus204(http.status)) {
var data = http.callbackData;
deleteCachedMessage(data["messageId"]);
deleteMessageRequestCount--;
if (Mailer.currentMailbox == data["mailbox"]) {
var div = $('messageContent');
if (Mailer.currentMessages[Mailer.currentMailbox] == data["id"]) {
div.update();
Mailer.currentMessages[Mailer.currentMailbox] = null;
}
if (isHttpStatus204(http.status)) {
var data = http.callbackData;
deleteCachedMessage(data["messageId"]);
deleteMessageRequestCount--;
if (Mailer.currentMailbox == data["mailbox"]) {
var div = $('messageContent');
if (Mailer.currentMessages[Mailer.currentMailbox] == data["id"]) {
div.update();
Mailer.currentMessages[Mailer.currentMailbox] = null;
}
var row = $("row_" + data["id"]);
var nextRow = row.next("tr");
if (!nextRow)
nextRow = row.previous("tr");
row.parentNode.removeChild(row);
var row = $("row_" + data["id"]);
var nextRow = row.next("tr");
if (!nextRow)
nextRow = row.previous("tr");
row.parentNode.removeChild(row);
// row.addClassName("deleted"); // when we'll offer "mark as deleted"
if (deleteMessageRequestCount == 0) {
if (nextRow) {
Mailer.currentMessages[Mailer.currentMailbox] = nextRow.getAttribute("id").substr(4);
nextRow.select();
loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
}
if (deleteMessageRequestCount == 0) {
if (nextRow) {
Mailer.currentMessages[Mailer.currentMailbox] = nextRow.getAttribute("id").substr(4);
nextRow.select();
loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
}
}
}
@ -487,9 +491,11 @@ function openMailbox(mailbox, reload, idx) {
= triggerAjaxRequest(url, messageListCallback,
currentMessage);
var quotasUrl = ApplicationBaseURL + mailbox + "/quotas";
document.quotasAjaxRequest
= triggerAjaxRequest(quotasUrl, quotasCallback);
var account = Mailer.currentMailbox.split("/")[1];
if (accounts[account].supportsQuotas) {
var quotasUrl = ApplicationBaseURL + mailbox + "/quotas";
triggerAjaxRequest(quotasUrl, quotasCallback);
}
}
}
@ -503,8 +509,7 @@ function messageListCallback(http) {
var div = $('mailboxContent');
var table = $('messageList');
if (http.readyState == 4
&& http.status == 200) {
if (http.status == 200) {
document.messageListAjaxRequest = null;
if (table) {
@ -571,8 +576,7 @@ function messageListCallback(http) {
}
function quotasCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.status == 200) {
var hasQuotas = false;
if (http.responseText.length > 0) {
@ -629,7 +633,7 @@ function onMessageContextMenuHide(event) {
function onFolderMenuClick(event) {
var onhide, menuName;
var menutype = this.parentNode.getAttribute("datatype");
if (menutype) {
if (menutype == "inbox") {
@ -822,18 +826,16 @@ function onICalendarButtonClick(event) {
}
function ICalendarButtonCallback(http) {
if (http.readyState == 4)
if (isHttpStatus204(http.status)) {
var oldMsg = http.callbackData;
var msg = Mailer.currentMailbox + "/" + Mailer.currentMessages[Mailer.currentMailbox];
if (oldMsg == msg) {
deleteCachedMessage(oldMsg);
loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
}
}
else {
window.alert("received code: " + http.status);
if (isHttpStatus204(http.status)) {
var oldMsg = http.callbackData;
var msg = Mailer.currentMailbox + "/" + Mailer.currentMessages[Mailer.currentMailbox];
if (oldMsg == msg) {
deleteCachedMessage(oldMsg);
loadMessage(Mailer.currentMessages[Mailer.currentMailbox]);
}
}
else
window.alert("received code: " + http.status);
}
function resizeMailContent() {
@ -878,8 +880,7 @@ function onImageClick(event) {
function messageCallback(http) {
var div = $('messageContent');
if (http.readyState == 4
&& http.status == 200) {
if (http.status == 200) {
document.messageAjaxRequest = null;
div.update(http.responseText);
configureLinksInMessage();
@ -1161,7 +1162,8 @@ function configureMessageListBodyEvents(table) {
if ($(cell).hasClassName("tbtv_navcell")) {
var anchors = $(cell).childNodesWithTag("a");
for (var i = 0; i < anchors.length; i++)
Event.observe(anchors[i], "click", openMailboxAtIndex.bindAsEventListener(anchors[i]));
Event.observe(anchors[i], "click",
openMailboxAtIndex.bindAsEventListener(anchors[i]));
}
rows = table.tBodies[0].rows;
@ -1418,8 +1420,7 @@ function updateMailboxMenus() {
}
function onLoadMailboxesCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.status == 200) {
checkAjaxRequestsState();
if (http.responseText.length > 0) {
var newAccount = buildMailboxes(http.callbackData,
@ -1456,6 +1457,10 @@ function onLoadMailboxesCallback(http) {
function buildMailboxes(accountName, encoded) {
var account = new Mailbox("account", accountName);
var accountIndex = mailAccounts.indexOf(accountName);
account.supportsQuotas = (quotaSupport[accountIndex] != 0);
var data = encoded.evalJSON(true);
for (var i = 0; i < data.length; i++) {
var currentNode = account;
@ -1489,8 +1494,7 @@ function getFoldersState() {
}
function getFoldersStateCallback(http) {
if (http.readyState == 4
&& http.status == 200) {
if (http.status == 200) {
if (http.responseText.length > 0) {
// The response text is a JSOn representation
// of the folders that were left opened.
@ -1501,8 +1505,8 @@ function getFoldersStateCallback(http) {
mailboxTree.o(i);
}
}
mailboxTree.autoSync();
}
mailboxTree.autoSync();
}
function saveFoldersState() {
@ -1514,8 +1518,7 @@ function saveFoldersState() {
}
function saveFoldersStateCallback(http) {
if (http.readyState == 4
&& isHttpStatus204(http.status)) {
if (isHttpStatus204(http.status)) {
log ("folders state saved");
}
}

View file

@ -322,7 +322,8 @@ function displayFreeBusyForNode(input) {
}
var sd = $('startTime_date').valueAsShortDateString();
var ed = $('endTime_date').valueAsShortDateString();
var urlstr = ( UserFolderURL + "../" + input.uid + "/freebusy.ifb/ajaxRead?"
var urlstr = ( UserFolderURL + "../" + input.uid
+ "/freebusy.ifb/ajaxRead?"
+ "sday=" + sd + "&eday=" + ed + "&additional=" +
additionalDays );
document.contactFreeBusyAjaxRequest
@ -601,7 +602,8 @@ function prepareAttendees() {
$(row).addClassName(attendeesEditor.states[i]);
var input = $(row).down("input");
var value = "";
if (attendeesEditor.names[i].length > 0 && attendeesEditor.names[i] != attendeesEditor.emails[i])
if (attendeesEditor.names[i].length > 0
&& attendeesEditor.names[i] != attendeesEditor.emails[i])
value += attendeesEditor.names[i] + " ";
value += "<" + attendeesEditor.emails[i] + ">";
input.value = value;

View file

@ -309,39 +309,47 @@ function appendDifferentiator(url) {
return url_nocache;
}
function onAjaxRequestStateChange(http) {
try {
if (http.readyState == 4
&& activeAjaxRequests > 0) {
if (!http.aborted)
http.callback(http);
activeAjaxRequests--;
checkAjaxRequestsState();
http.onreadystatechange = Prototype.emptyFunction;
http.callback = Prototype.emptyFunction;
http.callbackData = null;
}
}
catch (e) {
activeAjaxRequests--;
checkAjaxRequestsState();
http.onreadystatechange = Prototype.emptyFunction;
http.callback = Prototype.emptyFunction;
http.callbackData = null;
log("AJAX Request, Caught Exception: " + e.name);
log(e.message);
log(backtrace());
}
}
function triggerAjaxRequest(url, callback, userdata, content, headers) {
var http = createHTTPClient();
activeAjaxRequests += 1;
document.animTimer = setTimeout("checkAjaxRequestsState();", 50);
activeAjaxRequests++;
document.animTimer = setTimeout("checkAjaxRequestsState();", 250);
//url = appendDifferentiator(url);
if (http) {
http.open("POST", url, true);
http.url = url;
http.onreadystatechange
= function() {
// log ("state changed (" + http.readyState + "): " + url);
try {
if (http.readyState == 4
&& activeAjaxRequests > 0) {
if (!http.aborted) {
if (userdata)
http.callbackData = userdata;
callback(http);
}
activeAjaxRequests -= 1;
checkAjaxRequestsState();
}
}
catch (e) {
activeAjaxRequests -= 1;
checkAjaxRequestsState();
log("AJAX Request, Caught Exception: " + e.name);
log(e.message);
log(backtrace());
}
};
http.callback = callback;
http.callbackData = userdata;
http.onreadystatechange = function() { onAjaxRequestStateChange(http) };
// = function() {
// // log ("state changed (" + http.readyState + "): " + url);
// };
var hasContentLength = false;
if (headers) {
for (var i in headers) {
@ -367,36 +375,31 @@ function triggerAjaxRequest(url, callback, userdata, content, headers) {
function startAnimation(parent, nextNode) {
var anim = $("progressIndicator");
if (anim) return anim;
anim = document.createElement("img");
anim = $(anim);
anim.id = "progressIndicator";
anim.src = ResourcesURL + "/busy.gif";
anim.setStyle({ visibility: "hidden" });
if (nextNode)
parent.insertBefore(anim, nextNode);
else
parent.appendChild(anim);
anim.setStyle({ visibility: "visible" });
if (!anim) {
anim = createElement("img", "progressIndicator", null,
{src: ResourcesURL + "/busy.gif"});
anim.setStyle({ visibility: "hidden" });
if (nextNode)
parent.insertBefore(anim, nextNode);
else
parent.appendChild(anim);
anim.setStyle({ visibility: "visible" });
}
return anim;
}
function checkAjaxRequestsState() {
var toolbar = document.getElementById("toolbar");
if (toolbar) {
if (activeAjaxRequests > 0
&& !document.busyAnim) {
document.busyAnim = startAnimation(toolbar);
}
else if (activeAjaxRequests == 0
&& document.busyAnim
&& document.busyAnim.parentNode) {
document.busyAnim.parentNode.removeChild(document.busyAnim);
document.busyAnim = null;
}
var progressImage = $("progressIndicator");
if (activeAjaxRequests > 0
&& !progressImage) {
var toolbar = $("toolbar");
if (toolbar)
startAnimation(toolbar);
}
else if (!activeAjaxRequests
&& progressImage)
progressImage.parentNode.removeChild(progressImage);
}
function isSafari3() {