michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "SmsChild.h" michael@0: #include "SmsMessage.h" michael@0: #include "MmsMessage.h" michael@0: #include "SmsSegmentInfo.h" michael@0: #include "nsIObserverService.h" michael@0: #include "mozilla/Services.h" michael@0: #include "mozilla/dom/ContentChild.h" michael@0: #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType michael@0: #include "MobileMessageThread.h" michael@0: #include "MainThreadUtils.h" michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::dom; michael@0: using namespace mozilla::dom::mobilemessage; michael@0: michael@0: namespace { michael@0: michael@0: already_AddRefed michael@0: CreateMessageFromMessageData(const MobileMessageData& aData) michael@0: { michael@0: nsCOMPtr message; michael@0: michael@0: switch(aData.type()) { michael@0: case MobileMessageData::TMmsMessageData: michael@0: message = new MmsMessage(aData.get_MmsMessageData()); michael@0: break; michael@0: case MobileMessageData::TSmsMessageData: michael@0: message = new SmsMessage(aData.get_SmsMessageData()); michael@0: break; michael@0: default: michael@0: MOZ_CRASH("Unexpected type of MobileMessageData"); michael@0: } michael@0: michael@0: return message.forget(); michael@0: } michael@0: michael@0: void michael@0: NotifyObserversWithMobileMessage(const char* aEventName, michael@0: const MobileMessageData& aData) michael@0: { michael@0: nsCOMPtr obs = services::GetObserverService(); michael@0: if (!obs) { michael@0: return; michael@0: } michael@0: michael@0: nsCOMPtr msg = CreateMessageFromMessageData(aData); michael@0: obs->NotifyObservers(msg, aEventName, nullptr); michael@0: } michael@0: michael@0: } // anonymous namespace michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: namespace mobilemessage { michael@0: michael@0: void michael@0: SmsChild::ActorDestroy(ActorDestroyReason aWhy) michael@0: { michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyReceivedMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsReceivedObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyRetrievingMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsRetrievingObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifySendingMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsSendingObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifySentMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsSentObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyFailedMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsFailedObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyDeliverySuccessMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsDeliverySuccessObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyDeliveryErrorMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsDeliveryErrorObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyReceivedSilentMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSilentSmsReceivedObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyReadSuccessMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsReadSuccessObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: SmsChild::RecvNotifyReadErrorMessage(const MobileMessageData& aData) michael@0: { michael@0: NotifyObserversWithMobileMessage(kSmsReadErrorObserverTopic, aData); michael@0: return true; michael@0: } michael@0: michael@0: PSmsRequestChild* michael@0: SmsChild::AllocPSmsRequestChild(const IPCSmsRequest& aRequest) michael@0: { michael@0: MOZ_CRASH("Caller is supposed to manually construct a request!"); michael@0: } michael@0: michael@0: bool michael@0: SmsChild::DeallocPSmsRequestChild(PSmsRequestChild* aActor) michael@0: { michael@0: delete aActor; michael@0: return true; michael@0: } michael@0: michael@0: PMobileMessageCursorChild* michael@0: SmsChild::AllocPMobileMessageCursorChild(const IPCMobileMessageCursor& aCursor) michael@0: { michael@0: MOZ_CRASH("Caller is supposed to manually construct a cursor!"); michael@0: } michael@0: michael@0: bool michael@0: SmsChild::DeallocPMobileMessageCursorChild(PMobileMessageCursorChild* aActor) michael@0: { michael@0: // MobileMessageCursorChild is refcounted, must not be freed manually. michael@0: // Originally AddRefed in SendCursorRequest() in SmsIPCService.cpp. michael@0: static_cast(aActor)->Release(); michael@0: return true; michael@0: } michael@0: michael@0: /******************************************************************************* michael@0: * SmsRequestChild michael@0: ******************************************************************************/ michael@0: michael@0: SmsRequestChild::SmsRequestChild(nsIMobileMessageCallback* aReplyRequest) michael@0: : mReplyRequest(aReplyRequest) michael@0: { michael@0: MOZ_COUNT_CTOR(SmsRequestChild); michael@0: MOZ_ASSERT(aReplyRequest); michael@0: } michael@0: michael@0: void michael@0: SmsRequestChild::ActorDestroy(ActorDestroyReason aWhy) michael@0: { michael@0: // Nothing needed here. michael@0: } michael@0: michael@0: bool michael@0: SmsRequestChild::Recv__delete__(const MessageReply& aReply) michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: MOZ_ASSERT(mReplyRequest); michael@0: nsCOMPtr message; michael@0: switch(aReply.type()) { michael@0: case MessageReply::TReplyMessageSend: { michael@0: const MobileMessageData& data = michael@0: aReply.get_ReplyMessageSend().messageData(); michael@0: nsCOMPtr msg = CreateMessageFromMessageData(data); michael@0: mReplyRequest->NotifyMessageSent(msg); michael@0: } michael@0: break; michael@0: case MessageReply::TReplyMessageSendFail: michael@0: mReplyRequest->NotifySendMessageFailed(aReply.get_ReplyMessageSendFail().error()); michael@0: break; michael@0: case MessageReply::TReplyGetMessage: { michael@0: const MobileMessageData& data = michael@0: aReply.get_ReplyGetMessage().messageData(); michael@0: nsCOMPtr msg = CreateMessageFromMessageData(data); michael@0: mReplyRequest->NotifyMessageGot(msg); michael@0: } michael@0: break; michael@0: case MessageReply::TReplyGetMessageFail: michael@0: mReplyRequest->NotifyGetMessageFailed(aReply.get_ReplyGetMessageFail().error()); michael@0: break; michael@0: case MessageReply::TReplyMessageDelete: { michael@0: const InfallibleTArray& deletedResult = aReply.get_ReplyMessageDelete().deleted(); michael@0: mReplyRequest->NotifyMessageDeleted(const_cast(deletedResult.Elements()), michael@0: deletedResult.Length()); michael@0: } michael@0: break; michael@0: case MessageReply::TReplyMessageDeleteFail: michael@0: mReplyRequest->NotifyDeleteMessageFailed(aReply.get_ReplyMessageDeleteFail().error()); michael@0: break; michael@0: case MessageReply::TReplyMarkeMessageRead: michael@0: mReplyRequest->NotifyMessageMarkedRead(aReply.get_ReplyMarkeMessageRead().read()); michael@0: break; michael@0: case MessageReply::TReplyMarkeMessageReadFail: michael@0: mReplyRequest->NotifyMarkMessageReadFailed(aReply.get_ReplyMarkeMessageReadFail().error()); michael@0: break; michael@0: case MessageReply::TReplyGetSegmentInfoForText: { michael@0: const SmsSegmentInfoData& data = michael@0: aReply.get_ReplyGetSegmentInfoForText().infoData(); michael@0: nsCOMPtr info = new SmsSegmentInfo(data); michael@0: mReplyRequest->NotifySegmentInfoForTextGot(info); michael@0: } michael@0: break; michael@0: case MessageReply::TReplyGetSegmentInfoForTextFail: michael@0: mReplyRequest->NotifyGetSegmentInfoForTextFailed( michael@0: aReply.get_ReplyGetSegmentInfoForTextFail().error()); michael@0: break; michael@0: case MessageReply::TReplyGetSmscAddress: michael@0: mReplyRequest->NotifyGetSmscAddress(aReply.get_ReplyGetSmscAddress().smscAddress()); michael@0: break; michael@0: case MessageReply::TReplyGetSmscAddressFail: michael@0: mReplyRequest->NotifyGetSmscAddressFailed(aReply.get_ReplyGetSmscAddressFail().error()); michael@0: break; michael@0: default: michael@0: MOZ_CRASH("Received invalid response parameters!"); michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: /******************************************************************************* michael@0: * MobileMessageCursorChild michael@0: ******************************************************************************/ michael@0: michael@0: NS_IMPL_ISUPPORTS(MobileMessageCursorChild, nsICursorContinueCallback) michael@0: michael@0: MobileMessageCursorChild::MobileMessageCursorChild(nsIMobileMessageCursorCallback* aCallback) michael@0: : mCursorCallback(aCallback) michael@0: { michael@0: MOZ_COUNT_CTOR(MobileMessageCursorChild); michael@0: MOZ_ASSERT(aCallback); michael@0: } michael@0: michael@0: void michael@0: MobileMessageCursorChild::ActorDestroy(ActorDestroyReason aWhy) michael@0: { michael@0: // Nothing needed here. michael@0: } michael@0: michael@0: bool michael@0: MobileMessageCursorChild::RecvNotifyResult(const MobileMessageCursorData& aData) michael@0: { michael@0: MOZ_ASSERT(mCursorCallback); michael@0: michael@0: nsCOMPtr result; michael@0: switch(aData.type()) { michael@0: case MobileMessageCursorData::TMmsMessageData: michael@0: result = new MmsMessage(aData.get_MmsMessageData()); michael@0: break; michael@0: case MobileMessageCursorData::TSmsMessageData: michael@0: result = new SmsMessage(aData.get_SmsMessageData()); michael@0: break; michael@0: case MobileMessageCursorData::TThreadData: michael@0: result = new MobileMessageThread(aData.get_ThreadData()); michael@0: break; michael@0: default: michael@0: MOZ_CRASH("Received invalid response parameters!"); michael@0: } michael@0: michael@0: mCursorCallback->NotifyCursorResult(result); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: MobileMessageCursorChild::Recv__delete__(const int32_t& aError) michael@0: { michael@0: MOZ_ASSERT(mCursorCallback); michael@0: michael@0: if (aError != nsIMobileMessageCallback::SUCCESS_NO_ERROR) { michael@0: mCursorCallback->NotifyCursorError(aError); michael@0: } else { michael@0: mCursorCallback->NotifyCursorDone(); michael@0: } michael@0: mCursorCallback = nullptr; michael@0: michael@0: return true; michael@0: } michael@0: michael@0: // nsICursorContinueCallback michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageCursorChild::HandleContinue() michael@0: { michael@0: MOZ_ASSERT(mCursorCallback); michael@0: michael@0: SendContinue(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: } // namespace mobilemessage michael@0: } // namespace dom michael@0: } // namespace mozilla