summaryrefslogtreecommitdiffstats
path: root/editor/txmgr/nsTransactionList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/txmgr/nsTransactionList.cpp')
-rw-r--r--editor/txmgr/nsTransactionList.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/editor/txmgr/nsTransactionList.cpp b/editor/txmgr/nsTransactionList.cpp
new file mode 100644
index 000000000..756edfd49
--- /dev/null
+++ b/editor/txmgr/nsTransactionList.cpp
@@ -0,0 +1,174 @@
+/* -*- 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 "mozilla/mozalloc.h"
+#include "nsCOMPtr.h"
+#include "nsDebug.h"
+#include "nsError.h"
+#include "nsID.h"
+#include "nsISupportsUtils.h"
+#include "nsITransactionManager.h"
+#include "nsTransactionItem.h"
+#include "nsTransactionList.h"
+#include "nsTransactionStack.h"
+#include "nscore.h"
+
+NS_IMPL_ISUPPORTS(nsTransactionList, nsITransactionList)
+
+nsTransactionList::nsTransactionList(nsITransactionManager *aTxnMgr, nsTransactionStack *aTxnStack)
+ : mTxnStack(aTxnStack)
+ , mTxnItem(nullptr)
+{
+ if (aTxnMgr)
+ mTxnMgr = do_GetWeakReference(aTxnMgr);
+}
+
+nsTransactionList::nsTransactionList(nsITransactionManager *aTxnMgr, nsTransactionItem *aTxnItem)
+ : mTxnStack(0)
+ , mTxnItem(aTxnItem)
+{
+ if (aTxnMgr)
+ mTxnMgr = do_GetWeakReference(aTxnMgr);
+}
+
+nsTransactionList::~nsTransactionList()
+{
+ mTxnStack = 0;
+ mTxnItem = nullptr;
+}
+
+NS_IMETHODIMP nsTransactionList::GetNumItems(int32_t *aNumItems)
+{
+ NS_ENSURE_TRUE(aNumItems, NS_ERROR_NULL_POINTER);
+
+ *aNumItems = 0;
+
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ if (mTxnStack) {
+ *aNumItems = mTxnStack->GetSize();
+ } else if (mTxnItem) {
+ return mTxnItem->GetNumberOfChildren(aNumItems);
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsTransactionList::ItemIsBatch(int32_t aIndex, bool *aIsBatch)
+{
+ NS_ENSURE_TRUE(aIsBatch, NS_ERROR_NULL_POINTER);
+
+ *aIsBatch = false;
+
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ RefPtr<nsTransactionItem> item;
+ if (mTxnStack) {
+ item = mTxnStack->GetItem(aIndex);
+ } else if (mTxnItem) {
+ nsresult rv = mTxnItem->GetChild(aIndex, getter_AddRefs(item));
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
+
+ return item->GetIsBatch(aIsBatch);
+}
+
+NS_IMETHODIMP nsTransactionList::GetData(int32_t aIndex,
+ uint32_t *aLength,
+ nsISupports ***aData)
+{
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ RefPtr<nsTransactionItem> item;
+ if (mTxnStack) {
+ item = mTxnStack->GetItem(aIndex);
+ } else if (mTxnItem) {
+ nsresult rv = mTxnItem->GetChild(aIndex, getter_AddRefs(item));
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+
+ nsCOMArray<nsISupports>& data = item->GetData();
+ nsISupports** ret = static_cast<nsISupports**>(moz_xmalloc(data.Count() *
+ sizeof(nsISupports*)));
+
+ for (int32_t i = 0; i < data.Count(); i++) {
+ NS_ADDREF(ret[i] = data[i]);
+ }
+ *aLength = data.Count();
+ *aData = ret;
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsTransactionList::GetItem(int32_t aIndex, nsITransaction **aItem)
+{
+ NS_ENSURE_TRUE(aItem, NS_ERROR_NULL_POINTER);
+
+ *aItem = 0;
+
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ RefPtr<nsTransactionItem> item;
+ if (mTxnStack) {
+ item = mTxnStack->GetItem(aIndex);
+ } else if (mTxnItem) {
+ nsresult rv = mTxnItem->GetChild(aIndex, getter_AddRefs(item));
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
+
+ *aItem = item->GetTransaction().take();
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsTransactionList::GetNumChildrenForItem(int32_t aIndex, int32_t *aNumChildren)
+{
+ NS_ENSURE_TRUE(aNumChildren, NS_ERROR_NULL_POINTER);
+
+ *aNumChildren = 0;
+
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ RefPtr<nsTransactionItem> item;
+ if (mTxnStack) {
+ item = mTxnStack->GetItem(aIndex);
+ } else if (mTxnItem) {
+ nsresult rv = mTxnItem->GetChild(aIndex, getter_AddRefs(item));
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
+
+ return item->GetNumberOfChildren(aNumChildren);
+}
+
+NS_IMETHODIMP nsTransactionList::GetChildListForItem(int32_t aIndex, nsITransactionList **aTxnList)
+{
+ NS_ENSURE_TRUE(aTxnList, NS_ERROR_NULL_POINTER);
+
+ *aTxnList = 0;
+
+ nsCOMPtr<nsITransactionManager> txMgr = do_QueryReferent(mTxnMgr);
+ NS_ENSURE_TRUE(txMgr, NS_ERROR_FAILURE);
+
+ RefPtr<nsTransactionItem> item;
+ if (mTxnStack) {
+ item = mTxnStack->GetItem(aIndex);
+ } else if (mTxnItem) {
+ nsresult rv = mTxnItem->GetChild(aIndex, getter_AddRefs(item));
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+ NS_ENSURE_TRUE(item, NS_ERROR_FAILURE);
+
+ *aTxnList = (nsITransactionList *)new nsTransactionList(txMgr, item);
+ NS_ENSURE_TRUE(*aTxnList, NS_ERROR_OUT_OF_MEMORY);
+
+ NS_ADDREF(*aTxnList);
+ return NS_OK;
+}