2 * Copyright 2001-2009 Internet2
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 * Resolves local filenames into absolute pathnames.
24 #include "exceptions.h"
25 #include "util/PathResolver.h"
27 using namespace xmltooling;
30 PathResolver::PathResolver() : m_defaultPackage(PACKAGE_NAME), m_defaultPrefix("/usr")
32 setLibDir("/usr/lib");
33 setLogDir("/var/log");
34 setXMLDir("/usr/share/xml");
35 setRunDir("/var/run");
39 PathResolver::~PathResolver()
43 void PathResolver::setDefaultPackageName(const char* pkgname)
45 m_defaultPackage = pkgname;
48 void PathResolver::setDefaultPrefix(const char* prefix)
50 m_defaultPrefix = prefix;
53 void PathResolver::setLibDir(const char* dir)
58 void PathResolver::setLogDir(const char* dir)
63 void PathResolver::setXMLDir(const char* dir)
68 void PathResolver::setRunDir(const char* dir)
73 void PathResolver::setCfgDir(const char* dir)
78 bool PathResolver::isAbsolute(const char* s) const
87 return (*(s+1) == '.' || *(s+1) == '/' || *(s+1) == '\\');
92 const string& PathResolver::resolve(string& s, file_type_t filetype, const char* pkgname, const char* prefix) const
94 if (!isAbsolute(s.c_str())) {
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;
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;
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;
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;
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;
139 throw XMLToolingException("Unknown file type to resolve.");