2 * The Shibboleth License, Version 1.
4 * University Corporation for Advanced Internet Development, Inc.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
11 * Redistributions of source code must retain the above copyright notice, this
12 * list of conditions and the following disclaimer.
14 * Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution, if any, must include
17 * the following acknowledgment: "This product includes software developed by
18 * the University Corporation for Advanced Internet Development
19 * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement
20 * may appear in the software itself, if and wherever such third-party
21 * acknowledgments normally appear.
23 * Neither the name of Shibboleth nor the names of its contributors, nor
24 * Internet2, nor the University Corporation for Advanced Internet Development,
25 * Inc., nor UCAID may be used to endorse or promote products derived from this
26 * software without specific prior written permission. For written permission,
27 * please contact shibboleth@shibboleth.org
29 * Products derived from this software may not be called Shibboleth, Internet2,
30 * UCAID, or the University Corporation for Advanced Internet Development, nor
31 * may Shibboleth appear in their name, without prior written permission of the
32 * University Corporation for Advanced Internet Development.
35 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
36 * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
38 * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
39 * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
40 * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
41 * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT,
42 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
43 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
44 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 /* shib.h - Shibboleth header file
62 #include <saml/saml.h>
63 #include <shib/shib-threads.h>
64 #include <xsec/xenc/XENCEncryptionMethod.hpp>
68 # define SHIB_EXPORTS __declspec(dllimport)
76 #define DECLARE_SHIB_EXCEPTION(name,base) \
77 class SHIB_EXPORTS name : public saml::base \
80 name(const char* msg) : saml::base(msg) {RTTI(name);} \
81 name(const std::string& msg) : saml::base(msg) {RTTI(name);} \
82 name(const saml::Iterator<saml::QName>& codes, const char* msg) : saml::base(codes,msg) {RTTI(name);} \
83 name(const saml::Iterator<saml::QName>& codes, const std::string& msg) : saml::base(codes, msg) {RTTI(name);} \
84 name(const saml::QName& code, const char* msg) : saml::base(code,msg) {RTTI(name);} \
85 name(const saml::QName& code, const std::string& msg) : saml::base(code, msg) {RTTI(name);} \
86 name(DOMElement* e) : saml::base(e) {RTTI(name);} \
87 name(std::istream& in) : saml::base(in) {RTTI(name);} \
88 virtual ~name() throw () {} \
91 DECLARE_SHIB_EXCEPTION(MetadataException,SAMLException);
92 DECLARE_SHIB_EXCEPTION(CredentialException,SAMLException);
93 DECLARE_SHIB_EXCEPTION(InvalidHandleException,RetryableProfileException);
95 // Metadata abstract interfaces, based on SAML 2.0
97 struct SHIB_EXPORTS IContactPerson
99 enum ContactType { technical, support, administrative, billing, other };
100 virtual ContactType getType() const=0;
101 virtual const char* getCompany() const=0;
102 virtual const char* getGivenName() const=0;
103 virtual const char* getSurName() const=0;
104 virtual saml::Iterator<std::string> getEmailAddresses() const=0;
105 virtual saml::Iterator<std::string> getTelephoneNumbers() const=0;
106 virtual const DOMElement* getElement() const=0;
107 virtual ~IContactPerson() {}
110 struct SHIB_EXPORTS IOrganization
112 virtual const char* getName(const char* lang="en") const=0;
113 virtual const char* getDisplayName(const char* lang="en") const=0;
114 virtual const char* getURL(const char* lang="en") const=0;
115 virtual const DOMElement* getElement() const=0;
116 virtual ~IOrganization() {}
119 struct SHIB_EXPORTS IKeyDescriptor
121 enum KeyUse { unspecified, encryption, signing };
122 virtual KeyUse getUse() const=0;
123 virtual DSIGKeyInfoList* getKeyInfo() const=0;
124 virtual saml::Iterator<const XENCEncryptionMethod*> getEncryptionMethod() const=0;
125 virtual ~IKeyDescriptor() {}
128 struct SHIB_EXPORTS IEndpoint
130 virtual const XMLCh* getBinding() const=0;
131 virtual const XMLCh* getLocation() const=0;
132 virtual const XMLCh* getResponseLocation() const=0;
133 virtual const DOMElement* getElement() const=0;
134 virtual ~IEndpoint() {}
137 struct SHIB_EXPORTS IIndexedEndpoint : public virtual IEndpoint
139 virtual unsigned short getIndex() const=0;
140 virtual ~IIndexedEndpoint() {}
143 struct SHIB_EXPORTS IEndpointManager
145 virtual saml::Iterator<const IEndpoint*> getEndpoints() const=0;
146 virtual const IEndpoint* getDefaultEndpoint() const=0;
147 virtual const IEndpoint* getEndpointByIndex(unsigned short index) const=0;
148 virtual const IEndpoint* getEndpointByBinding(const XMLCh* binding) const=0;
149 virtual ~IEndpointManager() {}
152 struct SHIB_EXPORTS IEntityDescriptor;
153 struct SHIB_EXPORTS IRoleDescriptor
155 virtual const IEntityDescriptor* getEntityDescriptor() const=0;
156 virtual saml::Iterator<const XMLCh*> getProtocolSupportEnumeration() const=0;
157 virtual bool hasSupport(const XMLCh* protocol) const=0;
158 virtual bool isValid() const=0;
159 virtual const char* getErrorURL() const=0;
160 virtual saml::Iterator<const IKeyDescriptor*> getKeyDescriptors() const=0;
161 virtual const IOrganization* getOrganization() const=0;
162 virtual saml::Iterator<const IContactPerson*> getContactPersons() const=0;
163 virtual const DOMElement* getElement() const=0;
164 virtual ~IRoleDescriptor() {}
167 struct SHIB_EXPORTS ISSODescriptor : public virtual IRoleDescriptor
169 virtual const IEndpointManager* getArtifactResolutionServiceManager() const=0;
170 virtual const IEndpointManager* getSingleLogoutServiceManager() const=0;
171 virtual const IEndpointManager* getManageNameIDServiceManager() const=0;
172 virtual saml::Iterator<const XMLCh*> getNameIDFormats() const=0;
173 virtual ~ISSODescriptor() {}
176 struct SHIB_EXPORTS IIDPSSODescriptor : public virtual ISSODescriptor
178 virtual bool getWantAuthnRequestsSigned() const=0;
179 virtual const IEndpointManager* getSingleSignOnServiceManager() const=0;
180 virtual const IEndpointManager* getNameIDMappingServiceManager() const=0;
181 virtual const IEndpointManager* getAssertionIDRequestServiceManager() const=0;
182 virtual saml::Iterator<const XMLCh*> getAttributeProfiles() const=0;
183 virtual saml::Iterator<const saml::SAMLAttribute*> getAttributes() const=0;
184 virtual ~IIDPSSODescriptor() {}
187 struct SHIB_EXPORTS IAttributeConsumingService
189 virtual const XMLCh* getName(const char* lang="en") const=0;
190 virtual const XMLCh* getDescription(const char* lang="en") const=0;
191 virtual saml::Iterator<std::pair<const saml::SAMLAttribute*,bool> > getRequestedAttributes() const=0;
192 virtual ~IAttributeConsumingService() {}
195 struct SHIB_EXPORTS ISPSSODescriptor : public virtual ISSODescriptor
197 virtual bool getAuthnRequestsSigned() const=0;
198 virtual bool getWantAssertionsSigned() const=0;
199 virtual const IEndpointManager* getAssertionConsumerServiceManager() const=0;
200 virtual saml::Iterator<const IAttributeConsumingService*> getAttributeConsumingServices() const=0;
201 virtual const IAttributeConsumingService* getDefaultAttributeConsumingService() const=0;
202 virtual const IAttributeConsumingService* getAttributeConsumingServiceByID(const XMLCh* id) const=0;
203 virtual ~ISPSSODescriptor() {}
206 struct SHIB_EXPORTS IAuthnAuthorityDescriptor : public virtual IRoleDescriptor
208 virtual const IEndpointManager* getAuthnQueryServiceManager() const=0;
209 virtual const IEndpointManager* getAssertionIDRequestServiceManager() const=0;
210 virtual saml::Iterator<const XMLCh*> getNameIDFormats() const=0;
211 virtual ~IAuthnAuthorityDescriptor() {}
214 struct SHIB_EXPORTS IPDPDescriptor : public virtual IRoleDescriptor
216 virtual const IEndpointManager* getAuthzServiceManager() const=0;
217 virtual const IEndpointManager* getAssertionIDRequestServiceManager() const=0;
218 virtual saml::Iterator<const XMLCh*> getNameIDFormats() const=0;
219 virtual ~IPDPDescriptor() {}
222 struct SHIB_EXPORTS IAttributeAuthorityDescriptor : public virtual IRoleDescriptor
224 virtual const IEndpointManager* getAttributeServices() const=0;
225 virtual const IEndpointManager* getAssertionIDRequestServiceManager() const=0;
226 virtual saml::Iterator<const XMLCh*> getNameIDFormats() const=0;
227 virtual saml::Iterator<const XMLCh*> getAttributeProfiles() const=0;
228 virtual saml::Iterator<const saml::SAMLAttribute*> getAttributes() const=0;
229 virtual ~IAttributeAuthorityDescriptor() {}
232 struct SHIB_EXPORTS IAffiliationDescriptor
234 virtual const IEntityDescriptor* getEntityDescriptor() const=0;
235 virtual const XMLCh* getOwnerID() const=0;
236 virtual bool isValid() const=0;
237 virtual saml::Iterator<const XMLCh*> getMembers() const=0;
238 virtual bool isMember(const XMLCh* id) const=0;
239 virtual saml::Iterator<const IKeyDescriptor*> getKeyDescriptors() const=0;
240 virtual const DOMElement* getElement() const=0;
241 virtual ~IAffiliationDescriptor() {}
244 struct SHIB_EXPORTS IEntitiesDescriptor;
245 struct SHIB_EXPORTS IEntityDescriptor
247 virtual const XMLCh* getId() const=0;
248 virtual bool isValid() const=0;
249 virtual saml::Iterator<const IRoleDescriptor*> getRoleDescriptors() const=0;
250 virtual const IIDPSSODescriptor* getIDPSSODescriptor(const XMLCh* protocol) const=0;
251 virtual const ISPSSODescriptor* getSPSSODescriptor(const XMLCh* protocol) const=0;
252 virtual const IAuthnAuthorityDescriptor* getAuthnAuthorityDescriptor(const XMLCh* protocol) const=0;
253 virtual const IAttributeAuthorityDescriptor* getAttributeAuthorityDescriptor(const XMLCh* protocol) const=0;
254 virtual const IPDPDescriptor* getPDPDescriptor(const XMLCh* protocol) const=0;
255 virtual const IAffiliationDescriptor* getAffiliationDescriptor() const=0;
256 virtual const IOrganization* getOrganization() const=0;
257 virtual saml::Iterator<const IContactPerson*> getContactPersons() const=0;
258 virtual saml::Iterator<std::pair<const XMLCh*,const XMLCh*> > getAdditionalMetadataLocations() const=0;
259 virtual const IEntitiesDescriptor* getEntitiesDescriptor() const=0;
260 virtual const DOMElement* getElement() const=0;
261 virtual ~IEntityDescriptor() {}
264 struct SHIB_EXPORTS IEntitiesDescriptor
266 virtual const XMLCh* getName() const=0;
267 virtual bool isValid() const=0;
268 virtual const IEntitiesDescriptor* getEntitiesDescriptor() const=0;
269 virtual saml::Iterator<const IEntitiesDescriptor*> getEntitiesDescriptors() const=0;
270 virtual saml::Iterator<const IEntityDescriptor*> getEntityDescriptors() const=0;
271 virtual const DOMElement* getElement() const=0;
272 virtual ~IEntitiesDescriptor() {}
275 // Supports Shib role extension describing attribute scoping rules
276 struct SHIB_EXPORTS IScopedRoleDescriptor : public virtual IRoleDescriptor
278 virtual saml::Iterator<std::pair<const XMLCh*,bool> > getScopes() const=0;
279 virtual ~IScopedRoleDescriptor() {}
282 struct SHIB_EXPORTS IMetadata : public virtual saml::ILockable, public virtual saml::IPlugIn
284 virtual const IEntityDescriptor* lookup(const XMLCh* id) const=0;
285 virtual const IEntityDescriptor* lookup(const saml::SAMLArtifact* artifact) const=0;
286 virtual ~IMetadata() {}
289 struct SHIB_EXPORTS IRevocation : public virtual saml::ILockable, public virtual saml::IPlugIn
291 virtual saml::Iterator<void*> getRevocationLists(const IEntityDescriptor* provider, const IRoleDescriptor* role=NULL) const=0;
292 virtual ~IRevocation() {}
295 // Trust interface hides *all* details of signature and SSL validation.
296 // Pluggable providers can fully override the Shibboleth trust model here.
298 struct SHIB_EXPORTS ITrust : public virtual saml::IPlugIn
300 virtual bool validate(
301 const saml::Iterator<IRevocation*>& revocations,
302 const IRoleDescriptor* role, const saml::SAMLSignedObject& token,
303 const saml::Iterator<IMetadata*>& metadatas=EMPTY(IMetadata*)
305 virtual bool attach(const saml::Iterator<IRevocation*>& revocations, const IRoleDescriptor* role, void* ctx)=0;
309 // Credentials interface abstracts access to "owned" keys and certificates.
311 struct SHIB_EXPORTS ICredResolver : public virtual saml::IPlugIn
313 virtual void attach(void* ctx) const=0;
314 virtual XSECCryptoKey* getKey() const=0;
315 virtual saml::Iterator<XSECCryptoX509*> getCertificates() const=0;
316 virtual void dump(FILE* f) const=0;
317 virtual void dump() const { dump(stdout); }
318 virtual ~ICredResolver() {}
321 struct SHIB_EXPORTS ICredentials : public virtual saml::ILockable, public virtual saml::IPlugIn
323 virtual const ICredResolver* lookup(const char* id) const=0;
324 virtual ~ICredentials() {}
327 // Attribute acceptance processing interfaces, applied to incoming attributes.
329 struct SHIB_EXPORTS IAttributeRule
331 virtual const XMLCh* getName() const=0;
332 virtual const XMLCh* getNamespace() const=0;
333 virtual const char* getFactory() const=0;
334 virtual const char* getAlias() const=0;
335 virtual const char* getHeader() const=0;
336 virtual bool getCaseSensitive() const=0;
337 virtual void apply(saml::SAMLAttribute& attribute, const IRoleDescriptor* role=NULL) const=0;
338 virtual ~IAttributeRule() {}
341 struct SHIB_EXPORTS IAAP : public virtual saml::ILockable, public virtual saml::IPlugIn
343 virtual bool anyAttribute() const=0;
344 virtual const IAttributeRule* lookup(const XMLCh* attrName, const XMLCh* attrNamespace=NULL) const=0;
345 virtual const IAttributeRule* lookup(const char* alias) const=0;
346 virtual saml::Iterator<const IAttributeRule*> getAttributeRules() const=0;
350 #ifdef SHIB_INSTANTIATE
351 template class SHIB_EXPORTS saml::Iterator<const IContactPerson*>;
352 template class SHIB_EXPORTS saml::Iterator<const XENCEncryptionMethod*>;
353 template class SHIB_EXPORTS saml::Iterator<const IKeyDescriptor*>;
354 template class SHIB_EXPORTS saml::Iterator<const IAttributeConsumingService*>;
355 template class SHIB_EXPORTS saml::Iterator<const IRoleDescriptor*>;
356 template class SHIB_EXPORTS saml::Iterator<const IEntityDescriptor*>;
357 template class SHIB_EXPORTS saml::Iterator<const IEntitiesDescriptor*>;
358 template class SHIB_EXPORTS saml::Iterator<const IEndpoint*>;
359 template class SHIB_EXPORTS saml::Iterator<const IAttributeRule*>;
360 template class SHIB_EXPORTS saml::Iterator<IMetadata*>;
361 template class SHIB_EXPORTS saml::ArrayIterator<IMetadata*>;
362 template class SHIB_EXPORTS saml::Iterator<ITrust*>;
363 template class SHIB_EXPORTS saml::ArrayIterator<ITrust*>;
364 template class SHIB_EXPORTS saml::Iterator<IRevocation*>;
365 template class SHIB_EXPORTS saml::ArrayIterator<IRevocation*>;
366 template class SHIB_EXPORTS saml::Iterator<ICredentials*>;
367 template class SHIB_EXPORTS saml::ArrayIterator<ICredentials*>;
368 template class SHIB_EXPORTS saml::Iterator<IAAP*>;
369 template class SHIB_EXPORTS saml::ArrayIterator<IAAP*>;
372 struct SHIB_EXPORTS Constants
374 static const XMLCh SHIB_ATTRIBUTE_NAMESPACE_URI[];
375 static const XMLCh SHIB_NAMEID_FORMAT_URI[];
376 static const XMLCh SHIB_AUTHNREQUEST_PROFILE_URI[];
377 static const XMLCh SHIB_NS[];
378 static const XMLCh InvalidHandle[];
381 // Glue classes between abstract metadata and concrete providers
383 class SHIB_EXPORTS Metadata
386 Metadata(const saml::Iterator<IMetadata*>& metadatas) : m_metadatas(metadatas), m_mapper(NULL) {}
389 const IEntityDescriptor* lookup(const XMLCh* providerId);
390 const IEntityDescriptor* lookup(const saml::SAMLArtifact* artifact);
393 Metadata(const Metadata&);
394 void operator=(const Metadata&);
396 const saml::Iterator<IMetadata*>& m_metadatas;
399 class SHIB_EXPORTS Revocation
402 Revocation(const saml::Iterator<IRevocation*>& revocations) : m_revocations(revocations), m_mapper(NULL) {}
405 saml::Iterator<void*> getRevocationLists(const IEntityDescriptor* provider, const IRoleDescriptor* role=NULL);
408 Revocation(const Revocation&);
409 void operator=(const Revocation&);
410 IRevocation* m_mapper;
411 const saml::Iterator<IRevocation*>& m_revocations;
414 class SHIB_EXPORTS Trust
417 Trust(const saml::Iterator<ITrust*>& trusts) : m_trusts(trusts) {}
421 const saml::Iterator<IRevocation*>& revocations,
422 const IRoleDescriptor* role, const saml::SAMLSignedObject& token,
423 const saml::Iterator<IMetadata*>& metadatas=EMPTY(IMetadata*)
425 bool attach(const saml::Iterator<IRevocation*>& revocations, const IRoleDescriptor* role, void* ctx) const;
429 void operator=(const Trust&);
430 const saml::Iterator<ITrust*>& m_trusts;
433 class SHIB_EXPORTS Credentials
436 Credentials(const saml::Iterator<ICredentials*>& creds) : m_creds(creds), m_mapper(NULL) {}
439 const ICredResolver* lookup(const char* id);
442 Credentials(const Credentials&);
443 void operator=(const Credentials&);
444 ICredentials* m_mapper;
445 const saml::Iterator<ICredentials*>& m_creds;
448 class SHIB_EXPORTS AAP
451 AAP(const saml::Iterator<IAAP*>& aaps, const XMLCh* attrName, const XMLCh* attrNamespace=NULL);
452 AAP(const saml::Iterator<IAAP*>& aaps, const char* alias);
454 bool fail() const {return m_mapper==NULL;}
455 const IAttributeRule* operator->() const {return m_rule;}
456 operator const IAttributeRule*() const {return m_rule;}
458 static void apply(const saml::Iterator<IAAP*>& aaps, saml::SAMLAssertion& assertion, const IRoleDescriptor* role=NULL);
462 void operator=(const AAP&);
464 const IAttributeRule* m_rule;
467 // Subclass around the OpenSAML browser profile interface,
468 // incoporates additional functionality using Shib-defined APIs.
469 class SHIB_EXPORTS ShibBrowserProfile : virtual public saml::SAMLBrowserProfile
473 const saml::Iterator<IMetadata*>& metadatas=EMPTY(IMetadata*),
474 const saml::Iterator<IRevocation*>& revocations=EMPTY(IRevocation*),
475 const saml::Iterator<ITrust*>& trusts=EMPTY(ITrust*)
477 virtual ~ShibBrowserProfile();
479 virtual void setVersion(int major, int minor);
480 virtual saml::SAMLBrowserProfile::BrowserProfileResponse receive(
483 const XMLCh* recipient,
484 int supportedProfiles,
485 saml::IReplayCache* replayCache=NULL,
486 saml::SAMLBrowserProfile::ArtifactMapper* callback=NULL
490 saml::SAMLBrowserProfile* m_profile;
491 saml::Iterator<IMetadata*> m_metadatas;
492 saml::Iterator<IRevocation*> m_revocations;
493 saml::Iterator<ITrust*> m_trusts;
496 // Instead of wrapping the binding to deal with mutual authentication, we
497 // just use the HTTP hook functionality offered by OpenSAML. The hook will
498 // register "itself" as a globalCtx pointer with the SAML binding and the caller
499 // will declare and pass the embedded struct as callCtx for use by the hook.
500 class SHIB_EXPORTS ShibHTTPHook : virtual public saml::SAMLSOAPHTTPBinding::HTTPHook
504 const saml::Iterator<IRevocation*>& revocations,
505 const saml::Iterator<ITrust*>& trusts,
506 const saml::Iterator<ICredentials*>& creds
507 ) : m_revocations(revocations), m_trusts(trusts), m_creds(creds) {}
508 virtual ~ShibHTTPHook() {}
510 // Only hook we need here is for outgoing connection to server.
511 virtual bool outgoing(saml::HTTPClient* conn, void* globalCtx=NULL, void* callCtx=NULL);
513 // Client declares a context object and pass as callCtx to send() method.
514 class SHIB_EXPORTS ShibHTTPHookCallContext {
516 ShibHTTPHookCallContext(const char* credResolverId, const IRoleDescriptor* role)
517 : m_credResolverId(credResolverId), m_role(role), m_hook(NULL) {}
519 const char* m_credResolverId;
520 const IRoleDescriptor* m_role;
521 ShibHTTPHook* m_hook;
522 friend class ShibHTTPHook;
523 friend bool ssl_ctx_callback(void* ssl_ctx, void* userptr);
526 friend bool ssl_ctx_callback(void* ssl_ctx, void* userptr);
527 saml::Iterator<IRevocation*> m_revocations;
528 saml::Iterator<ITrust*> m_trusts;
529 saml::Iterator<ICredentials*> m_creds;
532 class SHIB_EXPORTS ShibConfig
536 virtual ~ShibConfig() {}
538 // global per-process setup and shutdown of Shibboleth runtime
542 // enables runtime and clients to access configuration
543 static ShibConfig& getConfig();
546 /* Helper classes for implementing reloadable XML-based config files
547 The ILockable interface will usually be inherited twice, once as
548 part of the external interface to clients and once as an implementation
549 detail of the reloading class below.
552 class SHIB_EXPORTS ReloadableXMLFileImpl
555 ReloadableXMLFileImpl(const char* pathname);
556 ReloadableXMLFileImpl(const DOMElement* pathname);
557 virtual ~ReloadableXMLFileImpl();
561 const DOMElement* m_root;
564 class SHIB_EXPORTS ReloadableXMLFile : protected virtual saml::ILockable
567 ReloadableXMLFile(const DOMElement* e);
568 ~ReloadableXMLFile() { delete m_lock; delete m_impl; }
571 virtual void unlock() { if (m_lock) m_lock->unlock(); }
573 ReloadableXMLFileImpl* getImplementation() const;
576 virtual ReloadableXMLFileImpl* newImplementation(const char* pathname, bool first=true) const=0;
577 virtual ReloadableXMLFileImpl* newImplementation(const DOMElement* e, bool first=true) const=0;
578 mutable ReloadableXMLFileImpl* m_impl;
581 const DOMElement* m_root;
582 std::string m_source;