summaryrefslogtreecommitdiff
path: root/netwerk/protocol/http/nsHttpActivityDistributor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/protocol/http/nsHttpActivityDistributor.cpp')
-rw-r--r--netwerk/protocol/http/nsHttpActivityDistributor.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/netwerk/protocol/http/nsHttpActivityDistributor.cpp b/netwerk/protocol/http/nsHttpActivityDistributor.cpp
new file mode 100644
index 0000000000..4b332a53d8
--- /dev/null
+++ b/netwerk/protocol/http/nsHttpActivityDistributor.cpp
@@ -0,0 +1,135 @@
+/* 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/. */
+
+// HttpLog.h should generally be included first
+#include "HttpLog.h"
+
+#include "nsHttpActivityDistributor.h"
+#include "nsCOMPtr.h"
+#include "nsAutoPtr.h"
+#include "nsThreadUtils.h"
+
+namespace mozilla {
+namespace net {
+
+typedef nsMainThreadPtrHolder<nsIHttpActivityObserver> ObserverHolder;
+typedef nsMainThreadPtrHandle<nsIHttpActivityObserver> ObserverHandle;
+typedef nsTArray<ObserverHandle> ObserverArray;
+
+class nsHttpActivityEvent : public Runnable
+{
+public:
+ nsHttpActivityEvent(nsISupports *aHttpChannel,
+ uint32_t aActivityType,
+ uint32_t aActivitySubtype,
+ PRTime aTimestamp,
+ uint64_t aExtraSizeData,
+ const nsACString & aExtraStringData,
+ ObserverArray *aObservers)
+ : mHttpChannel(aHttpChannel)
+ , mActivityType(aActivityType)
+ , mActivitySubtype(aActivitySubtype)
+ , mTimestamp(aTimestamp)
+ , mExtraSizeData(aExtraSizeData)
+ , mExtraStringData(aExtraStringData)
+ , mObservers(*aObservers)
+ {
+ }
+
+ NS_IMETHOD Run() override
+ {
+ for (size_t i = 0 ; i < mObservers.Length() ; i++)
+ mObservers[i]->ObserveActivity(mHttpChannel, mActivityType,
+ mActivitySubtype, mTimestamp,
+ mExtraSizeData, mExtraStringData);
+ return NS_OK;
+ }
+
+private:
+ virtual ~nsHttpActivityEvent()
+ {
+ }
+
+ nsCOMPtr<nsISupports> mHttpChannel;
+ uint32_t mActivityType;
+ uint32_t mActivitySubtype;
+ PRTime mTimestamp;
+ uint64_t mExtraSizeData;
+ nsCString mExtraStringData;
+
+ ObserverArray mObservers;
+};
+
+NS_IMPL_ISUPPORTS(nsHttpActivityDistributor,
+ nsIHttpActivityDistributor,
+ nsIHttpActivityObserver)
+
+nsHttpActivityDistributor::nsHttpActivityDistributor()
+ : mLock("nsHttpActivityDistributor.mLock")
+{
+}
+
+nsHttpActivityDistributor::~nsHttpActivityDistributor()
+{
+}
+
+NS_IMETHODIMP
+nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel,
+ uint32_t aActivityType,
+ uint32_t aActivitySubtype,
+ PRTime aTimestamp,
+ uint64_t aExtraSizeData,
+ const nsACString & aExtraStringData)
+{
+ nsCOMPtr<nsIRunnable> event;
+ {
+ MutexAutoLock lock(mLock);
+
+ if (!mObservers.Length())
+ return NS_OK;
+
+ event = new nsHttpActivityEvent(aHttpChannel, aActivityType,
+ aActivitySubtype, aTimestamp,
+ aExtraSizeData, aExtraStringData,
+ &mObservers);
+ }
+ NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
+ return NS_DispatchToMainThread(event);
+}
+
+NS_IMETHODIMP
+nsHttpActivityDistributor::GetIsActive(bool *isActive)
+{
+ NS_ENSURE_ARG_POINTER(isActive);
+ MutexAutoLock lock(mLock);
+ *isActive = !!mObservers.Length();
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver)
+{
+ MutexAutoLock lock(mLock);
+
+ ObserverHandle observer(new ObserverHolder(aObserver));
+ if (!mObservers.AppendElement(observer))
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver)
+{
+ MutexAutoLock lock(mLock);
+
+ ObserverHandle observer(new ObserverHolder(aObserver));
+ if (!mObservers.RemoveElement(observer))
+ return NS_ERROR_FAILURE;
+
+ return NS_OK;
+}
+
+} // namespace net
+} // namespace mozilla