1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef nsObserverList_h___ 8 #define nsObserverList_h___ 9 10 #include "nsISupports.h" 11 #include "nsTArray.h" 12 #include "nsCOMPtr.h" 13 #include "nsCOMArray.h" 14 #include "nsIObserver.h" 15 #include "nsIWeakReference.h" 16 #include "nsHashKeys.h" 17 #include "nsISimpleEnumerator.h" 18 #include "mozilla/Attributes.h" 19 20 struct ObserverRef { ObserverRefObserverRef21 ObserverRef(const ObserverRef& aO) : isWeakRef(aO.isWeakRef), ref(aO.ref) {} ObserverRefObserverRef22 explicit ObserverRef(nsIObserver* aObserver) 23 : isWeakRef(false), ref(aObserver) {} ObserverRefObserverRef24 explicit ObserverRef(nsIWeakReference* aWeak) : isWeakRef(true), ref(aWeak) {} 25 26 bool isWeakRef; 27 nsCOMPtr<nsISupports> ref; 28 asObserverObserverRef29 nsIObserver* asObserver() { 30 NS_ASSERTION(!isWeakRef, "Isn't a strong ref."); 31 return static_cast<nsIObserver*>((nsISupports*)ref); 32 } 33 asWeakObserverRef34 nsIWeakReference* asWeak() { 35 NS_ASSERTION(isWeakRef, "Isn't a weak ref."); 36 return static_cast<nsIWeakReference*>((nsISupports*)ref); 37 } 38 39 bool operator==(nsISupports* aRhs) const { return ref == aRhs; } 40 }; 41 42 class nsObserverList : public nsCharPtrHashKey { 43 friend class nsObserverService; 44 45 public: nsObserverList(const char * aKey)46 explicit nsObserverList(const char* aKey) : nsCharPtrHashKey(aKey) { 47 MOZ_COUNT_CTOR(nsObserverList); 48 } 49 ~nsObserverList()50 ~nsObserverList() { MOZ_COUNT_DTOR(nsObserverList); } 51 52 MOZ_MUST_USE nsresult AddObserver(nsIObserver* aObserver, bool aOwnsWeak); 53 MOZ_MUST_USE nsresult RemoveObserver(nsIObserver* aObserver); 54 55 void NotifyObservers(nsISupports* aSubject, const char* aTopic, 56 const char16_t* aSomeData); 57 void GetObserverList(nsISimpleEnumerator** aEnumerator); 58 59 // Fill an array with the observers of this category. 60 // The array is filled in last-added-first order. 61 void FillObserverArray(nsCOMArray<nsIObserver>& aArray); 62 63 // Like FillObserverArray(), but only for strongly held observers. 64 void AppendStrongObservers(nsCOMArray<nsIObserver>& aArray); 65 66 private: 67 nsTArray<ObserverRef> mObservers; 68 }; 69 70 class nsObserverEnumerator final : public nsISimpleEnumerator { 71 public: 72 NS_DECL_ISUPPORTS 73 NS_DECL_NSISIMPLEENUMERATOR 74 75 explicit nsObserverEnumerator(nsObserverList* aObserverList); 76 77 private: ~nsObserverEnumerator()78 ~nsObserverEnumerator() {} 79 80 int32_t mIndex; // Counts up from 0 81 nsCOMArray<nsIObserver> mObservers; 82 }; 83 84 #endif /* nsObserverList_h___ */ 85