Bumping manifests a=b2g-bump
[gecko.git] / dom / mobilemessage / MobileMessageThread.cpp
blobac54bfee177193684c327398bd33b02bec47cb7e
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 namespace mozilla {
17 namespace dom {
19 NS_INTERFACE_MAP_BEGIN(MobileMessageThread)
20 NS_INTERFACE_MAP_ENTRY(nsIDOMMozMobileMessageThread)
21 NS_INTERFACE_MAP_ENTRY(nsISupports)
22 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozMobileMessageThread)
23 NS_INTERFACE_MAP_END
25 NS_IMPL_ADDREF(MobileMessageThread)
26 NS_IMPL_RELEASE(MobileMessageThread)
28 /* static */ nsresult
29 MobileMessageThread::Create(uint64_t aId,
30 const JS::Value& aParticipants,
31 uint64_t aTimestamp,
32 const nsAString& aLastMessageSubject,
33 const nsAString& aBody,
34 uint64_t aUnreadCount,
35 const nsAString& aLastMessageType,
36 JSContext* aCx,
37 nsIDOMMozMobileMessageThread** aThread)
39 *aThread = nullptr;
41 // ThreadData exposes these as references, so we can simply assign
42 // to them.
43 ThreadData data;
44 data.id() = aId;
45 data.lastMessageSubject().Assign(aLastMessageSubject);
46 data.body().Assign(aBody);
47 data.unreadCount() = aUnreadCount;
49 // Participants.
51 if (!aParticipants.isObject()) {
52 return NS_ERROR_INVALID_ARG;
55 JS::Rooted<JSObject*> obj(aCx, &aParticipants.toObject());
56 if (!JS_IsArrayObject(aCx, obj)) {
57 return NS_ERROR_INVALID_ARG;
60 uint32_t length;
61 MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &length));
62 NS_ENSURE_TRUE(length, NS_ERROR_INVALID_ARG);
64 for (uint32_t i = 0; i < length; ++i) {
65 JS::Rooted<JS::Value> val(aCx);
67 if (!JS_GetElement(aCx, obj, i, &val) || !val.isString()) {
68 return NS_ERROR_INVALID_ARG;
71 nsAutoJSString str;
72 if (!str.init(aCx, val.toString())) {
73 return NS_ERROR_FAILURE;
76 data.participants().AppendElement(str);
80 // Set |timestamp|;
81 data.timestamp() = aTimestamp;
83 // Set |lastMessageType|.
85 MessageType lastMessageType;
86 if (aLastMessageType.Equals(MESSAGE_TYPE_SMS)) {
87 lastMessageType = eMessageType_SMS;
88 } else if (aLastMessageType.Equals(MESSAGE_TYPE_MMS)) {
89 lastMessageType = eMessageType_MMS;
90 } else {
91 return NS_ERROR_INVALID_ARG;
93 data.lastMessageType() = lastMessageType;
96 nsCOMPtr<nsIDOMMozMobileMessageThread> thread = new MobileMessageThread(data);
97 thread.forget(aThread);
98 return NS_OK;
101 MobileMessageThread::MobileMessageThread(uint64_t aId,
102 const nsTArray<nsString>& aParticipants,
103 uint64_t aTimestamp,
104 const nsString& aLastMessageSubject,
105 const nsString& aBody,
106 uint64_t aUnreadCount,
107 MessageType aLastMessageType)
108 : mData(aId, aParticipants, aTimestamp, aLastMessageSubject, aBody,
109 aUnreadCount, aLastMessageType)
111 MOZ_ASSERT(aParticipants.Length());
114 MobileMessageThread::MobileMessageThread(const ThreadData& aData)
115 : mData(aData)
117 MOZ_ASSERT(aData.participants().Length());
120 NS_IMETHODIMP
121 MobileMessageThread::GetId(uint64_t* aId)
123 *aId = mData.id();
124 return NS_OK;
127 NS_IMETHODIMP
128 MobileMessageThread::GetLastMessageSubject(nsAString& aLastMessageSubject)
130 aLastMessageSubject = mData.lastMessageSubject();
131 return NS_OK;
134 NS_IMETHODIMP
135 MobileMessageThread::GetBody(nsAString& aBody)
137 aBody = mData.body();
138 return NS_OK;
141 NS_IMETHODIMP
142 MobileMessageThread::GetUnreadCount(uint64_t* aUnreadCount)
144 *aUnreadCount = mData.unreadCount();
145 return NS_OK;
148 NS_IMETHODIMP
149 MobileMessageThread::GetParticipants(JSContext* aCx,
150 JS::MutableHandle<JS::Value> aParticipants)
152 JS::Rooted<JSObject*> obj(aCx);
154 nsresult rv = nsTArrayToJSArray(aCx, mData.participants(), &obj);
155 NS_ENSURE_SUCCESS(rv, rv);
157 aParticipants.setObject(*obj);
158 return NS_OK;
161 NS_IMETHODIMP
162 MobileMessageThread::GetTimestamp(DOMTimeStamp* aDate)
164 *aDate = mData.timestamp();
165 return NS_OK;
168 NS_IMETHODIMP
169 MobileMessageThread::GetLastMessageType(nsAString& aLastMessageType)
171 switch (mData.lastMessageType()) {
172 case eMessageType_SMS:
173 aLastMessageType = MESSAGE_TYPE_SMS;
174 break;
175 case eMessageType_MMS:
176 aLastMessageType = MESSAGE_TYPE_MMS;
177 break;
178 case eMessageType_EndGuard:
179 default:
180 MOZ_CRASH("We shouldn't get any other message type!");
183 return NS_OK;
186 } // namespace dom
187 } // namespace mozilla