Line data Source code
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 Runnable
21 : {
22 : public:
23 0 : 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 0 : : Runnable("net::nsHttpActivityEvent")
31 : , mHttpChannel(aHttpChannel)
32 : , mActivityType(aActivityType)
33 : , mActivitySubtype(aActivitySubtype)
34 : , mTimestamp(aTimestamp)
35 : , mExtraSizeData(aExtraSizeData)
36 : , mExtraStringData(aExtraStringData)
37 0 : , mObservers(*aObservers)
38 : {
39 0 : }
40 :
41 0 : NS_IMETHOD Run() override
42 : {
43 0 : for (size_t i = 0 ; i < mObservers.Length() ; i++) {
44 : Unused <<
45 0 : mObservers[i]->ObserveActivity(mHttpChannel, mActivityType,
46 : mActivitySubtype, mTimestamp,
47 : mExtraSizeData,
48 0 : mExtraStringData);
49 : }
50 0 : return NS_OK;
51 : }
52 :
53 : private:
54 0 : virtual ~nsHttpActivityEvent()
55 0 : {
56 0 : }
57 :
58 : nsCOMPtr<nsISupports> mHttpChannel;
59 : uint32_t mActivityType;
60 : uint32_t mActivitySubtype;
61 : PRTime mTimestamp;
62 : uint64_t mExtraSizeData;
63 : nsCString mExtraStringData;
64 :
65 : ObserverArray mObservers;
66 : };
67 :
68 44 : NS_IMPL_ISUPPORTS(nsHttpActivityDistributor,
69 : nsIHttpActivityDistributor,
70 : nsIHttpActivityObserver)
71 :
72 1 : nsHttpActivityDistributor::nsHttpActivityDistributor()
73 1 : : mLock("nsHttpActivityDistributor.mLock")
74 : {
75 1 : }
76 :
77 0 : nsHttpActivityDistributor::~nsHttpActivityDistributor()
78 : {
79 0 : }
80 :
81 : NS_IMETHODIMP
82 0 : nsHttpActivityDistributor::ObserveActivity(nsISupports *aHttpChannel,
83 : uint32_t aActivityType,
84 : uint32_t aActivitySubtype,
85 : PRTime aTimestamp,
86 : uint64_t aExtraSizeData,
87 : const nsACString & aExtraStringData)
88 : {
89 0 : nsCOMPtr<nsIRunnable> event;
90 : {
91 0 : MutexAutoLock lock(mLock);
92 :
93 0 : if (!mObservers.Length())
94 0 : return NS_OK;
95 :
96 : event = new nsHttpActivityEvent(aHttpChannel, aActivityType,
97 : aActivitySubtype, aTimestamp,
98 : aExtraSizeData, aExtraStringData,
99 0 : &mObservers);
100 : }
101 0 : NS_ENSURE_TRUE(event, NS_ERROR_OUT_OF_MEMORY);
102 0 : return NS_DispatchToMainThread(event);
103 : }
104 :
105 : NS_IMETHODIMP
106 8 : nsHttpActivityDistributor::GetIsActive(bool *isActive)
107 : {
108 8 : NS_ENSURE_ARG_POINTER(isActive);
109 16 : MutexAutoLock lock(mLock);
110 8 : *isActive = !!mObservers.Length();
111 8 : return NS_OK;
112 : }
113 :
114 : NS_IMETHODIMP
115 0 : nsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver *aObserver)
116 : {
117 0 : MutexAutoLock lock(mLock);
118 :
119 0 : ObserverHandle observer(new ObserverHolder("nsIHttpActivityObserver", aObserver));
120 0 : if (!mObservers.AppendElement(observer))
121 0 : return NS_ERROR_OUT_OF_MEMORY;
122 :
123 0 : return NS_OK;
124 : }
125 :
126 : NS_IMETHODIMP
127 0 : nsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver *aObserver)
128 : {
129 0 : MutexAutoLock lock(mLock);
130 :
131 0 : ObserverHandle observer(new ObserverHolder("nsIHttpActivityObserver", aObserver));
132 0 : if (!mObservers.RemoveElement(observer))
133 0 : return NS_ERROR_FAILURE;
134 :
135 0 : return NS_OK;
136 : }
137 :
138 : } // namespace net
139 : } // namespace mozilla
|