michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // HttpLog.h should generally be included first michael@0: #include "HttpLog.h" michael@0: michael@0: #include "nsHttpActivityDistributor.h" michael@0: #include "nsCOMPtr.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "nsThreadUtils.h" michael@0: michael@0: namespace mozilla { michael@0: namespace net { michael@0: michael@0: typedef nsMainThreadPtrHolder ObserverHolder; michael@0: typedef nsMainThreadPtrHandle ObserverHandle; michael@0: typedef nsTArray ObserverArray; michael@0: michael@0: class nsHttpActivityEvent : public nsRunnable michael@0: { michael@0: public: michael@0: nsHttpActivityEvent(nsISupports *aHttpChannel, michael@0: uint32_t aActivityType, michael@0: uint32_t aActivitySubtype, michael@0: PRTime aTimestamp, michael@0: uint64_t aExtraSizeData, michael@0: const nsACString & aExtraStringData, michael@0: ObserverArray *aObservers) michael@0: : mHttpChannel(aHttpChannel) michael@0: , mActivityType(aActivityType) michael@0: , mActivitySubtype(aActivitySubtype) michael@0: , mTimestamp(aTimestamp) michael@0: , mExtraSizeData(aExtraSizeData) michael@0: , mExtraStringData(aExtraStringData) michael@0: , mObservers(*aObservers) michael@0: { michael@0: } michael@0: michael@0: NS_IMETHOD Run() michael@0: { michael@0: for (size_t i = 0 ; i < mObservers.Length() ; i++) michael@0: mObservers[i]->ObserveActivity(mHttpChannel, mActivityType, michael@0: mActivitySubtype, mTimestamp, michael@0: mExtraSizeData, mExtraStringData); michael@0: return NS_OK; michael@0: } michael@0: michael@0: private: michael@0: virtual ~nsHttpActivityEvent() michael@0: { michael@0: } michael@0: michael@0: nsCOMPtr mHttpChannel; michael@0: uint32_t mActivityType; michael@0: uint32_t mActivitySubtype; michael@0: PRTime mTimestamp; michael@0: uint64_t mExtraSizeData; michael@0: nsCString mExtraStringData; michael@0: michael@0: ObserverArray mObservers; michael@0: }; michael@0: michael@0: NS_IMPL_ISUPPORTS(nsHttpActivityDistributor, michael@0: nsIHttpActivityDistributor, michael@0: nsIHttpActivityObserver) michael@0: michael@0: nsHttpActivityDistributor::nsHttpActivityDistributor() michael@0: : mLock("nsHttpActivityDistributor.mLock") michael@0: { michael@0: } michael@0: michael@0: nsHttpActivityDistributor::~nsHttpActivityDistributor() michael@0: { michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel, michael@0: uint32_t aActivityType, michael@0: uint32_t aActivitySubtype, michael@0: PRTime aTimestamp, michael@0: uint64_t aExtraSizeData, michael@0: const nsACString & aExtraStringData) michael@0: { michael@0: nsRefPtr event; michael@0: { michael@0: MutexAutoLock lock(mLock); michael@0: michael@0: if (!mObservers.Length()) michael@0: return NS_OK; michael@0: michael@0: event = new nsHttpActivityEvent(aHttpChannel, aActivityType, michael@0: aActivitySubtype, aTimestamp, michael@0: aExtraSizeData, aExtraStringData, michael@0: &mObservers); michael@0: } michael@0: NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY); michael@0: return NS_DispatchToMainThread(event); michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsHttpActivityDistributor::GetIsActive(bool *isActive) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(isActive); michael@0: MutexAutoLock lock(mLock); michael@0: *isActive = !!mObservers.Length(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver) michael@0: { michael@0: MutexAutoLock lock(mLock); michael@0: michael@0: ObserverHandle observer(new ObserverHolder(aObserver)); michael@0: if (!mObservers.AppendElement(observer)) michael@0: return NS_ERROR_OUT_OF_MEMORY; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver) michael@0: { michael@0: MutexAutoLock lock(mLock); michael@0: michael@0: ObserverHandle observer(new ObserverHolder(aObserver)); michael@0: if (!mObservers.RemoveElement(observer)) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: return NS_OK; michael@0: } michael@0: } // namespace mozilla::net michael@0: } // namespace mozilla