Adjust Lock API
[shibboleth/cpp-xmltooling.git] / xmltooling / internal.h
1 /**
2  * Licensed to the University Corporation for Advanced Internet
3  * Development, Inc. (UCAID) under one or more contributor license
4  * agreements. See the NOTICE file distributed with this work for
5  * additional information regarding copyright ownership.
6  *
7  * UCAID licenses this file to you under the Apache License,
8  * Version 2.0 (the "License"); you may not use this file except
9  * in compliance with the License. You may obtain a copy of the
10  * License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17  * either express or implied. See the License for the specific
18  * language governing permissions and limitations under the License.
19  */
20
21 /*
22  *  internal.h - internally visible classes
23  */
24
25 #ifndef __xmltooling_internal_h__
26 #define __xmltooling_internal_h__
27
28 #ifdef WIN32
29 # define _CRT_SECURE_NO_DEPRECATE 1
30 # define _CRT_NONSTDC_NO_DEPRECATE 1
31 # define _SCL_SECURE_NO_WARNINGS 1
32 #endif
33
34 // Export public APIs.
35 #define XMLTOOLING_EXPORTS
36
37 // eventually we might be able to support autoconf via cygwin...
38 #if defined (_MSC_VER) || defined(__BORLANDC__)
39 # include "config_win32.h"
40 #else
41 # include "config.h"
42 #endif
43
44 #include "base.h"
45 #include "XMLToolingConfig.h"
46 #include "util/ParserPool.h"
47
48 #include <map>
49 #include <string>
50 #include <vector>
51
52 #ifndef XMLTOOLING_NO_XMLSEC
53     #include <xsec/framework/XSECProvider.hpp>
54 #endif
55
56 #define XMLTOOLING_LOGCAT "XMLTooling"
57
58 // Macros for path and directory separators.
59 #if defined __CYGWIN32__ && !defined __CYGWIN__
60    /* For backwards compatibility with Cygwin b19 and
61       earlier, we define __CYGWIN__ here, so that
62       we can rely on checking just for that macro. */
63 #  define __CYGWIN__  __CYGWIN32__
64 #endif
65
66 #if defined _WIN32 && !defined __CYGWIN__
67    /* Use Windows separators on all _WIN32 defining
68       environments, except Cygwin. */
69 #  define DIR_SEPARATOR_CHAR        '\\'
70 #  define DIR_SEPARATOR_STR         "\\"
71 #  define PATH_SEPARATOR_CHAR       ';'
72 #  define PATH_SEPARATOR_STR        ";"
73 #endif
74 #ifndef DIR_SEPARATOR_CHAR
75    /* Assume that not having this is an indicator that all
76       are missing. */
77 #  define DIR_SEPARATOR_CHAR        '/'
78 #  define DIR_SEPARATOR_STR         "/"
79 #  define PATH_SEPARATOR_CHAR       ':'
80 #  define PATH_SEPARATOR_STR        ":"
81 #endif /* !DIR_SEPARATOR_CHAR */
82
83 namespace xmltooling {
84     
85     /// @cond OFF
86     class XMLTOOL_DLLLOCAL XMLToolingInternalConfig : public XMLToolingConfig
87     {
88     public:
89         XMLToolingInternalConfig();
90         ~XMLToolingInternalConfig();
91
92         static XMLToolingInternalConfig& getInternalConfig();
93
94         // global per-process setup and shutdown of runtime
95         bool init();
96         void term();
97
98         // global mutex available to library applications
99         Lockable* lock();
100         void unlock();
101
102         // named mutexes to limit lock scope
103         Mutex& getNamedMutex(const char* name);
104
105         // configuration
106         bool load_library(const char* path, void* context=nullptr);
107         bool log_config(const char* config=nullptr);
108
109         // parser access
110         ParserPool& getParser() const {
111             return *m_parserPool;
112         }
113
114         ParserPool& getValidatingParser() const {
115             return *m_validatingPool;
116         }
117
118 #ifndef XMLTOOLING_NO_XMLSEC
119         XSECCryptoX509CRL* X509CRL() const;
120         std::pair<const char*,unsigned int> mapXMLAlgorithmToKeyAlgorithm(const XMLCh* xmlAlgorithm) const;
121         void registerXMLAlgorithm(
122             const XMLCh* xmlAlgorithm, const char* keyAlgorithm, unsigned int size=0, XMLSecurityAlgorithmType type=ALGTYPE_UNK
123             );
124         bool isXMLAlgorithmSupported(const XMLCh* xmlAlgorithm, XMLSecurityAlgorithmType type=ALGTYPE_UNK);
125         void registerXMLAlgorithms();
126
127         XSECProvider* m_xsecProvider;
128     private:
129         typedef std::map<XMLSecurityAlgorithmType, std::map< xstring,std::pair<std::string,unsigned int> > > algmap_t;
130         algmap_t m_algorithmMap;
131 #endif
132
133     private:
134         int m_initCount;
135         std::auto_ptr<Mutex> m_lock;
136         std::map<std::string,Mutex*> m_namedLocks;
137         std::vector<void*> m_libhandles;
138         ParserPool* m_parserPool;
139         ParserPool* m_validatingPool;
140     };
141     
142 #ifndef XMLTOOLING_NO_XMLSEC
143     void log_openssl();
144 #endif
145     
146     /// @endcond
147
148 };
149
150 #endif /* __xmltooling_internal_h__ */