|
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 /* vim: set ts=4 et sw=4 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 mozilla_XPTInterfaceInfoManager_h_ |
|
8 #define mozilla_XPTInterfaceInfoManager_h_ |
|
9 |
|
10 #include "nsIInterfaceInfoManager.h" |
|
11 #include "nsIMemoryReporter.h" |
|
12 |
|
13 #include "mozilla/MemoryReporting.h" |
|
14 #include "mozilla/Mutex.h" |
|
15 #include "mozilla/ReentrantMonitor.h" |
|
16 #include "nsDataHashtable.h" |
|
17 |
|
18 template<typename T> class nsCOMArray; |
|
19 class nsIMemoryReporter; |
|
20 class XPTHeader; |
|
21 class XPTInterfaceDirectoryEntry; |
|
22 class xptiInterfaceEntry; |
|
23 class xptiInterfaceInfo; |
|
24 class xptiTypelibGuts; |
|
25 |
|
26 namespace mozilla { |
|
27 |
|
28 class XPTInterfaceInfoManager MOZ_FINAL |
|
29 : public nsIInterfaceInfoManager |
|
30 , public nsIMemoryReporter |
|
31 { |
|
32 NS_DECL_THREADSAFE_ISUPPORTS |
|
33 NS_DECL_NSIINTERFACEINFOMANAGER |
|
34 NS_DECL_NSIMEMORYREPORTER |
|
35 |
|
36 public: |
|
37 // GetSingleton() is infallible |
|
38 static XPTInterfaceInfoManager* GetSingleton(); |
|
39 static void FreeInterfaceInfoManager(); |
|
40 |
|
41 void GetScriptableInterfaces(nsCOMArray<nsIInterfaceInfo>& aInterfaces); |
|
42 |
|
43 void RegisterBuffer(char *buf, uint32_t length); |
|
44 |
|
45 static Mutex& GetResolveLock() |
|
46 { |
|
47 return GetSingleton()->mResolveLock; |
|
48 } |
|
49 |
|
50 xptiInterfaceEntry* GetInterfaceEntryForIID(const nsIID *iid); |
|
51 |
|
52 size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf); |
|
53 |
|
54 private: |
|
55 XPTInterfaceInfoManager(); |
|
56 ~XPTInterfaceInfoManager(); |
|
57 |
|
58 void InitMemoryReporter(); |
|
59 |
|
60 void RegisterXPTHeader(XPTHeader* aHeader); |
|
61 |
|
62 // idx is the index of this interface in the XPTHeader |
|
63 void VerifyAndAddEntryIfNew(XPTInterfaceDirectoryEntry* iface, |
|
64 uint16_t idx, |
|
65 xptiTypelibGuts* typelib); |
|
66 |
|
67 private: |
|
68 |
|
69 class xptiWorkingSet |
|
70 { |
|
71 public: |
|
72 xptiWorkingSet(); |
|
73 ~xptiWorkingSet(); |
|
74 |
|
75 bool IsValid() const; |
|
76 |
|
77 void InvalidateInterfaceInfos(); |
|
78 void ClearHashTables(); |
|
79 |
|
80 // utility methods... |
|
81 |
|
82 enum {NOT_FOUND = 0xffffffff}; |
|
83 |
|
84 // Directory stuff... |
|
85 |
|
86 uint32_t GetDirectoryCount(); |
|
87 nsresult GetCloneOfDirectoryAt(uint32_t i, nsIFile** dir); |
|
88 nsresult GetDirectoryAt(uint32_t i, nsIFile** dir); |
|
89 bool FindDirectory(nsIFile* dir, uint32_t* index); |
|
90 bool FindDirectoryOfFile(nsIFile* file, uint32_t* index); |
|
91 bool DirectoryAtMatchesPersistentDescriptor(uint32_t i, const char* desc); |
|
92 |
|
93 private: |
|
94 uint32_t mFileCount; |
|
95 uint32_t mMaxFileCount; |
|
96 |
|
97 public: |
|
98 // XXX make these private with accessors |
|
99 // mTableMonitor must be held across: |
|
100 // * any read from or write to mIIDTable or mNameTable |
|
101 // * any writing to the links between an xptiInterfaceEntry |
|
102 // and its xptiInterfaceInfo (mEntry/mInfo) |
|
103 mozilla::ReentrantMonitor mTableReentrantMonitor; |
|
104 nsDataHashtable<nsIDHashKey, xptiInterfaceEntry*> mIIDTable; |
|
105 nsDataHashtable<nsDepCharHashKey, xptiInterfaceEntry*> mNameTable; |
|
106 }; |
|
107 |
|
108 // XXX xptiInterfaceInfo want's to poke at the working set itself |
|
109 friend class ::xptiInterfaceInfo; |
|
110 friend class ::xptiInterfaceEntry; |
|
111 friend class ::xptiTypelibGuts; |
|
112 |
|
113 xptiWorkingSet mWorkingSet; |
|
114 Mutex mResolveLock; |
|
115 }; |
|
116 |
|
117 } |
|
118 |
|
119 #endif |