diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/base/src/nsMsgEnumerator.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/comm/mailnews/base/src/nsMsgEnumerator.cpp b/comm/mailnews/base/src/nsMsgEnumerator.cpp new file mode 100644 index 0000000000..5763a8d4dc --- /dev/null +++ b/comm/mailnews/base/src/nsMsgEnumerator.cpp @@ -0,0 +1,138 @@ +/* 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 "nsMsgEnumerator.h" + +#include "mozilla/dom/IteratorResultBinding.h" +#include "mozilla/dom/RootedDictionary.h" +#include "mozilla/dom/ToJSValue.h" +#include "mozilla/ResultExtensions.h" +#include "nsContentUtils.h" + +#include "nsIMsgHdr.h" +#include "nsIMsgThread.h" + +using namespace mozilla; +using namespace mozilla::dom; + +/** + * Internal class to support iteration over nsBaseMsgEnumerator in javascript. + */ +class JSMsgIterator final : public nsIJSIterator { + NS_DECL_ISUPPORTS + NS_DECL_NSIJSITERATOR + + explicit JSMsgIterator(nsBaseMsgEnumerator* aEnumerator) + : mEnumerator(aEnumerator) {} + + private: + ~JSMsgIterator() = default; + RefPtr<nsBaseMsgEnumerator> mEnumerator; +}; + +NS_IMETHODIMP JSMsgIterator::Next(JSContext* aCx, + JS::MutableHandle<JS::Value> aResult) { + // result is object of the form: {value: ..., done: ...} + RootedDictionary<IteratorResult> result(aCx); + + // We're really using the enumerator itself as the iterator. + nsCOMPtr<nsIMsgDBHdr> msg; + if (NS_FAILED(mEnumerator->GetNext(getter_AddRefs(msg)))) { + result.mDone = true; + // Leave value unset. + } else { + result.mDone = false; + + JS::Rooted<JS::Value> value(aCx); + MOZ_TRY( + nsContentUtils::WrapNative(aCx, msg, &NS_GET_IID(nsIMsgDBHdr), &value)); + result.mValue = value; + } + + if (!ToJSValue(aCx, result, aResult)) { + return NS_ERROR_OUT_OF_MEMORY; + } + return NS_OK; +} + +NS_IMPL_ISUPPORTS(JSMsgIterator, nsIJSIterator) + +// nsBaseMsgEnumerator implementation. + +NS_IMETHODIMP nsBaseMsgEnumerator::Iterator(nsIJSIterator** aResult) { + auto result = MakeRefPtr<JSMsgIterator>(this); + result.forget(aResult); + return NS_OK; +} + +NS_IMETHODIMP nsBaseMsgEnumerator::GetNext(nsIMsgDBHdr** aItem) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP nsBaseMsgEnumerator::HasMoreElements(bool* aResult) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMPL_ISUPPORTS(nsBaseMsgEnumerator, nsIMsgEnumerator) + +/** + * Internal class to support iteration over nsBaseMsgThreadEnumerator in + * javascript. + */ +class JSThreadIterator final : public nsIJSIterator { + NS_DECL_ISUPPORTS + NS_DECL_NSIJSITERATOR + + explicit JSThreadIterator(nsBaseMsgThreadEnumerator* aEnumerator) + : mEnumerator(aEnumerator) {} + + private: + ~JSThreadIterator() = default; + RefPtr<nsBaseMsgThreadEnumerator> mEnumerator; +}; + +NS_IMETHODIMP JSThreadIterator::Next(JSContext* aCx, + JS::MutableHandle<JS::Value> aResult) { + // result is object of the form: {value: ..., done: ...} + RootedDictionary<IteratorResult> result(aCx); + + // We're really using the enumerator itself as the iterator. + nsCOMPtr<nsIMsgThread> msg; + if (NS_FAILED(mEnumerator->GetNext(getter_AddRefs(msg)))) { + result.mDone = true; + // Leave value unset. + } else { + result.mDone = false; + + JS::Rooted<JS::Value> value(aCx); + MOZ_TRY(nsContentUtils::WrapNative(aCx, msg, &NS_GET_IID(nsIMsgThread), + &value)); + result.mValue = value; + } + + if (!ToJSValue(aCx, result, aResult)) { + return NS_ERROR_OUT_OF_MEMORY; + } + return NS_OK; +} + +NS_IMPL_ISUPPORTS(JSThreadIterator, nsIJSIterator) + +// nsBaseMsgThreadEnumerator implementation. + +NS_IMETHODIMP nsBaseMsgThreadEnumerator::Iterator(nsIJSIterator** aResult) { + auto result = MakeRefPtr<JSThreadIterator>(this); + result.forget(aResult); + return NS_OK; +} + +NS_IMETHODIMP nsBaseMsgThreadEnumerator::GetNext(nsIMsgThread** aItem) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP nsBaseMsgThreadEnumerator::HasMoreElements(bool* aResult) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMPL_ISUPPORTS(nsBaseMsgThreadEnumerator, nsIMsgThreadEnumerator) |