dom/mobilemessage/src/SmsFilter.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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 "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"
    17 using namespace mozilla::dom::mobilemessage;
    19 DOMCI_DATA(MozSmsFilter, mozilla::dom::SmsFilter)
    21 namespace mozilla {
    22 namespace dom {
    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
    30 NS_IMPL_ADDREF(SmsFilter)
    31 NS_IMPL_RELEASE(SmsFilter)
    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 }
    42 SmsFilter::SmsFilter(const SmsFilterData& aData)
    43   : mData(aData)
    44 {
    45 }
    47 /* static */ nsresult
    48 SmsFilter::NewSmsFilter(nsISupports** aSmsFilter)
    49 {
    50   NS_ADDREF(*aSmsFilter = new SmsFilter());
    51   return NS_OK;
    52 }
    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   }
    62   aStartDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.startDate()));
    63   NS_ENSURE_TRUE(aStartDate.isObject(), NS_ERROR_FAILURE);
    65   return NS_OK;
    66 }
    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   }
    76   if (!aStartDate.isObject()) {
    77     return NS_ERROR_INVALID_ARG;
    78   }
    80   JS::Rooted<JSObject*> obj(aCx, &aStartDate.toObject());
    81   if (!JS_ObjectIsDate(aCx, obj)) {
    82     return NS_ERROR_INVALID_ARG;
    83   }
    85   mData.startDate() = js_DateGetMsecSinceEpoch(obj);
    86   return NS_OK;
    87 }
    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   }
    97   aEndDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.endDate()));
    98   NS_ENSURE_TRUE(aEndDate.isObject(), NS_ERROR_FAILURE);
   100   return NS_OK;
   101 }
   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   }
   111   if (!aEndDate.isObject()) {
   112     return NS_ERROR_INVALID_ARG;
   113   }
   115   JS::Rooted<JSObject*> obj(aCx, &aEndDate.toObject());
   116   if (!JS_ObjectIsDate(aCx, obj)) {
   117     return NS_ERROR_INVALID_ARG;
   118   }
   120   mData.endDate() = js_DateGetMsecSinceEpoch(obj);
   121   return NS_OK;
   122 }
   124 NS_IMETHODIMP
   125 SmsFilter::GetNumbers(JSContext* aCx, JS::MutableHandle<JS::Value> aNumbers)
   126 {
   127   uint32_t length = mData.numbers().Length();
   129   if (length == 0) {
   130     aNumbers.setNull();
   131     return NS_OK;
   132   }
   134   if (!ToJSValue(aCx, mData.numbers(), aNumbers)) {
   135     return NS_ERROR_FAILURE;
   136   }
   138   return NS_OK;
   139 }
   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   }
   149   if (!aNumbers.isObject()) {
   150     return NS_ERROR_INVALID_ARG;
   151   }
   153   JS::Rooted<JSObject*> obj(aCx, &aNumbers.toObject());
   154   if (!JS_IsArrayObject(aCx, obj)) {
   155     return NS_ERROR_INVALID_ARG;
   156   }
   158   uint32_t size;
   159   MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &size));
   161   nsTArray<nsString> numbers;
   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     }
   169     if (!jsNumber.isString()) {
   170       return NS_ERROR_INVALID_ARG;
   171     }
   173     nsDependentJSString number;
   174     number.init(aCx, jsNumber.toString());
   176     numbers.AppendElement(number);
   177   }
   179   mData.numbers().Clear();
   180   mData.numbers().AppendElements(numbers);
   182   return NS_OK;
   183 }
   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   }
   203   return NS_OK;
   204 }
   206 NS_IMETHODIMP
   207 SmsFilter::SetDelivery(const nsAString& aDelivery)
   208 {
   209   if (aDelivery.IsEmpty()) {
   210     mData.delivery() = eDeliveryState_Unknown;
   211     return NS_OK;
   212   }
   214   if (aDelivery.Equals(DELIVERY_RECEIVED)) {
   215     mData.delivery() = eDeliveryState_Received;
   216     return NS_OK;
   217   }
   219   if (aDelivery.Equals(DELIVERY_SENT)) {
   220     mData.delivery() = eDeliveryState_Sent;
   221     return NS_OK;
   222   }
   224   return NS_ERROR_INVALID_ARG;
   225 }
   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   }
   235   aRead.setBoolean(mData.read());
   236   return NS_OK;
   237 }
   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   }
   247   if (!aRead.isBoolean()) {
   248     return NS_ERROR_INVALID_ARG;
   249   }
   251   mData.read() = aRead.toBoolean() ? eReadState_Read : eReadState_Unread;
   252   return NS_OK;
   253 }
   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   }
   263   aThreadId.setNumber(static_cast<double>(mData.threadId()));
   264   return NS_OK;
   265 }
   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   }
   275   if (!aThreadId.isNumber()) {
   276     return NS_ERROR_INVALID_ARG;
   277   }
   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;
   286   return NS_OK;
   287 }
   289 } // namespace dom
   290 } // namespace mozilla

mercurial