michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 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 "SmsMessage.h" michael@0: #include "nsIDOMClassInfo.h" michael@0: #include "jsapi.h" // For OBJECT_TO_JSVAL and JS_NewDateObjectMsec michael@0: #include "jsfriendapi.h" // For js_DateGetMsecSinceEpoch michael@0: #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType michael@0: michael@0: using namespace mozilla::dom::mobilemessage; michael@0: michael@0: DOMCI_DATA(MozSmsMessage, mozilla::dom::SmsMessage) michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(SmsMessage) michael@0: NS_INTERFACE_MAP_ENTRY(nsIDOMMozSmsMessage) michael@0: NS_INTERFACE_MAP_ENTRY(nsISupports) michael@0: NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozSmsMessage) michael@0: NS_INTERFACE_MAP_END michael@0: michael@0: NS_IMPL_ADDREF(SmsMessage) michael@0: NS_IMPL_RELEASE(SmsMessage) michael@0: michael@0: SmsMessage::SmsMessage(int32_t aId, michael@0: uint64_t aThreadId, michael@0: const nsString& aIccId, michael@0: DeliveryState aDelivery, michael@0: DeliveryStatus aDeliveryStatus, michael@0: const nsString& aSender, michael@0: const nsString& aReceiver, michael@0: const nsString& aBody, michael@0: MessageClass aMessageClass, michael@0: uint64_t aTimestamp, michael@0: uint64_t aSentTimestamp, michael@0: uint64_t aDeliveryTimestamp, michael@0: bool aRead) michael@0: : mData(aId, aThreadId, aIccId, aDelivery, aDeliveryStatus, michael@0: aSender, aReceiver, aBody, aMessageClass, aTimestamp, aSentTimestamp, michael@0: aDeliveryTimestamp, aRead) michael@0: { michael@0: } michael@0: michael@0: SmsMessage::SmsMessage(const SmsMessageData& aData) michael@0: : mData(aData) michael@0: { michael@0: } michael@0: michael@0: /* static */ nsresult michael@0: SmsMessage::Create(int32_t aId, michael@0: uint64_t aThreadId, michael@0: const nsAString& aIccId, michael@0: const nsAString& aDelivery, michael@0: const nsAString& aDeliveryStatus, michael@0: const nsAString& aSender, michael@0: const nsAString& aReceiver, michael@0: const nsAString& aBody, michael@0: const nsAString& aMessageClass, michael@0: uint64_t aTimestamp, michael@0: uint64_t aSentTimestamp, michael@0: uint64_t aDeliveryTimestamp, michael@0: bool aRead, michael@0: JSContext* aCx, michael@0: nsIDOMMozSmsMessage** aMessage) michael@0: { michael@0: *aMessage = nullptr; michael@0: michael@0: // SmsMessageData exposes these as references, so we can simply assign michael@0: // to them. michael@0: SmsMessageData data; michael@0: data.id() = aId; michael@0: data.threadId() = aThreadId; michael@0: data.iccId() = nsString(aIccId); michael@0: data.sender() = nsString(aSender); michael@0: data.receiver() = nsString(aReceiver); michael@0: data.body() = nsString(aBody); michael@0: data.read() = aRead; michael@0: michael@0: if (aDelivery.Equals(DELIVERY_RECEIVED)) { michael@0: data.delivery() = eDeliveryState_Received; michael@0: } else if (aDelivery.Equals(DELIVERY_SENDING)) { michael@0: data.delivery() = eDeliveryState_Sending; michael@0: } else if (aDelivery.Equals(DELIVERY_SENT)) { michael@0: data.delivery() = eDeliveryState_Sent; michael@0: } else if (aDelivery.Equals(DELIVERY_ERROR)) { michael@0: data.delivery() = eDeliveryState_Error; michael@0: } else { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: if (aDeliveryStatus.Equals(DELIVERY_STATUS_NOT_APPLICABLE)) { michael@0: data.deliveryStatus() = eDeliveryStatus_NotApplicable; michael@0: } else if (aDeliveryStatus.Equals(DELIVERY_STATUS_SUCCESS)) { michael@0: data.deliveryStatus() = eDeliveryStatus_Success; michael@0: } else if (aDeliveryStatus.Equals(DELIVERY_STATUS_PENDING)) { michael@0: data.deliveryStatus() = eDeliveryStatus_Pending; michael@0: } else if (aDeliveryStatus.Equals(DELIVERY_STATUS_ERROR)) { michael@0: data.deliveryStatus() = eDeliveryStatus_Error; michael@0: } else { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: if (aMessageClass.Equals(MESSAGE_CLASS_NORMAL)) { michael@0: data.messageClass() = eMessageClass_Normal; michael@0: } else if (aMessageClass.Equals(MESSAGE_CLASS_CLASS_0)) { michael@0: data.messageClass() = eMessageClass_Class0; michael@0: } else if (aMessageClass.Equals(MESSAGE_CLASS_CLASS_1)) { michael@0: data.messageClass() = eMessageClass_Class1; michael@0: } else if (aMessageClass.Equals(MESSAGE_CLASS_CLASS_2)) { michael@0: data.messageClass() = eMessageClass_Class2; michael@0: } else if (aMessageClass.Equals(MESSAGE_CLASS_CLASS_3)) { michael@0: data.messageClass() = eMessageClass_Class3; michael@0: } else { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: // Set |timestamp|. michael@0: data.timestamp() = aTimestamp; michael@0: michael@0: // Set |sentTimestamp|. michael@0: data.sentTimestamp() = aSentTimestamp; michael@0: michael@0: // Set |deliveryTimestamp|. michael@0: data.deliveryTimestamp() = aDeliveryTimestamp; michael@0: michael@0: nsCOMPtr message = new SmsMessage(data); michael@0: message.swap(*aMessage); michael@0: return NS_OK; michael@0: } michael@0: michael@0: const SmsMessageData& michael@0: SmsMessage::GetData() const michael@0: { michael@0: return mData; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetType(nsAString& aType) michael@0: { michael@0: aType = NS_LITERAL_STRING("sms"); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetId(int32_t* aId) michael@0: { michael@0: *aId = mData.id(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetThreadId(uint64_t* aThreadId) michael@0: { michael@0: *aThreadId = mData.threadId(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetIccId(nsAString& aIccId) michael@0: { michael@0: aIccId = mData.iccId(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetDelivery(nsAString& aDelivery) michael@0: { michael@0: switch (mData.delivery()) { michael@0: case eDeliveryState_Received: michael@0: aDelivery = DELIVERY_RECEIVED; michael@0: break; michael@0: case eDeliveryState_Sending: michael@0: aDelivery = DELIVERY_SENDING; michael@0: break; michael@0: case eDeliveryState_Sent: michael@0: aDelivery = DELIVERY_SENT; michael@0: break; michael@0: case eDeliveryState_Error: michael@0: aDelivery = DELIVERY_ERROR; michael@0: break; michael@0: case eDeliveryState_Unknown: michael@0: case eDeliveryState_EndGuard: michael@0: default: michael@0: MOZ_CRASH("We shouldn't get any other delivery state!"); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetDeliveryStatus(nsAString& aDeliveryStatus) michael@0: { michael@0: switch (mData.deliveryStatus()) { michael@0: case eDeliveryStatus_NotApplicable: michael@0: aDeliveryStatus = DELIVERY_STATUS_NOT_APPLICABLE; michael@0: break; michael@0: case eDeliveryStatus_Success: michael@0: aDeliveryStatus = DELIVERY_STATUS_SUCCESS; michael@0: break; michael@0: case eDeliveryStatus_Pending: michael@0: aDeliveryStatus = DELIVERY_STATUS_PENDING; michael@0: break; michael@0: case eDeliveryStatus_Error: michael@0: aDeliveryStatus = DELIVERY_STATUS_ERROR; michael@0: break; michael@0: case eDeliveryStatus_EndGuard: michael@0: default: michael@0: MOZ_CRASH("We shouldn't get any other delivery status!"); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetSender(nsAString& aSender) michael@0: { michael@0: aSender = mData.sender(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetReceiver(nsAString& aReceiver) michael@0: { michael@0: aReceiver = mData.receiver(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetBody(nsAString& aBody) michael@0: { michael@0: aBody = mData.body(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetMessageClass(nsAString& aMessageClass) michael@0: { michael@0: switch (mData.messageClass()) { michael@0: case eMessageClass_Normal: michael@0: aMessageClass = MESSAGE_CLASS_NORMAL; michael@0: break; michael@0: case eMessageClass_Class0: michael@0: aMessageClass = MESSAGE_CLASS_CLASS_0; michael@0: break; michael@0: case eMessageClass_Class1: michael@0: aMessageClass = MESSAGE_CLASS_CLASS_1; michael@0: break; michael@0: case eMessageClass_Class2: michael@0: aMessageClass = MESSAGE_CLASS_CLASS_2; michael@0: break; michael@0: case eMessageClass_Class3: michael@0: aMessageClass = MESSAGE_CLASS_CLASS_3; michael@0: break; michael@0: default: michael@0: MOZ_CRASH("We shouldn't get any other message class!"); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetTimestamp(DOMTimeStamp* aTimestamp) michael@0: { michael@0: *aTimestamp = mData.timestamp(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetSentTimestamp(DOMTimeStamp* aSentTimestamp) michael@0: { michael@0: *aSentTimestamp = mData.sentTimestamp(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetDeliveryTimestamp(DOMTimeStamp* aDate) michael@0: { michael@0: *aDate = mData.deliveryTimestamp(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: SmsMessage::GetRead(bool* aRead) michael@0: { michael@0: *aRead = mData.read(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla