OLD | NEW |
1 /** | 1 /** |
2 * \file handle.h The "install session" is the context for all custom installati
on behavior. | 2 * \file handle.h The "install session" is the context for all custom installati
on behavior. |
3 */ | 3 */ |
4 | 4 |
5 #ifndef HANDLE_H | 5 #ifndef HANDLE_H |
6 #define HANDLE_H | 6 #define HANDLE_H |
7 | 7 |
8 #include "windows.h" | 8 #include "windows.h" |
9 #include "msi.h" | 9 #include "msi.h" |
10 | 10 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 * Policy class that indicates that a raw handle is permitted to be zero. | 62 * Policy class that indicates that a raw handle is permitted to be zero. |
63 */ | 63 */ |
64 template< class T > | 64 template< class T > |
65 struct Allow_Null | 65 struct Allow_Null |
66 { | 66 { |
67 inline static bool prohibited_always() { return false ; } | 67 inline static bool prohibited_always() { return false ; } |
68 inline static bool prohibited_from_outside() { return false ; } | 68 inline static bool prohibited_from_outside() { return false ; } |
69 } ; | 69 } ; |
70 | 70 |
71 /** | 71 /** |
72 * Policy class that does not close a file handle when it goes out of scope | 72 * Policy class that does not close a handle at all. |
73 */ | 73 */ |
74 template< class T > | 74 template< class T > |
75 class No_Destruction | 75 class No_Destruction |
76 { | 76 { |
77 public: | 77 public: |
78 inline static void close( T handle ) {} ; | 78 inline static void close( T handle ) {} ; |
79 } ; | 79 } ; |
80 | 80 |
81 /** | 81 /** |
82 * Policy class that does not close a file handle when it goes out of scope | 82 * Policy class that closes an MSI handle when it goes out of scope. |
83 */ | 83 */ |
84 template< class T > | 84 template< class T > |
85 class MSI_Generic_Destruction | 85 class MSI_Generic_Destruction |
86 { | 86 { |
87 public: | 87 public: |
88 inline static void close( T handle ) | 88 inline static void close( T handle ) |
89 { | 89 { |
90 MsiCloseHandle( handle ) ; | 90 MsiCloseHandle( handle ) ; |
91 } ; | 91 } ; |
92 } ; | 92 } ; |
93 | 93 |
| 94 /** |
| 95 * Policy class that closes a Windows handle when it goes out of scope. |
| 96 */ |
| 97 template< class T > |
| 98 class Windows_Generic_Destruction |
| 99 { |
| 100 public: |
| 101 inline static void close( T handle ) |
| 102 { |
| 103 CloseHandle( handle ) ; |
| 104 } ; |
| 105 } ; |
| 106 |
94 | 107 |
95 //------------------------------------------------------- | 108 //------------------------------------------------------- |
96 // Handle | 109 // Handle |
97 //------------------------------------------------------- | 110 //------------------------------------------------------- |
98 /** | 111 /** |
99 * Raw handle is the base class for the generic handle. | 112 * Raw handle is the base class for the generic handle. |
100 * | 113 * |
101 * Raw handles always allow null, so that generic handles may allow or disallow
them as they please. | 114 * Raw handles always allow null, so that generic handles may allow or disallow
them as they please. |
102 */ | 115 */ |
103 template< class T > | 116 template< class T > |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 * Handle class | 154 * Handle class |
142 */ | 155 */ |
143 template< | 156 template< |
144 class T, | 157 class T, |
145 template <class> class Null_Policy, | 158 template <class> class Null_Policy, |
146 template <class> class Destruction_Policy = No_Destruction | 159 template <class> class Destruction_Policy = No_Destruction |
147 > | 160 > |
148 class handle | 161 class handle |
149 : public handle_raw< T > | 162 : public handle_raw< T > |
150 { | 163 { |
| 164 /** |
| 165 * Copy constructor prohibited. |
| 166 * |
| 167 * This class represents an external resource and is responsible for its lifec
ycle. |
| 168 * As such, the semantics here require a one-to-one match between instances an
d resource. |
| 169 * Copy construction violates these semantics. |
| 170 * |
| 171 * \par Implementation |
| 172 * Currently, declared private and not defined. |
| 173 * Add "= delete" for C++11. |
| 174 */ |
| 175 handle( handle & ) ; |
| 176 |
| 177 /** |
| 178 * Copy assignment not implemented. |
| 179 * |
| 180 * It's not used anywhere yet. |
| 181 * |
| 182 * \par Implementation |
| 183 * Currently, declared private and not defined. |
| 184 */ |
| 185 handle operator=( const handle & ) ; |
| 186 |
| 187 /** |
| 188 * Validate initial handle values, both for construction and reinitialization
assignment. |
| 189 */ |
| 190 T validate_handle( T handle ) |
| 191 { |
| 192 if ( Null_Policy< T >::prohibited_from_outside() && handle == 0 ) |
| 193 { |
| 194 throw null_handle_error() ; |
| 195 } |
| 196 return handle ; |
| 197 } |
| 198 |
151 protected: | 199 protected: |
152 /** | 200 /** |
153 * Tag class for null record constructor | 201 * Tag class for null record constructor |
154 */ | 202 */ |
155 class null_t {} ; | 203 class null_t {} ; |
156 | 204 |
157 /** | 205 /** |
158 * Null handle constructor initializes its handle to zero. | 206 * Null handle constructor initializes its handle to zero. |
159 * | 207 * |
160 * The null record constructor avoids the ordinary check that an external hand
le not be zero. | 208 * The null record constructor avoids the ordinary check that an external hand
le not be zero. |
161 * It's declared protected so that it's not ordinarily visible. | 209 * It's declared protected so that it's not ordinarily visible. |
162 * To use this constructor, derive from it and add a friend declaration. | 210 * To use this constructor, derive from it and add a friend declaration. |
163 */ | 211 */ |
164 handle( null_t ) | 212 handle( null_t ) |
165 : handle_raw( 0 ) | 213 : handle_raw( 0 ) |
166 { | 214 { |
167 if ( Null_Policy< T >::prohibited_always() ) | 215 if ( Null_Policy< T >::prohibited_always() ) |
168 { | 216 { |
169 throw null_handle_error() ; | 217 throw null_handle_error() ; |
170 } | 218 } |
171 } | 219 } |
172 | 220 |
173 public: | 221 public: |
174 /** | 222 /** |
175 * Ordinary constructor. | 223 * Ordinary constructor. |
176 * | 224 * |
177 * A check for a non-zero handle compiles in conditionally based on the Null_P
olicy. | 225 * A check for a non-zero handle compiles in conditionally based on the Null_P
olicy. |
178 */ | 226 */ |
179 handle( T _handle ) | 227 handle( T handle ) |
180 : handle_raw( _handle ) | 228 : handle_raw( validate_handle( handle ) ) |
| 229 {} |
| 230 |
| 231 /** |
| 232 * Reinitialization Assignment. |
| 233 * |
| 234 * If we had C++11 move constructors, we wouldn't need this, since this acts e
xactly as construct-plus-move would. |
| 235 */ |
| 236 handle & operator=( T handle ) |
181 { | 237 { |
182 if ( Null_Policy< T >::prohibited_from_outside() && _handle == 0 ) | 238 validate_handle( handle ) ; |
183 { | 239 this -> ~handle() ; |
184 throw null_handle_error() ; | 240 _handle = handle ; |
185 } | 241 return * this ; |
186 } | 242 } |
187 | 243 |
188 /** | 244 /** |
189 * Destructor | 245 * Destructor |
190 * | 246 * |
191 * The check for a non-zero handle compiles out conditionally based on Null_Po
licy. | 247 * The check for a non-zero handle compiles out conditionally based on Null_Po
licy. |
192 * The specific function used to close the handle is given by the Destruction_
Policy. | 248 * The specific function used to close the handle is given by the Destruction_
Policy. |
193 */ | 249 */ |
194 ~handle() | 250 ~handle() |
195 { | 251 { |
196 if ( Null_Policy< T >::prohibited_always() || ( _handle != 0 ) ) { | 252 if ( Null_Policy< T >::prohibited_always() || ( _handle != 0 ) ) { |
197 Destruction_Policy< T >::close( _handle ) ; | 253 Destruction_Policy< T >::close( _handle ) ; |
198 } | 254 } |
199 } | 255 } |
200 | 256 |
201 } ; | 257 } ; |
202 | 258 |
| 259 //------------------------------------------------------- |
| 260 // Common instantiations of handle |
| 261 //------------------------------------------------------- |
| 262 typedef handle< HANDLE, Disallow_Null, Windows_Generic_Destruction > Windows_Han
dle ; |
| 263 |
203 #endif | 264 #endif |
OLD | NEW |