Reducing header overuse, non-inlining selected methods (CPPOST-35).
[shibboleth/cpp-xmltooling.git] / xmltooling / util / PathResolver.cpp
1 /*
2  *  Copyright 2001-2009 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  * PathResolver.cpp
19  *
20  * Resolves local filenames into absolute pathnames.
21  */
22
23 #include "internal.h"
24 #include "exceptions.h"
25 #include "util/PathResolver.h"
26
27 using namespace xmltooling;
28 using namespace std;
29
30 PathResolver::PathResolver() : m_defaultPackage(PACKAGE_NAME), m_defaultPrefix("/usr")
31 {
32     setLibDir("/usr/lib");
33     setLogDir("/var/log");
34     setXMLDir("/usr/share/xml");
35     setRunDir("/var/run");
36     setCfgDir("/etc");
37 }
38
39 PathResolver::~PathResolver()
40 {
41 }
42
43 void PathResolver::setDefaultPackageName(const char* pkgname)
44 {
45     m_defaultPackage = pkgname;
46 }
47
48 void PathResolver::setDefaultPrefix(const char* prefix)
49 {
50     m_defaultPrefix = prefix;
51 }
52
53 void PathResolver::setLibDir(const char* dir)
54 {
55     m_lib = dir;
56 }
57
58 void PathResolver::setLogDir(const char* dir)
59 {
60     m_log = dir;
61 }
62
63 void PathResolver::setXMLDir(const char* dir)
64 {
65     m_xml = dir;
66 }
67
68 void PathResolver::setRunDir(const char* dir)
69 {
70     m_run = dir;
71 }
72
73 void PathResolver::setCfgDir(const char* dir)
74 {
75     m_cfg = dir;
76 }
77
78 bool PathResolver::isAbsolute(const char* s) const
79 {
80     switch (*s) {
81         case '/':
82         case '\\':
83             return true;
84         case '.':
85             return (*(s+1) == '.' || *(s+1) == '/' || *(s+1) == '\\');
86     }
87     return *(s+1) == ':';
88 }
89
90 const string& PathResolver::resolve(string& s, file_type_t filetype, const char* pkgname, const char* prefix) const
91 {
92     if (!isAbsolute(s.c_str())) {
93         switch (filetype) {
94             case XMLTOOLING_LIB_FILE:
95                 s = m_lib + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
96                 if (!isAbsolute(m_lib.c_str()))
97                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
98                 break;
99
100             case XMLTOOLING_LOG_FILE:
101                 s = m_log + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
102                 if (!isAbsolute(m_log.c_str())) {
103                     if (prefix || m_defaultPrefix != "/usr")
104                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
105                     else
106                         s = string("/") + s;
107                 }
108                 break;
109
110             case XMLTOOLING_XML_FILE:
111                 s = m_xml + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
112                 if (!isAbsolute(m_xml.c_str()))
113                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
114                 break;
115
116             case XMLTOOLING_RUN_FILE:
117                 s = m_run + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
118                 if (!isAbsolute(m_run.c_str())) {
119                     if (prefix || m_defaultPrefix != "/usr")
120                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
121                     else
122                         s = string("/") + s;
123                 }
124                 break;
125
126             case XMLTOOLING_CFG_FILE:
127                 s = m_cfg + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
128                 if (!isAbsolute(m_cfg.c_str())) {
129                     if (prefix || m_defaultPrefix != "/usr")
130                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
131                     else
132                         s = string("/") + s;
133                 }
134                 break;
135
136             default:
137                 throw XMLToolingException("Unknown file type to resolve.");
138         }
139     }
140     return s;
141 }