dom/mobilemessage/src/SmsFilter.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:34e2cef85bbd
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/. */
5
6 #include "SmsFilter.h"
7 #include "jsapi.h"
8 #include "jsfriendapi.h" // For js_DateGetMsecSinceEpoch.
9 #include "js/Utility.h"
10 #include "mozilla/dom/mobilemessage/Constants.h" // For MessageType
11 #include "mozilla/dom/ToJSValue.h"
12 #include "nsDOMString.h"
13 #include "nsError.h"
14 #include "nsIDOMClassInfo.h"
15 #include "nsJSUtils.h"
16
17 using namespace mozilla::dom::mobilemessage;
18
19 DOMCI_DATA(MozSmsFilter, mozilla::dom::SmsFilter)
20
21 namespace mozilla {
22 namespace dom {
23
24 NS_INTERFACE_MAP_BEGIN(SmsFilter)
25 NS_INTERFACE_MAP_ENTRY(nsIDOMMozSmsFilter)
26 NS_INTERFACE_MAP_ENTRY(nsISupports)
27 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozSmsFilter)
28 NS_INTERFACE_MAP_END
29
30 NS_IMPL_ADDREF(SmsFilter)
31 NS_IMPL_RELEASE(SmsFilter)
32
33 SmsFilter::SmsFilter()
34 {
35 mData.startDate() = 0;
36 mData.endDate() = 0;
37 mData.delivery() = eDeliveryState_Unknown;
38 mData.read() = eReadState_Unknown;
39 mData.threadId() = 0;
40 }
41
42 SmsFilter::SmsFilter(const SmsFilterData& aData)
43 : mData(aData)
44 {
45 }
46
47 /* static */ nsresult
48 SmsFilter::NewSmsFilter(nsISupports** aSmsFilter)
49 {
50 NS_ADDREF(*aSmsFilter = new SmsFilter());
51 return NS_OK;
52 }
53
54 NS_IMETHODIMP
55 SmsFilter::GetStartDate(JSContext* aCx, JS::MutableHandle<JS::Value> aStartDate)
56 {
57 if (mData.startDate() == 0) {
58 aStartDate.setNull();
59 return NS_OK;
60 }
61
62 aStartDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.startDate()));
63 NS_ENSURE_TRUE(aStartDate.isObject(), NS_ERROR_FAILURE);
64
65 return NS_OK;
66 }
67
68 NS_IMETHODIMP
69 SmsFilter::SetStartDate(JSContext* aCx, JS::Handle<JS::Value> aStartDate)
70 {
71 if (aStartDate.isNull()) {
72 mData.startDate() = 0;
73 return NS_OK;
74 }
75
76 if (!aStartDate.isObject()) {
77 return NS_ERROR_INVALID_ARG;
78 }
79
80 JS::Rooted<JSObject*> obj(aCx, &aStartDate.toObject());
81 if (!JS_ObjectIsDate(aCx, obj)) {
82 return NS_ERROR_INVALID_ARG;
83 }
84
85 mData.startDate() = js_DateGetMsecSinceEpoch(obj);
86 return NS_OK;
87 }
88
89 NS_IMETHODIMP
90 SmsFilter::GetEndDate(JSContext* aCx, JS::MutableHandle<JS::Value> aEndDate)
91 {
92 if (mData.endDate() == 0) {
93 aEndDate.setNull();
94 return NS_OK;
95 }
96
97 aEndDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.endDate()));
98 NS_ENSURE_TRUE(aEndDate.isObject(), NS_ERROR_FAILURE);
99
100 return NS_OK;
101 }
102
103 NS_IMETHODIMP
104 SmsFilter::SetEndDate(JSContext* aCx, JS::Handle<JS::Value> aEndDate)
105 {
106 if (aEndDate.isNull()) {
107 mData.endDate() = 0;
108 return NS_OK;
109 }
110
111 if (!aEndDate.isObject()) {
112 return NS_ERROR_INVALID_ARG;
113 }
114
115 JS::Rooted<JSObject*> obj(aCx, &aEndDate.toObject());
116 if (!JS_ObjectIsDate(aCx, obj)) {
117 return NS_ERROR_INVALID_ARG;
118 }
119
120 mData.endDate() = js_DateGetMsecSinceEpoch(obj);
121 return NS_OK;
122 }
123
124 NS_IMETHODIMP
125 SmsFilter::GetNumbers(JSContext* aCx, JS::MutableHandle<JS::Value> aNumbers)
126 {
127 uint32_t length = mData.numbers().Length();
128
129 if (length == 0) {
130 aNumbers.setNull();
131 return NS_OK;
132 }
133
134 if (!ToJSValue(aCx, mData.numbers(), aNumbers)) {
135 return NS_ERROR_FAILURE;
136 }
137
138 return NS_OK;
139 }
140
141 NS_IMETHODIMP
142 SmsFilter::SetNumbers(JSContext* aCx, JS::Handle<JS::Value> aNumbers)
143 {
144 if (aNumbers.isNull()) {
145 mData.numbers().Clear();
146 return NS_OK;
147 }
148
149 if (!aNumbers.isObject()) {
150 return NS_ERROR_INVALID_ARG;
151 }
152
153 JS::Rooted<JSObject*> obj(aCx, &aNumbers.toObject());
154 if (!JS_IsArrayObject(aCx, obj)) {
155 return NS_ERROR_INVALID_ARG;
156 }
157
158 uint32_t size;
159 MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &size));
160
161 nsTArray<nsString> numbers;
162
163 for (uint32_t i=0; i<size; ++i) {
164 JS::Rooted<JS::Value> jsNumber(aCx);
165 if (!JS_GetElement(aCx, obj, i, &jsNumber)) {
166 return NS_ERROR_INVALID_ARG;
167 }
168
169 if (!jsNumber.isString()) {
170 return NS_ERROR_INVALID_ARG;
171 }
172
173 nsDependentJSString number;
174 number.init(aCx, jsNumber.toString());
175
176 numbers.AppendElement(number);
177 }
178
179 mData.numbers().Clear();
180 mData.numbers().AppendElements(numbers);
181
182 return NS_OK;
183 }
184
185 NS_IMETHODIMP
186 SmsFilter::GetDelivery(nsAString& aDelivery)
187 {
188 switch (mData.delivery()) {
189 case eDeliveryState_Received:
190 aDelivery = DELIVERY_RECEIVED;
191 break;
192 case eDeliveryState_Sent:
193 aDelivery = DELIVERY_SENT;
194 break;
195 case eDeliveryState_Unknown:
196 SetDOMStringToNull(aDelivery);
197 break;
198 default:
199 NS_ASSERTION(false, "We shouldn't get another delivery state!");
200 return NS_ERROR_UNEXPECTED;
201 }
202
203 return NS_OK;
204 }
205
206 NS_IMETHODIMP
207 SmsFilter::SetDelivery(const nsAString& aDelivery)
208 {
209 if (aDelivery.IsEmpty()) {
210 mData.delivery() = eDeliveryState_Unknown;
211 return NS_OK;
212 }
213
214 if (aDelivery.Equals(DELIVERY_RECEIVED)) {
215 mData.delivery() = eDeliveryState_Received;
216 return NS_OK;
217 }
218
219 if (aDelivery.Equals(DELIVERY_SENT)) {
220 mData.delivery() = eDeliveryState_Sent;
221 return NS_OK;
222 }
223
224 return NS_ERROR_INVALID_ARG;
225 }
226
227 NS_IMETHODIMP
228 SmsFilter::GetRead(JSContext* aCx, JS::MutableHandle<JS::Value> aRead)
229 {
230 if (mData.read() == eReadState_Unknown) {
231 aRead.setNull();
232 return NS_OK;
233 }
234
235 aRead.setBoolean(mData.read());
236 return NS_OK;
237 }
238
239 NS_IMETHODIMP
240 SmsFilter::SetRead(JSContext* aCx, JS::Handle<JS::Value> aRead)
241 {
242 if (aRead.isNull()) {
243 mData.read() = eReadState_Unknown;
244 return NS_OK;
245 }
246
247 if (!aRead.isBoolean()) {
248 return NS_ERROR_INVALID_ARG;
249 }
250
251 mData.read() = aRead.toBoolean() ? eReadState_Read : eReadState_Unread;
252 return NS_OK;
253 }
254
255 NS_IMETHODIMP
256 SmsFilter::GetThreadId(JSContext* aCx, JS::MutableHandle<JS::Value> aThreadId)
257 {
258 if (!mData.threadId()) {
259 aThreadId.setNull();
260 return NS_OK;
261 }
262
263 aThreadId.setNumber(static_cast<double>(mData.threadId()));
264 return NS_OK;
265 }
266
267 NS_IMETHODIMP
268 SmsFilter::SetThreadId(JSContext* aCx, JS::Handle<JS::Value> aThreadId)
269 {
270 if (aThreadId.isNull()) {
271 mData.threadId() = 0;
272 return NS_OK;
273 }
274
275 if (!aThreadId.isNumber()) {
276 return NS_ERROR_INVALID_ARG;
277 }
278
279 double number = aThreadId.toNumber();
280 uint64_t integer = static_cast<uint64_t>(number);
281 if (integer == 0 || integer != number) {
282 return NS_ERROR_INVALID_ARG;
283 }
284 mData.threadId() = integer;
285
286 return NS_OK;
287 }
288
289 } // namespace dom
290 } // namespace mozilla

mercurial