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