ff69c40bdc6b77bd7d17ab3a899ca4146225bed1
[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 bool PathResolver::isAbsolute(const char* s) const
40 {
41     switch (*s) {
42         case '/':
43         case '\\':
44             return true;
45         case '.':
46             return (*(s+1) == '.' || *(s+1) == '/' || *(s+1) == '\\');
47     }
48     return *(s+1) == ':';
49 }
50
51 const string& PathResolver::resolve(string& s, file_type_t filetype, const char* pkgname, const char* prefix) const
52 {
53     if (!isAbsolute(s.c_str())) {
54         switch (filetype) {
55             case XMLTOOLING_LIB_FILE:
56                 s = m_lib + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
57                 if (!isAbsolute(m_lib.c_str()))
58                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
59                 break;
60
61             case XMLTOOLING_LOG_FILE:
62                 s = m_log + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
63                 if (!isAbsolute(m_log.c_str())) {
64                     if (prefix || m_defaultPrefix != "/usr")
65                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
66                     else
67                         s = string("/") + s;
68                 }
69                 break;
70
71             case XMLTOOLING_XML_FILE:
72                 s = m_xml + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
73                 if (!isAbsolute(m_xml.c_str()))
74                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
75                 break;
76
77             case XMLTOOLING_RUN_FILE:
78                 s = m_run + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
79                 if (!isAbsolute(m_run.c_str())) {
80                     if (prefix || m_defaultPrefix != "/usr")
81                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
82                     else
83                         s = string("/") + s;
84                 }
85                 break;
86
87             case XMLTOOLING_CFG_FILE:
88                 s = m_cfg + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
89                 if (!isAbsolute(m_cfg.c_str())) {
90                     if (prefix || m_defaultPrefix != "/usr")
91                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
92                     else
93                         s = string("/") + s;
94                 }
95                 break;
96
97             default:
98                 throw XMLToolingException("Unknown file type to resolve.");
99         }
100     }
101     return s;
102 }