278 lines
6.5 KiB
Text
278 lines
6.5 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file documentSpec.I
|
||
|
* @author drose
|
||
|
* @date 2003-01-28
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE DocumentSpec::
|
||
|
DocumentSpec() {
|
||
|
_request_mode = RM_any;
|
||
|
_cache_control = CC_allow_cache;
|
||
|
_flags = 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE DocumentSpec::
|
||
|
DocumentSpec(const std::string &url) :
|
||
|
_url(url)
|
||
|
{
|
||
|
_request_mode = RM_any;
|
||
|
_cache_control = CC_allow_cache;
|
||
|
_flags = 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE DocumentSpec::
|
||
|
DocumentSpec(const URLSpec &url) :
|
||
|
_url(url)
|
||
|
{
|
||
|
_request_mode = RM_any;
|
||
|
_cache_control = CC_allow_cache;
|
||
|
_flags = 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE DocumentSpec::
|
||
|
DocumentSpec(const DocumentSpec ©) :
|
||
|
_url(copy._url),
|
||
|
_tag(copy._tag),
|
||
|
_date(copy._date),
|
||
|
_request_mode(copy._request_mode),
|
||
|
_cache_control(copy._cache_control),
|
||
|
_flags(copy._flags)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
operator = (const DocumentSpec ©) {
|
||
|
_url = copy._url;
|
||
|
_tag = copy._tag;
|
||
|
_date = copy._date;
|
||
|
_request_mode = copy._request_mode;
|
||
|
_cache_control = copy._cache_control;
|
||
|
_flags = copy._flags;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool DocumentSpec::
|
||
|
operator == (const DocumentSpec &other) const {
|
||
|
return compare_to(other) == 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool DocumentSpec::
|
||
|
operator != (const DocumentSpec &other) const {
|
||
|
return compare_to(other) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
INLINE bool DocumentSpec::
|
||
|
operator < (const DocumentSpec &other) const {
|
||
|
return compare_to(other) < 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes the URL of the DocumentSpec without modifying its other properties.
|
||
|
* Normally this would be a strange thing to do, because the tag and date are
|
||
|
* usually strongly associated with the URL. To get a DocumentSpec pointing
|
||
|
* to a new URL, you would normally create a new DocumentSpec object.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
set_url(const URLSpec &url) {
|
||
|
_url = url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieves the URL of the DocumentSpec.
|
||
|
*/
|
||
|
INLINE const URLSpec &DocumentSpec::
|
||
|
get_url() const {
|
||
|
return _url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes the identity tag associated with the DocumentSpec.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
set_tag(const HTTPEntityTag &tag) {
|
||
|
_tag = tag;
|
||
|
_flags |= F_has_tag;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if an identity tag is associated with the DocumentSpec.
|
||
|
*/
|
||
|
INLINE bool DocumentSpec::
|
||
|
has_tag() const {
|
||
|
return (_flags & F_has_tag) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the identity tag associated with the DocumentSpec, if there is one.
|
||
|
* It is an error to call this if has_tag() returns false.
|
||
|
*
|
||
|
* The identity tag is set by the HTTP server to uniquely refer to a
|
||
|
* particular version of a document.
|
||
|
*/
|
||
|
INLINE const HTTPEntityTag &DocumentSpec::
|
||
|
get_tag() const {
|
||
|
nassertr(has_tag(), _tag);
|
||
|
return _tag;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the identity tag associated with the DocumentSpec, if there is one.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
clear_tag() {
|
||
|
_flags &= ~F_has_tag;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes the last-modified date associated with the DocumentSpec.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
set_date(const HTTPDate &date) {
|
||
|
_date = date;
|
||
|
_flags |= F_has_date;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if a last-modified date is associated with the DocumentSpec.
|
||
|
*/
|
||
|
INLINE bool DocumentSpec::
|
||
|
has_date() const {
|
||
|
return (_flags & F_has_date) != 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the last-modified date associated with the DocumentSpec, if there
|
||
|
* is one. It is an error to call this if has_date() returns false.
|
||
|
*/
|
||
|
INLINE const HTTPDate &DocumentSpec::
|
||
|
get_date() const {
|
||
|
nassertr(has_date(), _date);
|
||
|
return _date;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the last-modified date associated with the DocumentSpec, if there
|
||
|
* is one.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
clear_date() {
|
||
|
_flags &= ~F_has_date;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the request mode of this DocumentSpec. This is only relevant when
|
||
|
* using the DocumentSpec to generate a request (for instance, in
|
||
|
* HTTPChannel). This specifies whether the document request will ask the
|
||
|
* server for a newer version than the indicated version, or the exact
|
||
|
* version, neither, or either.
|
||
|
*
|
||
|
* The possible values are:
|
||
|
*
|
||
|
* RM_any: ignore date and tag (if specified), and retrieve any document that
|
||
|
* matches the URL. For a subrange request, if the document matches the
|
||
|
* version indicated exactly, retrieve the subrange only; otherwise, retrieve
|
||
|
* the entire document.
|
||
|
*
|
||
|
* RM_equal: request only the precise version of the document that matches the
|
||
|
* particular date and/or tag exactly, if specified; fail if this version is
|
||
|
* not available.
|
||
|
*
|
||
|
* RM_newer: request any document that is newer than the version indicated by
|
||
|
* the particular date and/or tag; fail if only that version (or older
|
||
|
* versions) are available.
|
||
|
*
|
||
|
* RM_newer_or_equal: request any document that matches the version indicated
|
||
|
* by the particular date and/or tag, or is a newer version; fail if only
|
||
|
* older versions are available.
|
||
|
*
|
||
|
* In any of the above, you may specify either or both of the last-modified
|
||
|
* date and the identity tag, whichever is known to the client.
|
||
|
*
|
||
|
* The default mode is RM_any.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
set_request_mode(DocumentSpec::RequestMode request_mode) {
|
||
|
_request_mode = request_mode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the request mode of this DocumentSpec. See set_request_mode().
|
||
|
*/
|
||
|
INLINE DocumentSpec::RequestMode DocumentSpec::
|
||
|
get_request_mode() const {
|
||
|
return _request_mode;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Specifies what kind of cached value is acceptable for this document.
|
||
|
* Warning: some HTTP proxies may not respect this setting and may return a
|
||
|
* cached result anyway.
|
||
|
*
|
||
|
* CC_allow_cache: the normal HTTP behavior; the server may return a cached
|
||
|
* value if it believes it is valid.
|
||
|
*
|
||
|
* CC_revalidate: a proxy is forced to contact the origin server and verify
|
||
|
* that is cached value is in fact still valid before it returns it.
|
||
|
*
|
||
|
* CC_no_cache: a proxy must not return its cached value at all, but is forced
|
||
|
* to go all the way back to the origin server for the official document.
|
||
|
*
|
||
|
* The default mode is CC_allow_cache.
|
||
|
*/
|
||
|
INLINE void DocumentSpec::
|
||
|
set_cache_control(DocumentSpec::CacheControl cache_control) {
|
||
|
_cache_control = cache_control;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the request mode of this DocumentSpec. See set_cache_control().
|
||
|
*/
|
||
|
INLINE DocumentSpec::CacheControl DocumentSpec::
|
||
|
get_cache_control() const {
|
||
|
return _cache_control;
|
||
|
}
|
||
|
|
||
|
INLINE std::istream &
|
||
|
operator >> (std::istream &in, DocumentSpec &doc) {
|
||
|
if (!doc.input(in)) {
|
||
|
in.clear(std::ios::failbit | in.rdstate());
|
||
|
}
|
||
|
return in;
|
||
|
}
|
||
|
|
||
|
INLINE std::ostream &
|
||
|
operator << (std::ostream &out, const DocumentSpec &doc) {
|
||
|
doc.output(out);
|
||
|
return out;
|
||
|
}
|