Bug 849739 4/5: RIL. r=gwagner

This commit is contained in:
Vicamo Yang 2013-04-09 10:22:03 +08:00
parent 4be71d4339
commit a554bab576

View File

@ -16,6 +16,8 @@ const RIL_MOBILEMESSAGEDATABASESERVICE_CID =
Components.ID("{29785f90-6b5b-11e2-9201-3b280170b2ec}"); Components.ID("{29785f90-6b5b-11e2-9201-3b280170b2ec}");
const RIL_GETMESSAGESCURSOR_CID = const RIL_GETMESSAGESCURSOR_CID =
Components.ID("{484d1ad8-840e-4782-9dc4-9ebc4d914937}"); Components.ID("{484d1ad8-840e-4782-9dc4-9ebc4d914937}");
const RIL_GETTHREADSCURSOR_CID =
Components.ID("{95ee7c3e-d6f2-4ec4-ade5-0c453c036d35}");
const DEBUG = false; const DEBUG = false;
const DB_NAME = "sms"; const DB_NAME = "sms";
@ -1360,34 +1362,35 @@ MobileMessageDatabaseService.prototype = {
}, [MESSAGE_STORE_NAME, THREAD_STORE_NAME]); }, [MESSAGE_STORE_NAME, THREAD_STORE_NAME]);
}, },
getThreadList: function getThreadList(aRequest) { createThreadCursor: function createThreadCursor(callback) {
if (DEBUG) debug("Getting thread list"); if (DEBUG) debug("Getting thread list");
let cursor = new GetThreadsCursor(this, callback);
this.newTxn(READ_ONLY, function (error, txn, threadStore) { this.newTxn(READ_ONLY, function (error, txn, threadStore) {
let collector = cursor.collector;
if (error) { if (error) {
if (DEBUG) debug(error); if (DEBUG) debug(error);
aRequest.notifyThreadListFailed(Ci.nsIMobileMessageCallback.INTERNAL_ERROR); collector.collect(null, COLLECT_ID_ERROR, COLLECT_TIMESTAMP_UNUSED);
return; return;
} }
txn.onerror = function onerror(event) { txn.onerror = function onerror(event) {
if (DEBUG) debug("Caught error on transaction ", event.target.errorCode); if (DEBUG) debug("Caught error on transaction ", event.target.errorCode);
aRequest.notifyThreadListFailed(Ci.nsIMobileMessageCallback.INTERNAL_ERROR); collector.collect(null, COLLECT_ID_ERROR, COLLECT_TIMESTAMP_UNUSED);
}; };
let request = threadStore.index("lastTimestamp").mozGetAll(); let request = threadStore.index("lastTimestamp").openKeyCursor();
request.onsuccess = function(event) { request.onsuccess = function(event) {
// TODO: keep backward compatibility of original API interface only. let cursor = event.target.result;
let results = []; if (cursor) {
for each (let item in event.target.result) { if (collector.collect(txn, cursor.primaryKey, cursor.key)) {
results.push({ cursor.continue();
id: item.id, }
senderOrReceiver: item.participantAddresses[0], } else {
timestamp: item.lastTimestamp, collector.collect(txn, COLLECT_ID_END, COLLECT_TIMESTAMP_UNUSED);
body: item.subject,
unreadCount: item.unreadCount
});
} }
aRequest.notifyThreadList(results);
}; };
}, [THREAD_STORE_NAME]); }, [THREAD_STORE_NAME]);
return cursor;
} }
}; };
@ -1951,6 +1954,85 @@ GetMessagesCursor.prototype = {
} }
}; };
function GetThreadsCursor(service, callback) {
this.service = service;
this.callback = callback;
this.collector = new ResultsCollector();
this.handleContinue(); // Trigger first run.
}
GetThreadsCursor.prototype = {
classID: RIL_GETTHREADSCURSOR_CID,
QueryInterface: XPCOMUtils.generateQI([Ci.nsICursorContinueCallback]),
service: null,
callback: null,
collector: null,
getThreadTxn: function getThreadTxn(threadStore, threadId) {
if (DEBUG) debug ("Fetching message " + threadId);
let getRequest = threadStore.get(threadId);
let self = this;
getRequest.onsuccess = function onsuccess(event) {
if (DEBUG) {
debug("notifyCursorResult - threadId: " + threadId);
}
let threadRecord = event.target.result;
let thread =
gMobileMessageService.createThread(threadRecord.id,
threadRecord.participantAddresses,
threadRecord.lastTimestamp,
threadRecord.subject,
threadRecord.unreadCount);
self.callback.notifyCursorResult(thread);
};
getRequest.onerror = function onerror(event) {
if (DEBUG) {
debug("notifyCursorError - threadId: " + threadId);
}
self.callback.notifyCursorError(Ci.nsIMobileMessageCallback.INTERNAL_ERROR);
};
},
notify: function notify(txn, threadId) {
if (!threadId) {
this.callback.notifyCursorDone();
return;
}
if (threadId < 0) {
this.callback.notifyCursorError(Ci.nsIMobileMessageCallback.INTERNAL_ERROR);
return;
}
// When filter transaction is not yet completed, we're called with current
// ongoing transaction object.
if (txn) {
let threadStore = txn.objectStore(THREAD_STORE_NAME);
this.getThreadTxn(threadStore, threadId);
return;
}
// Or, we have to open another transaction ourselves.
let self = this;
this.service.newTxn(READ_ONLY, function (error, txn, threadStore) {
if (error) {
self.callback.notifyCursorError(Ci.nsIMobileMessageCallback.INTERNAL_ERROR);
return;
}
self.getThreadTxn(threadStore, threadId);
}, [THREAD_STORE_NAME]);
},
// nsICursorContinueCallback
handleContinue: function handleContinue() {
if (DEBUG) debug("Getting next thread in list");
this.collector.squeeze(this.notify.bind(this));
}
}
XPCOMUtils.defineLazyServiceGetter(MobileMessageDatabaseService.prototype, "mRIL", XPCOMUtils.defineLazyServiceGetter(MobileMessageDatabaseService.prototype, "mRIL",
"@mozilla.org/ril;1", "@mozilla.org/ril;1",
"nsIRadioInterfaceLayer"); "nsIRadioInterfaceLayer");