Bug 878533 - 1/3: move MozSmsFilter to webidl dictionary. r=smaug

This commit is contained in:
Vicamo Yang 2014-08-28 11:00:03 +08:00
parent 4ee4d8c55a
commit 98e41eaeae
19 changed files with 206 additions and 449 deletions

View File

@ -5,8 +5,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/ArrayUtils.h" #include "mozilla/ArrayUtils.h"
// On top because they include basictypes.h:
#include "mozilla/dom/SmsFilter.h"
#ifdef XP_WIN #ifdef XP_WIN
#undef GetClassName #undef GetClassName
@ -125,7 +123,6 @@
#include "nsIDOMMozSmsMessage.h" #include "nsIDOMMozSmsMessage.h"
#include "nsIDOMMozMmsMessage.h" #include "nsIDOMMozMmsMessage.h"
#include "nsIDOMSmsFilter.h"
#include "nsIDOMMozMobileMessageThread.h" #include "nsIDOMMozMobileMessageThread.h"
#ifdef MOZ_B2G_FM #ifdef MOZ_B2G_FM
@ -348,9 +345,6 @@ static nsDOMClassInfoData sClassInfoData[] = {
NS_DEFINE_CLASSINFO_DATA(MozMmsMessage, nsDOMGenericSH, NS_DEFINE_CLASSINFO_DATA(MozMmsMessage, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS) DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(MozSmsFilter, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(MozMobileMessageThread, nsDOMGenericSH, NS_DEFINE_CLASSINFO_DATA(MozMobileMessageThread, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS) DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -422,7 +416,6 @@ static const nsConstructorFuncMapData kConstructorFuncMap[] =
{ {
NS_DEFINE_CONSTRUCTOR_FUNC_DATA(Blob, DOMMultipartFileImpl::NewBlob) NS_DEFINE_CONSTRUCTOR_FUNC_DATA(Blob, DOMMultipartFileImpl::NewBlob)
NS_DEFINE_CONSTRUCTOR_FUNC_DATA(File, DOMMultipartFileImpl::NewFile) NS_DEFINE_CONSTRUCTOR_FUNC_DATA(File, DOMMultipartFileImpl::NewFile)
NS_DEFINE_CONSTRUCTOR_FUNC_DATA(MozSmsFilter, SmsFilter::NewSmsFilter)
NS_DEFINE_CONSTRUCTOR_FUNC_DATA(XSLTProcessor, XSLTProcessorCtor) NS_DEFINE_CONSTRUCTOR_FUNC_DATA(XSLTProcessor, XSLTProcessorCtor)
}; };
#undef NS_DEFINE_CONSTRUCTOR_FUNC_DATA #undef NS_DEFINE_CONSTRUCTOR_FUNC_DATA
@ -913,10 +906,6 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozMmsMessage) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozMmsMessage)
DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(MozSmsFilter, nsIDOMMozSmsFilter)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozSmsFilter)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(MozMobileMessageThread, nsIDOMMozMobileMessageThread) DOM_CLASSINFO_MAP_BEGIN(MozMobileMessageThread, nsIDOMMozMobileMessageThread)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozMobileMessageThread) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozMobileMessageThread)
DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_END

View File

@ -55,7 +55,6 @@ DOMCI_CLASS(ModalContentWindow)
DOMCI_CLASS(MozSmsMessage) DOMCI_CLASS(MozSmsMessage)
DOMCI_CLASS(MozMmsMessage) DOMCI_CLASS(MozMmsMessage)
DOMCI_CLASS(MozSmsFilter)
DOMCI_CLASS(MozMobileMessageThread) DOMCI_CLASS(MozMobileMessageThread)
// @font-face in CSS // @font-face in CSS

View File

@ -1990,7 +1990,6 @@ addExternalIface('MozObserver', nativeType='nsIObserver', notflattened=True)
addExternalIface('MozRDFCompositeDataSource', nativeType='nsIRDFCompositeDataSource', addExternalIface('MozRDFCompositeDataSource', nativeType='nsIRDFCompositeDataSource',
notflattened=True) notflattened=True)
addExternalIface('MozRDFResource', nativeType='nsIRDFResource', notflattened=True) addExternalIface('MozRDFResource', nativeType='nsIRDFResource', notflattened=True)
addExternalIface('MozSmsFilter', headerFile='nsIDOMSmsFilter.h')
addExternalIface('MozSmsMessage') addExternalIface('MozSmsMessage')
addExternalIface('MozTreeBoxObject', nativeType='nsITreeBoxObject', addExternalIface('MozTreeBoxObject', nativeType='nsITreeBoxObject',
notflattened=True) notflattened=True)

