tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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