Changeset 102309 in vbox for trunk/src/libs/xpcom18a4/xpcom
- Timestamp:
- Nov 27, 2023 12:56:43 PM (15 months ago)
- Location:
- trunk/src/libs/xpcom18a4/xpcom/reflect/xptinfo
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/libs/xpcom18a4/xpcom/reflect/xptinfo/public/nsIInterfaceInfoManager.idl
r1 r102309 61 61 }; 62 62 63 [uuid(0ee22850-bc6a-11d5-9134-0010a4e73d9a)]64 interface nsIInterfaceInfoSuperManager : nsIInterfaceInfoManager65 {66 void addAdditionalManager(in nsIInterfaceInfoManager manager);67 void removeAdditionalManager(in nsIInterfaceInfoManager manager);68 69 PRBool hasAdditionalManagers();70 nsISimpleEnumerator enumerateAdditionalManagers();71 };72 73 63 %{C++ 74 64 #define NS_INTERFACEINFOMANAGER_SERVICE_CLASSNAME \ -
trunk/src/libs/xpcom18a4/xpcom/reflect/xptinfo/src/xptiInterfaceInfoManager.cpp
r102196 r102309 49 49 #define NS_ZIPLOADER_CONTRACTID NS_XPTLOADER_CONTRACTID_PREFIX "zip" 50 50 51 NS_IMPL_THREADSAFE_ISUPPORTS2(xptiInterfaceInfoManager, 52 nsIInterfaceInfoManager, 53 nsIInterfaceInfoSuperManager) 51 NS_IMPL_THREADSAFE_ISUPPORTS1(xptiInterfaceInfoManager, 52 nsIInterfaceInfoManager); 54 53 55 54 static xptiInterfaceInfoManager* gInterfaceInfoManager = nsnull; … … 116 115 mResolveLock != NIL_RTSEMFASTMUTEX && 117 116 mAutoRegLock != NIL_RTSEMFASTMUTEX && 118 mInfoMonitor && 119 mAdditionalManagersLock != NIL_RTSEMFASTMUTEX; 117 mInfoMonitor; 120 118 } 121 119 … … 126 124 mAutoRegLock(NIL_RTSEMFASTMUTEX), 127 125 mInfoMonitor(nsAutoMonitor::NewMonitor("xptiInfoMonitor")), 128 mAdditionalManagersLock(NIL_RTSEMFASTMUTEX),129 126 mSearchPath(aSearchPath) 130 127 { … … 133 130 134 131 vrc = RTSemFastMutexCreate(&mAutoRegLock); 135 AssertRC(vrc); RT_NOREF(vrc);136 137 vrc = RTSemFastMutexCreate(&mAdditionalManagersLock);138 132 AssertRC(vrc); RT_NOREF(vrc); 139 133 … … 158 152 if(mInfoMonitor) 159 153 nsAutoMonitor::DestroyMonitor(mInfoMonitor); 160 if(mAdditionalManagersLock)161 RTSemFastMutexDestroy(mAdditionalManagersLock);162 154 163 155 gInterfaceInfoManager = nsnull; … … 1972 1964 /***************************************************************************/ 1973 1965 1974 class xptiAdditionalManagersEnumerator : public nsISimpleEnumerator1975 {1976 public:1977 NS_DECL_ISUPPORTS1978 NS_DECL_NSISIMPLEENUMERATOR1979 1980 xptiAdditionalManagersEnumerator();1981 1982 PRBool SizeTo(PRUint32 likelyCount) {return mArray.SizeTo(likelyCount);}1983 PRBool AppendElement(nsIInterfaceInfoManager* element);1984 1985 private:1986 ~xptiAdditionalManagersEnumerator() {}1987 1988 nsSupportsArray mArray;1989 PRUint32 mIndex;1990 PRUint32 mCount;1991 };1992 1993 NS_IMPL_ISUPPORTS1(xptiAdditionalManagersEnumerator, nsISimpleEnumerator)1994 1995 xptiAdditionalManagersEnumerator::xptiAdditionalManagersEnumerator()1996 : mIndex(0), mCount(0)1997 {1998 }1999 2000 PRBool xptiAdditionalManagersEnumerator::AppendElement(nsIInterfaceInfoManager* element)2001 {2002 if(!mArray.AppendElement(NS_STATIC_CAST(nsISupports*, element)))2003 return PR_FALSE;2004 mCount++;2005 return PR_TRUE;2006 }2007 2008 /* boolean hasMoreElements (); */2009 NS_IMETHODIMP xptiAdditionalManagersEnumerator::HasMoreElements(PRBool *_retval)2010 {2011 *_retval = mIndex < mCount;2012 return NS_OK;2013 }2014 2015 /* nsISupports getNext (); */2016 NS_IMETHODIMP xptiAdditionalManagersEnumerator::GetNext(nsISupports **_retval)2017 {2018 if(!(mIndex < mCount))2019 {2020 NS_ERROR("Bad nsISimpleEnumerator caller!");2021 return NS_ERROR_FAILURE;2022 }2023 2024 *_retval = mArray.ElementAt(mIndex++);2025 return *_retval ? NS_OK : NS_ERROR_FAILURE;2026 }2027 2028 /***************************************************************************/2029 2030 /* void addAdditionalManager (in nsIInterfaceInfoManager manager); */2031 NS_IMETHODIMP xptiInterfaceInfoManager::AddAdditionalManager(nsIInterfaceInfoManager *manager)2032 {2033 nsCOMPtr<nsIWeakReference> weakRef = do_GetWeakReference(manager);2034 nsISupports* ptrToAdd = weakRef ?2035 NS_STATIC_CAST(nsISupports*, weakRef) :2036 NS_STATIC_CAST(nsISupports*, manager);2037 { // scoped lock...2038 nsAutoLock lock(mAdditionalManagersLock);2039 PRInt32 index;2040 nsresult rv = mAdditionalManagers.GetIndexOf(ptrToAdd, &index);2041 if(NS_FAILED(rv) || -1 != index)2042 return NS_ERROR_FAILURE;2043 if(!mAdditionalManagers.AppendElement(ptrToAdd))2044 return NS_ERROR_OUT_OF_MEMORY;2045 }2046 return NS_OK;2047 }2048 2049 /* void removeAdditionalManager (in nsIInterfaceInfoManager manager); */2050 NS_IMETHODIMP xptiInterfaceInfoManager::RemoveAdditionalManager(nsIInterfaceInfoManager *manager)2051 {2052 nsCOMPtr<nsIWeakReference> weakRef = do_GetWeakReference(manager);2053 nsISupports* ptrToRemove = weakRef ?2054 NS_STATIC_CAST(nsISupports*, weakRef) :2055 NS_STATIC_CAST(nsISupports*, manager);2056 { // scoped lock...2057 nsAutoLock lock(mAdditionalManagersLock);2058 if(!mAdditionalManagers.RemoveElement(ptrToRemove))2059 return NS_ERROR_FAILURE;2060 }2061 return NS_OK;2062 }2063 2064 /* PRBool hasAdditionalManagers (); */2065 NS_IMETHODIMP xptiInterfaceInfoManager::HasAdditionalManagers(PRBool *_retval)2066 {2067 PRUint32 count;2068 nsresult rv = mAdditionalManagers.Count(&count);2069 *_retval = count != 0;2070 return rv;2071 }2072 2073 /* nsISimpleEnumerator enumerateAdditionalManagers (); */2074 NS_IMETHODIMP xptiInterfaceInfoManager::EnumerateAdditionalManagers(nsISimpleEnumerator **_retval)2075 {2076 nsAutoLock lock(mAdditionalManagersLock);2077 2078 PRUint32 count;2079 nsresult rv = mAdditionalManagers.Count(&count);2080 if(NS_FAILED(rv))2081 return rv;2082 2083 nsCOMPtr<xptiAdditionalManagersEnumerator> enumerator =2084 new xptiAdditionalManagersEnumerator();2085 if(!enumerator)2086 return NS_ERROR_OUT_OF_MEMORY;2087 2088 enumerator->SizeTo(count);2089 2090 for(PRUint32 i = 0; i < count; /* i incremented in the loop body */)2091 {2092 nsCOMPtr<nsISupports> raw =2093 dont_AddRef(mAdditionalManagers.ElementAt(i++));2094 if(!raw)2095 return NS_ERROR_FAILURE;2096 nsCOMPtr<nsIWeakReference> weakRef = do_QueryInterface(raw);2097 if(weakRef)2098 {2099 nsCOMPtr<nsIInterfaceInfoManager> manager =2100 do_QueryReferent(weakRef);2101 if(manager)2102 {2103 if(!enumerator->AppendElement(manager))2104 return NS_ERROR_FAILURE;2105 }2106 else2107 {2108 // The manager is no more. Remove the element.2109 if(!mAdditionalManagers.RemoveElementAt(--i))2110 return NS_ERROR_FAILURE;2111 count--;2112 }2113 }2114 else2115 {2116 // We *know* we put a pointer to either a nsIWeakReference or2117 // an nsIInterfaceInfoManager into the array, so we can avoid an2118 // extra QI here and just do a cast.2119 if(!enumerator->AppendElement(2120 NS_REINTERPRET_CAST(nsIInterfaceInfoManager*, raw.get())))2121 return NS_ERROR_FAILURE;2122 }2123 }2124 2125 NS_ADDREF(*_retval = enumerator);2126 return NS_OK;2127 }2128 2129 /***************************************************************************/2130 2131 1966 XPTI_PUBLIC_API(nsIInterfaceInfoManager*) 2132 1967 XPTI_GetInterfaceInfoManager() -
trunk/src/libs/xpcom18a4/xpcom/reflect/xptinfo/src/xptiprivate.h
r102197 r102309 69 69 70 70 #include "nsISupportsArray.h" 71 #include "nsSupportsArray.h"72 71 #include "nsInt64.h" 73 72 … … 859 858 860 859 class xptiInterfaceInfoManager 861 : public nsIInterfaceInfo SuperManager860 : public nsIInterfaceInfoManager 862 861 { 863 862 NS_DECL_ISUPPORTS 864 863 NS_DECL_NSIINTERFACEINFOMANAGER 865 NS_DECL_NSIINTERFACEINFOSUPERMANAGER866 864 867 865 // helper … … 965 963 RTSEMFASTMUTEX mAutoRegLock; 966 964 PRMonitor* mInfoMonitor; 967 RTSEMFASTMUTEX mAdditionalManagersLock;968 nsSupportsArray mAdditionalManagers;969 965 nsCOMPtr<nsISupportsArray> mSearchPath; 970 966 };
Note:
See TracChangeset
for help on using the changeset viewer.