Correct MAX limit constant.
[shibboleth/cpp-opensaml.git] / saml / SAMLConfig.cpp
index 12e60e1..9315b01 100644 (file)
@@ -1,6 +1,5 @@
-
 /*
- *  Copyright 2001-2009 Internet2
+ *  Copyright 2001-2010 Internet2
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -56,6 +55,7 @@
 #include <xmltooling/signature/Signature.h>
 #include <xmltooling/util/NDC.h>
 #include <xmltooling/util/PathResolver.h>
+#include <xmltooling/util/Threads.h>
 
 #include <xsec/enc/XSECCryptoException.hpp>
 #include <xsec/enc/XSECCryptoProvider.hpp>
@@ -104,7 +104,7 @@ SAMLInternalConfig& SAMLInternalConfig::getInternalConfig()
     return g_config;
 }
 
-SAMLConfig::SAMLConfig() : m_artifactMap(NULL)
+SAMLConfig::SAMLConfig() : m_artifactMap(nullptr)
 {
 }
 
@@ -123,16 +123,40 @@ void SAMLConfig::setArtifactMap(ArtifactMap* artifactMap)
     m_artifactMap = artifactMap;
 }
 
+SAMLInternalConfig::SAMLInternalConfig() : m_initCount(0), m_lock(Mutex::create())
+{
+}
+
+SAMLInternalConfig::~SAMLInternalConfig()
+{
+    delete m_lock;
+}
+
 bool SAMLInternalConfig::init(bool initXMLTooling)
 {
 #ifdef _DEBUG
     xmltooling::NDC ndc("init");
 #endif
-    Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig");
+    Category& log=Category::getInstance(SAML_LOGCAT".Config");
+
+    Lock initLock(m_lock);
+
+    if (m_initCount == INT_MAX) {
+        log.crit("library initialized too many times");
+        return false;
+    }
+
+    if (m_initCount >= 1) {
+        ++m_initCount;
+        return true;
+    }
+
     log.debug("library initialization started");
 
-    if (initXMLTooling)
-        XMLToolingConfig::getConfig().init();
+    if (initXMLTooling && !XMLToolingConfig::getConfig().init()) {
+        return false;
+    }
+
     XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName("opensaml");
 
     REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml);
@@ -157,6 +181,7 @@ bool SAMLInternalConfig::init(bool initXMLTooling)
     registerSecurityPolicyRules();
 
     log.info("%s library initialization complete", PACKAGE_STRING);
+    ++m_initCount;
     return true;
 }
 
@@ -165,7 +190,15 @@ void SAMLInternalConfig::term(bool termXMLTooling)
 #ifdef _DEBUG
     xmltooling::NDC ndc("term");
 #endif
-    Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig");
+
+    Lock initLock(m_lock);
+    if (m_initCount == 0) {
+        Category::getInstance(SAML_LOGCAT".Config").crit("term without corresponding init");
+        return;
+    }
+    else if (--m_initCount > 0) {
+        return;
+    }
 
     MessageDecoderManager.deregisterFactories();
     MessageEncoderManager.deregisterFactories();
@@ -175,12 +208,12 @@ void SAMLInternalConfig::term(bool termXMLTooling)
     MetadataProviderManager.deregisterFactories();
 
     delete m_artifactMap;
-    m_artifactMap = NULL;
+    m_artifactMap = nullptr;
 
     if (termXMLTooling)
         XMLToolingConfig::getConfig().term();
     
-    log.info("%s library shutdown complete", PACKAGE_STRING);
+    Category::getInstance(SAML_LOGCAT".Config").info("%s library shutdown complete", PACKAGE_STRING);
 }
 
 void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len)
@@ -250,13 +283,13 @@ using namespace saml2md;
 
 void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow)
 {
-    const RoleDescriptor* role = NULL;
+    const RoleDescriptor* role = nullptr;
     if (entity) {
         const list<XMLObject*>& roles=entity->getOrderedChildren();
         for (list<XMLObject*>::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) {
             role=dynamic_cast<RoleDescriptor*>(*child);
             if (role && !role->isValid())
-                role = NULL;
+                role = nullptr;
         }
     }
     annotateException(e, role, status, rethrow);
@@ -275,8 +308,8 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r
                     || XMLString::equals(ctype,ContactPerson::CONTACT_TECHNICAL))) {
                 GivenName* fname=(*c)->getGivenName();
                 SurName* lname=(*c)->getSurName();
-                auto_ptr_char first(fname ? fname->getName() : NULL);
-                auto_ptr_char last(lname ? lname->getName() : NULL);
+                auto_ptr_char first(fname ? fname->getName() : nullptr);
+                auto_ptr_char last(lname ? lname->getName() : nullptr);
                 if (first.get() && last.get()) {
                     string contact=string(first.get()) + ' ' + last.get();
                     e->addProperty("contactName",contact.c_str());
@@ -302,7 +335,7 @@ void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* r
     }
     
     if (status) {
-        auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : NULL);
+        auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : nullptr);
         if (sc.get() && *sc.get())
             e->addProperty("statusCode", sc.get());
         if (status->getStatusCode()->getStatusCode()) {