Bumping gaia.json for 1 gaia revision(s) a=gaia-bump
[gecko.git] / dom / mobilemessage / MobileMessageThread.cpp
blob8d9041892111c24f63fdea05876473ede51d56e4
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "MobileMessageThread.h"
7 #include "nsIDOMClassInfo.h"
8 #include "jsapi.h" // For OBJECT_TO_JSVAL and JS_NewDateObjectMsec
9 #include "jsfriendapi.h" // For js_DateGetMsecSinceEpoch
10 #include "nsJSUtils.h" // For nsAutoJSString
11 #include "nsTArrayHelpers.h" // For nsTArrayToJSArray
12 #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType
14 using namespace mozilla::dom::mobilemessage;
16 DOMCI_DATA(MozMobileMessageThread, mozilla::dom::MobileMessageThread)
18 namespace mozilla {
19 namespace dom {
21 NS_INTERFACE_MAP_BEGIN(MobileMessageThread)
22 NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageThread)
23 NS_INTERFACE_MAP_ENTRY(nsISupports)
24 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageThread)
25 NS_INTERFACE_MAP_END
27 NS_IMPL_ADDREF(MobileMessageThread)
28 NS_IMPL_RELEASE(MobileMessageThread)
30 /* static */ nsresult
31 MobileMessageThread::Create(uint64_t aId,
32 const JS::Value& aParticipants,
33 uint64_t aTimestamp,
34 const nsAString& aLastMessageSubject,
35 const nsAString& aBody,
36 uint64_t aUnreadCount,
37 const nsAString& aLastMessageType,
38 JSContext* aCx,
39 nsIDOMMozMobileMessageThread** aThread)
41 *aThread = nullptr;
43 // ThreadData exposes these as references, so we can simply assign
44 // to them.
45 ThreadData data;
46 data.id() = aId;
47 data.lastMessageSubject().Assign(aLastMessageSubject);
48 data.body().Assign(aBody);
49 data.unreadCount() = aUnreadCount;
51 // Participants.
53 if (!aParticipants.isObject()) {
54 return NS_ERROR_INVALID_ARG;
57 JS::Rooted<JSObject*> obj(aCx, &aParticipants.toObject());
58 if (!JS_IsArrayObject(aCx, obj)) {
59 return NS_ERROR_INVALID_ARG;
62 uint32_t length;
63 MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &length));
64 NS_ENSURE_TRUE(length, NS_ERROR_INVALID_ARG);
66 for (uint32_t i = 0; i < length; ++i) {
67 JS::Rooted<JS::Value> val(aCx);
69 if (!JS_GetElement(aCx, obj, i, &val) || !val.isString()) {
70 return NS_ERROR_INVALID_ARG;
73 nsAutoJSString str;
74 if (!str.init(aCx, val.toString())) {
75 return NS_ERROR_FAILURE;
78 data.participants().AppendElement(str);
82 // Set |timestamp|;
83 data.timestamp() = aTimestamp;
85 // Set |lastMessageType|.
87 MessageType lastMessageType;
88 if (aLastMessageType.Equals(MESSAGE_TYPE_SMS)) {
89 lastMessageType = eMessageType_SMS;
90 } else if (aLastMessageType.Equals(MESSAGE_TYPE_MMS)) {
91 lastMessageType = eMessageType_MMS;
92 } else {
93 return NS_ERROR_INVALID_ARG;
95 data.lastMessageType() = lastMessageType;
98 nsCOMPtr<nsIDOMMozMobileMessageThread> thread = new MobileMessageThread(data);
99 thread.forget(aThread);
100 return NS_OK;
103 MobileMessageThread::MobileMessageThread(uint64_t aId,
104 const nsTArray<nsString>& aParticipants,
105 uint64_t aTimestamp,
106 const nsString& aLastMessageSubject,
107 const nsString& aBody,
108 uint64_t aUnreadCount,
109 MessageType aLastMessageType)
110 : mData(aId, aParticipants, aTimestamp, aLastMessageSubject, aBody,
111 aUnreadCount, aLastMessageType)
113 MOZ_ASSERT(aParticipants.Length());
116 MobileMessageThread::MobileMessageThread(const ThreadData& aData)
117 : mData(aData)
119 MOZ_ASSERT(aData.participants().Length());
122 NS_IMETHODIMP
123 MobileMessageThread::GetId(uint64_t* aId)
125 *aId = mData.id();
126 return NS_OK;
129 NS_IMETHODIMP
130 MobileMessageThread::GetLastMessageSubject(nsAString& aLastMessageSubject)
132 aLastMessageSubject = mData.lastMessageSubject();
133 return NS_OK;
136 NS_IMETHODIMP
137 MobileMessageThread::GetBody(nsAString& aBody)
139 aBody = mData.body();
140 return NS_OK;
143 NS_IMETHODIMP
144 MobileMessageThread::GetUnreadCount(uint64_t* aUnreadCount)
146 *aUnreadCount = mData.unreadCount();
147 return NS_OK;
150 NS_IMETHODIMP
151 MobileMessageThread::GetParticipants(JSContext* aCx,
152 JS::MutableHandle<JS::Value> aParticipants)
154 JS::Rooted<JSObject*> obj(aCx);
156 nsresult rv = nsTArrayToJSArray(aCx, mData.participants(), &obj);
157 NS_ENSURE_SUCCESS(rv, rv);
159 aParticipants.setObject(*obj);
160 return NS_OK;
163 NS_IMETHODIMP
164 MobileMessageThread::GetTimestamp(DOMTimeStamp* aDate)
166 *aDate = mData.timestamp();
167 return NS_OK;
170 NS_IMETHODIMP
171 MobileMessageThread::GetLastMessageType(nsAString& aLastMessageType)
173 switch (mData.lastMessageType()) {
174 case eMessageType_SMS:
175 aLastMessageType = MESSAGE_TYPE_SMS;
176 break;
177 case eMessageType_MMS:
178 aLastMessageType = MESSAGE_TYPE_MMS;
179 break;
180 case eMessageType_EndGuard:
181 default:
182 MOZ_CRASH("We shouldn't get any other message type!");
185 return NS_OK;
188 } // namespace dom
189 } // namespace mozilla