NS_IMETHODIMP nsCategoryManager::AddCategoryEntry( const char *aCategoryName, const char *aEntryName, const char *aValue, PRBool aPersist, PRBool aReplace, char **_retval ) { NS_ENSURE_ARG_POINTER(aCategoryName); NS_ENSURE_ARG_POINTER(aEntryName); NS_ENSURE_ARG_POINTER(aValue); // Before we can insert a new entry, we'll need to // find the |CategoryNode| to put it in... CategoryNode* category; { MutexAutoLock lock(mLock); category = get_category(aCategoryName); if (!category) { // That category doesn't exist yet; let's make it. category = CategoryNode::Create(&mArena); char* categoryName = ArenaStrdup(aCategoryName, &mArena); mTable.Put(categoryName, category); } } if (!category) return NS_ERROR_OUT_OF_MEMORY; // We will need the return value of AddLeaf even if the called doesn't want it char *oldEntry = nsnull; nsresult rv = category->AddLeaf(aEntryName, aValue, aPersist, aReplace, &oldEntry, &mArena); if (NS_SUCCEEDED(rv)) { if (oldEntry) { NotifyObservers(NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID, aCategoryName, oldEntry); } NotifyObservers(NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID, aCategoryName, aEntryName); if (_retval) *_retval = oldEntry; else if (oldEntry) nsMemory::Free(oldEntry); } return rv; }
void nsCategoryManager::AddCategoryEntry(const char *aCategoryName, const char *aEntryName, const char *aValue, bool aReplace, char** aOldValue) { if (aOldValue) *aOldValue = NULL; // Before we can insert a new entry, we'll need to // find the |CategoryNode| to put it in... CategoryNode* category; { MutexAutoLock lock(mLock); category = get_category(aCategoryName); if (!category) { // That category doesn't exist yet; let's make it. category = CategoryNode::Create(&mArena); char* categoryName = ArenaStrdup(aCategoryName, &mArena); mTable.Put(categoryName, category); } } if (!category) return; // We will need the return value of AddLeaf even if the called doesn't want it char *oldEntry = nsnull; nsresult rv = category->AddLeaf(aEntryName, aValue, aReplace, &oldEntry, &mArena); if (NS_SUCCEEDED(rv)) { if (oldEntry) { NotifyObservers(NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID, aCategoryName, oldEntry); } NotifyObservers(NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID, aCategoryName, aEntryName); if (aOldValue) *aOldValue = oldEntry; else NS_Free(oldEntry); } }