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 nsID_h__
8 #define nsID_h__
9 
10 #include <string.h>
11 
12 #include "nscore.h"
13 
14 #define NSID_LENGTH 39
15 
16 /**
17  * A "unique identifier". This is modeled after OSF DCE UUIDs.
18  */
19 
20 struct nsID
21 {
22   /**
23    * @name Identifier values
24    */
25 
26   //@{
27   uint32_t m0;
28   uint16_t m1;
29   uint16_t m2;
30   uint8_t m3[8];
31   //@}
32 
33   /**
34    * @name Methods
35    */
36 
37   //@{
38   /**
39    * Ensures everything is zeroed out.
40    */
41   void Clear();
42 
43   /**
44    * Equivalency method. Compares this nsID with another.
45    * @return <b>true</b> if they are the same, <b>false</b> if not.
46    */
47 
EqualsnsID48   inline bool Equals(const nsID& aOther) const
49   {
50     // Unfortunately memcmp isn't faster than this.
51     return
52       (((uint32_t*)&m0)[0] == ((uint32_t*)&aOther.m0)[0]) &&
53       (((uint32_t*)&m0)[1] == ((uint32_t*)&aOther.m0)[1]) &&
54       (((uint32_t*)&m0)[2] == ((uint32_t*)&aOther.m0)[2]) &&
55       (((uint32_t*)&m0)[3] == ((uint32_t*)&aOther.m0)[3]);
56   }
57 
58   inline bool operator==(const nsID& aOther) const
59   {
60     return Equals(aOther);
61   }
62 
63   /**
64    * nsID Parsing method. Turns a {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
65    * string into an nsID
66    */
67   bool Parse(const char* aIDStr);
68 
69 #ifndef XPCOM_GLUE_AVOID_NSPR
70   /**
71    * nsID string encoder. Returns an allocated string in
72    * {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} format. Caller should free string.
73    * YOU SHOULD ONLY USE THIS IF YOU CANNOT USE ToProvidedString() BELOW.
74    */
75   char* ToString() const;
76 
77   /**
78    * nsID string encoder. Builds a string in
79    * {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} format, into a char[NSID_LENGTH]
80    * buffer provided by the caller (for instance, on the stack).
81    */
82   void ToProvidedString(char (&aDest)[NSID_LENGTH]) const;
83 
84 #endif // XPCOM_GLUE_AVOID_NSPR
85 
86   //@}
87 };
88 
89 #ifndef XPCOM_GLUE_AVOID_NSPR
90 /**
91  * A stack helper class to convert a nsID to a string.  Useful
92  * for printing nsIDs.  For example:
93  *   nsID aID = ...;
94  *   printf("%s", nsIDToCString(aID).get());
95  */
96 class nsIDToCString
97 {
98 public:
nsIDToCString(const nsID & aID)99   explicit nsIDToCString(const nsID& aID)
100   {
101     aID.ToProvidedString(mStringBytes);
102   }
103 
get()104   const char *get() const
105   {
106     return mStringBytes;
107   }
108 
109 protected:
110   char mStringBytes[NSID_LENGTH];
111 };
112 #endif
113 
114 /*
115  * Class IDs
116  */
117 
118 typedef nsID nsCID;
119 
120 // Define an CID
121 #define NS_DEFINE_CID(_name, _cidspec) \
122   const nsCID _name = _cidspec
123 
124 #define NS_DEFINE_NAMED_CID(_name) \
125   static const nsCID k##_name = _name
126 
127 #define REFNSCID const nsCID&
128 
129 /**
130  * An "interface id" which can be used to uniquely identify a given
131  * interface.
132  */
133 
134 typedef nsID nsIID;
135 
136 /**
137  * A macro shorthand for <tt>const nsIID&<tt>
138  */
139 
140 #define REFNSIID const nsIID&
141 
142 /**
143  * Define an IID
144  * obsolete - do not use this macro
145  */
146 
147 #define NS_DEFINE_IID(_name, _iidspec) \
148   const nsIID _name = _iidspec
149 
150 /**
151  * A macro to build the static const IID accessor method. The Dummy
152  * template parameter only exists so that the kIID symbol will be linked
153  * properly (weak symbol on linux, gnu_linkonce on mac, multiple-definitions
154  * merged on windows). Dummy should always be instantiated as "void".
155  */
156 
157 #define NS_DECLARE_STATIC_IID_ACCESSOR(the_iid)                         \
158   template<typename T, typename U>                                      \
159   struct COMTypeInfo;
160 
161 #define NS_DEFINE_STATIC_IID_ACCESSOR(the_interface, the_iid)           \
162   template<typename T>                                                  \
163   struct the_interface::COMTypeInfo<the_interface, T> {                 \
164     static const nsIID kIID NS_HIDDEN;                                  \
165   };                                                                    \
166   template<typename T>                                                  \
167   const nsIID the_interface::COMTypeInfo<the_interface, T>::kIID NS_HIDDEN = the_iid;
168 
169 /**
170  * A macro to build the static const CID accessor method
171  */
172 
173 #define NS_DEFINE_STATIC_CID_ACCESSOR(the_cid) \
174   static const nsID& GetCID() {static const nsID cid = the_cid; return cid;}
175 
176 #define NS_GET_IID(T) (T::COMTypeInfo<T, void>::kIID)
177 #define NS_GET_TEMPLATE_IID(T) (T::template COMTypeInfo<T, void>::kIID)
178 
179 #endif
180