blob: c3d8a9160aeac519d4dd85d79a1f139283477ebb [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.
*/
#if !defined(XALANPARSEDURI_HEADER_GUARD_1357924680)
#define XALANPARSEDURI_HEADER_GUARD_1357924680
// Base include file. Must be first.
#include <xalanc/PlatformSupport/PlatformSupportDefinitions.hpp>
#include <xalanc/XalanDOM/XalanDOMString.hpp>
namespace XALAN_CPP_NAMESPACE {
/**
* URI handling (hopefully) according to RFC2396.
*/
class XALAN_PLATFORMSUPPORT_EXPORT XalanParsedURI
{
public:
// Flags to say if a component is defined. Note that each component may
// be defined but empty, except for the path.
enum eComponent
{
d_scheme = 1,
d_authority = 2,
d_query = 4,
d_fragment = 8
};
/**
* Default constructor
*/
XalanParsedURI(MemoryManager& theManager) :
m_scheme(theManager),
m_authority(theManager),
m_path(theManager),
m_query(theManager),
m_fragment(theManager),
m_defined(0)
{
}
/**
* Constructor which parses the passed in uri
*
* @param uriString URI to parse
* @param uriStringLen Length of the URI string
*/
XalanParsedURI(
const XalanDOMChar* uriString,
XalanDOMString::size_type uriStringLen,
MemoryManager& theManager) :
m_scheme(theManager),
m_authority(theManager),
m_path(theManager),
m_query(theManager),
m_fragment(theManager),
m_defined(0)
{
parse(uriString, uriStringLen);
}
/**
* Constructor which parses the passed in uri
*
* @param uriString URI to parse
*/
XalanParsedURI(
const XalanDOMString &uriString,
MemoryManager& theManager) :
m_scheme(theManager),
m_authority(theManager),
m_path(theManager),
m_query(theManager),
m_fragment(theManager),
m_defined(0)
{
parse(uriString.c_str(), uriString.length());
}
MemoryManager&
getMemoryManager()
{
return m_scheme.getMemoryManager();
}
/**
* Parse the passed in uri
*
* @param uriString URI to parse
* @param uriStringLen Length of the URI string
*/
void parse(
const XalanDOMChar* uriString,
XalanDOMString::size_type uriStringLen);
/**
* Parse the passed in uri
*
* @param uriString URI to parse
* @param uriStringLen Length of the URI string
*/
void parse(
const XalanDOMString &uriString)
{
parse(uriString.c_str(), uriString.length());
}
/**
* Reassemble the uri components to make a complete URI
*
* @return The reassembled URI
*/
XalanDOMString& make(XalanDOMString& theResult) const;
/**
* Resolve this URI relative to another, according to RFC2396.
*
* @param base The base URI to use during resolution.
*/
void resolve(const XalanParsedURI &base);
/**
* Resolve this URI relative to another.
*
* @param base The base URI string
* @param baseLen The length of the base URI
*/
void resolve(
const XalanDOMChar *base,
const XalanDOMString::size_type baseLen)
{
XalanParsedURI baseURI(base, baseLen,getMemoryManager());
resolve(baseURI);
}
/**
* Resolve this URI relative to another.
*
* @param base The base URI string
*/
void resolve(
const XalanDOMString &base)
{
resolve(base.c_str(), base.length());
}
/**
* Resolve the one URI relative to another.
*
* @relative The URI string to resolve
* @relativeLen The lengh of the relative URI string
* @base The base URI string
* @baseLen The length of the base URI string
*
*/
static XalanDOMString& resolve(
const XalanDOMChar *relative,
XalanDOMString::size_type relativeLen,
const XalanDOMChar *base,
XalanDOMString::size_type baseLen,
XalanDOMString& theResult
);
/**
* Resolve the one URI relative to another.
*
* @relative The URI string to resolve
* @base The base URI string
*
*/
static XalanDOMString& resolve(
const XalanDOMString &relative,
const XalanDOMString &base,
XalanDOMString& theResult
)
{
return resolve(relative.c_str(), relative.length(), base.c_str(), base.length(), theResult);
}
/**
* Get the scheme component
*/
const XalanDOMString& getScheme() const
{
return m_scheme;
}
/**
* See if the scheme component is defined.
*/
bool isSchemeDefined() const
{
return m_defined & d_scheme;
}
/**
* Set the scheme component. Also sets the scheme defined flag.
*/
void setScheme(const XalanDOMChar *scheme)
{
m_scheme = scheme;
m_defined |= d_scheme;
}
/**
* Set the scheme component. Also sets the scheme defined flag.
*/
void setScheme(const XalanDOMString &scheme)
{
m_scheme = scheme;
m_defined |= d_scheme;
}
/**
* Get the authority component
*/
const XalanDOMString& getAuthority() const
{
return m_authority;
}
/**
* See if the authority component is defined.
*/
bool isAuthorityDefined() const
{
return m_defined & d_authority ? true : false;
}
/**
* Set the authority component. Also sets the authority defined flag.
*/
void setAuthority(const XalanDOMChar *authority)
{
m_authority = authority;
m_defined |= d_authority;
}
/**
* Set the authority component. Also sets the authority defined flag.
*/
void setAuthority(const XalanDOMString &authority)
{
m_authority = authority;
m_defined |= d_authority;
}
/**
* Get the path component
*/
const XalanDOMString& getPath() const
{
return m_path;
}
/**
* Set the path component.
*/
void setPath(const XalanDOMChar *path)
{
m_path = path;
}
/**
* Set the path component.
*/
void setPath(const XalanDOMString &path)
{
m_path = path;
}
/**
* Get function to get the query component
*/
const XalanDOMString& getQuery() const
{
return m_query;
}
/**
* See if the query component is defined.
*/
bool isQueryDefined() const
{
return m_defined & d_query ? true : false;
}
/**
* Set the query component. Also sets the query defined flag.
*/
void setQuery(const XalanDOMChar *query)
{
m_query = query;
m_defined |= d_query;
}
/**
* Set the query component. Also sets the query defined flag.
*/
void setQuery(const XalanDOMString &query)
{
m_query = query;
m_defined |= d_query;
}
/**
* Get the fragment component
*/
const XalanDOMString& getFragment() const
{
return m_fragment;
}
/**
* See if the fragment component is defined.
*/
bool isFragmentDefined() const
{
return m_defined & d_fragment ? true : false;
}
/**
* Set the fragment component. Also sets the fragment defined flag.
*/
void setFragment(const XalanDOMChar *fragment)
{
m_fragment = fragment;
m_defined |= d_fragment;
}
/**
* Set the fragment component. Also sets the fragment defined flag.
*/
void setFragment(const XalanDOMString &fragment)
{
m_fragment = fragment;
m_defined |= d_fragment;
}
/**
* Get the defined components mask.
*/
unsigned int getDefined() const
{
return m_defined;
}
/**
* Set the defined components mask.
*/
void setDefined(unsigned int defined)
{
m_defined = defined;
}
private:
// not implemented
XalanParsedURI();
XalanParsedURI(const XalanParsedURI&);
XalanDOMString m_scheme;
XalanDOMString m_authority;
XalanDOMString m_path;
XalanDOMString m_query;
XalanDOMString m_fragment;
unsigned int m_defined;
};
}
#endif // XALANPARSEDURI_HEADER_GUARD_1357924680