95a1eeabffb7e683786c95de5f142c625a5ddc9a
[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 0:
82             return false;
83         case '/':
84         case '\\':
85             return true;
86         case '.':
87             return (*(s+1) == '.' || *(s+1) == '/' || *(s+1) == '\\');
88     }
89     return *(s+1) == ':';
90 }
91
92 const string& PathResolver::resolve(string& s, file_type_t filetype, const char* pkgname, const char* prefix) const
93 {
94     if (!isAbsolute(s.c_str())) {
95         switch (filetype) {
96             case XMLTOOLING_LIB_FILE:
97                 s = m_lib + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
98                 if (!isAbsolute(m_lib.c_str()))
99                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
100                 break;
101
102             case XMLTOOLING_LOG_FILE:
103                 s = m_log + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
104                 if (!isAbsolute(m_log.c_str())) {
105                     if (prefix || m_defaultPrefix != "/usr")
106                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
107                     else
108                         s = string("/") + s;
109                 }
110                 break;
111
112             case XMLTOOLING_XML_FILE:
113                 s = m_xml + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
114                 if (!isAbsolute(m_xml.c_str()))
115                     s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
116                 break;
117
118             case XMLTOOLING_RUN_FILE:
119                 s = m_run + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
120                 if (!isAbsolute(m_run.c_str())) {
121                     if (prefix || m_defaultPrefix != "/usr")
122                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
123                     else
124                         s = string("/") + s;
125                 }
126                 break;
127
128             case XMLTOOLING_CFG_FILE:
129                 s = m_cfg + '/' + (pkgname ? pkgname : m_defaultPackage) + '/' + s;
130                 if (!isAbsolute(m_cfg.c_str())) {
131                     if (prefix || m_defaultPrefix != "/usr")
132                         s = string(prefix ? prefix : m_defaultPrefix) + '/' + s;
133                     else
134                         s = string("/") + s;
135                 }
136                 break;
137
138             default:
139                 throw XMLToolingException("Unknown file type to resolve.");
140         }
141     }
142     return s;
143 }