1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/mobilemessage/src/SmsFilter.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,290 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "SmsFilter.h" 1.10 +#include "jsapi.h" 1.11 +#include "jsfriendapi.h" // For js_DateGetMsecSinceEpoch. 1.12 +#include "js/Utility.h" 1.13 +#include "mozilla/dom/mobilemessage/Constants.h" // For MessageType 1.14 +#include "mozilla/dom/ToJSValue.h" 1.15 +#include "nsDOMString.h" 1.16 +#include "nsError.h" 1.17 +#include "nsIDOMClassInfo.h" 1.18 +#include "nsJSUtils.h" 1.19 + 1.20 +using namespace mozilla::dom::mobilemessage; 1.21 + 1.22 +DOMCI_DATA(MozSmsFilter, mozilla::dom::SmsFilter) 1.23 + 1.24 +namespace mozilla { 1.25 +namespace dom { 1.26 + 1.27 +NS_INTERFACE_MAP_BEGIN(SmsFilter) 1.28 + NS_INTERFACE_MAP_ENTRY(nsIDOMMozSmsFilter) 1.29 + NS_INTERFACE_MAP_ENTRY(nsISupports) 1.30 + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozSmsFilter) 1.31 +NS_INTERFACE_MAP_END 1.32 + 1.33 +NS_IMPL_ADDREF(SmsFilter) 1.34 +NS_IMPL_RELEASE(SmsFilter) 1.35 + 1.36 +SmsFilter::SmsFilter() 1.37 +{ 1.38 + mData.startDate() = 0; 1.39 + mData.endDate() = 0; 1.40 + mData.delivery() = eDeliveryState_Unknown; 1.41 + mData.read() = eReadState_Unknown; 1.42 + mData.threadId() = 0; 1.43 +} 1.44 + 1.45 +SmsFilter::SmsFilter(const SmsFilterData& aData) 1.46 + : mData(aData) 1.47 +{ 1.48 +} 1.49 + 1.50 +/* static */ nsresult 1.51 +SmsFilter::NewSmsFilter(nsISupports** aSmsFilter) 1.52 +{ 1.53 + NS_ADDREF(*aSmsFilter = new SmsFilter()); 1.54 + return NS_OK; 1.55 +} 1.56 + 1.57 +NS_IMETHODIMP 1.58 +SmsFilter::GetStartDate(JSContext* aCx, JS::MutableHandle<JS::Value> aStartDate) 1.59 +{ 1.60 + if (mData.startDate() == 0) { 1.61 + aStartDate.setNull(); 1.62 + return NS_OK; 1.63 + } 1.64 + 1.65 + aStartDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.startDate())); 1.66 + NS_ENSURE_TRUE(aStartDate.isObject(), NS_ERROR_FAILURE); 1.67 + 1.68 + return NS_OK; 1.69 +} 1.70 + 1.71 +NS_IMETHODIMP 1.72 +SmsFilter::SetStartDate(JSContext* aCx, JS::Handle<JS::Value> aStartDate) 1.73 +{ 1.74 + if (aStartDate.isNull()) { 1.75 + mData.startDate() = 0; 1.76 + return NS_OK; 1.77 + } 1.78 + 1.79 + if (!aStartDate.isObject()) { 1.80 + return NS_ERROR_INVALID_ARG; 1.81 + } 1.82 + 1.83 + JS::Rooted<JSObject*> obj(aCx, &aStartDate.toObject()); 1.84 + if (!JS_ObjectIsDate(aCx, obj)) { 1.85 + return NS_ERROR_INVALID_ARG; 1.86 + } 1.87 + 1.88 + mData.startDate() = js_DateGetMsecSinceEpoch(obj); 1.89 + return NS_OK; 1.90 +} 1.91 + 1.92 +NS_IMETHODIMP 1.93 +SmsFilter::GetEndDate(JSContext* aCx, JS::MutableHandle<JS::Value> aEndDate) 1.94 +{ 1.95 + if (mData.endDate() == 0) { 1.96 + aEndDate.setNull(); 1.97 + return NS_OK; 1.98 + } 1.99 + 1.100 + aEndDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.endDate())); 1.101 + NS_ENSURE_TRUE(aEndDate.isObject(), NS_ERROR_FAILURE); 1.102 + 1.103 + return NS_OK; 1.104 +} 1.105 + 1.106 +NS_IMETHODIMP 1.107 +SmsFilter::SetEndDate(JSContext* aCx, JS::Handle<JS::Value> aEndDate) 1.108 +{ 1.109 + if (aEndDate.isNull()) { 1.110 + mData.endDate() = 0; 1.111 + return NS_OK; 1.112 + } 1.113 + 1.114 + if (!aEndDate.isObject()) { 1.115 + return NS_ERROR_INVALID_ARG; 1.116 + } 1.117 + 1.118 + JS::Rooted<JSObject*> obj(aCx, &aEndDate.toObject()); 1.119 + if (!JS_ObjectIsDate(aCx, obj)) { 1.120 + return NS_ERROR_INVALID_ARG; 1.121 + } 1.122 + 1.123 + mData.endDate() = js_DateGetMsecSinceEpoch(obj); 1.124 + return NS_OK; 1.125 +} 1.126 + 1.127 +NS_IMETHODIMP 1.128 +SmsFilter::GetNumbers(JSContext* aCx, JS::MutableHandle<JS::Value> aNumbers) 1.129 +{ 1.130 + uint32_t length = mData.numbers().Length(); 1.131 + 1.132 + if (length == 0) { 1.133 + aNumbers.setNull(); 1.134 + return NS_OK; 1.135 + } 1.136 + 1.137 + if (!ToJSValue(aCx, mData.numbers(), aNumbers)) { 1.138 + return NS_ERROR_FAILURE; 1.139 + } 1.140 + 1.141 + return NS_OK; 1.142 +} 1.143 + 1.144 +NS_IMETHODIMP 1.145 +SmsFilter::SetNumbers(JSContext* aCx, JS::Handle<JS::Value> aNumbers) 1.146 +{ 1.147 + if (aNumbers.isNull()) { 1.148 + mData.numbers().Clear(); 1.149 + return NS_OK; 1.150 + } 1.151 + 1.152 + if (!aNumbers.isObject()) { 1.153 + return NS_ERROR_INVALID_ARG; 1.154 + } 1.155 + 1.156 + JS::Rooted<JSObject*> obj(aCx, &aNumbers.toObject()); 1.157 + if (!JS_IsArrayObject(aCx, obj)) { 1.158 + return NS_ERROR_INVALID_ARG; 1.159 + } 1.160 + 1.161 + uint32_t size; 1.162 + MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &size)); 1.163 + 1.164 + nsTArray<nsString> numbers; 1.165 + 1.166 + for (uint32_t i=0; i<size; ++i) { 1.167 + JS::Rooted<JS::Value> jsNumber(aCx); 1.168 + if (!JS_GetElement(aCx, obj, i, &jsNumber)) { 1.169 + return NS_ERROR_INVALID_ARG; 1.170 + } 1.171 + 1.172 + if (!jsNumber.isString()) { 1.173 + return NS_ERROR_INVALID_ARG; 1.174 + } 1.175 + 1.176 + nsDependentJSString number; 1.177 + number.init(aCx, jsNumber.toString()); 1.178 + 1.179 + numbers.AppendElement(number); 1.180 + } 1.181 + 1.182 + mData.numbers().Clear(); 1.183 + mData.numbers().AppendElements(numbers); 1.184 + 1.185 + return NS_OK; 1.186 +} 1.187 + 1.188 +NS_IMETHODIMP 1.189 +SmsFilter::GetDelivery(nsAString& aDelivery) 1.190 +{ 1.191 + switch (mData.delivery()) { 1.192 + case eDeliveryState_Received: 1.193 + aDelivery = DELIVERY_RECEIVED; 1.194 + break; 1.195 + case eDeliveryState_Sent: 1.196 + aDelivery = DELIVERY_SENT; 1.197 + break; 1.198 + case eDeliveryState_Unknown: 1.199 + SetDOMStringToNull(aDelivery); 1.200 + break; 1.201 + default: 1.202 + NS_ASSERTION(false, "We shouldn't get another delivery state!"); 1.203 + return NS_ERROR_UNEXPECTED; 1.204 + } 1.205 + 1.206 + return NS_OK; 1.207 +} 1.208 + 1.209 +NS_IMETHODIMP 1.210 +SmsFilter::SetDelivery(const nsAString& aDelivery) 1.211 +{ 1.212 + if (aDelivery.IsEmpty()) { 1.213 + mData.delivery() = eDeliveryState_Unknown; 1.214 + return NS_OK; 1.215 + } 1.216 + 1.217 + if (aDelivery.Equals(DELIVERY_RECEIVED)) { 1.218 + mData.delivery() = eDeliveryState_Received; 1.219 + return NS_OK; 1.220 + } 1.221 + 1.222 + if (aDelivery.Equals(DELIVERY_SENT)) { 1.223 + mData.delivery() = eDeliveryState_Sent; 1.224 + return NS_OK; 1.225 + } 1.226 + 1.227 + return NS_ERROR_INVALID_ARG; 1.228 +} 1.229 + 1.230 +NS_IMETHODIMP 1.231 +SmsFilter::GetRead(JSContext* aCx, JS::MutableHandle<JS::Value> aRead) 1.232 +{ 1.233 + if (mData.read() == eReadState_Unknown) { 1.234 + aRead.setNull(); 1.235 + return NS_OK; 1.236 + } 1.237 + 1.238 + aRead.setBoolean(mData.read()); 1.239 + return NS_OK; 1.240 +} 1.241 + 1.242 +NS_IMETHODIMP 1.243 +SmsFilter::SetRead(JSContext* aCx, JS::Handle<JS::Value> aRead) 1.244 +{ 1.245 + if (aRead.isNull()) { 1.246 + mData.read() = eReadState_Unknown; 1.247 + return NS_OK; 1.248 + } 1.249 + 1.250 + if (!aRead.isBoolean()) { 1.251 + return NS_ERROR_INVALID_ARG; 1.252 + } 1.253 + 1.254 + mData.read() = aRead.toBoolean() ? eReadState_Read : eReadState_Unread; 1.255 + return NS_OK; 1.256 +} 1.257 + 1.258 +NS_IMETHODIMP 1.259 +SmsFilter::GetThreadId(JSContext* aCx, JS::MutableHandle<JS::Value> aThreadId) 1.260 +{ 1.261 + if (!mData.threadId()) { 1.262 + aThreadId.setNull(); 1.263 + return NS_OK; 1.264 + } 1.265 + 1.266 + aThreadId.setNumber(static_cast<double>(mData.threadId())); 1.267 + return NS_OK; 1.268 +} 1.269 + 1.270 +NS_IMETHODIMP 1.271 +SmsFilter::SetThreadId(JSContext* aCx, JS::Handle<JS::Value> aThreadId) 1.272 +{ 1.273 + if (aThreadId.isNull()) { 1.274 + mData.threadId() = 0; 1.275 + return NS_OK; 1.276 + } 1.277 + 1.278 + if (!aThreadId.isNumber()) { 1.279 + return NS_ERROR_INVALID_ARG; 1.280 + } 1.281 + 1.282 + double number = aThreadId.toNumber(); 1.283 + uint64_t integer = static_cast<uint64_t>(number); 1.284 + if (integer == 0 || integer != number) { 1.285 + return NS_ERROR_INVALID_ARG; 1.286 + } 1.287 + mData.threadId() = integer; 1.288 + 1.289 + return NS_OK; 1.290 +} 1.291 + 1.292 +} // namespace dom 1.293 +} // namespace mozilla