blob: 85ab228824be33decd183ae0d89f537b3539ec1c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "URISupport.hpp"
#include <algorithm>
#include <xercesc/util/Janitor.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xalanc/Include/STLHelper.hpp>
#include "XalanUnicode.hpp"
#include "XalanParsedURI.hpp"
namespace XALAN_CPP_NAMESPACE {
const XalanDOMChar URISupport::s_fileProtocolString1[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charColon,
XalanUnicode::charSolidus,
XalanUnicode::charSolidus,
0
};
const XalanDOMChar URISupport::s_fileProtocolString2[] =
{
XalanUnicode::charLetter_f,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_e,
XalanUnicode::charColon,
XalanUnicode::charSolidus,
XalanUnicode::charSolidus,
XalanUnicode::charSolidus,
0
};
URISupport::URLAutoPtrType
URISupport::getURLFromString(
const XalanDOMChar* urlString,
MemoryManager& theManager)
{
URLAutoPtrType url(new (&theManager) XMLURLType(&theManager));
XalanDOMString normalizedURL(theManager);
getURLStringFromString(urlString, normalizedURL);
url->setURL(normalizedURL.c_str());
return url;
}
void
URISupport::getURLStringFromString(
const XalanDOMChar* urlString,
XalanDOMString::size_type len,
XalanDOMString& theNormalizedURI)
{
assert(urlString != 0);
// Let's see what sort of URI we have...
if (len != 0)
{
const XalanDOMString::size_type index = indexOf(urlString, XalanUnicode::charColon);
bool protocolPresent = false;
if (index != len)
{
const XalanDOMString theProtocolString(urlString, theNormalizedURI.getMemoryManager(), index );
// $$$ ToDo: XMLURL::lookupByName() is supposed to be static, but is not.
const XMLURLType::Protocols theProtocol =
XMLURLType::lookupByName(theProtocolString.c_str());
if (theProtocol != XMLURLType::Unknown)
{
protocolPresent = true;
}
}
if (protocolPresent == true)
{
theNormalizedURI = urlString;
NormalizeURIText(theNormalizedURI);
}
else
{
using xercesc::ArrayJanitor;
using xercesc::XMLPlatformUtils;
// Assume it's a file specification...
using xercesc::MemoryManager;
MemoryManager& theMemoryManager = theNormalizedURI.getMemoryManager();
const ArrayJanitor<XMLCh> theFullPathGuard(
XMLPlatformUtils::getFullPath(
urlString,
&theMemoryManager),
&theMemoryManager);
const XalanDOMChar* const theFullPath = theFullPathGuard.get();
assert(theFullPath != 0);
const XalanDOMString::size_type theFullPathLength =
XalanDOMString::length(theFullPath);
assert(theFullPathLength > 0);
if (theFullPath[0] == XalanDOMChar(XalanUnicode::charSolidus))
{
const size_t theSize = sizeof(s_fileProtocolString1) / sizeof(s_fileProtocolString1[0]) - 1;
theNormalizedURI.reserve(theFullPathLength + theSize);
theNormalizedURI.assign(s_fileProtocolString1, theSize);
}
else
{
const size_t theSize = sizeof(s_fileProtocolString2) / sizeof(s_fileProtocolString2[0]) - 1;
theNormalizedURI.reserve(theFullPathLength + theSize);
theNormalizedURI.assign(s_fileProtocolString2, theSize);
}
theNormalizedURI.append(theFullPath, theFullPathLength);
NormalizeURIText(theNormalizedURI);
}
}
}
void
URISupport::getURLStringFromString(
const XalanDOMChar* urlString,
XalanDOMString::size_type urlStringLen,
const XalanDOMChar* base,
XalanDOMString::size_type baseLen,
XalanDOMString& theNormalizedURI)
{
MemoryManager& theMemoryManager = theNormalizedURI.getMemoryManager();
XalanDOMString context(base, theMemoryManager, baseLen);
XalanDOMString url(urlString, theMemoryManager, urlStringLen);
// Flip slashes
NormalizeURIText(context);
NormalizeURIText(url);
// Resolve the URI
XalanParsedURI::resolve(url, context, url);
// Do platform specific stuff
getURLStringFromString(url, theNormalizedURI);
}
XalanDOMString&
URISupport::NormalizeURIText(XalanDOMString& uriString)
{
// OK, look for a quick, cheap exit...
const XalanDOMString::size_type len = uriString.length();
const XalanDOMString::size_type index = indexOf(uriString, XalanUnicode::charReverseSolidus);
if (index != len)
{
// Start replacing at the index point, since that's the
// first one...
std::replace(
uriString.begin() + index,
uriString.end(),
XalanUnicode::charReverseSolidus,
XalanUnicode::charSolidus);
}
return uriString;
}
URISupport::InvalidURIException::InvalidURIException(
const XalanDOMString& theMessage,
MemoryManager& theManager,
const Locator* theLocator) :
XSLException(
theMessage,
theManager,
theLocator)
{
}
URISupport::InvalidURIException::InvalidURIException(
const XalanDOMString& theMessage,
MemoryManager& theManager) :
XSLException(
theMessage,
theManager)
{
}
URISupport::InvalidURIException::~InvalidURIException()
{
}
static const XalanDOMChar s_type[] =
{
XalanUnicode::charLetter_I,
XalanUnicode::charLetter_n,
XalanUnicode::charLetter_v,
XalanUnicode::charLetter_a,
XalanUnicode::charLetter_l,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_d,
XalanUnicode::charLetter_U,
XalanUnicode::charLetter_R,
XalanUnicode::charLetter_I,
XalanUnicode::charLetter_E,
XalanUnicode::charLetter_x,
XalanUnicode::charLetter_c,
XalanUnicode::charLetter_e,
XalanUnicode::charLetter_p,
XalanUnicode::charLetter_t,
XalanUnicode::charLetter_i,
XalanUnicode::charLetter_o,
XalanUnicode::charLetter_n,
0
};
const XalanDOMChar*
URISupport::InvalidURIException::getType() const
{
return s_type;
}
}