Bug 810099 - B2G MMS: support onretrieving event. r=vyang

This commit is contained in:
Chia-hung Tai 2013-05-10 13:39:22 -07:00
parent 06935a6eed
commit d75d680f5b
10 changed files with 67 additions and 22 deletions

View File

@ -762,6 +762,7 @@ GK_ATOM(onpopupshowing, "onpopupshowing")
GK_ATOM(onpopupshown, "onpopupshown")
GK_ATOM(onreadystatechange, "onreadystatechange")
GK_ATOM(onreceived, "onreceived")
GK_ATOM(onretrieving, "onretrieving")
GK_ATOM(onRequest, "onRequest")
GK_ATOM(onreset, "onreset")
GK_ATOM(onresuming, "onresuming")

View File

@ -8,6 +8,7 @@ namespace dom {
namespace mobilemessage {
const char* kSmsReceivedObserverTopic = "sms-received";
const char* kSmsRetrievingObserverTopic = "sms-retrieving";
const char* kSmsSendingObserverTopic = "sms-sending";
const char* kSmsSentObserverTopic = "sms-sent";
const char* kSmsFailedObserverTopic = "sms-failed";

View File

@ -12,6 +12,7 @@ namespace mobilemessage {
// Defined in the .cpp.
extern const char* kSmsReceivedObserverTopic;
extern const char* kSmsRetrievingObserverTopic;
extern const char* kSmsSendingObserverTopic;
extern const char* kSmsSentObserverTopic;
extern const char* kSmsFailedObserverTopic;

View File

@ -30,6 +30,7 @@
#include "DOMCursor.h"
#define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received")
#define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving")
#define SENDING_EVENT_NAME NS_LITERAL_STRING("sending")
#define SENT_EVENT_NAME NS_LITERAL_STRING("sent")
#define FAILED_EVENT_NAME NS_LITERAL_STRING("failed")
@ -53,6 +54,7 @@ NS_IMPL_ADDREF_INHERITED(MobileMessageManager, nsDOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(MobileMessageManager, nsDOMEventTargetHelper)
NS_IMPL_EVENT_HANDLER(MobileMessageManager, received)
NS_IMPL_EVENT_HANDLER(MobileMessageManager, retrieving)
NS_IMPL_EVENT_HANDLER(MobileMessageManager, sending)
NS_IMPL_EVENT_HANDLER(MobileMessageManager, sent)
NS_IMPL_EVENT_HANDLER(MobileMessageManager, failed)
@ -71,6 +73,7 @@ MobileMessageManager::Init(nsPIDOMWindow *aWindow)
}
obs->AddObserver(this, kSmsReceivedObserverTopic, false);
obs->AddObserver(this, kSmsRetrievingObserverTopic, false);
obs->AddObserver(this, kSmsSendingObserverTopic, false);
obs->AddObserver(this, kSmsSentObserverTopic, false);
obs->AddObserver(this, kSmsFailedObserverTopic, false);
@ -88,6 +91,7 @@ MobileMessageManager::Shutdown()
}
obs->RemoveObserver(this, kSmsReceivedObserverTopic);
obs->RemoveObserver(this, kSmsRetrievingObserverTopic);
obs->RemoveObserver(this, kSmsSendingObserverTopic);
obs->RemoveObserver(this, kSmsSentObserverTopic);
obs->RemoveObserver(this, kSmsFailedObserverTopic);
@ -433,6 +437,10 @@ MobileMessageManager::Observe(nsISupports* aSubject, const char* aTopic,
return DispatchTrustedSmsEventToSelf(aTopic, RECEIVED_EVENT_NAME, aSubject);
}
if (!strcmp(aTopic, kSmsRetrievingObserverTopic)) {
return DispatchTrustedSmsEventToSelf(aTopic, RETRIEVING_EVENT_NAME, aSubject);
}
if (!strcmp(aTopic, kSmsSendingObserverTopic)) {
return DispatchTrustedSmsEventToSelf(aTopic, SENDING_EVENT_NAME, aSubject);
}

View File

@ -88,6 +88,8 @@ sync protocol PSms {
child:
NotifyReceivedMessage(MobileMessageData aMessageData);
NotifyRetrievingMessage(MobileMessageData aMessageData);
NotifySendingMessage(MobileMessageData aMessageData);
NotifySentMessage(MobileMessageData aMessageData);

View File

@ -68,6 +68,13 @@ SmsChild::RecvNotifyReceivedMessage(const MobileMessageData& aData)
return true;
}
bool
SmsChild::RecvNotifyRetrievingMessage(const MobileMessageData& aData)
{
NotifyObserversWithMobileMessage(kSmsRetrievingObserverTopic, aData);
return true;
}
bool
SmsChild::RecvNotifySendingMessage(const MobileMessageData& aData)
{

View File

@ -37,6 +37,9 @@ protected:
virtual bool
RecvNotifyReceivedMessage(const MobileMessageData& aMessage) MOZ_OVERRIDE;
virtual bool
RecvNotifyRetrievingMessage(const MobileMessageData& aMessage) MOZ_OVERRIDE;
virtual bool
RecvNotifySendingMessage(const MobileMessageData& aMessage) MOZ_OVERRIDE;

View File

@ -145,6 +145,7 @@ SmsParent::SmsParent()
}
obs->AddObserver(this, kSmsReceivedObserverTopic, false);
obs->AddObserver(this, kSmsRetrievingObserverTopic, false);
obs->AddObserver(this, kSmsSendingObserverTopic, false);
obs->AddObserver(this, kSmsSentObserverTopic, false);
obs->AddObserver(this, kSmsFailedObserverTopic, false);
@ -161,6 +162,7 @@ SmsParent::ActorDestroy(ActorDestroyReason why)
}
obs->RemoveObserver(this, kSmsReceivedObserverTopic);
obs->RemoveObserver(this, kSmsRetrievingObserverTopic);
obs->RemoveObserver(this, kSmsSendingObserverTopic);
obs->RemoveObserver(this, kSmsSentObserverTopic);
obs->RemoveObserver(this, kSmsFailedObserverTopic);
@ -183,6 +185,17 @@ SmsParent::Observe(nsISupports* aSubject, const char* aTopic,
return NS_OK;
}
if (!strcmp(aTopic, kSmsRetrievingObserverTopic)) {
MobileMessageData msgData;
if (!GetMobileMessageDataFromMessage(aSubject, msgData)) {
NS_ERROR("Got a 'sms-retrieving' topic without a valid message!");
return NS_OK;
}
unused << SendNotifyRetrievingMessage(msgData);
return NS_OK;
}
if (!strcmp(aTopic, kSmsSendingObserverTopic)) {
MobileMessageData msgData;
if (!GetMobileMessageDataFromMessage(aSubject, msgData)) {

View File

@ -28,6 +28,7 @@ const kSmsSendingObserverTopic = "sms-sending";
const kSmsSentObserverTopic = "sms-sent";
const kSmsFailedObserverTopic = "sms-failed";
const kSmsReceivedObserverTopic = "sms-received";
const kSmsRetrievingObserverTopic = "sms-retrieving";
const kNetworkInterfaceStateChangedTopic = "network-interface-state-changed";
const kXpcomShutdownObserverTopic = "xpcom-shutdown";
@ -1039,18 +1040,20 @@ MmsService.prototype = {
},
/**
* @param contentLocation
* @param aContentLocation
* X-Mms-Content-Location of the message.
* @param callback [optional]
* @param aCallback [optional]
* A callback function that takes two arguments: one for X-Mms-Status,
* the other parsed MMS message.
* @param aDomMessage
* The nsIDOMMozMmsMessage object.
*/
retrieveMessage: function retrieveMessage(contentLocation, callback) {
// TODO: bug 810099 - support onretrieving event
// TODO: bug 809832 - support customizable max incoming/outgoing message size.
retrieveMessage: function retrieveMessage(aContentLocation, aCallback, aDomMessage) {
// Notifying observers an MMS message is retrieving.
Services.obs.notifyObservers(aDomMessage, kSmsRetrievingObserverTopic, null);
let transaction = new RetrieveTransaction(contentLocation);
transaction.run(callback);
let transaction = new RetrieveTransaction(aContentLocation);
transaction.run(aCallback);
},
/**
@ -1275,7 +1278,8 @@ MmsService.prototype = {
.saveReceivedMessage(savableMessage,
this.saveReceivedMessageCallback.bind(this,
retrievalMode,
savableMessage));
savableMessage),
domMessage);
}).bind(this));
},

View File

@ -1272,10 +1272,11 @@ MobileMessageDatabaseService.prototype = {
getMessageRecordByTransactionId: function getMessageRecordByTransactionId(aTransactionId, aCallback) {
if (DEBUG) debug("Retrieving message with transaction ID " + aTransactionId);
let self = this;
this.newTxn(READ_ONLY, function (error, txn, messageStore) {
if (error) {
if (DEBUG) debug(error);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null, null);
return;
}
let request = messageStore.index("transactionId").get(aTransactionId);
@ -1285,10 +1286,13 @@ MobileMessageDatabaseService.prototype = {
let messageRecord = request.result;
if (!messageRecord) {
if (DEBUG) debug("Transaction ID " + aTransactionId + " not found");
aCallback.notify(Ci.nsIMobileMessageCallback.NOT_FOUND_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.NOT_FOUND_ERROR, null, null);
return;
}
aCallback.notify(Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR, messageRecord);
// In this case, we don't need a dom message. Just pass null to the
// third argument.
aCallback.notify(Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR,
messageRecord, null);
};
txn.onerror = function onerror(event) {
@ -1296,17 +1300,18 @@ MobileMessageDatabaseService.prototype = {
if (event.target)
debug("Caught error on transaction", event.target.errorCode);
}
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null, null);
};
});
},
getMessageRecordById: function getMessageRecordById(aMessageId, aCallback) {
if (DEBUG) debug("Retrieving message with ID " + aMessageId);
let self = this;
this.newTxn(READ_ONLY, function (error, txn, messageStore) {
if (error) {
if (DEBUG) debug(error);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null, null);
return;
}
let request = messageStore.mozGetAll(aMessageId);
@ -1315,13 +1320,13 @@ MobileMessageDatabaseService.prototype = {
if (DEBUG) debug("Transaction " + txn + " completed.");
if (request.result.length > 1) {
if (DEBUG) debug("Got too many results for id " + aMessageId);
aCallback.notify(Ci.nsIMobileMessageCallback.UNKNOWN_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.UNKNOWN_ERROR, null, null);
return;
}
let messageRecord = request.result[0];
if (!messageRecord) {
if (DEBUG) debug("Message ID " + aMessageId + " not found");
aCallback.notify(Ci.nsIMobileMessageCallback.NOT_FOUND_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.NOT_FOUND_ERROR, null, null);
return;
}
if (messageRecord.id != aMessageId) {
@ -1329,10 +1334,12 @@ MobileMessageDatabaseService.prototype = {
debug("Requested message ID (" + aMessageId + ") is " +
"different from the one we got");
}
aCallback.notify(Ci.nsIMobileMessageCallback.UNKNOWN_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.UNKNOWN_ERROR, null, null);
return;
}
aCallback.notify(Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR, messageRecord);
let domMessage = self.createDomMessageFromRecord(messageRecord);
aCallback.notify(Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR,
messageRecord, domMessage);
};
txn.onerror = function onerror(event) {
@ -1341,7 +1348,7 @@ MobileMessageDatabaseService.prototype = {
debug("Caught error on transaction", event.target.errorCode);
}
}
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null);
aCallback.notify(Ci.nsIMobileMessageCallback.INTERNAL_ERROR, null, null);
};
});
},
@ -1352,12 +1359,10 @@ MobileMessageDatabaseService.prototype = {
getMessage: function getMessage(aMessageId, aRequest) {
if (DEBUG) debug("Retrieving message with ID " + aMessageId);
let self = this;
let notifyCallback = {
notify: function notify(aRv, aMessageRecord) {
notify: function notify(aRv, aMessageRecord, aDomMessage) {
if (Ci.nsIMobileMessageCallback.SUCCESS_NO_ERROR == aRv) {
let domMessage = self.createDomMessageFromRecord(aMessageRecord);
aRequest.notifyMessageGot(domMessage);
aRequest.notifyMessageGot(aDomMessage);
return;
}
aRequest.notifyGetMessageFailed(aRv, null);