View File

@ -9,7 +9,6 @@ XPIDL_SOURCES += [
'nsIDOMMozMmsMessage.idl', 'nsIDOMMozMmsMessage.idl',
'nsIDOMMozMobileMessageThread.idl', 'nsIDOMMozMobileMessageThread.idl',
'nsIDOMMozSmsMessage.idl', 'nsIDOMMozSmsMessage.idl',
'nsIDOMSmsFilter.idl',
'nsIMmsService.idl', 'nsIMmsService.idl',
'nsIMobileMessageCallback.idl', 'nsIMobileMessageCallback.idl',
'nsIMobileMessageCursorCallback.idl', 'nsIMobileMessageCursorCallback.idl',

View File

@ -1,33 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
[scriptable, builtinclass, uuid(17890b60-0367-45c6-9729-62e5bf349b2b)]
interface nsIDOMMozSmsFilter : nsISupports
{
// A date that can return null.
[implicit_jscontext]
attribute jsval startDate;
// A date that can return null.
[implicit_jscontext]
attribute jsval endDate;
// An array of DOMString that can return null.
[implicit_jscontext]
attribute jsval numbers;
// A DOMString that can return and be set to "sent", "received" or null.
[Null(Empty)]
attribute DOMString delivery;
// A read flag that can return and be set to a boolean or null.
[implicit_jscontext]
attribute jsval read;
// A thread id that can return and be set to a numeric value or null.
[implicit_jscontext]
attribute jsval threadId;
};

View File

@ -12,11 +12,10 @@
%} %}
interface nsICursorContinueCallback; interface nsICursorContinueCallback;
interface nsIDOMMozSmsFilter;
interface nsIMobileMessageCallback; interface nsIMobileMessageCallback;
interface nsIMobileMessageCursorCallback; interface nsIMobileMessageCursorCallback;
[scriptable, uuid(8439916f-abc1-4c67-aa45-8a276a0a7855)] [scriptable, uuid(ead626bc-f5b4-47e1-921c-0b956c9298e0)]
interface nsIMobileMessageDatabaseService : nsISupports interface nsIMobileMessageDatabaseService : nsISupports
{ {
[binaryname(GetMessageMoz)] [binaryname(GetMessageMoz)]
@ -27,7 +26,16 @@ interface nsIMobileMessageDatabaseService : nsISupports
in uint32_t count, in uint32_t count,
in nsIMobileMessageCallback request); in nsIMobileMessageCallback request);
nsICursorContinueCallback createMessageCursor(in nsIDOMMozSmsFilter filter, nsICursorContinueCallback createMessageCursor(in boolean hasStartDate,
in unsigned long long startDate,
in boolean hasEndDate,
in unsigned long long endDate,
[array, size_is(numbersCount)] in wstring numbers,
in uint32_t numbersCount,
[Null(Null), Undefined(Null)] in DOMString delivery,
in boolean hasRead,
in boolean read,
in unsigned long long threadId,
in boolean reverse, in boolean reverse,
in nsIMobileMessageCursorCallback callback); in nsIMobileMessageCursorCallback callback);

View File

