nsCommandParams.h (5022B)
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 nsCommandParams_h 8 #define nsCommandParams_h 9 10 #include "PLDHashTable.h" 11 #include "mozilla/ErrorResult.h" 12 #include "nsCOMPtr.h" 13 #include "nsICommandParams.h" 14 #include "nsString.h" 15 16 class nsCommandParams : public nsICommandParams { 17 using ErrorResult = mozilla::ErrorResult; 18 using IgnoredErrorResult = mozilla::IgnoredErrorResult; 19 20 public: 21 nsCommandParams(); 22 23 NS_DECL_ISUPPORTS 24 NS_DECL_NSICOMMANDPARAMS 25 26 bool GetBool(const char* aName, ErrorResult& aRv) const; 27 inline bool GetBool(const char* aName) const { 28 IgnoredErrorResult error; 29 return GetBool(aName, error); 30 } 31 int32_t GetInt(const char* aName, ErrorResult& aRv) const; 32 inline int32_t GetInt(const char* aName) const { 33 IgnoredErrorResult error; 34 return GetInt(aName, error); 35 } 36 double GetDouble(const char* aName, ErrorResult& aRv) const; 37 inline double GetDouble(const char* aName) const { 38 IgnoredErrorResult error; 39 return GetDouble(aName, error); 40 } 41 nsresult GetString(const char* aName, nsAString& aValue) const; 42 nsresult GetCString(const char* aName, nsACString& aValue) const; 43 already_AddRefed<nsISupports> GetISupports(const char* aName, 44 ErrorResult& aRv) const; 45 inline already_AddRefed<nsISupports> GetISupports(const char* aName) const { 46 IgnoredErrorResult error; 47 return GetISupports(aName, error); 48 } 49 50 nsresult SetBool(const char* aName, bool aValue); 51 nsresult SetInt(const char* aName, int32_t aValue); 52 nsresult SetDouble(const char* aName, double aValue); 53 nsresult SetString(const char* aName, const nsAString& aValue); 54 nsresult SetCString(const char* aName, const nsACString& aValue); 55 nsresult SetISupports(const char* aName, nsISupports* aValue); 56 57 protected: 58 virtual ~nsCommandParams(); 59 60 struct HashEntry : public PLDHashEntryHdr { 61 nsCString mEntryName; 62 63 uint8_t mEntryType; 64 union { 65 bool mBoolean; 66 int32_t mLong; 67 double mDouble; 68 nsString* mString; 69 nsCString* mCString; 70 } mData; 71 72 nsCOMPtr<nsISupports> mISupports; 73 74 HashEntry(uint8_t aType, const char* aEntryName) 75 : mEntryName(aEntryName), mEntryType(aType), mData() { 76 Reset(mEntryType); 77 } 78 79 explicit HashEntry(const HashEntry& aRHS) : mEntryType(aRHS.mEntryType) { 80 Reset(mEntryType); 81 switch (mEntryType) { 82 case eBooleanType: 83 mData.mBoolean = aRHS.mData.mBoolean; 84 break; 85 case eLongType: 86 mData.mLong = aRHS.mData.mLong; 87 break; 88 case eDoubleType: 89 mData.mDouble = aRHS.mData.mDouble; 90 break; 91 case eWStringType: 92 NS_ASSERTION(aRHS.mData.mString, "Source entry has no string"); 93 mData.mString = new nsString(*aRHS.mData.mString); 94 break; 95 case eStringType: 96 NS_ASSERTION(aRHS.mData.mCString, "Source entry has no string"); 97 mData.mCString = new nsCString(*aRHS.mData.mCString); 98 break; 99 case eISupportsType: 100 mISupports = aRHS.mISupports.get(); 101 break; 102 default: 103 NS_ERROR("Unknown type"); 104 } 105 } 106 107 ~HashEntry() { Reset(eNoType); } 108 109 void Reset(uint8_t aNewType) { 110 switch (mEntryType) { 111 case eNoType: 112 break; 113 case eBooleanType: 114 mData.mBoolean = false; 115 break; 116 case eLongType: 117 mData.mLong = 0; 118 break; 119 case eDoubleType: 120 mData.mDouble = 0.0; 121 break; 122 case eWStringType: 123 delete mData.mString; 124 mData.mString = nullptr; 125 break; 126 case eISupportsType: 127 mISupports = nullptr; 128 break; 129 case eStringType: 130 delete mData.mCString; 131 mData.mCString = nullptr; 132 break; 133 default: 134 NS_ERROR("Unknown type"); 135 } 136 mEntryType = aNewType; 137 } 138 }; 139 140 HashEntry* GetNamedEntry(const char* aName) const; 141 HashEntry* GetOrMakeEntry(const char* aName, uint8_t aEntryType); 142 143 protected: 144 static PLDHashNumber HashKey(const void* aKey); 145 146 static bool HashMatchEntry(const PLDHashEntryHdr* aEntry, const void* aKey); 147 148 static void HashMoveEntry(PLDHashTable* aTable, const PLDHashEntryHdr* aFrom, 149 PLDHashEntryHdr* aTo); 150 151 static void HashClearEntry(PLDHashTable* aTable, PLDHashEntryHdr* aEntry); 152 153 PLDHashTable mValuesHash; 154 155 static const PLDHashTableOps sHashOps; 156 }; 157 158 nsCommandParams* nsICommandParams::AsCommandParams() { 159 return static_cast<nsCommandParams*>(this); 160 } 161 162 const nsCommandParams* nsICommandParams::AsCommandParams() const { 163 return static_cast<const nsCommandParams*>(this); 164 } 165 166 #endif // nsCommandParams_h