netwerk/dns/nsEffectiveTLDService.h

Wed, 31 Dec 2014 06:55:46 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:46 +0100
changeset 1
ca08bd8f51b2
permissions
-rw-r--r--

Added tag TORBROWSER_REPLICA for changeset 6474c204b198

     1 //* -*- Mode: C++; tab-width: 2; 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/. */
     6 #ifndef EffectiveTLDService_h
     7 #define EffectiveTLDService_h
     9 #include "nsIEffectiveTLDService.h"
    11 #include "nsIMemoryReporter.h"
    12 #include "nsTHashtable.h"
    13 #include "nsString.h"
    14 #include "nsCOMPtr.h"
    15 #include "mozilla/Attributes.h"
    16 #include "mozilla/MemoryReporting.h"
    18 class nsIIDNService;
    20 #define ETLD_ENTRY_N_INDEX_BITS 30
    22 // struct for static data generated from effective_tld_names.dat
    23 struct ETLDEntry {
    24   uint32_t strtab_index : ETLD_ENTRY_N_INDEX_BITS;
    25   uint32_t exception : 1;
    26   uint32_t wild : 1;
    27 };
    30 // hash entry class
    31 class nsDomainEntry : public PLDHashEntryHdr
    32 {
    33   friend class nsEffectiveTLDService;
    34 public:
    35   // Hash methods
    36   typedef const char* KeyType;
    37   typedef const char* KeyTypePointer;
    39   nsDomainEntry(KeyTypePointer aEntry)
    40   {
    41   }
    43   nsDomainEntry(const nsDomainEntry& toCopy)
    44   {
    45     // if we end up here, things will break. nsTHashtable shouldn't
    46     // allow this, since we set ALLOW_MEMMOVE to true.
    47     NS_NOTREACHED("nsDomainEntry copy constructor is forbidden!");
    48   }
    50   ~nsDomainEntry()
    51   {
    52   }
    54   KeyType GetKey() const
    55   {
    56     return GetEffectiveTLDName(mData->strtab_index);
    57   }
    59   bool KeyEquals(KeyTypePointer aKey) const
    60   {
    61     return !strcmp(GetKey(), aKey);
    62   }
    64   static KeyTypePointer KeyToPointer(KeyType aKey)
    65   {
    66     return aKey;
    67   }
    69   static PLDHashNumber HashKey(KeyTypePointer aKey)
    70   {
    71     // PL_DHashStringKey doesn't use the table parameter, so we can safely
    72     // pass nullptr
    73     return PL_DHashStringKey(nullptr, aKey);
    74   }
    76   enum { ALLOW_MEMMOVE = true };
    78   void SetData(const ETLDEntry* entry) { mData = entry; }
    80   bool IsNormal() { return mData->wild || !mData->exception; }
    81   bool IsException() { return mData->exception; }
    82   bool IsWild() { return mData->wild; }
    84   static const char *GetEffectiveTLDName(size_t idx)
    85   {
    86     return strings.strtab + idx;
    87   }
    89 private:
    90   const ETLDEntry* mData;
    91 #define ETLD_STR_NUM_1(line) str##line
    92 #define ETLD_STR_NUM(line) ETLD_STR_NUM_1(line)
    93   struct etld_string_list {
    94 #define ETLD_ENTRY(name, ex, wild) char ETLD_STR_NUM(__LINE__)[sizeof(name)];
    95 #include "etld_data.inc"
    96 #undef ETLD_ENTRY
    97   };
    98   static const union etld_strings {
    99     struct etld_string_list list;
   100     char strtab[1];
   101   } strings;
   102   static const ETLDEntry entries[];
   103   void FuncForStaticAsserts(void);
   104 #undef ETLD_STR_NUM
   105 #undef ETLD_STR_NUM1
   106 };
   108 class nsEffectiveTLDService MOZ_FINAL
   109   : public nsIEffectiveTLDService
   110   , public nsIMemoryReporter
   111 {
   112 public:
   113   NS_DECL_ISUPPORTS
   114   NS_DECL_NSIEFFECTIVETLDSERVICE
   115   NS_DECL_NSIMEMORYREPORTER
   117   nsEffectiveTLDService();
   118   nsresult Init();
   120   size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf);
   122 private:
   123   nsresult GetBaseDomainInternal(nsCString &aHostname, int32_t aAdditionalParts, nsACString &aBaseDomain);
   124   nsresult NormalizeHostname(nsCString &aHostname);
   125   ~nsEffectiveTLDService();
   127   nsTHashtable<nsDomainEntry> mHash;
   128   nsCOMPtr<nsIIDNService>     mIDNService;
   129 };
   131 #endif // EffectiveTLDService_h

mercurial