@ -26,7 +26,6 @@
#include "nsIObserverService.h" #include "nsIObserverService.h"
#include "nsISmsService.h" #include "nsISmsService.h"
#include "nsServiceManagerUtils.h" // For do_GetService() #include "nsServiceManagerUtils.h" // For do_GetService()
#include "SmsFilter.h"
#define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received") #define RECEIVED_EVENT_NAME NS_LITERAL_STRING("received")
#define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving") #define RETRIEVING_EVENT_NAME NS_LITERAL_STRING("retrieving")
@ -367,7 +366,7 @@ MobileMessageManager::Delete(const Sequence<OwningLongOrMozSmsMessageOrMozMmsMes
} }
already_AddRefed<DOMCursor> already_AddRefed<DOMCursor>
MobileMessageManager::GetMessages(nsIDOMMozSmsFilter* aFilter, MobileMessageManager::GetMessages(const MobileMessageFilter& aFilter,
bool aReverse, bool aReverse,
ErrorResult& aRv) ErrorResult& aRv)
{ {
@ -378,16 +377,62 @@ MobileMessageManager::GetMessages(nsIDOMMozSmsFilter* aFilter,
return nullptr; return nullptr;
} }
nsCOMPtr<nsIDOMMozSmsFilter> filter = aFilter; bool hasStartDate = !aFilter.mStartDate.IsNull();
if (!filter) { uint64_t startDate = 0;
filter = new SmsFilter(); if (hasStartDate) {
startDate = aFilter.mStartDate.Value();
}
bool hasEndDate = !aFilter.mEndDate.IsNull();
uint64_t endDate = 0;
if (hasEndDate) {
endDate = aFilter.mEndDate.Value();
}
nsAutoArrayPtr<const char16_t*> ptrNumbers;
uint32_t numbersCount = 0;
if (!aFilter.mNumbers.IsNull() &&
aFilter.mNumbers.Value().Length()) {
const FallibleTArray<nsString>& numbers = aFilter.mNumbers.Value();
uint32_t index;
numbersCount = numbers.Length();
ptrNumbers = new const char16_t* [numbersCount];
for (index = 0; index < numbersCount; index++) {
ptrNumbers[index] = numbers[index].get();
}
}
nsString delivery;
delivery.SetIsVoid(true);
if (!aFilter.mDelivery.IsNull()) {
const uint32_t index = static_cast<uint32_t>(aFilter.mDelivery.Value());
const EnumEntry& entry =
MobileMessageFilterDeliveryValues::strings[index];
delivery.AssignASCII(entry.value, entry.length);
}
bool hasRead = !aFilter.mRead.IsNull();
bool read = false;
if (hasRead) {
read = aFilter.mRead.Value();
}
uint64_t threadId = 0;
if (!aFilter.mThreadId.IsNull()) {
threadId = aFilter.mThreadId.Value();
} }
nsRefPtr<MobileMessageCursorCallback> cursorCallback = nsRefPtr<MobileMessageCursorCallback> cursorCallback =
new MobileMessageCursorCallback(); new MobileMessageCursorCallback();
nsCOMPtr<nsICursorContinueCallback> continueCallback; nsCOMPtr<nsICursorContinueCallback> continueCallback;
nsresult rv = dbService->CreateMessageCursor(filter, aReverse, cursorCallback, nsresult rv = dbService->CreateMessageCursor(hasStartDate, startDate,
hasEndDate, endDate,
ptrNumbers, numbersCount,
delivery,
hasRead, read,
threadId,
aReverse, cursorCallback,
getter_AddRefs(continueCallback)); getter_AddRefs(continueCallback));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
aRv.Throw(rv); aRv.Throw(rv);

View File

@ -14,7 +14,6 @@
class nsISmsService; class nsISmsService;
class nsIDOMMozSmsMessage; class nsIDOMMozSmsMessage;
class nsIDOMMozMmsMessage; class nsIDOMMozMmsMessage;
class nsIDOMMozSmsFilter;
namespace mozilla { namespace mozilla {
namespace dom { namespace dom {
@ -23,6 +22,7 @@ class DOMRequest;
class DOMCursor; class DOMCursor;
struct MmsParameters; struct MmsParameters;
struct MmsSendParameters; struct MmsSendParameters;
struct MobileMessageFilter;
struct SmsSendParameters; struct SmsSendParameters;
class MobileMessageManager MOZ_FINAL : public DOMEventTargetHelper class MobileMessageManager MOZ_FINAL : public DOMEventTargetHelper
@ -90,7 +90,7 @@ public:
ErrorResult& aRv); ErrorResult& aRv);
already_AddRefed<DOMCursor> already_AddRefed<DOMCursor>
GetMessages(nsIDOMMozSmsFilter* aFilter, GetMessages(const MobileMessageFilter& aFilter,
bool aReverse, bool aReverse,
ErrorResult& aRv); ErrorResult& aRv);

View File

@ -1,292 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "SmsFilter.h"
#include "jsapi.h"
#include "jsfriendapi.h" // For js_DateGetMsecSinceEpoch.
#include "js/Utility.h"
#include "mozilla/dom/mobilemessage/Constants.h" // For MessageType
#include "mozilla/dom/ToJSValue.h"
#include "nsDOMString.h"
#include "nsError.h"
#include "nsIDOMClassInfo.h"
#include "nsJSUtils.h"
using namespace mozilla::dom::mobilemessage;
DOMCI_DATA(MozSmsFilter, mozilla::dom::SmsFilter)
namespace mozilla {
namespace dom {
NS_INTERFACE_MAP_BEGIN(SmsFilter)
NS_INTERFACE_MAP_ENTRY(nsIDOMMozSmsFilter)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(MozSmsFilter)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(SmsFilter)
NS_IMPL_RELEASE(SmsFilter)
SmsFilter::SmsFilter()
{
mData.startDate() = 0;
mData.endDate() = 0;
mData.delivery() = eDeliveryState_Unknown;
mData.read() = eReadState_Unknown;
mData.threadId() = 0;
}
SmsFilter::SmsFilter(const SmsFilterData& aData)
: mData(aData)
{
}
/* static */ nsresult
SmsFilter::NewSmsFilter(nsISupports** aSmsFilter)
{
NS_ADDREF(*aSmsFilter = new SmsFilter());
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::GetStartDate(JSContext* aCx, JS::MutableHandle<JS::Value> aStartDate)
{
if (mData.startDate() == 0) {
aStartDate.setNull();
return NS_OK;
}
aStartDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.startDate()));
NS_ENSURE_TRUE(aStartDate.isObject(), NS_ERROR_FAILURE);
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetStartDate(JSContext* aCx, JS::Handle<JS::Value> aStartDate)
{
if (aStartDate.isNull()) {
mData.startDate() = 0;
return NS_OK;
}
if (!aStartDate.isObject()) {
return NS_ERROR_INVALID_ARG;
}
JS::Rooted<JSObject*> obj(aCx, &aStartDate.toObject());
if (!JS_ObjectIsDate(aCx, obj)) {
return NS_ERROR_INVALID_ARG;
}
mData.startDate() = js_DateGetMsecSinceEpoch(obj);
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::GetEndDate(JSContext* aCx, JS::MutableHandle<JS::Value> aEndDate)
{
if (mData.endDate() == 0) {
aEndDate.setNull();
return NS_OK;
}
aEndDate.setObjectOrNull(JS_NewDateObjectMsec(aCx, mData.endDate()));
NS_ENSURE_TRUE(aEndDate.isObject(), NS_ERROR_FAILURE);
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetEndDate(JSContext* aCx, JS::Handle<JS::Value> aEndDate)
{
if (aEndDate.isNull()) {
mData.endDate() = 0;
return NS_OK;
}
if (!aEndDate.isObject()) {
return NS_ERROR_INVALID_ARG;
}
JS::Rooted<JSObject*> obj(aCx, &aEndDate.toObject());
if (!JS_ObjectIsDate(aCx, obj)) {
return NS_ERROR_INVALID_ARG;
}
mData.endDate() = js_DateGetMsecSinceEpoch(obj);
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::GetNumbers(JSContext* aCx, JS::MutableHandle<JS::Value> aNumbers)
{
uint32_t length = mData.numbers().Length();
if (length == 0) {
aNumbers.setNull();
return NS_OK;
}
if (!ToJSValue(aCx, mData.numbers(), aNumbers)) {
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetNumbers(JSContext* aCx, JS::Handle<JS::Value> aNumbers)
{
if (aNumbers.isNull()) {
mData.numbers().Clear();
return NS_OK;
}
if (!aNumbers.isObject()) {
return NS_ERROR_INVALID_ARG;
}
JS::Rooted<JSObject*> obj(aCx, &aNumbers.toObject());
if (!JS_IsArrayObject(aCx, obj)) {
return NS_ERROR_INVALID_ARG;
}
uint32_t size;
MOZ_ALWAYS_TRUE(JS_GetArrayLength(aCx, obj, &size));
nsTArray<nsString> numbers;
for (uint32_t i=0; i<size; ++i) {
JS::Rooted<JS::Value> jsNumber(aCx);
if (!JS_GetElement(aCx, obj, i, &jsNumber)) {
return NS_ERROR_INVALID_ARG;
}
if (!jsNumber.isString()) {
return NS_ERROR_INVALID_ARG;
}
nsAutoJSString number;
if (!number.init(aCx, jsNumber.toString())) {
return NS_ERROR_FAILURE;
}
numbers.AppendElement(number);
}
mData.numbers().Clear();
mData.numbers().AppendElements(numbers);
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::GetDelivery(nsAString& aDelivery)
{
switch (mData.delivery()) {
case eDeliveryState_Received:
aDelivery = DELIVERY_RECEIVED;
break;
case eDeliveryState_Sent:
aDelivery = DELIVERY_SENT;
break;
case eDeliveryState_Unknown:
SetDOMStringToNull(aDelivery);
break;
default:
NS_ASSERTION(false, "We shouldn't get another delivery state!");
return NS_ERROR_UNEXPECTED;
}
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetDelivery(const nsAString& aDelivery)
{
if (aDelivery.IsEmpty()) {
mData.delivery() = eDeliveryState_Unknown;
return NS_OK;
}
if (aDelivery.Equals(DELIVERY_RECEIVED)) {
mData.delivery() = eDeliveryState_Received;
return NS_OK;
}
if (aDelivery.Equals(DELIVERY_SENT)) {
mData.delivery() = eDeliveryState_Sent;
return NS_OK;
}
return NS_ERROR_INVALID_ARG;
}
NS_IMETHODIMP
SmsFilter::GetRead(JSContext* aCx, JS::MutableHandle<JS::Value> aRead)
{
if (mData.read() == eReadState_Unknown) {
aRead.setNull();
return NS_OK;
}
aRead.setBoolean(mData.read());
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetRead(JSContext* aCx, JS::Handle<JS::Value> aRead)
{
if (aRead.isNull()) {
mData.read() = eReadState_Unknown;
return NS_OK;
}
if (!aRead.isBoolean()) {
return NS_ERROR_INVALID_ARG;
}
mData.read() = aRead.toBoolean() ? eReadState_Read : eReadState_Unread;
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::GetThreadId(JSContext* aCx, JS::MutableHandle<JS::Value> aThreadId)
{
if (!mData.threadId()) {
aThreadId.setNull();
return NS_OK;
}
aThreadId.setNumber(static_cast<double>(mData.threadId()));
return NS_OK;
}
NS_IMETHODIMP
SmsFilter::SetThreadId(JSContext* aCx, JS::Handle<JS::Value> aThreadId)
{
if (aThreadId.isNull()) {
mData.threadId() = 0;
return NS_OK;
}
if (!aThreadId.isNumber()) {
return NS_ERROR_INVALID_ARG;
}
double number = aThreadId.toNumber();
uint64_t integer = static_cast<uint64_t>(number);
if (integer == 0 || integer != number) {
return NS_ERROR_INVALID_ARG;
}
mData.threadId() = integer;
return NS_OK;
}
} // namespace dom
} // namespace mozilla

View File

@ -1,43 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_mobilemessage_SmsFilter_h
#define mozilla_dom_mobilemessage_SmsFilter_h
#include "mozilla/dom/mobilemessage/SmsTypes.h"
#include "nsIDOMSmsFilter.h"
#include "mozilla/Attributes.h"
namespace mozilla {
namespace dom {
class SmsFilter MOZ_FINAL : public nsIDOMMozSmsFilter
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMMOZSMSFILTER
SmsFilter();
SmsFilter(const mobilemessage::SmsFilterData& aData);
const mobilemessage::SmsFilterData& GetData() const;
static nsresult NewSmsFilter(nsISupports** aSmsFilter);
private:
~SmsFilter() {}
mobilemessage::SmsFilterData mData;
};
inline const mobilemessage::SmsFilterData&
SmsFilter::GetData() const {
return mData;
}
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_mobilemessage_SmsFilter_h

View File

@ -48,16 +48,7 @@ enum ReadStatus {
eReadStatus_EndGuard eReadStatus_EndGuard
}; };
// For {Mms,Sms}FilterData.read. // For {Mms,Sms}MessageData.messageClass.
enum ReadState {
eReadState_Unknown = -1,
eReadState_Unread,
eReadState_Read,
// This state should stay at the end.
eReadState_EndGuard
};
// For {Mms,Sms}FilterData.messageClass.
enum MessageClass { enum MessageClass {
eMessageClass_Normal = 0, eMessageClass_Normal = 0,
eMessageClass_Class0, eMessageClass_Class0,
@ -115,17 +106,6 @@ struct ParamTraits<mozilla::dom::mobilemessage::ReadStatus>
mozilla::dom::mobilemessage::eReadStatus_EndGuard> mozilla::dom::mobilemessage::eReadStatus_EndGuard>
{}; {};
/**
* Read state serializer.
*/
template <>
struct ParamTraits<mozilla::dom::mobilemessage::ReadState>
: public ContiguousEnumSerializer<
mozilla::dom::mobilemessage::ReadState,
mozilla::dom::mobilemessage::eReadState_Unknown,
mozilla::dom::mobilemessage::eReadState_EndGuard>
{};
/** /**
* Message class serializer. * Message class serializer.
*/ */

View File

@ -3,7 +3,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file, * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */ * You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "SmsFilter.h"
#include "MobileMessageDatabaseService.h" #include "MobileMessageDatabaseService.h"
#include "AndroidBridge.h" #include "AndroidBridge.h"
@ -47,7 +46,16 @@ MobileMessageDatabaseService::DeleteMessage(int32_t *aMessageIds,
} }
NS_IMETHODIMP NS_IMETHODIMP
MobileMessageDatabaseService::CreateMessageCursor(nsIDOMMozSmsFilter* aFilter, MobileMessageDatabaseService::CreateMessageCursor(bool aHasStartDate,
uint64_t aStartDate,
bool aHasEndDate,
uint64_t aEndDate,
const char16_t** aNumbers,
uint32_t aNumbersCount,
const nsAString& aDelivery,
bool aHasRead,
bool aRead,
uint64_t aThreadId,
bool aReverse, bool aReverse,
nsIMobileMessageCursorCallback* aCallback, nsIMobileMessageCursorCallback* aCallback,
nsICursorContinueCallback** aResult) nsICursorContinueCallback** aResult)

View File

@ -3105,25 +3105,47 @@ MobileMessageDB.prototype = {
}, [MESSAGE_STORE_NAME, THREAD_STORE_NAME]); }, [MESSAGE_STORE_NAME, THREAD_STORE_NAME]);
}, },
createMessageCursor: function(filter, reverse, callback) { createMessageCursor: function(aHasStartDate, aStartDate, aHasEndDate,
aEndDate, aNumbers, aNumbersCount, aDelivery,
aHasRead, aRead, aThreadId, aReverse, aCallback) {
if (DEBUG) { if (DEBUG) {
debug("Creating a message cursor. Filters:" + debug("Creating a message cursor. Filters:" +
" startDate: " + filter.startDate + " startDate: " + (aHasStartDate ? aStartDate : "(null)") +
" endDate: " + filter.endDate + " endDate: " + (aHasEndDate ? aEndDate : "(null)") +
" delivery: " + filter.delivery + " delivery: " + aDelivery +
" numbers: " + filter.numbers + " numbers: " + (aNumbersCount ? aNumbers : "(null)") +
" read: " + filter.read + " read: " + (aHasRead ? aRead : "(null)") +
" threadId: " + filter.threadId + " threadId: " + aThreadId +
" reverse: " + reverse); " reverse: " + aReverse);
} }
let cursor = new GetMessagesCursor(this, callback); let filter = {};
if (aHasStartDate) {
filter.startDate = aStartDate;
}
if (aHasEndDate) {
filter.endDate = aEndDate;
}
if (aNumbersCount) {
filter.numbers = aNumbers.slice();
}
if (aDelivery !== null) {
filter.delivery = aDelivery;
}
if (aHasRead) {
filter.read = aRead;
}
if (aThreadId) {
filter.threadId = aThreadId;
}
let cursor = new GetMessagesCursor(this, aCallback);
let self = this; let self = this;
self.newTxn(READ_ONLY, function(error, txn, stores) { self.newTxn(READ_ONLY, function(error, txn, stores) {
let collector = cursor.collector; let collector = cursor.collector;
let collect = collector.collect.bind(collector); let collect = collector.collect.bind(collector);
FilterSearcherHelper.transact(self, txn, error, filter, reverse, collect); FilterSearcherHelper.transact(self, txn, error, filter, aReverse, collect);
}, [MESSAGE_STORE_NAME, PARTICIPANT_STORE_NAME]); }, [MESSAGE_STORE_NAME, PARTICIPANT_STORE_NAME]);
return cursor; return cursor;
@ -3311,11 +3333,11 @@ let FilterSearcherHelper = {
filterTimestamp: function(startDate, endDate, direction, txn, collect) { filterTimestamp: function(startDate, endDate, direction, txn, collect) {
let range = null; let range = null;
if (startDate != null && endDate != null) { if (startDate != null && endDate != null) {
range = IDBKeyRange.bound(startDate.getTime(), endDate.getTime()); range = IDBKeyRange.bound(startDate, endDate);
} else if (startDate != null) { } else if (startDate != null) {
range = IDBKeyRange.lowerBound(startDate.getTime()); range = IDBKeyRange.lowerBound(startDate);
} else if (endDate != null) { } else if (endDate != null) {
range = IDBKeyRange.upperBound(endDate.getTime()); range = IDBKeyRange.upperBound(endDate);
} }
this.filterIndex("timestamp", range, direction, txn, collect); this.filterIndex("timestamp", range, direction, txn, collect);
}, },
@ -3330,7 +3352,7 @@ let FilterSearcherHelper = {
* @param error * @param error
* Previous error while creating the transaction. * Previous error while creating the transaction.
* @param filter * @param filter
* A SmsFilter object. * A MobileMessageFilter dictionary.
* @param reverse * @param reverse
* A boolean value indicating whether we should filter message in * A boolean value indicating whether we should filter message in
* reversed order. * reversed order.
@ -3368,10 +3390,10 @@ let FilterSearcherHelper = {
// than all numeric values. // than all numeric values.
let startDate = 0, endDate = ""; let startDate = 0, endDate = "";
if (filter.startDate != null) { if (filter.startDate != null) {
startDate = filter.startDate.getTime(); startDate = filter.startDate;
} }
if (filter.endDate != null) { if (filter.endDate != null) {
endDate = filter.endDate.getTime(); endDate = filter.endDate;
} }
let single, intersectionCollector; let single, intersectionCollector;

View File

@ -108,8 +108,13 @@ MobileMessageDatabaseService.prototype = {
this.mmdb.deleteMessage(aMessageIds, aLength, aRequest); this.mmdb.deleteMessage(aMessageIds, aLength, aRequest);
}, },
createMessageCursor: function(aFilter, aReverse, aCallback) { createMessageCursor: function(aHasStartDate, aStartDate, aHasEndDate,
return this.mmdb.createMessageCursor(aFilter, aReverse, aCallback); aEndDate, aNumbers, aNumbersCount, aDelivery,
aHasRead, aRead, aThreadId, aReverse, aCallback) {
return this.mmdb.createMessageCursor(aHasStartDate, aStartDate, aHasEndDate,
aEndDate, aNumbers, aNumbersCount,
aDelivery, aHasRead, aRead, aThreadId,
aReverse, aCallback);
}, },
markMessageRead: function(aMessageId, aValue, aSendReadReport, aRequest) { markMessageRead: function(aMessageId, aValue, aSendReadReport, aRequest) {

View File

@ -8,7 +8,6 @@
#include "nsXULAppAPI.h" #include "nsXULAppAPI.h"
#include "mozilla/dom/mobilemessage/SmsChild.h" #include "mozilla/dom/mobilemessage/SmsChild.h"
#include "SmsMessage.h" #include "SmsMessage.h"
#include "SmsFilter.h"
#include "nsJSUtils.h" #include "nsJSUtils.h"
#include "mozilla/dom/MozMobileMessageManagerBinding.h" #include "mozilla/dom/MozMobileMessageManagerBinding.h"
#include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/BindingUtils.h"
@ -220,13 +219,40 @@ SmsIPCService::DeleteMessage(int32_t *aMessageIds, uint32_t aSize,
} }
NS_IMETHODIMP NS_IMETHODIMP
SmsIPCService::CreateMessageCursor(nsIDOMMozSmsFilter* aFilter, SmsIPCService::CreateMessageCursor(bool aHasStartDate,
uint64_t aStartDate,
bool aHasEndDate,
uint64_t aEndDate,
const char16_t** aNumbers,
uint32_t aNumbersCount,
const nsAString& aDelivery,
bool aHasRead,
bool aRead,
uint64_t aThreadId,
bool aReverse, bool aReverse,
nsIMobileMessageCursorCallback* aCursorCallback, nsIMobileMessageCursorCallback* aCursorCallback,
nsICursorContinueCallback** aResult) nsICursorContinueCallback** aResult)
{ {
const SmsFilterData& data = SmsFilterData data;
SmsFilterData(static_cast<SmsFilter*>(aFilter)->GetData());
data.hasStartDate() = aHasStartDate;
data.startDate() = aStartDate;
data.hasEndDate() = aHasEndDate;
data.startDate() = aEndDate;
if (aNumbersCount && aNumbers) {
nsTArray<nsString>& numbers = data.numbers();
uint32_t index;
for (index = 0; index < aNumbersCount; index++) {
numbers.AppendElement(aNumbers[index]);
}
}
data.delivery() = aDelivery;
data.hasRead() = aHasRead;
data.read() = aRead;
data.threadId() = aThreadId;
return SendCursorRequest(CreateMessageCursorRequest(data, aReverse), return SendCursorRequest(CreateMessageCursorRequest(data, aReverse),
aCursorCallback, aResult); aCursorCallback, aResult);

View File

@ -14,7 +14,6 @@
#include "SmsMessage.h" #include "SmsMessage.h"
#include "MmsMessage.h" #include "MmsMessage.h"
#include "nsIMobileMessageDatabaseService.h" #include "nsIMobileMessageDatabaseService.h"
#include "SmsFilter.h"
#include "MobileMessageThread.h" #include "MobileMessageThread.h"
#include "nsIDOMFile.h" #include "nsIDOMFile.h"
#include "mozilla/dom/ipc/Blob.h" #include "mozilla/dom/ipc/Blob.h"
@ -774,10 +773,31 @@ MobileMessageCursorParent::DoRequest(const CreateMessageCursorRequest& aRequest)
nsCOMPtr<nsIMobileMessageDatabaseService> dbService = nsCOMPtr<nsIMobileMessageDatabaseService> dbService =
do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID); do_GetService(MOBILE_MESSAGE_DATABASE_SERVICE_CONTRACTID);
if (dbService) { if (dbService) {
nsCOMPtr<nsIDOMMozSmsFilter> filter = new SmsFilter(aRequest.filter()); const SmsFilterData& filter = aRequest.filter();
bool reverse = aRequest.reverse();
rv = dbService->CreateMessageCursor(filter, reverse, this, const nsTArray<nsString>& numbers = filter.numbers();
nsAutoArrayPtr<const char16_t*> ptrNumbers;
uint32_t numbersCount = numbers.Length();
if (numbersCount) {
uint32_t index;
ptrNumbers = new const char16_t* [numbersCount];
for (index = 0; index < numbersCount; index++) {
ptrNumbers[index] = numbers[index].get();
}
}
rv = dbService->CreateMessageCursor(filter.hasStartDate(),
filter.startDate(),
filter.hasEndDate(),
filter.endDate(),
ptrNumbers, numbersCount,
filter.delivery(),
filter.hasRead(),
filter.read(),
filter.threadId(),
aRequest.reverse(),
this,
getter_AddRefs(mContinueCallback)); getter_AddRefs(mContinueCallback));
} }

View File

@ -77,11 +77,14 @@ union MobileMessageData
struct SmsFilterData struct SmsFilterData
{ {
bool hasStartDate;
uint64_t startDate; uint64_t startDate;
bool hasEndDate;
uint64_t endDate; uint64_t endDate;
nsString[] numbers; nsString[] numbers;
DeliveryState delivery; nsString delivery;
ReadState read; bool hasRead;
bool read;
uint64_t threadId; uint64_t threadId;
}; };

View File

@ -40,7 +40,6 @@ EXPORTS.mozilla.dom += [
'DOMMobileMessageError.h', 'DOMMobileMessageError.h',
'MmsMessage.h', 'MmsMessage.h',
'MobileMessageManager.h', 'MobileMessageManager.h',
'SmsFilter.h',
'SmsMessage.h', 'SmsMessage.h',
] ]
@ -57,7 +56,6 @@ UNIFIED_SOURCES += [
'MobileMessageManager.cpp', 'MobileMessageManager.cpp',
'MobileMessageService.cpp', 'MobileMessageService.cpp',
'MobileMessageThread.cpp', 'MobileMessageThread.cpp',
'SmsFilter.cpp',
'SmsMessage.cpp', 'SmsMessage.cpp',
'SmsServicesFactory.cpp', 'SmsServicesFactory.cpp',
] ]

View File

@ -5,7 +5,6 @@
*/ */
interface MozMmsMessage; interface MozMmsMessage;
interface MozSmsFilter;
interface MozSmsMessage; interface MozSmsMessage;
dictionary SmsSegmentInfo { dictionary SmsSegmentInfo {
@ -51,6 +50,31 @@ dictionary MmsSendParameters {
// specified under the multi-sim scenario. // specified under the multi-sim scenario.
}; };
enum MobileMessageFilterDelivery { "sent", "received" };
dictionary MobileMessageFilter
{
// Close lower bound range for filtering by the message timestamp.
// Time in milliseconds since Epoch.
[EnforceRange] DOMTimeStamp? startDate = null;
// Close upper bound range for filtering by the message timestamp.
// Time in milliseconds since Epoch.
[EnforceRange] DOMTimeStamp? endDate = null;
// An array of string message participant addresses that any of which
// appears or matches a message's sendor or recipients addresses.
sequence<DOMString>? numbers = null;
MobileMessageFilterDelivery? delivery = null;
// Filtering by whether a message has been read or not.
boolean? read = null;
// Filtering by a message's threadId attribute.
[EnforceRange] unsigned long long? threadId = 0;
};
[Pref="dom.sms.enabled"] [Pref="dom.sms.enabled"]
interface MozMobileMessageManager : EventTarget interface MozMobileMessageManager : EventTarget
{ {
@ -111,7 +135,7 @@ interface MozMobileMessageManager : EventTarget
// Iterates through Moz{Mms,Sms}Message. // Iterates through Moz{Mms,Sms}Message.
[Throws] [Throws]
DOMCursor getMessages(optional MozSmsFilter? filter = null, DOMCursor getMessages(optional MobileMessageFilter filter,
optional boolean reverse = false); optional boolean reverse = false);
[Throws] [Throws]