From 423f4a4270018fea99627cbd3f54149edef2d228 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Thu, 17 Aug 2017 09:42:25 +0200 Subject: [PATCH 01/11] mivExchangeCalendar.js: cleanup getItems (wip) --- .../exchangeCalendar/mivExchangeCalendar.js | 123 +++++++++--------- 1 file changed, 63 insertions(+), 60 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index 3c93c495..1ce76b0c 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2362,35 +2362,35 @@ calExchangeCalendar.prototype = { // in calIOperationListener aListener); getItems: function _getItems(aItemFilter, aCount, aRangeStart, aRangeEnd, aListener) { - if (this.debug) this.logInfo("getItems 0: " + " aItemFilter, " + aItemFilter + " aCount, " + aCount - + " aRangeStart, " + aRangeStart + " aRangeEnd, " + aRangeEnd - + " aListener , " + aListener); + if (this.debug) { + this.logInfo("getItems 0: " + " aItemFilter, " + aItemFilter + + " aCount, " + aCount + + " aRangeStart, " + aRangeStart + + " aRangeEnd, " + aRangeEnd + + " aListener , " + aListener); + + if (aRangeStart) { + this.logInfo("getItems 2: aRangeStart:" + aRangeStart.toString()); + } + else { + this.logInfo("getItems 2: aRangeStart:null"); + } + if (aRangeEnd) { + this.logInfo("getItems 3: aRangeEnd:" + aRangeEnd.toString()); + } + else { + this.logInfo("getItems 3: aRangeEnd:null"); + } + } //Start poller if not already runnning this may resolve suspend issue this.startCalendarPoller(); - if (aRangeStart) { - if (this.debug) this.logInfo("getItems 2: aRangeStart:" + aRangeStart.toString()); - //dump(", aRangeStart:"+aRangeStart.toString()); - } - else { - if (this.debug) this.logInfo("getItems 2: aRangeStart:null"); - //dump(", aRangeStart:null"); - } - if (aRangeEnd) { - if (this.debug) this.logInfo("getItems 3: aRangeEnd:" + aRangeEnd.toString()); - //dump(", aRangeEnd:"+aRangeEnd.toString()); - } - else { - if (this.debug) this.logInfo("getItems 3: aRangeEnd:null"); - //dump(", aRangeEnd:null"); - } - //dump("\n"); + if (this.typeString(aListener) === "object") { + if (this.debug) { + this.logInfo("getItems: We received a getItems from repeatingInvitationsTimer function. Because this request if always for a full year it will consume a lot of memory when we have a lot of recurring events with no end date. So for now we only request the period we have in memory cache. startDate:" + this.startDate + ", endDate:" + this.endDate); + } - //dump(" typeString(aListener):"+this.typeString(aListener)+"\n"); - if (this.typeString(aListener) == "object") { - if (this.debug) this.logInfo("We received a getItems from repeatingInvitationsTimer function. Because this request if always for a full year it will consume a lot of memory when we have a lot of recurring events with no end date. So for now we only request the period we have in memory cache. startDate:" + this.startDate + ", endDate:" + this.endDate); - //dump(this.globalFunctions.STACK(10)+"\n"); if (this.startDate) { aRangeStart = this.startDate.clone(); } @@ -2405,24 +2405,27 @@ calExchangeCalendar.prototype = { } } - var wantEvents = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_TYPE_EVENT) != 0); + let wantEvents = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_EVENT) != 0); + let wantTodos = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_TODO) != 0); - var wantTodos = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_TYPE_TODO) != 0); - - //if (wantEvents) dump("Events are requested by calendar.\n"); - //if (wantTodos) dump("Tasks are requested by calendar.\n"); - - if (wantEvents) - if (this.debug) this.logInfo("Events are requested by calendar."); - if (wantTodos) - if (this.debug) this.logInfo("Tasks are requested by calendar."); + if (this.debug) { + if (wantEvents) { + this.logInfo("getItems: Events are requested by calendar."); + } + if (wantTodos) { + this.logInfo("getItems: Tasks are requested by calendar."); + } + } + // Calendar is in creation, we just update calendar range selection and stop if (this.newCalendar) { - if (this.debug) this.logInfo("We are still creating this calendar. Ignore getItems for now."); - if (aRangeStart) { - if (wantEvents) { + if (this.debug) { + this.logInfo("getItems: We are still creating this calendar. Ignore getItems for now."); + } + + // Adjust start/end range for events + if (wantEvents) { + if (aRangeStart) { if (this.newCalRangeStartEvents) { if (aRangeStart.compare(this.newCalRangeStartEvents) < 0) { this.newCalRangeStartEvents = aRangeStart.clone(); @@ -2431,31 +2434,35 @@ calExchangeCalendar.prototype = { else { this.newCalRangeStartEvents = aRangeStart.clone(); } + } - if (wantTodos) { - if (this.newCalRangeStartTodos) { - if (aRangeStart.compare(this.newCalRangeStartTodos) < 0) { - this.newCalRangeStartTodos = aRangeStart.clone(); + + if (aRangeEnd) { + if (this.newCalRangeEndEvents) { + if (aRangeEnd.compare(this.newCalRangeEndEvents) > 0) { + this.newCalRangeEndEvents = aRangeEnd.clone(); } } else { - this.newCalRangeStartTodos = aRangeStart.clone(); + this.newCalRangeEndEvents = aRangeEnd.clone(); } } } - if (aRangeEnd) { - if (wantEvents) { - if (this.newCalRangeEndEvents) { - if (aRangeEnd.compare(this.newCalRangeEndEvents) > 0) { - this.newCalRangeEndEvents = aRangeEnd.clone(); + // Adjust start/end range for tasks + if (wantTodos) { + if (aRangeStart) { + if (this.newCalRangeStartTodos) { + if (aRangeStart.compare(this.newCalRangeStartTodos) < 0) { + this.newCalRangeStartTodos = aRangeStart.clone(); } } else { - this.newCalRangeEndEvents = aRangeEnd.clone(); + this.newCalRangeStartTodos = aRangeStart.clone(); } } - if (wantTodos) { + + if (aRangeEnd) { if (this.newCalRangeEndTodos) { if (aRangeEnd.compare(this.newCalRangeEndTodos) > 0) { this.newCalRangeEndTodos = aRangeEnd.clone(); @@ -2474,11 +2481,11 @@ calExchangeCalendar.prototype = { null, null); } + return; } if (!this.firstSyncDone) { - //dump("!this.firstSyncDone\n"); this.getItemsSyncQueue.push({ itemFilter: aItemFilter, count: aCount, @@ -2490,7 +2497,6 @@ calExchangeCalendar.prototype = { } if (!this.isInitialized) { - //dump("!this.isInitialized\n"); if (aListener) { this.notifyOperationComplete(aListener, Cr.NS_OK, @@ -2501,7 +2507,7 @@ calExchangeCalendar.prototype = { return; } - var validPeriod = false; + let validPeriod = false; if ((aRangeStart) && (aRangeEnd) && (aRangeStart.isDate) && (aRangeEnd.isDate)) { validPeriod = true; this.lastValidRangeStart = aRangeStart.clone(); @@ -2517,11 +2523,8 @@ calExchangeCalendar.prototype = { this.exporting = true; } - var asOccurrences = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_CLASS_OCCURRENCES) != 0); - - var wantInvitations = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_REQUEST_NEEDS_ACTION) != 0); + let asOccurrences = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_CLASS_OCCURRENCES) != 0); + let wantInvitations = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_REQUEST_NEEDS_ACTION) != 0); if (!wantEvents && !wantInvitations && !wantTodos) { this.notifyOperationComplete(aListener, @@ -11054,4 +11057,4 @@ else { } dump(">>>>>>>>>>> -----:"+tmpXML.toString()+"\n"); -*/ \ No newline at end of file +*/ From 2a15e0cd960968070bf0bb7f754eec13277bbf9c Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Thu, 17 Aug 2017 14:30:05 +0200 Subject: [PATCH 02/11] mivExchangeCalendar.js: Rewrite getItems check (style and comments) Note that logInfo already do itself debug param check before logging. --- .../exchangeCalendar/mivExchangeCalendar.js | 163 +++++++++++------- 1 file changed, 99 insertions(+), 64 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index 1ce76b0c..28697b44 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -76,11 +76,8 @@ Cu.import("resource://exchangecalendar/erDeleteAttachment.js"); Cu.import("resource://interfaces/xml2json/xml2json.js"); -//Cu.import("resource://interfaces/xml.js"); - Cu.import("resource://interfaces/exchangeTodo/mivExchangeTodo.js"); Cu.import("resource://interfaces/exchangeEvent/mivExchangeEvent.js"); -//Cu.import("resource://interfaces/exchangeBaseItem/mivExchangeBaseItem.js"); var globalStart = new Date().getTime(); @@ -296,8 +293,6 @@ const MAPI_PidLidReminderSet = "34051"; // calExchangeCalendar // -//var EXPORTED_SYMBOLS = ["calExchangeCalendar"]; - function calExchangeCalendar() { try { @@ -2362,34 +2357,34 @@ calExchangeCalendar.prototype = { // in calIOperationListener aListener); getItems: function _getItems(aItemFilter, aCount, aRangeStart, aRangeEnd, aListener) { - if (this.debug) { - this.logInfo("getItems 0: " + " aItemFilter, " + aItemFilter - + " aCount, " + aCount - + " aRangeStart, " + aRangeStart - + " aRangeEnd, " + aRangeEnd - + " aListener , " + aListener); - - if (aRangeStart) { - this.logInfo("getItems 2: aRangeStart:" + aRangeStart.toString()); - } - else { - this.logInfo("getItems 2: aRangeStart:null"); - } - if (aRangeEnd) { - this.logInfo("getItems 3: aRangeEnd:" + aRangeEnd.toString()); - } - else { - this.logInfo("getItems 3: aRangeEnd:null"); - } + + this.logInfo("getItems: aItemFilter, " + aItemFilter + + " aCount, " + aCount + + " aListener , " + aListener); + + if (aRangeStart) { + this.logInfo("getItems: aRangeStart:" + aRangeStart.toString()); + } + else { + this.logInfo("getItems: aRangeStart: null"); } - //Start poller if not already runnning this may resolve suspend issue + if (aRangeEnd) { + this.logInfo("getItems: aRangeEnd:" + aRangeEnd.toString()); + } + else { + this.logInfo("getItems: aRangeEnd: null"); + } + + // Start poller if not already runnning this may resolve suspend issue this.startCalendarPoller(); if (this.typeString(aListener) === "object") { - if (this.debug) { - this.logInfo("getItems: We received a getItems from repeatingInvitationsTimer function. Because this request if always for a full year it will consume a lot of memory when we have a lot of recurring events with no end date. So for now we only request the period we have in memory cache. startDate:" + this.startDate + ", endDate:" + this.endDate); - } + this.logInfo("getItems: We received a getItems from repeatingInvitationsTimer function.\ + Because this request if always for a full year it will consume a lot of\ + memory when we have a lot of recurring events with no end date.\ + So for now we only request the period we have in memory cache.\ + startDate:" + this.startDate + ", endDate:" + this.endDate); if (this.startDate) { aRangeStart = this.startDate.clone(); @@ -2397,6 +2392,7 @@ calExchangeCalendar.prototype = { else { aRangeStart = undefined; } + if (this.endDate) { aRangeEnd = this.endDate.clone(); } @@ -2405,25 +2401,37 @@ calExchangeCalendar.prototype = { } } - let wantEvents = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_EVENT) != 0); - let wantTodos = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_TODO) != 0); + /* + * Check minimal assestements before looking for items: + * - calendar is not in creation + * - calendar is initialized + * - calendar support requested items + * - first synchronization is done + */ + + // Unfold request filters to booleans + let wantEvents = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_EVENT) !== 0); + let wantTodos = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_TODO) !== 0); + let asOccurrences = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_CLASS_OCCURRENCES) !== 0); + let wantInvitations = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_REQUEST_NEEDS_ACTION) !== 0); - if (this.debug) { - if (wantEvents) { - this.logInfo("getItems: Events are requested by calendar."); - } - if (wantTodos) { - this.logInfo("getItems: Tasks are requested by calendar."); - } + if (wantEvents) { + this.logInfo("getItems: Events are requested by calendar."); + } + + if (wantTodos) { + this.logInfo("getItems: Tasks are requested by calendar."); } - // Calendar is in creation, we just update calendar range selection and stop + if (wantInvitations) { + this.logInfo("getItems: Invitations are requested by calendar."); + } + + // Calendar creation is not finished, we just update calendar range selection and stop if (this.newCalendar) { - if (this.debug) { - this.logInfo("getItems: We are still creating this calendar. Ignore getItems for now."); - } + this.logInfo("getItems: We are still creating this calendar. Ignore getItems for now."); - // Adjust start/end range for events + // Update start/end range for events if (wantEvents) { if (aRangeStart) { if (this.newCalRangeStartEvents) { @@ -2449,7 +2457,7 @@ calExchangeCalendar.prototype = { } } - // Adjust start/end range for tasks + // Update start/end range for tasks if (wantTodos) { if (aRangeStart) { if (this.newCalRangeStartTodos) { @@ -2493,6 +2501,7 @@ calExchangeCalendar.prototype = { rangeEnd: aRangeEnd, listener: aListener }); + return; } @@ -2504,63 +2513,89 @@ calExchangeCalendar.prototype = { null, null); } + return; } let validPeriod = false; - if ((aRangeStart) && (aRangeEnd) && (aRangeStart.isDate) && (aRangeEnd.isDate)) { + if (aRangeStart + && aRangeStart.isDate + && aRangeEnd + && aRangeEnd.isDate) { validPeriod = true; this.lastValidRangeStart = aRangeStart.clone(); this.lastValidRangeEnd = aRangeEnd.clone(); } this.exporting = false; - if ((aItemFilter == Ci.calICalendar.ITEM_FILTER_ALL_ITEMS) - && (aCount == 0) - && (aRangeStart === null) - && (aRangeEnd === null)) { - if (this.debug) this.logInfo("getItems: Request to get all Items in Calendar. Probably an export"); + if (aItemFilter === Ci.calICalendar.ITEM_FILTER_ALL_ITEMS + && aCount == 0 + && aRangeStart === null + && aRangeEnd === null) { + + this.logInfo("getItems: Request to get all Items in Calendar. Probably an export"); + this.exporting = true; } - let asOccurrences = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_CLASS_OCCURRENCES) != 0); - let wantInvitations = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_REQUEST_NEEDS_ACTION) != 0); + if (!wantEvents + && !wantInvitations + && !wantTodos) { - if (!wantEvents && !wantInvitations && !wantTodos) { this.notifyOperationComplete(aListener, Cr.NS_OK, Ci.calIOperationListener.GET, null, null); + return; } - if (wantInvitations) - if (this.debug) this.logInfo("Invitations are requested by calendar."); + // Calendar is not able to complete request (item type is not supported) + if (!this.supportsEvents + && !this.supportsTasks + && !this.OnlyShowAvailability) { + + this.logInfo("getItems: This folder currently is not able yet to support events or tasks."); - if ((!this.supportsEvents) && (!this.supportsTasks) && (!this.OnlyShowAvailability)) { - // Something requested we cannot fullfill. - if (this.debug) this.logInfo("This folder currently is not able yet to support events or tasks."); this.notifyOperationComplete(aListener, Cr.NS_OK, Ci.calIOperationListener.GET, null, null); + return; } - var eventsRequestedAndPossible = (((wantEvents) && (this.supportsEvents)) || (this.OnlyShowAvailability)); - var tasksRequestedAndPossible = ((wantTodos) && (this.supportsTasks)); + let eventsRequestedAndPossible = (wantEvents && this.supportsEvents); + let tasksRequestedAndPossible = (wantTodos && this.supportsTasks); + + // When only availability is readable, we can also request events: + if (this.OnlyShowAvailability) { + eventsRequestedAndPossible = true; + } + + if (eventsRequestedAndPossible) { + this.logInfo("getItems: Events are requested and this is possible for this folder"); + } + + if (tasksRequestedAndPossible) { + this.logInfo("getItems: Tasks are requested and this is possible for this folder"); + } + if ((!eventsRequestedAndPossible) && (!tasksRequestedAndPossible)) { - if (this.debug) this.logInfo("This folder is not able to support requested items. this.OnlyShowAvailability:" + this.OnlyShowAvailability); + this.logInfo("getItems: This folder is not able to support requested items."); + this.notifyOperationComplete(aListener, Cr.NS_OK, Ci.calIOperationListener.GET, null, null); + return; } - if (eventsRequestedAndPossible) - if (this.debug) this.logInfo("Events are requested and this is possible for this folder"); - if (tasksRequestedAndPossible) - if (this.debug) this.logInfo("Tasks are requested and this is possible for this folder"); + + /* + * All checks passed, look for items to send + * + */ if (!aRangeStart) { /*if (this.startDate) { From 4b4d86f77b499ea4dc803279d958f156d38b6f83 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Thu, 17 Aug 2017 14:48:34 +0200 Subject: [PATCH 03/11] mivExchangeCalendar.js: getItems, remove duplicated check --- .../exchangeCalendar/mivExchangeCalendar.js | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index 28697b44..ee412f6a 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2550,21 +2550,6 @@ calExchangeCalendar.prototype = { return; } - // Calendar is not able to complete request (item type is not supported) - if (!this.supportsEvents - && !this.supportsTasks - && !this.OnlyShowAvailability) { - - this.logInfo("getItems: This folder currently is not able yet to support events or tasks."); - - this.notifyOperationComplete(aListener, - Cr.NS_OK, - Ci.calIOperationListener.GET, - null, null); - - return; - } - let eventsRequestedAndPossible = (wantEvents && this.supportsEvents); let tasksRequestedAndPossible = (wantTodos && this.supportsTasks); @@ -2581,7 +2566,9 @@ calExchangeCalendar.prototype = { this.logInfo("getItems: Tasks are requested and this is possible for this folder"); } - if ((!eventsRequestedAndPossible) && (!tasksRequestedAndPossible)) { + // Calendar is not able to complete request (item type is not supported) + if (!eventsRequestedAndPossible + && !tasksRequestedAndPossible) { this.logInfo("getItems: This folder is not able to support requested items."); this.notifyOperationComplete(aListener, From 8adef5bb340fbdf07c52ee21d1fbfa947eaff0a2 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Thu, 17 Aug 2017 15:51:05 +0200 Subject: [PATCH 04/11] mivExchangeCalendar.js: getItems: set default values for aRangeStart and a aRangeEnd --- .../exchangeCalendar/mivExchangeCalendar.js | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index ee412f6a..15707036 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2584,42 +2584,31 @@ calExchangeCalendar.prototype = { * */ + // When range start is not defined, + // set it to five 5 before now. if (!aRangeStart) { - /*if (this.startDate) { - aRangeStart = this.startDate.clone(); - } - else { - aRangeStart = cal.fromRFC3339("1900-01-01T00:00:00Z"); - }*/ - - // We are going to request a rangestart of 5 weeks before now. - aRangeStart = cal.now() - var offset = cal.createDuration(); + let offset = cal.createDuration(); offset.weeks = -5; - aRangeStart.addDuration(offset); - //dump("aRangeStart == null. Setting to:"+aRangeStart+"\n"); - if ((this.startDate) && (this.startDate.compare(aRangeStart) < 0)) { + aRangeStart = cal.now().addDuration(offset); + + // If cache already contains a bigger range, use it + if (this.startDate + && this.startDate.compare(aRangeStart) < 0) { aRangeStart = this.startDate.clone(); } } + // When range end is not defined, + // set it to five 5 after now. if (!aRangeEnd) { - /*if (this.endDate) { - aRangeEnd = this.endDate.clone(); - } - else { - aRangeEnd = cal.fromRFC3339("3500-01-01T00:00:00Z"); - }*/ - - // We are going to request a rangeend of 5 weeks after now. - aRangeEnd = cal.now() - var offset = cal.createDuration(); + let offset = cal.createDuration(); offset.weeks = 5; - aRangeEnd.addDuration(offset); - //dump("aRangeEnd == null. Setting to:"+aRangeEnd+"\n"); + aRangeEnd = cal.now().addDuration(offset); + + // If cache already contains a bigger range, use it if ((this.endDate) && (this.endDate.compare(aRangeEnd) > 0)) { aRangeEnd = this.endDate.clone(); } From e87f29868d52c5cf562ed9f0bac53f2ea920c675 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Thu, 17 Aug 2017 15:52:51 +0200 Subject: [PATCH 05/11] mivExchangeCalendar.js: getItems: remove unused variables and code --- .../exchangeCalendar/mivExchangeCalendar.js | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index 15707036..a15929b4 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2615,20 +2615,9 @@ calExchangeCalendar.prototype = { } - var dateChanged = false; - var startChanged = false; - var endChanged = false; - - if (!this.periods) { - this.periods = []; - } - // Check if this requested period touches a previous seen period. - var periodMatch = false; - var i = 0; - while ((!periodMatch) && (i < this.periods.length)) { - if (this.periods[i].startDate.compare(aRangeStart) > 0) {} - i++; - } + let dateChanged = false; + let startChanged = false; + let endChanged = false; if (!this.startDate) { if (this.debug) this.logInfo("no startdate"); From db9665734a5b24fdf7c95be86902664ed901debb Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 10:30:37 +0200 Subject: [PATCH 06/11] mivExchangeCalendar.js: getItems: code style in param initializations Remove use of this.debug Inverse tests inside if statements to avoid double negation (not, else) --- .../exchangeCalendar/mivExchangeCalendar.js | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index a15929b4..b2b30ded 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2529,7 +2529,7 @@ calExchangeCalendar.prototype = { this.exporting = false; if (aItemFilter === Ci.calICalendar.ITEM_FILTER_ALL_ITEMS - && aCount == 0 + && aCount === 0 && aRangeStart === null && aRangeEnd === null) { @@ -2598,6 +2598,7 @@ calExchangeCalendar.prototype = { aRangeStart = this.startDate.clone(); } + this.logInfo("getItems: aRangeStart has been updated:" + aRangeStart.toString()); } // When range end is not defined, @@ -2613,54 +2614,62 @@ calExchangeCalendar.prototype = { aRangeEnd = this.endDate.clone(); } + this.logInfo("getItems: aRangeEnd has been updated:" + aRangeEnd.toString()); } + if (!this.lastValidRangeStart) { + this.lastValidRangeStart = aRangeStart.clone(); + } + + if (!this.lastValidRangeEnd) { + this.lastValidRangeEnd = aRangeEnd.clone(); + } + + // Check if requested range is bigger than memory cache. + let dateChanged = false; let startChanged = false; let endChanged = false; - if (!this.startDate) { - if (this.debug) this.logInfo("no startdate"); - this.startDate = aRangeStart.clone(); - dateChanged = true; - } - else { + if (this.startDate) { + // New start date is before the memory cache one. + // memory cache is growing. if (this.startDate.compare(aRangeStart) > 0) { - if (this.debug) this.logInfo("aRangeStart (" + aRangeStart.toString() + ") is before current startDate (" + this.startDate.toString() + ")"); - // New start date is before old startdate. Period has grown. + this.logInfo("getItems: calendar has start date and aRangeStart (" + aRangeStart.toString() + ") is before current startDate (" + this.startDate.toString() + ")"); + var oldStartDate = this.startDate.clone(); this.startDate = aRangeStart.clone(); + dateChanged = true; startChanged = true; } } + else { + this.logInfo("getItems: calendar hasn't start date, use the range start"); - if (!this.endDate) { - if (this.debug) this.logInfo("no enddate"); - this.endDate = aRangeEnd.clone(); + this.startDate = aRangeStart.clone(); dateChanged = true; } - else { + + if (this.endDate) { + // New end date is after the memory cache one. + // Memory cache is growing. if (this.endDate.compare(aRangeEnd) < 0) { - if (this.debug) this.logInfo("aRangeEnd (" + aRangeEnd.toString() + ") is after current endDate (" + this.endDate.toString() + ")"); - // New end date is after old enddate. Period has grown. + this.logInfo("getItems: calendar has endDate and aRangeEnd (" + aRangeEnd.toString() + ") is after current endDate (" + this.endDate.toString() + ")"); + var oldEndDate = this.endDate.clone(); this.endDate = aRangeEnd.clone(); dateChanged = true; endChanged = true; } } + else { + this.logInfo("getItems: calendar hasn't end date, use the range end"); - if (aRangeStart) { - if (this.debug) this.logInfo("getItems 5a: aRangeStart:" + aRangeStart.toString()); - } - if (aRangeEnd) { - if (this.debug) this.logInfo("getItems 5b: aRangeEnd:" + aRangeEnd.toString()); + this.endDate = aRangeEnd.clone(); + dateChanged = true; } - if (!this.lastValidRangeStart) this.lastValidRangeStart = aRangeStart.clone(); - if (!this.lastValidRangeEnd) this.lastValidRangeEnd = aRangeEnd.clone(); - if ((this.useOfflineCache) && (dateChanged)) { if (((wantEvents) && (this.supportsEvents)) || ((wantTodos) && (this.supportsTasks))) { if (this.debug) this.logInfo("Requesting events/tasks from offline cache."); From 6b623bf80ac85cc1ff3bbf2d3cae0c4ce42a64a7 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 10:35:58 +0200 Subject: [PATCH 07/11] mivExchangeCalendar.js: getItems: simplify conditions to request memory cache --- .../exchangeCalendar/mivExchangeCalendar.js | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index b2b30ded..a5e5ac6c 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2670,59 +2670,61 @@ calExchangeCalendar.prototype = { dateChanged = true; } - if ((this.useOfflineCache) && (dateChanged)) { - if (((wantEvents) && (this.supportsEvents)) || ((wantTodos) && (this.supportsTasks))) { - if (this.debug) this.logInfo("Requesting events/tasks from offline cache."); - - if ((startChanged) || (endChanged)) { - - if (startChanged) { - if (this.debug) this.logInfo("Startdate has changed to an earlier date. Requesting difference."); - this.getItemsFromOfflineCache(aRangeStart, oldStartDate); - } - if (endChanged) { - if (this.debug) this.logInfo("Enddate has changed to a later date. Requesting difference."); - this.getItemsFromOfflineCache(oldEndDate, aRangeEnd, aListener); - } + // If offline cache is enabled and requested range is bigger than the + // memory cache one, try to get items from offline cache. + if (this.useOfflineCache + && dateChanged) { + if ((eventsRequestedAndPossible && !this.OnlyShowAvailability) + || tasksRequestedAndPossible) { + if (startChanged) { + this.logInfo("getItems: Startdate has changed to an earlier date. Requesting difference from offline cache."); + this.getItemsFromOfflineCache(aRangeStart, oldStartDate, aListener); + } - // We need to get the period which did not change from memorycache. + if (endChanged) { + this.logInfo("getItems: Enddate has changed to a later date. Requesting difference from offline cache."); + this.getItemsFromOfflineCache(oldEndDate, aRangeEnd, aListener); } - else { - if (this.debug) this.logInfo("New time period. Requesting items in period."); + + // We didn't had any memory cache (startDate and endDate has just been defined) + if (!startChanged + && !endChanged) { + this.logInfo("getItems: New time period to cache. Requesting full period from offline cache."); this.getItemsFromOfflineCache(aRangeStart, aRangeEnd, aListener); } } - if ((this.offlineStartDate) && (aRangeStart.compare(this.offlineStartDate) < 0)) { - if (this.debug) this.logInfo("Rangestart is before offlineCache start."); - oldStartDate = this.offlineStartDate.clone(); - startChanged = true; - } - else { - if (this.offlineStartDate) { - if (this.debug) this.logInfo("Rangestart is after offlineCache start."); - startChanged = false; + // Update startChanged and endChanged according to offline cache range + // It allows us to know if we have to ask Exchange server new items + if (this.offlineStartDate) { + if (aRangeStart.compare(this.offlineStartDate) < 0) { + this.logInfo("getItems: aRangestart is before offlineCache start."); + oldStartDate = this.offlineStartDate.clone(); + startChanged = true; } else { - startChanged = true; + this.logInfo("getItems: aRangestart is after offlineCache start."); + startChanged = false; } } - - if ((this.offlineEndDate) && (aRangeEnd.compare(this.offlineEndDate) > 0)) { - if (this.debug) this.logInfo("RangeEnd is after offlineCache end."); - oldEndDate = this.offlineEndDate.clone(); - endChanged = true; - } else { - if (this.offlineEndDate) { - if (this.debug) this.logInfo("RangeEnd is before offlineCache end."); - endChanged = false; + startChanged = true; + } + + if (this.offlineEndDate) { + if (aRangeEnd.compare(this.offlineEndDate) > 0) { + this.logInfo("RangeEnd is after offlineCache end."); + oldEndDate = this.offlineEndDate.clone(); + endChanged = true; } else { - endChanged = true; + this.logInfo("RangeEnd is before offlineCache end."); + endChanged = false; } } - + else { + endChanged = true; + } } //Update calendar/task view From dff77aa2cee4cfbfd27ac90c524957e88900009e Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 10:42:53 +0200 Subject: [PATCH 08/11] mivExchangeCalendar.js: getItems: simplify conditions to get only-availability calendar events --- .../exchangeCalendar/mivExchangeCalendar.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index a5e5ac6c..10192f50 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2727,19 +2727,20 @@ calExchangeCalendar.prototype = { } } - //Update calendar/task view + // Update calendar/task view with items in memory this.getItemsFromMemoryCache(aRangeStart, aRangeEnd, aItemFilter, aListener, this.exporting); if (this.OnlyShowAvailability) { - if ((startChanged) || (endChanged)) { - if (startChanged) { - this.getOnlyFreeBusyInformation(aRangeStart, oldStartDate); - } - if (endChanged) { - this.getOnlyFreeBusyInformation(oldEndDate, aRangeEnd); - } + if (startChanged) { + this.getOnlyFreeBusyInformation(aRangeStart, oldStartDate); } - else { + + if (endChanged) { + this.getOnlyFreeBusyInformation(oldEndDate, aRangeEnd); + } + + if (!startChanged + && !endChanged) { this.getOnlyFreeBusyInformation(aRangeStart, aRangeEnd); } From 2c6d20fa65cc1046a62cbfbee84b0597ab39d3fb Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 10:44:51 +0200 Subject: [PATCH 09/11] mivExchangeCalendar.js: getItems: old comments cleanup --- .../exchangeCalendar/mivExchangeCalendar.js | 43 ++++++++----------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index 10192f50..faa7d197 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2747,41 +2747,30 @@ calExchangeCalendar.prototype = { return; } - /* We started the inbox poller again in the normal place - if ((this.syncInboxState) && (!this.weAreInboxSyncing)) { - if ((this.folderBase == "calendar") && (!this.folderID)) { - - // Start the inbox poller to check for meetinginvitations or cancelations. - this.checkInbox(); - } - } - */ - // 2013-11-19 Going to request getitems period from exchange. + // Check if we should add items from Exchange server if (!dateChanged) { - if (this.debug) this.logInfo("No dateChanged. Not going to request items from server."); + this.logInfo("getItems: No dateChanged. Not going to request items from server."); + return; } if (this.isOffline) { - if (this.debug) this.logInfo("We are offline. Not going to request items from server."); + this.logInfo("getItems: We are offline. Not going to request items from server."); + return; } - // 2013-11-19 Going to request getitems period from exchange. - /* if ((wantEvents) && (this.supportsEvents)) { - this.requestPeriod(aRangeStart, aRangeEnd, aItemFilter, aCount, false); - }*/ - - if ((wantEvents) && (this.supportsEvents)) { - if (this.debug) this.logInfo("Requesting events from exchange server."); - if (((startChanged) && (oldStartDate)) || ((endChanged) && (oldEndDate))) { + if (eventsRequestedAndPossible) { - //this.getItemsFromMemoryCache(aRangeStart, aRangeEnd, aItemFilter, aListener, this.exporting); + this.logInfo("getItems: Requesting events from exchange server."); + if ((startChanged && oldStartDate) + || (endChanged && oldEndDate)) { if (startChanged) { if (this.debug) this.logInfo("Startdate has changed to an earlier date. Requesting difference."); this.requestPeriod(aRangeStart, oldStartDate, aItemFilter, aCount, false); } + if (endChanged) { if (this.debug) this.logInfo("Enddate has changed to a later date. Requesting difference."); this.requestPeriod(oldEndDate, aRangeEnd, aItemFilter, aCount, true); @@ -2790,14 +2779,16 @@ calExchangeCalendar.prototype = { // We need to get the period which did not change from memorycache. } else { - if (this.debug) this.logInfo("New time period. Requesting items in period."); + this.logInfo("New time period. Requesting items in period."); this.requestPeriod(aRangeStart, aRangeEnd, aItemFilter, aCount, false); } } - //Request server when calendar date changed . - if ((wantTodos) && (this.supportsTasks) && (startChanged || endChanged)) { - if (this.debug) this.logInfo("Requesting tasks from exchange server."); + // Request server when calendar date changed . + if (tasksRequestedAndPossible + && (startChanged || endChanged)) { + this.logInfo("getItems: Requesting tasks from exchange server."); + var self = this; this.addToQueue(erFindTaskItemsRequest, { user: this.user, @@ -2818,7 +2809,7 @@ calExchangeCalendar.prototype = { null); if (!this.deactivateTaskFollowup) { - if (this.debug) this.logInfo("Requesting followup tasks from exchange server."); + this.logInfo("getItems: Requesting followup tasks from exchange server."); this.addToQueue(erFindFollowupItemsRequest, { user: this.user, mailbox: this.mailbox, From deeea44ca3442c8f71d475b29f87c3a602e31bb3 Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 10:47:42 +0200 Subject: [PATCH 10/11] mivExchangeCalendar.js: getItemsFromMemoryCache: code cleanup and conditions rewrite --- .../exchangeCalendar/mivExchangeCalendar.js | 75 +++++++++---------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index faa7d197..f2de5d32 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2832,15 +2832,13 @@ calExchangeCalendar.prototype = { }, getItemsFromMemoryCache: function _getItemsFromMemoryCache(aRangeStart, aRangeEnd, aItemFilter, aListener, aExporting) { - if (this.debug) this.logInfo("getItemsFromMemoryCache startDate:" + aRangeStart + ", endDate:" + aRangeEnd + ", aListener:" + aListener + ", aExporting:" + aExporting); - var events = []; - var tasks = []; + this.logInfo("getItemsFromMemoryCache: startDate:" + aRangeStart + ", endDate:" + aRangeEnd + ", aListener:" + aListener + ", aExporting:" + aExporting); - var wantEvents = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_TYPE_EVENT) != 0); + let events = []; + let tasks = []; - var wantTodos = ((aItemFilter & Ci.calICalendar - .ITEM_FILTER_TYPE_TODO) != 0); + let wantEvents = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_EVENT) != 0); + let wantTodos = ((aItemFilter & Ci.calICalendar.ITEM_FILTER_TYPE_TODO) != 0); // This is by using the this.itemCacheByStartDate and this.itemCacheByEndDate index. if (wantEvents) { @@ -2870,47 +2868,47 @@ calExchangeCalendar.prototype = { } } - for (var itemid in ids) { - if (this.itemCacheById[itemid]) { - if (isEvent(this.itemCacheById[itemid])) { - if (this.deleteCancelledInvitation && this.itemCacheById[itemid].isCancelled) { - events.push(this.itemCacheById[itemid]); - this.deleteItemCancelled(this.itemCacheById[itemid]); + // For all found ids, if item cache has it, push it to events answer + // Check also if invitation should be cancelled + for (let itemid in ids) { + if (this.itemCacheById[itemid] + && cal.isEvent(this.itemCacheById[itemid])) { + events.push(this.itemCacheById[itemid]); - } - else { - events.push(this.itemCacheById[itemid]); - } + if (this.deleteCancelledInvitation + && this.itemCacheById[itemid].isCancelled) { + this.deleteItemCancelled(this.itemCacheById[itemid]); } } } } - else { - if (wantTodos) { - for (var index in this.itemCacheById) { - if (isToDo(this.itemCacheById[index])) { - if ((this.deactivateTaskFollowup) && (this.itemCacheById[index].itemClass == "IPM.Note")) { - //Do not change order or removing from local or it will throw db error - //remove from offlinecache - this.removeFromOfflineCache(this.itemCacheById[index]); - //remove from lighting GUI - this.removeItemFromCache(this.itemCacheById[index]); - } - else { - if (((this.itemCacheById[index].isCompleted) && (aItemFilter & Ci.calICalendar.ITEM_FILTER_COMPLETED_YES)) - || ((!this.itemCacheById[index].isCompleted) && (aItemFilter & Ci.calICalendar.ITEM_FILTER_COMPLETED_NO))) { - tasks.push(this.itemCacheById[index]); - } - } + else if (wantTodos) { + let wantCompletedTodo = aItemFilter & Ci.calICalendar.ITEM_FILTER_COMPLETED_YES; + let wantNotCompletedTodo = aItemFilter & Ci.calICalendar.ITEM_FILTER_COMPLETED_NO; + + for (let index in this.itemCacheById) { + if (cal.isToDo(this.itemCacheById[index])) { + if (this.deactivateTaskFollowup + && this.itemCacheById[index].itemClass == "IPM.Note") { + //Do not change order or removing from local or it will throw db error + //remove from offlinecache + this.removeFromOfflineCache(this.itemCacheById[index]); + //remove from lighting GUI + this.removeItemFromCache(this.itemCacheById[index]); + } + else if ((this.itemCacheById[index].isCompleted && wantCompletedTodo) + || (!this.itemCacheById[index].isCompleted && wantNotCompletedTodo)) { + tasks.push(this.itemCacheById[index]); } } } } - if (this.debug) this.logInfo("We got '" + events.length + "' events and '" + tasks.length + "' tasks from memory cache."); + this.logInfo("getItemsFromMemoryCache: We got '" + events.length + "' events and '" + tasks.length + "' tasks from memory cache."); if (aListener) { - if (this.debug) this.logInfo("We have a listener so going to inform it.(2)"); - if ((events.length > 0) && (wantEvents)) { + this.logInfo("getItemsFromMemoryCache: We have a listener so going to inform it."); + if (events.length > 0 + && wantEvents) { aListener.onGetResult(this, Cr.NS_OK, Ci.calIEvent, @@ -2919,7 +2917,8 @@ calExchangeCalendar.prototype = { events); } - if ((tasks.length > 0) && (wantTodos)) { + if (tasks.length > 0 + && wantTodos) { aListener.onGetResult(this, Cr.NS_OK, Ci.calITodo, From 8963df8bbb62ed37e091daf51c9b31dbb64c753c Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Fri, 18 Aug 2017 23:22:39 +1200 Subject: [PATCH 11/11] mivExchangeCalendar.js: getItemsFromMemoryCache: fix looking for items in cache The code before were using simple day index to go through start and end of the range. Furthermore, it didn't managed that range were given in local timezone and memory cache is in UTC. This fix use Lightning tools to go through range and it converts local timezone to UTC, so the cache is correctly read. Fixes #67 --- .../exchangeCalendar/mivExchangeCalendar.js | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/interfaces/exchangeCalendar/mivExchangeCalendar.js b/interfaces/exchangeCalendar/mivExchangeCalendar.js index f2de5d32..7cc64e8f 100644 --- a/interfaces/exchangeCalendar/mivExchangeCalendar.js +++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js @@ -2842,30 +2842,31 @@ calExchangeCalendar.prototype = { // This is by using the this.itemCacheByStartDate and this.itemCacheByEndDate index. if (wantEvents) { - - var startYear = aRangeStart.year; - var startYearday = aRangeStart.yearday; - - var endYear = aRangeEnd.year; - var endYearday = aRangeEnd.yearday; - var doStop = false; - var ids = {}; - while (!doStop) { - if ((startYear == endYear) && (startYearday == endYearday)) { - doStop = true; - } - - if ((this.itemCacheByStartDate) && (this.itemCacheByStartDate[startYear]) && (this.itemCacheByStartDate[startYear][startYearday])) { - for (var itemid in this.itemCacheByStartDate[startYear][startYearday]) { + let ids = {}; + + let dayOffset = cal.createDuration(); + dayOffset.days = 1; + + let dayPos = cal.createDateTime(); + dayPos = aRangeStart.clone(); + + // Convert date from local timezone to UTC + // Given range is in local timezone and cache save in UTC + dayPos.isDate = false; + dayPos = dayPos.getInTimezone(cal.UTC()); + dayPos.isDate = true; + + // Go through all days bewteen the range start day and the range end day + while (dayPos.compare(aRangeEnd) < 0 ) { + if (this.itemCacheByStartDate + && this.itemCacheByStartDate[dayPos.year] + && this.itemCacheByStartDate[dayPos.year][dayPos.yearday]) { + for (let itemid in this.itemCacheByStartDate[dayPos.year][dayPos.yearday]) { ids[itemid] = true; } } - startYearday++; - if (startYearday > 366) { - startYear++; - startYearday = 1; - } + dayPos.addDuration(dayOffset); } // For all found ids, if item cache has it, push it to events answer