|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 // HttpLog.h should generally be included first |
|
6 #include "HttpLog.h" |
|
7 |
|
8 #include "nsHttpActivityDistributor.h" |
|
9 #include "nsCOMPtr.h" |
|
10 #include "nsAutoPtr.h" |
|
11 #include "nsThreadUtils.h" |
|
12 |
|
13 namespace mozilla { |
|
14 namespace net { |
|
15 |
|
16 typedef nsMainThreadPtrHolder<nsIHttpActivityObserver> ObserverHolder; |
|
17 typedef nsMainThreadPtrHandle<nsIHttpActivityObserver> ObserverHandle; |
|
18 typedef nsTArray<ObserverHandle> ObserverArray; |
|
19 |
|
20 class nsHttpActivityEvent : public nsRunnable |
|
21 { |
|
22 public: |
|
23 nsHttpActivityEvent(nsISupports *aHttpChannel, |
|
24 uint32_t aActivityType, |
|
25 uint32_t aActivitySubtype, |
|
26 PRTime aTimestamp, |
|
27 uint64_t aExtraSizeData, |
|
28 const nsACString & aExtraStringData, |
|
29 ObserverArray *aObservers) |
|
30 : mHttpChannel(aHttpChannel) |
|
31 , mActivityType(aActivityType) |
|
32 , mActivitySubtype(aActivitySubtype) |
|
33 , mTimestamp(aTimestamp) |
|
34 , mExtraSizeData(aExtraSizeData) |
|
35 , mExtraStringData(aExtraStringData) |
|
36 , mObservers(*aObservers) |
|
37 { |
|
38 } |
|
39 |
|
40 NS_IMETHOD Run() |
|
41 { |
|
42 for (size_t i = 0 ; i < mObservers.Length() ; i++) |
|
43 mObservers[i]->ObserveActivity(mHttpChannel, mActivityType, |
|
44 mActivitySubtype, mTimestamp, |
|
45 mExtraSizeData, mExtraStringData); |
|
46 return NS_OK; |
|
47 } |
|
48 |
|
49 private: |
|
50 virtual ~nsHttpActivityEvent() |
|
51 { |
|
52 } |
|
53 |
|
54 nsCOMPtr<nsISupports> mHttpChannel; |
|
55 uint32_t mActivityType; |
|
56 uint32_t mActivitySubtype; |
|
57 PRTime mTimestamp; |
|
58 uint64_t mExtraSizeData; |
|
59 nsCString mExtraStringData; |
|
60 |
|
61 ObserverArray mObservers; |
|
62 }; |
|
63 |
|
64 NS_IMPL_ISUPPORTS(nsHttpActivityDistributor, |
|
65 nsIHttpActivityDistributor, |
|
66 nsIHttpActivityObserver) |
|
67 |
|
68 nsHttpActivityDistributor::nsHttpActivityDistributor() |
|
69 : mLock("nsHttpActivityDistributor.mLock") |
|
70 { |
|
71 } |
|
72 |
|
73 nsHttpActivityDistributor::~nsHttpActivityDistributor() |
|
74 { |
|
75 } |
|
76 |
|
77 NS_IMETHODIMP |
|
78 nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel, |
|
79 uint32_t aActivityType, |
|
80 uint32_t aActivitySubtype, |
|
81 PRTime aTimestamp, |
|
82 uint64_t aExtraSizeData, |
|
83 const nsACString & aExtraStringData) |
|
84 { |
|
85 nsRefPtr<nsIRunnable> event; |
|
86 { |
|
87 MutexAutoLock lock(mLock); |
|
88 |
|
89 if (!mObservers.Length()) |
|
90 return NS_OK; |
|
91 |
|
92 event = new nsHttpActivityEvent(aHttpChannel, aActivityType, |
|
93 aActivitySubtype, aTimestamp, |
|
94 aExtraSizeData, aExtraStringData, |
|
95 &mObservers); |
|
96 } |
|
97 NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY); |
|
98 return NS_DispatchToMainThread(event); |
|
99 } |
|
100 |
|
101 NS_IMETHODIMP |
|
102 nsHttpActivityDistributor::GetIsActive(bool *isActive) |
|
103 { |
|
104 NS_ENSURE_ARG_POINTER(isActive); |
|
105 MutexAutoLock lock(mLock); |
|
106 *isActive = !!mObservers.Length(); |
|
107 return NS_OK; |
|
108 } |
|
109 |
|
110 NS_IMETHODIMP |
|
111 nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver) |
|
112 { |
|
113 MutexAutoLock lock(mLock); |
|
114 |
|
115 ObserverHandle observer(new ObserverHolder(aObserver)); |
|
116 if (!mObservers.AppendElement(observer)) |
|
117 return NS_ERROR_OUT_OF_MEMORY; |
|
118 |
|
119 return NS_OK; |
|
120 } |
|
121 |
|
122 NS_IMETHODIMP |
|
123 nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver) |
|
124 { |
|
125 MutexAutoLock lock(mLock); |
|
126 |
|
127 ObserverHandle observer(new ObserverHolder(aObserver)); |
|
128 if (!mObservers.RemoveElement(observer)) |
|
129 return NS_ERROR_FAILURE; |
|
130 |
|
131 return NS_OK; |
|
132 } |
|
133 } // namespace mozilla::net |
|
134 } // namespace mozilla |