nsCommandParams.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "xpcom-config.h"
  6. #include <new>
  7. #include "nscore.h"
  8. #include "nsCRT.h"
  9. #include "nsCommandParams.h"
  10. #include "mozilla/HashFunctions.h"
  11. using namespace mozilla;
  12. const PLDHashTableOps nsCommandParams::sHashOps =
  13. {
  14. HashKey,
  15. HashMatchEntry,
  16. HashMoveEntry,
  17. HashClearEntry
  18. };
  19. NS_IMPL_ISUPPORTS(nsCommandParams, nsICommandParams)
  20. nsCommandParams::nsCommandParams()
  21. : mValuesHash(&sHashOps, sizeof(HashEntry), 2)
  22. {
  23. }
  24. nsCommandParams::~nsCommandParams()
  25. {
  26. }
  27. NS_IMETHODIMP
  28. nsCommandParams::GetValueType(const char* aName, int16_t* aRetVal)
  29. {
  30. NS_ENSURE_ARG_POINTER(aRetVal);
  31. HashEntry* foundEntry = GetNamedEntry(aName);
  32. if (foundEntry) {
  33. *aRetVal = foundEntry->mEntryType;
  34. return NS_OK;
  35. }
  36. *aRetVal = eNoType;
  37. return NS_ERROR_FAILURE;
  38. }
  39. NS_IMETHODIMP
  40. nsCommandParams::GetBooleanValue(const char* aName, bool* aRetVal)
  41. {
  42. NS_ENSURE_ARG_POINTER(aRetVal);
  43. HashEntry* foundEntry = GetNamedEntry(aName);
  44. if (foundEntry && foundEntry->mEntryType == eBooleanType) {
  45. *aRetVal = foundEntry->mData.mBoolean;
  46. return NS_OK;
  47. }
  48. *aRetVal = false;
  49. return NS_ERROR_FAILURE;
  50. }
  51. NS_IMETHODIMP
  52. nsCommandParams::GetLongValue(const char* aName, int32_t* aRetVal)
  53. {
  54. NS_ENSURE_ARG_POINTER(aRetVal);
  55. HashEntry* foundEntry = GetNamedEntry(aName);
  56. if (foundEntry && foundEntry->mEntryType == eLongType) {
  57. *aRetVal = foundEntry->mData.mLong;
  58. return NS_OK;
  59. }
  60. *aRetVal = false;
  61. return NS_ERROR_FAILURE;
  62. }
  63. NS_IMETHODIMP
  64. nsCommandParams::GetDoubleValue(const char* aName, double* aRetVal)
  65. {
  66. NS_ENSURE_ARG_POINTER(aRetVal);
  67. HashEntry* foundEntry = GetNamedEntry(aName);
  68. if (foundEntry && foundEntry->mEntryType == eDoubleType) {
  69. *aRetVal = foundEntry->mData.mDouble;
  70. return NS_OK;
  71. }
  72. *aRetVal = 0.0;
  73. return NS_ERROR_FAILURE;
  74. }
  75. NS_IMETHODIMP
  76. nsCommandParams::GetStringValue(const char* aName, nsAString& aRetVal)
  77. {
  78. HashEntry* foundEntry = GetNamedEntry(aName);
  79. if (foundEntry && foundEntry->mEntryType == eWStringType) {
  80. NS_ASSERTION(foundEntry->mData.mString, "Null string");
  81. aRetVal.Assign(*foundEntry->mData.mString);
  82. return NS_OK;
  83. }
  84. aRetVal.Truncate();
  85. return NS_ERROR_FAILURE;
  86. }
  87. NS_IMETHODIMP
  88. nsCommandParams::GetCStringValue(const char* aName, char** aRetVal)
  89. {
  90. NS_ENSURE_ARG_POINTER(aRetVal);
  91. HashEntry* foundEntry = GetNamedEntry(aName);
  92. if (foundEntry && foundEntry->mEntryType == eStringType) {
  93. NS_ASSERTION(foundEntry->mData.mCString, "Null string");
  94. *aRetVal = ToNewCString(*foundEntry->mData.mCString);
  95. return NS_OK;
  96. }
  97. *aRetVal = nullptr;
  98. return NS_ERROR_FAILURE;
  99. }
  100. NS_IMETHODIMP
  101. nsCommandParams::GetISupportsValue(const char* aName, nsISupports** aRetVal)
  102. {
  103. NS_ENSURE_ARG_POINTER(aRetVal);
  104. HashEntry* foundEntry = GetNamedEntry(aName);
  105. if (foundEntry && foundEntry->mEntryType == eISupportsType) {
  106. NS_IF_ADDREF(*aRetVal = foundEntry->mISupports.get());
  107. return NS_OK;
  108. }
  109. *aRetVal = nullptr;
  110. return NS_ERROR_FAILURE;
  111. }
  112. NS_IMETHODIMP
  113. nsCommandParams::SetBooleanValue(const char* aName, bool aValue)
  114. {
  115. HashEntry* foundEntry = GetOrMakeEntry(aName, eBooleanType);
  116. if (!foundEntry) {
  117. return NS_ERROR_OUT_OF_MEMORY;
  118. }
  119. foundEntry->mData.mBoolean = aValue;
  120. return NS_OK;
  121. }
  122. NS_IMETHODIMP
  123. nsCommandParams::SetLongValue(const char* aName, int32_t aValue)
  124. {
  125. HashEntry* foundEntry = GetOrMakeEntry(aName, eLongType);
  126. if (!foundEntry) {
  127. return NS_ERROR_OUT_OF_MEMORY;
  128. }
  129. foundEntry->mData.mLong = aValue;
  130. return NS_OK;
  131. }
  132. NS_IMETHODIMP
  133. nsCommandParams::SetDoubleValue(const char* aName, double aValue)
  134. {
  135. HashEntry* foundEntry = GetOrMakeEntry(aName, eDoubleType);
  136. if (!foundEntry) {
  137. return NS_ERROR_OUT_OF_MEMORY;
  138. }
  139. foundEntry->mData.mDouble = aValue;
  140. return NS_OK;
  141. }
  142. NS_IMETHODIMP
  143. nsCommandParams::SetStringValue(const char* aName, const nsAString& aValue)
  144. {
  145. HashEntry* foundEntry = GetOrMakeEntry(aName, eWStringType);
  146. if (!foundEntry) {
  147. return NS_ERROR_OUT_OF_MEMORY;
  148. }
  149. foundEntry->mData.mString = new nsString(aValue);
  150. return NS_OK;
  151. }
  152. NS_IMETHODIMP
  153. nsCommandParams::SetCStringValue(const char* aName, const char* aValue)
  154. {
  155. HashEntry* foundEntry = GetOrMakeEntry(aName, eStringType);
  156. if (!foundEntry) {
  157. return NS_ERROR_OUT_OF_MEMORY;
  158. }
  159. foundEntry->mData.mCString = new nsCString(aValue);
  160. return NS_OK;
  161. }
  162. NS_IMETHODIMP
  163. nsCommandParams::SetISupportsValue(const char* aName, nsISupports* aValue)
  164. {
  165. HashEntry* foundEntry = GetOrMakeEntry(aName, eISupportsType);
  166. if (!foundEntry) {
  167. return NS_ERROR_OUT_OF_MEMORY;
  168. }
  169. foundEntry->mISupports = aValue; // addrefs
  170. return NS_OK;
  171. }
  172. NS_IMETHODIMP
  173. nsCommandParams::RemoveValue(const char* aName)
  174. {
  175. mValuesHash.Remove((void*)aName);
  176. return NS_OK;
  177. }
  178. nsCommandParams::HashEntry*
  179. nsCommandParams::GetNamedEntry(const char* aName)
  180. {
  181. return static_cast<HashEntry*>(mValuesHash.Search((void*)aName));
  182. }
  183. nsCommandParams::HashEntry*
  184. nsCommandParams::GetOrMakeEntry(const char* aName, uint8_t aEntryType)
  185. {
  186. auto foundEntry = static_cast<HashEntry*>(mValuesHash.Search((void*)aName));
  187. if (foundEntry) { // reuse existing entry
  188. foundEntry->Reset(aEntryType);
  189. return foundEntry;
  190. }
  191. foundEntry = static_cast<HashEntry*>(mValuesHash.Add((void*)aName, fallible));
  192. if (!foundEntry) {
  193. return nullptr;
  194. }
  195. // Use placement new. Our ctor does not clobber keyHash, which is important.
  196. new (foundEntry) HashEntry(aEntryType, aName);
  197. return foundEntry;
  198. }
  199. PLDHashNumber
  200. nsCommandParams::HashKey(const void* aKey)
  201. {
  202. return HashString((const char*)aKey);
  203. }
  204. bool
  205. nsCommandParams::HashMatchEntry(const PLDHashEntryHdr* aEntry, const void* aKey)
  206. {
  207. const char* keyString = (const char*)aKey;
  208. const HashEntry* thisEntry = static_cast<const HashEntry*>(aEntry);
  209. return thisEntry->mEntryName.Equals(keyString);
  210. }
  211. void
  212. nsCommandParams::HashMoveEntry(PLDHashTable* aTable,
  213. const PLDHashEntryHdr* aFrom,
  214. PLDHashEntryHdr* aTo)
  215. {
  216. const HashEntry* fromEntry = static_cast<const HashEntry*>(aFrom);
  217. HashEntry* toEntry = static_cast<HashEntry*>(aTo);
  218. new (toEntry) HashEntry(*fromEntry);
  219. fromEntry->~HashEntry();
  220. }
  221. void
  222. nsCommandParams::HashClearEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry)
  223. {
  224. HashEntry* thisEntry = static_cast<HashEntry*>(aEntry);
  225. thisEntry->~HashEntry();
  226. }