1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/protocol/http/nsHttpActivityDistributor.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,134 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +// HttpLog.h should generally be included first 1.9 +#include "HttpLog.h" 1.10 + 1.11 +#include "nsHttpActivityDistributor.h" 1.12 +#include "nsCOMPtr.h" 1.13 +#include "nsAutoPtr.h" 1.14 +#include "nsThreadUtils.h" 1.15 + 1.16 +namespace mozilla { 1.17 +namespace net { 1.18 + 1.19 +typedef nsMainThreadPtrHolder<nsIHttpActivityObserver> ObserverHolder; 1.20 +typedef nsMainThreadPtrHandle<nsIHttpActivityObserver> ObserverHandle; 1.21 +typedef nsTArray<ObserverHandle> ObserverArray; 1.22 + 1.23 +class nsHttpActivityEvent : public nsRunnable 1.24 +{ 1.25 +public: 1.26 + nsHttpActivityEvent(nsISupports *aHttpChannel, 1.27 + uint32_t aActivityType, 1.28 + uint32_t aActivitySubtype, 1.29 + PRTime aTimestamp, 1.30 + uint64_t aExtraSizeData, 1.31 + const nsACString & aExtraStringData, 1.32 + ObserverArray *aObservers) 1.33 + : mHttpChannel(aHttpChannel) 1.34 + , mActivityType(aActivityType) 1.35 + , mActivitySubtype(aActivitySubtype) 1.36 + , mTimestamp(aTimestamp) 1.37 + , mExtraSizeData(aExtraSizeData) 1.38 + , mExtraStringData(aExtraStringData) 1.39 + , mObservers(*aObservers) 1.40 + { 1.41 + } 1.42 + 1.43 + NS_IMETHOD Run() 1.44 + { 1.45 + for (size_t i = 0 ; i < mObservers.Length() ; i++) 1.46 + mObservers[i]->ObserveActivity(mHttpChannel, mActivityType, 1.47 + mActivitySubtype, mTimestamp, 1.48 + mExtraSizeData, mExtraStringData); 1.49 + return NS_OK; 1.50 + } 1.51 + 1.52 +private: 1.53 + virtual ~nsHttpActivityEvent() 1.54 + { 1.55 + } 1.56 + 1.57 + nsCOMPtr<nsISupports> mHttpChannel; 1.58 + uint32_t mActivityType; 1.59 + uint32_t mActivitySubtype; 1.60 + PRTime mTimestamp; 1.61 + uint64_t mExtraSizeData; 1.62 + nsCString mExtraStringData; 1.63 + 1.64 + ObserverArray mObservers; 1.65 +}; 1.66 + 1.67 +NS_IMPL_ISUPPORTS(nsHttpActivityDistributor, 1.68 + nsIHttpActivityDistributor, 1.69 + nsIHttpActivityObserver) 1.70 + 1.71 +nsHttpActivityDistributor::nsHttpActivityDistributor() 1.72 + : mLock("nsHttpActivityDistributor.mLock") 1.73 +{ 1.74 +} 1.75 + 1.76 +nsHttpActivityDistributor::~nsHttpActivityDistributor() 1.77 +{ 1.78 +} 1.79 + 1.80 +NS_IMETHODIMP 1.81 +nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel, 1.82 + uint32_t aActivityType, 1.83 + uint32_t aActivitySubtype, 1.84 + PRTime aTimestamp, 1.85 + uint64_t aExtraSizeData, 1.86 + const nsACString & aExtraStringData) 1.87 +{ 1.88 + nsRefPtr<nsIRunnable> event; 1.89 + { 1.90 + MutexAutoLock lock(mLock); 1.91 + 1.92 + if (!mObservers.Length()) 1.93 + return NS_OK; 1.94 + 1.95 + event = new nsHttpActivityEvent(aHttpChannel, aActivityType, 1.96 + aActivitySubtype, aTimestamp, 1.97 + aExtraSizeData, aExtraStringData, 1.98 + &mObservers); 1.99 + } 1.100 + NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY); 1.101 + return NS_DispatchToMainThread(event); 1.102 +} 1.103 + 1.104 +NS_IMETHODIMP 1.105 +nsHttpActivityDistributor::GetIsActive(bool *isActive) 1.106 +{ 1.107 + NS_ENSURE_ARG_POINTER(isActive); 1.108 + MutexAutoLock lock(mLock); 1.109 + *isActive = !!mObservers.Length(); 1.110 + return NS_OK; 1.111 +} 1.112 + 1.113 +NS_IMETHODIMP 1.114 +nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver) 1.115 +{ 1.116 + MutexAutoLock lock(mLock); 1.117 + 1.118 + ObserverHandle observer(new ObserverHolder(aObserver)); 1.119 + if (!mObservers.AppendElement(observer)) 1.120 + return NS_ERROR_OUT_OF_MEMORY; 1.121 + 1.122 + return NS_OK; 1.123 +} 1.124 + 1.125 +NS_IMETHODIMP 1.126 +nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver) 1.127 +{ 1.128 + MutexAutoLock lock(mLock); 1.129 + 1.130 + ObserverHandle observer(new ObserverHolder(aObserver)); 1.131 + if (!mObservers.RemoveElement(observer)) 1.132 + return NS_ERROR_FAILURE; 1.133 + 1.134 + return NS_OK; 1.135 +} 1.136 +} // namespace mozilla::net 1.137 +} // namespace mozilla