Bug 1436557 - Move calOperationGroup to calDataUtils.jsm. r=MakeMyDay
MozReview-Commit-ID: BkVndYLfrOw --HG-- extra : rebase_source : 1cf414fce5e13a6ce14c9a5cf73767662ae1c24e
This commit is contained in:
Родитель
df27dd0de4
Коммит
a2f97d7763
|
@ -91,10 +91,87 @@ class ObserverSet extends ListenerSet {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This object implements calIOperation and could group multiple sub
|
||||
* operations into one. You can pass a cancel function which is called once
|
||||
* the operation group is cancelled.
|
||||
* Users must call notifyCompleted() once all sub operations have been
|
||||
* successful, else the operation group will stay pending.
|
||||
* The reason for the latter is that providers currently should (but need
|
||||
* not) implement (and return) calIOperation handles, thus there may be pending
|
||||
* calendar operations (without handle).
|
||||
*/
|
||||
class OperationGroup {
|
||||
static nextGroupId() {
|
||||
if (typeof OperationGroup.mOpGroupId == "undefined") {
|
||||
OperationGroup.mOpGroupId = 0;
|
||||
}
|
||||
|
||||
return OperationGroup.mOpGroupId++;
|
||||
}
|
||||
|
||||
constructor(aCancelFunc) {
|
||||
this.mId = cal.getUUID() + "-" + OperationGroup.nextGroupId();
|
||||
this.mIsPending = true;
|
||||
|
||||
this.mCancelFunc = aCancelFunc;
|
||||
this.mSubOperations = [];
|
||||
this.mStatus = Components.results.NS_OK;
|
||||
}
|
||||
|
||||
get id() { return this.mId; }
|
||||
get isPending() { return this.mIsPending; }
|
||||
get status() { return this.mStatus; }
|
||||
get isEmpty() { return this.mSubOperations.length == 0; }
|
||||
|
||||
add(aOperation) {
|
||||
if (aOperation && aOperation.isPending) {
|
||||
this.mSubOperations.push(aOperation);
|
||||
}
|
||||
}
|
||||
|
||||
remove(aOperation) {
|
||||
if (aOperation) {
|
||||
this.mSubOperations = this.mSubOperations.filter(operation => aOperation.id != operation.id);
|
||||
}
|
||||
}
|
||||
|
||||
notifyCompleted(aStatus) {
|
||||
cal.ASSERT(this.isPending, "[OperationGroup_notifyCompleted] this.isPending");
|
||||
if (this.isPending) {
|
||||
this.mIsPending = false;
|
||||
if (aStatus) {
|
||||
this.mStatus = aStatus;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cancel(aStatus=Components.interfaces.calIErrors.OPERATION_CANCELLED) {
|
||||
if (this.isPending) {
|
||||
this.notifyCompleted(aStatus);
|
||||
let cancelFunc = this.mCancelFunc;
|
||||
if (cancelFunc) {
|
||||
this.mCancelFunc = null;
|
||||
cancelFunc();
|
||||
}
|
||||
let subOperations = this.mSubOperations;
|
||||
this.mSubOperations = [];
|
||||
for (let operation of subOperations) {
|
||||
operation.cancel(Components.interfaces.calIErrors.OPERATION_CANCELLED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
toString() {
|
||||
return `[OperationGroup id=${this.id}]`;
|
||||
}
|
||||
}
|
||||
|
||||
var caldata = {
|
||||
ListenerSet: ListenerSet,
|
||||
ObserverSet: ObserverSet,
|
||||
PropertyMap: PropertyMap,
|
||||
OperationGroup: OperationGroup,
|
||||
|
||||
/**
|
||||
* Use the binary search algorithm to search for an item in an array.
|
||||
|
|
|
@ -9,7 +9,7 @@ function calCalendarSearchListener(numOperations, finalListener) {
|
|||
this.mNumOperations = numOperations;
|
||||
this.mResults = [];
|
||||
|
||||
this.opGroup = new cal.calOperationGroup(() => {
|
||||
this.opGroup = new cal.data.OperationGroup(() => {
|
||||
this.notifyResult(null);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ function calFreeBusyListener(numOperations, finalListener) {
|
|||
this.mFinalListener = finalListener;
|
||||
this.mNumOperations = numOperations;
|
||||
|
||||
this.opGroup = new cal.calOperationGroup(() => {
|
||||
this.opGroup = new cal.data.OperationGroup(() => {
|
||||
this.notifyResult(null);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
/* exported getCalendarDirectory, attendeeMatchesAddresses,
|
||||
* calTryWrappedJSObject, compareObjects, LOG, WARN, ERROR, showError,
|
||||
* sendMailTo, applyAttributeToMenuChildren, isPropertyValueSame,
|
||||
* calIterateEmailIdentities, calGetString
|
||||
* calIterateEmailIdentities, calGetString, getUUID
|
||||
*/
|
||||
|
||||
ChromeUtils.import("resource:///modules/mailServices.js");
|
||||
|
@ -258,98 +258,6 @@ function sendMailTo(aRecipient, aSubject, aBody, aIdentity) {
|
|||
MailServices.compose.OpenComposeWindowWithParams(null, msgParams);
|
||||
}
|
||||
|
||||
/**
|
||||
* This object implements calIOperation and could group multiple sub
|
||||
* operations into one. You can pass a cancel function which is called once
|
||||
* the operation group is cancelled.
|
||||
* Users must call notifyCompleted() once all sub operations have been
|
||||
* successful, else the operation group will stay pending.
|
||||
* The reason for the latter is that providers currently should (but need
|
||||
* not) implement (and return) calIOperation handles, thus there may be pending
|
||||
* calendar operations (without handle).
|
||||
*/
|
||||
function calOperationGroup(cancelFunc) {
|
||||
this.wrappedJSObject = this;
|
||||
if (calOperationGroup.mOpGroupId === undefined) {
|
||||
calOperationGroup.mOpGroupId = 0;
|
||||
}
|
||||
if (calOperationGroup.mOpGroupPrefix === undefined) {
|
||||
calOperationGroup.mOpGroupPrefix = getUUID() + "-";
|
||||
}
|
||||
this.mCancelFunc = cancelFunc;
|
||||
this.mId = calOperationGroup.mOpGroupPrefix + calOperationGroup.mOpGroupId++;
|
||||
this.mSubOperations = [];
|
||||
}
|
||||
calOperationGroup.prototype = {
|
||||
mCancelFunc: null,
|
||||
mId: null,
|
||||
mIsPending: true,
|
||||
mStatus: Components.results.NS_OK,
|
||||
mSubOperations: null,
|
||||
|
||||
add: function(aOperation) {
|
||||
if (aOperation && aOperation.isPending) {
|
||||
this.mSubOperations.push(aOperation);
|
||||
}
|
||||
},
|
||||
|
||||
remove: function(aOperation) {
|
||||
if (aOperation) {
|
||||
this.mSubOperations = this.mSubOperations.filter(operation => aOperation.id != operation.id);
|
||||
}
|
||||
},
|
||||
|
||||
get isEmpty() {
|
||||
return (this.mSubOperations.length == 0);
|
||||
},
|
||||
|
||||
notifyCompleted: function(status) {
|
||||
ASSERT(this.isPending, "[calOperationGroup_notifyCompleted] this.isPending");
|
||||
if (this.isPending) {
|
||||
this.mIsPending = false;
|
||||
if (status) {
|
||||
this.mStatus = status;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
toString: function() {
|
||||
return "[calOperationGroup] id=" + this.id;
|
||||
},
|
||||
|
||||
// calIOperation:
|
||||
get id() {
|
||||
return this.mId;
|
||||
},
|
||||
|
||||
get isPending() {
|
||||
return this.mIsPending;
|
||||
},
|
||||
|
||||
get status() {
|
||||
return this.mStatus;
|
||||
},
|
||||
|
||||
cancel: function(status) {
|
||||
if (this.isPending) {
|
||||
if (!status) {
|
||||
status = Components.interfaces.calIErrors.OPERATION_CANCELLED;
|
||||
}
|
||||
this.notifyCompleted(status);
|
||||
let cancelFunc = this.mCancelFunc;
|
||||
if (cancelFunc) {
|
||||
this.mCancelFunc = null;
|
||||
cancelFunc();
|
||||
}
|
||||
let subOperations = this.mSubOperations;
|
||||
this.mSubOperations = [];
|
||||
for (let operation of subOperations) {
|
||||
operation.cancel(Components.interfaces.calIErrors.OPERATION_CANCELLED);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* TODO: The following UI-related functions need to move somewhere different,
|
||||
* i.e calendar-ui-utils.js
|
||||
|
|
|
@ -451,7 +451,7 @@ calCompositeGetListenerHelper.prototype = {
|
|||
|
||||
get opGroup() {
|
||||
if (!this.mOpGroup) {
|
||||
this.mOpGroup = new cal.calOperationGroup(() => {
|
||||
this.mOpGroup = new cal.data.OperationGroup(() => {
|
||||
let listener = this.mRealListener;
|
||||
this.mRealListener = null;
|
||||
if (listener) {
|
||||
|
|
|
@ -12,7 +12,7 @@ function really_run_test() {
|
|||
test_attendeeMatchesAddresses();
|
||||
test_getDefaultStartDate();
|
||||
test_getStartEndProps();
|
||||
test_calOperationGroup();
|
||||
test_OperationGroup();
|
||||
test_sameDay();
|
||||
test_binarySearch();
|
||||
}
|
||||
|
@ -122,17 +122,17 @@ function test_getStartEndProps() {
|
|||
/2147500033/);
|
||||
}
|
||||
|
||||
function test_calOperationGroup() {
|
||||
function test_OperationGroup() {
|
||||
let cancelCalled = false;
|
||||
function cancelFunc() {
|
||||
cancelCalled = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
let group = new cal.calOperationGroup(cancelFunc);
|
||||
let group = new cal.data.OperationGroup(cancelFunc);
|
||||
|
||||
ok(group.isEmpty);
|
||||
equal(group.id, cal.calOperationGroup.mOpGroupPrefix + "0");
|
||||
ok(group.id.endsWith("-0"));
|
||||
equal(group.status, Components.results.NS_OK);
|
||||
equal(group.isPending, true);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче