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 "MobileMessageThread.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 "nsJSUtils.h" // For nsDependentJSString michael@0: #include "nsTArrayHelpers.h" // For nsTArrayToJSArray 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(MozMobileMessageThread, mozilla::dom::MobileMessageThread) michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: NS_INTERFACE_MAP_BEGIN(MobileMessageThread) michael@0: NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageThread) michael@0: NS_INTERFACE_MAP_ENTRY(nsISupports) michael@0: NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageThread) michael@0: NS_INTERFACE_MAP_END michael@0: michael@0: NS_IMPL_ADDREF(MobileMessageThread) michael@0: NS_IMPL_RELEASE(MobileMessageThread) michael@0: michael@0: /* static */ nsresult michael@0: MobileMessageThread::Create(uint64_t aId, michael@0: const JS::Value& aParticipants, michael@0: uint64_t aTimestamp, michael@0: const nsAString& aLastMessageSubject, michael@0: const nsAString& aBody, michael@0: uint64_t aUnreadCount, michael@0: const nsAString& aLastMessageType, michael@0: JSContext* aCx, michael@0: nsIDOMMozMobileMessageThread** aThread) michael@0: { michael@0: *aThread = nullptr; michael@0: michael@0: // ThreadData exposes these as references, so we can simply assign michael@0: // to them. michael@0: ThreadData data; michael@0: data.id() = aId; michael@0: data.lastMessageSubject().Assign(aLastMessageSubject); michael@0: data.body().Assign(aBody); michael@0: data.unreadCount() = aUnreadCount; michael@0: michael@0: // Participants. michael@0: { michael@0: if (!aParticipants.isObject()) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: JS::Rooted obj(aCx, &aParticipants.toObject()); michael@0: if (!JS_IsArrayObject(aCx, obj)) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: uint32_t length; michael@0: MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &length)); michael@0: NS_ENSURE_TRUE(length, NS_ERROR_INVALID_ARG); michael@0: michael@0: for (uint32_t i = 0; i < length; ++i) { michael@0: JS::Rooted val(aCx); michael@0: michael@0: if (!JS_GetElement(aCx, obj, i, &val) || !val.isString()) { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: michael@0: nsDependentJSString str; michael@0: str.init(aCx, val.toString()); michael@0: data.participants().AppendElement(str); michael@0: } michael@0: } michael@0: michael@0: // Set |timestamp|; michael@0: data.timestamp() = aTimestamp; michael@0: michael@0: // Set |lastMessageType|. michael@0: { michael@0: MessageType lastMessageType; michael@0: if (aLastMessageType.Equals(MESSAGE_TYPE_SMS)) { michael@0: lastMessageType = eMessageType_SMS; michael@0: } else if (aLastMessageType.Equals(MESSAGE_TYPE_MMS)) { michael@0: lastMessageType = eMessageType_MMS; michael@0: } else { michael@0: return NS_ERROR_INVALID_ARG; michael@0: } michael@0: data.lastMessageType() = lastMessageType; michael@0: } michael@0: michael@0: nsCOMPtr thread = new MobileMessageThread(data); michael@0: thread.forget(aThread); michael@0: return NS_OK; michael@0: } michael@0: michael@0: MobileMessageThread::MobileMessageThread(uint64_t aId, michael@0: const nsTArray& aParticipants, michael@0: uint64_t aTimestamp, michael@0: const nsString& aLastMessageSubject, michael@0: const nsString& aBody, michael@0: uint64_t aUnreadCount, michael@0: MessageType aLastMessageType) michael@0: : mData(aId, aParticipants, aTimestamp, aLastMessageSubject, aBody, michael@0: aUnreadCount, aLastMessageType) michael@0: { michael@0: MOZ_ASSERT(aParticipants.Length()); michael@0: } michael@0: michael@0: MobileMessageThread::MobileMessageThread(const ThreadData& aData) michael@0: : mData(aData) michael@0: { michael@0: MOZ_ASSERT(aData.participants().Length()); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::GetId(uint64_t* aId) michael@0: { michael@0: *aId = mData.id(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::GetLastMessageSubject(nsAString& aLastMessageSubject) michael@0: { michael@0: aLastMessageSubject = mData.lastMessageSubject(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::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: MobileMessageThread::GetUnreadCount(uint64_t* aUnreadCount) michael@0: { michael@0: *aUnreadCount = mData.unreadCount(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::GetParticipants(JSContext* aCx, michael@0: JS::MutableHandle aParticipants) michael@0: { michael@0: JS::Rooted obj(aCx); michael@0: michael@0: nsresult rv = nsTArrayToJSArray(aCx, mData.participants(), obj.address()); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: aParticipants.setObject(*obj); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::GetTimestamp(DOMTimeStamp* aDate) michael@0: { michael@0: *aDate = mData.timestamp(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: MobileMessageThread::GetLastMessageType(nsAString& aLastMessageType) michael@0: { michael@0: switch (mData.lastMessageType()) { michael@0: case eMessageType_SMS: michael@0: aLastMessageType = MESSAGE_TYPE_SMS; michael@0: break; michael@0: case eMessageType_MMS: michael@0: aLastMessageType = MESSAGE_TYPE_MMS; michael@0: break; michael@0: case eMessageType_EndGuard: michael@0: default: michael@0: MOZ_CRASH("We shouldn't get any other message type!"); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla