commit
9faa981d82
@ -1,190 +0,0 @@
|
|||||||
#
|
|
||||||
# Find the W3C libwww includes and library
|
|
||||||
#
|
|
||||||
# This module defines
|
|
||||||
# LIBWWW_INCLUDE_DIR, where to find tiff.h, etc.
|
|
||||||
# LIBWWW_LIBRARY, where to find the Libwww library.
|
|
||||||
# LIBWWW_FOUND, If false, do not try to use Libwww.
|
|
||||||
|
|
||||||
OPTION(WITH_LIBWWW_STATIC "Use only static libraries for libwww" OFF)
|
|
||||||
|
|
||||||
# also defined, but not for general use are
|
|
||||||
IF(LIBWWW_LIBRARIES AND LIBWWW_INCLUDE_DIR)
|
|
||||||
# in cache already
|
|
||||||
SET(Libwww_FIND_QUIETLY TRUE)
|
|
||||||
ENDIF(LIBWWW_LIBRARIES AND LIBWWW_INCLUDE_DIR)
|
|
||||||
|
|
||||||
FIND_PATH(LIBWWW_INCLUDE_DIR
|
|
||||||
WWWInit.h
|
|
||||||
PATHS
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include
|
|
||||||
/sw/include
|
|
||||||
/opt/local/include
|
|
||||||
/opt/csw/include
|
|
||||||
/opt/include
|
|
||||||
PATH_SUFFIXES libwww w3c-libwww
|
|
||||||
)
|
|
||||||
|
|
||||||
# when installing libwww on mac os x using macports the file wwwconf.h resides
|
|
||||||
# in /opt/local/include and not in the real libwww include dir :/
|
|
||||||
FIND_PATH(LIBWWW_ADDITIONAL_INCLUDE_DIR
|
|
||||||
wwwconf.h
|
|
||||||
PATHS
|
|
||||||
/usr/local/include
|
|
||||||
/usr/include
|
|
||||||
/sw/include
|
|
||||||
/opt/local/include
|
|
||||||
/opt/csw/include
|
|
||||||
/opt/include
|
|
||||||
)
|
|
||||||
|
|
||||||
# combine both include directories into one variable
|
|
||||||
IF(LIBWWW_ADDITIONAL_INCLUDE_DIR)
|
|
||||||
SET(LIBWWW_INCLUDE_DIR ${LIBWWW_INCLUDE_DIR} ${LIBWWW_ADDITIONAL_INCLUDE_DIR})
|
|
||||||
ENDIF(LIBWWW_ADDITIONAL_INCLUDE_DIR)
|
|
||||||
|
|
||||||
# helper to find all the libwww sub libraries
|
|
||||||
MACRO(FIND_WWW_LIBRARY MYLIBRARY OPTION FILE)
|
|
||||||
IF(WITH_LIBWWW_STATIC AND UNIX AND NOT APPLE AND NOT WITH_STATIC_EXTERNAL)
|
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES_OLD ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
|
||||||
ENDIF(WITH_LIBWWW_STATIC AND UNIX AND NOT APPLE AND NOT WITH_STATIC_EXTERNAL)
|
|
||||||
|
|
||||||
FIND_LIBRARY(${MYLIBRARY}_RELEASE
|
|
||||||
NAMES ${FILE}
|
|
||||||
PATHS
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/usr/lib/x86_64-linux-gnu
|
|
||||||
/usr/local/X11R6/lib
|
|
||||||
/usr/X11R6/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(${MYLIBRARY}_DEBUG
|
|
||||||
NAMES ${FILE}d
|
|
||||||
PATHS
|
|
||||||
/usr/local/lib
|
|
||||||
/usr/lib
|
|
||||||
/usr/lib/x86_64-linux-gnu
|
|
||||||
/usr/local/X11R6/lib
|
|
||||||
/usr/X11R6/lib
|
|
||||||
/sw/lib
|
|
||||||
/opt/local/lib
|
|
||||||
/opt/csw/lib
|
|
||||||
/opt/lib
|
|
||||||
/usr/freeware/lib64
|
|
||||||
)
|
|
||||||
|
|
||||||
IF(CMAKE_FIND_LIBRARY_SUFFIXES_OLD)
|
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_OLD})
|
|
||||||
ENDIF(CMAKE_FIND_LIBRARY_SUFFIXES_OLD)
|
|
||||||
|
|
||||||
IF(${MYLIBRARY}_RELEASE AND ${MYLIBRARY}_DEBUG)
|
|
||||||
IF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
SET(LIBWWW_LIBRARIES ${LIBWWW_LIBRARIES} optimized ${${MYLIBRARY}_RELEASE} debug ${${MYLIBRARY}_DEBUG})
|
|
||||||
ENDIF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
ELSEIF(${MYLIBRARY}_RELEASE)
|
|
||||||
IF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
SET(LIBWWW_LIBRARIES ${LIBWWW_LIBRARIES} ${${MYLIBRARY}_RELEASE})
|
|
||||||
ENDIF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
ELSEIF(${MYLIBRARY}_DEBUG)
|
|
||||||
IF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
SET(LIBWWW_LIBRARIES ${LIBWWW_LIBRARIES} ${${MYLIBRARY}_DEBUG})
|
|
||||||
ENDIF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC)
|
|
||||||
ELSE(${MYLIBRARY}_RELEASE AND ${MYLIBRARY}_DEBUG)
|
|
||||||
IF(NOT Libwww_FIND_QUIETLY AND NOT WIN32)
|
|
||||||
MESSAGE(STATUS "Warning: Libwww: Library not found: ${MYLIBRARY}")
|
|
||||||
ENDIF(NOT Libwww_FIND_QUIETLY AND NOT WIN32)
|
|
||||||
ENDIF(${MYLIBRARY}_RELEASE AND ${MYLIBRARY}_DEBUG)
|
|
||||||
|
|
||||||
MARK_AS_ADVANCED(${MYLIBRARY}_RELEASE ${MYLIBRARY}_DEBUG)
|
|
||||||
ENDMACRO(FIND_WWW_LIBRARY)
|
|
||||||
|
|
||||||
MACRO(LINK_WWW_LIBRARY MYLIBRARY OTHERLIBRARY SYMBOL)
|
|
||||||
IF(NOT WITH_LIBWWW_STATIC AND NOT WITH_STATIC_EXTERNAL)
|
|
||||||
LINK_DEPENDS(LIBWWW_LIBRARIES ${MYLIBRARY} ${OTHERLIBRARY} ${SYMBOL})
|
|
||||||
ENDIF(NOT WITH_LIBWWW_STATIC AND NOT WITH_STATIC_EXTERNAL)
|
|
||||||
ENDMACRO(LINK_WWW_LIBRARY)
|
|
||||||
|
|
||||||
# Find and link required libs for static or dynamic
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWAPP_LIBRARY REQUIRED wwwapp) # cache core file ftp gopher html http mime news stream telnet trans utils zip xml xmlparse
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWCORE_LIBRARY REQUIRED wwwcore) # utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWFILE_LIBRARY REQUIRED wwwfile) # core trans utils html
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWHTML_LIBRARY REQUIRED wwwhtml) # core utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWHTTP_LIBRARY REQUIRED wwwhttp) # md5 core mime stream utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWMIME_LIBRARY REQUIRED wwwmime) # core cache stream utils
|
|
||||||
|
|
||||||
# Required for static or if underlinking
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWCACHE_LIBRARY OPTIONAL wwwcache) # core trans utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWSTREAM_LIBRARY OPTIONAL wwwstream) # core file utils
|
|
||||||
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWTRANS_LIBRARY REQUIRED wwwtrans) # core utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWUTILS_LIBRARY REQUIRED wwwutils)
|
|
||||||
|
|
||||||
|
|
||||||
# Required only if underlinking
|
|
||||||
|
|
||||||
# Unused protocols
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWFTP_LIBRARY OPTIONAL wwwftp) # core file utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWGOPHER_LIBRARY OPTIONAL wwwgopher) # core html utils file
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWNEWS_LIBRARY OPTIONAL wwwnews) # core html mime stream utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWTELNET_LIBRARY OPTIONAL wwwtelnet) # core utils
|
|
||||||
|
|
||||||
# Other used by app
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWDIR_LIBRARY OPTIONAL wwwdir) # file
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWINIT_LIBRARY OPTIONAL wwwinit) # app cache core file html utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWMUX_LIBRARY OPTIONAL wwwmux) # core stream trans utils
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWXML_LIBRARY OPTIONAL wwwxml) # core utils xmlparse
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWZIP_LIBRARY OPTIONAL wwwzip) # core utils
|
|
||||||
FIND_WWW_LIBRARY(LIBXMLPARSE_LIBRARY OPTIONAL xmlparse) # xmltok
|
|
||||||
|
|
||||||
# Other used by other
|
|
||||||
FIND_WWW_LIBRARY(LIBXMLTOK_LIBRARY OPTIONAL xmltok)
|
|
||||||
FIND_WWW_LIBRARY(LIBWWWSSL_LIBRARY OPTIONAL wwwssl)
|
|
||||||
FIND_WWW_LIBRARY(LIBMD5_LIBRARY OPTIONAL md5)
|
|
||||||
FIND_WWW_LIBRARY(LIBPICS_LIBRARY OPTIONAL pics)
|
|
||||||
|
|
||||||
# Other external libraries
|
|
||||||
FIND_PACKAGE(EXPAT QUIET)
|
|
||||||
FIND_PACKAGE(OpenSSL QUIET)
|
|
||||||
FIND_WWW_LIBRARY(LIBREGEX_LIBRARY OPTIONAL gnu_regex)
|
|
||||||
|
|
||||||
# Now link all libs together
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWCACHE_LIBRARY HTLoadCache)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWCACHE_LIBRARY HTCacheAppend)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWFTP_LIBRARY HTLoadFTP)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWGOPHER_LIBRARY HTLoadGopher)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWNEWS_LIBRARY HTLoadNews)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWTELNET_LIBRARY HTLoadTelnet)
|
|
||||||
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWSTREAM_LIBRARY HTStreamToChunk)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWSTREAM_LIBRARY HTGuess_new)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWFILE_LIBRARY LIBWWWDIR_LIBRARY HTDir_new)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWINIT_LIBRARY HTProtocolInit)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWXML_LIBRARY HTXML_new)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBWWWZIP_LIBRARY HTZLib_inflate)
|
|
||||||
|
|
||||||
# libwwwxml can be linked to xmlparse or expat
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWXML_LIBRARY LIBXMLPARSE_LIBRARY XML_ParserCreate)
|
|
||||||
|
|
||||||
IF(LIBXMLPARSE_LIBRARY_LINKED)
|
|
||||||
LINK_WWW_LIBRARY(LIBXMLPARSE_LIBRARY EXPAT_LIBRARY XmlInitEncoding)
|
|
||||||
ELSE(LIBXMLPARSE_LIBRARY_LINKED)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWXML_LIBRARY EXPAT_LIBRARY XML_ParserCreate)
|
|
||||||
ENDIF(LIBXMLPARSE_LIBRARY_LINKED)
|
|
||||||
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWHTTP_LIBRARY LIBMD5_LIBRARY MD5Init)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY LIBREGEX_LIBRARY regexec)
|
|
||||||
LINK_WWW_LIBRARY(LIBWWWAPP_LIBRARY OPENSSL_LIBRARIES SSL_new)
|
|
||||||
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Libwww DEFAULT_MSG
|
|
||||||
LIBWWW_LIBRARIES
|
|
||||||
LIBWWW_INCLUDE_DIR
|
|
||||||
)
|
|
@ -1,28 +0,0 @@
|
|||||||
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef LIBWWW_NEL_STREAM_H
|
|
||||||
#define LIBWWW_NEL_STREAM_H
|
|
||||||
|
|
||||||
|
|
||||||
#include "HTProt.h"
|
|
||||||
|
|
||||||
extern "C" HTProtCallback HTLoadNeLFile;
|
|
||||||
extern "C" PUBLIC HTInputStream * HTNeLReader_new (HTHost * host, HTChannel * ch, void * param, int mode);
|
|
||||||
|
|
||||||
#endif // LIBWWW_NEL_STREAM_H
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,63 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_URL_PARSER_H
|
||||||
|
#define CL_URL_PARSER_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Simple URL parser
|
||||||
|
* \author Meelis Mägi
|
||||||
|
* \date 2015
|
||||||
|
*/
|
||||||
|
class CUrlParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CUrlParser(){}
|
||||||
|
|
||||||
|
// parse uri to components
|
||||||
|
CUrlParser(const std::string &url);
|
||||||
|
|
||||||
|
// parse uri to components
|
||||||
|
void parse(std::string uri);
|
||||||
|
|
||||||
|
// serialize URL back to string
|
||||||
|
std::string toString() const;
|
||||||
|
|
||||||
|
// inherit scheme, domain, path from given url
|
||||||
|
void inherit(const std::string &url);
|
||||||
|
|
||||||
|
// if current parts can compose absolute url or not
|
||||||
|
bool isAbsolute() const;
|
||||||
|
|
||||||
|
// resolve relative path like './a/../b' to absolute path '/a/b'
|
||||||
|
static void resolveRelativePath(std::string &path);
|
||||||
|
|
||||||
|
public:
|
||||||
|
std::string scheme;
|
||||||
|
std::string domain;
|
||||||
|
std::string path;
|
||||||
|
std::string query;
|
||||||
|
std::string hash;
|
||||||
|
};
|
||||||
|
|
||||||
|
}// namespace
|
||||||
|
|
||||||
|
#endif // CL_URL_PARSER_H
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
// Public domain hash functions
|
||||||
|
|
||||||
|
#ifndef NLMISC_WANG_HASH_H
|
||||||
|
#define NLMISC_WANG_HASH_H
|
||||||
|
|
||||||
|
#include "types_nl.h"
|
||||||
|
|
||||||
|
namespace NLMISC {
|
||||||
|
|
||||||
|
// http://burtleburtle.net/bob/hash/integer.html
|
||||||
|
inline uint32 wangHash(uint32 a)
|
||||||
|
{
|
||||||
|
a = (a ^ 61) ^ (a >> 16);
|
||||||
|
a = a + (a << 3);
|
||||||
|
a = a ^ (a >> 4);
|
||||||
|
a = a * 0x27d4eb2d;
|
||||||
|
a = a ^ (a >> 15);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://naml.us/blog/2012/03
|
||||||
|
inline uint64 wangHash64(uint64 key)
|
||||||
|
{
|
||||||
|
key = (~key) + (key << 21); // key = (key << 21) - key - 1;
|
||||||
|
key = key ^ (key >> 24);
|
||||||
|
key = (key + (key << 3)) + (key << 8); // key * 265
|
||||||
|
key = key ^ (key >> 14);
|
||||||
|
key = (key + (key << 2)) + (key << 4); // key * 21
|
||||||
|
key = key ^ (key >> 28);
|
||||||
|
key = key + (key << 31);
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://naml.us/blog/2012/03 Inverse 64-bit wang hash
|
||||||
|
inline uint64 wangHash64Inv(uint64 key)
|
||||||
|
{
|
||||||
|
uint64 tmp;
|
||||||
|
|
||||||
|
// Invert key = key + (key << 31)
|
||||||
|
tmp = key - (key << 31);
|
||||||
|
key = key - (tmp << 31);
|
||||||
|
|
||||||
|
// Invert key = key ^ (key >> 28)
|
||||||
|
tmp = key^key >> 28;
|
||||||
|
key = key^tmp >> 28;
|
||||||
|
|
||||||
|
// Invert key *= 21
|
||||||
|
key *= 14933078535860113213u;
|
||||||
|
|
||||||
|
// Invert key = key ^ (key >> 14)
|
||||||
|
tmp = key^key >> 14;
|
||||||
|
tmp = key^tmp >> 14;
|
||||||
|
tmp = key^tmp >> 14;
|
||||||
|
key = key^tmp >> 14;
|
||||||
|
|
||||||
|
// Invert key *= 265
|
||||||
|
key *= 15244667743933553977u;
|
||||||
|
|
||||||
|
// Invert key = key ^ (key >> 24)
|
||||||
|
tmp = key^key >> 24;
|
||||||
|
key = key^tmp >> 24;
|
||||||
|
|
||||||
|
// Invert key = (~key) + (key << 21)
|
||||||
|
tmp = ~key;
|
||||||
|
tmp = ~(key - (tmp << 21));
|
||||||
|
tmp = ~(key - (tmp << 21));
|
||||||
|
key = ~(key - (tmp << 21));
|
||||||
|
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* namespace NLMISC */
|
||||||
|
|
||||||
|
#endif // NLMISC_WANG_HASH_H
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,312 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#include "stdpch.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <libxml/HTMLparser.h>
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/libwww.h"
|
||||||
|
#include "nel/gui/group_html.h"
|
||||||
|
#include "nel/gui/lua_ihm.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
// ***************************************************************************
|
||||||
|
void CGroupHTML::htmlElement(xmlNode *node, int element_number)
|
||||||
|
{
|
||||||
|
SGML_dtd *HTML_DTD = HTML_dtd ();
|
||||||
|
|
||||||
|
if (element_number < HTML_ELEMENTS)
|
||||||
|
{
|
||||||
|
CXMLAutoPtr ptr;
|
||||||
|
// load attributes into libwww structs
|
||||||
|
std::vector<bool> present;
|
||||||
|
std::vector<const char *>value;
|
||||||
|
std::string strvalues[MAX_ATTRIBUTES];
|
||||||
|
present.resize(30, false);
|
||||||
|
value.resize(30);
|
||||||
|
|
||||||
|
uint nbAttributes = std::min(MAX_ATTRIBUTES, HTML_DTD->tags[element_number].number_of_attributes);
|
||||||
|
for(uint i=0; i<nbAttributes; i++)
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
name = toLower(std::string(HTML_DTD->tags[element_number].attributes[i].name));
|
||||||
|
ptr = xmlGetProp(node, (const xmlChar *)name.c_str());
|
||||||
|
if (ptr)
|
||||||
|
{
|
||||||
|
// copy xmlChar to string (xmlChar will be released)
|
||||||
|
strvalues[i] = (const char *)(ptr);
|
||||||
|
// now use string pointer in value[] array
|
||||||
|
value[i] = strvalues[i].c_str();
|
||||||
|
present[i] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element_number == HTML_A)
|
||||||
|
{
|
||||||
|
addLink(element_number, present, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
beginElement(element_number, present, value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
beginUnparsedElement((const char *)(node->name), xmlStrlen(node->name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// recursive - text content / child nodes
|
||||||
|
htmlWalkDOM(node->children);
|
||||||
|
|
||||||
|
// closing tag
|
||||||
|
if (element_number < HTML_ELEMENTS)
|
||||||
|
{
|
||||||
|
endElement(element_number);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
endUnparsedElement((const char *)(node->name), xmlStrlen(node->name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// recursive function to walk html document
|
||||||
|
void CGroupHTML::htmlWalkDOM(xmlNode *a_node)
|
||||||
|
{
|
||||||
|
SGML_dtd *HTML_DTD = HTML_dtd ();
|
||||||
|
|
||||||
|
uint element_number;
|
||||||
|
xmlNode *node = a_node;
|
||||||
|
while(node)
|
||||||
|
{
|
||||||
|
if (node->type == XML_TEXT_NODE)
|
||||||
|
{
|
||||||
|
addText((const char *)(node->content), xmlStrlen(node->content));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (node->type == XML_ELEMENT_NODE)
|
||||||
|
{
|
||||||
|
// find libwww tag
|
||||||
|
for(element_number = 0; element_number<HTML_ELEMENTS; ++element_number)
|
||||||
|
{
|
||||||
|
if (xmlStrncasecmp(node->name, (const xmlChar *)HTML_DTD->tags[element_number].name.c_str(), xmlStrlen(node->name)) == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
htmlElement(node, element_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move into next sibling
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// http://stackoverflow.com/a/18335183
|
||||||
|
static std::string correct_non_utf_8(const std::string &str)
|
||||||
|
{
|
||||||
|
int i,f_size=str.size();
|
||||||
|
unsigned char c,c2,c3,c4;
|
||||||
|
std::string to;
|
||||||
|
to.reserve(f_size);
|
||||||
|
|
||||||
|
for(i=0 ; i<f_size ; i++){
|
||||||
|
c=(unsigned char)(str[i]);
|
||||||
|
if(c<32){//control char
|
||||||
|
if(c==9 || c==10 || c==13){//allow only \t \n \r
|
||||||
|
to.append(1,c);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}else if(c<127){//normal ASCII
|
||||||
|
to.append(1,c);
|
||||||
|
continue;
|
||||||
|
}else if(c<160){//control char (nothing should be defined here either ASCI, ISO_8859-1 or UTF8, so skipping)
|
||||||
|
if(c==128){//fix microsoft mess, add euro
|
||||||
|
to.append(1,226);
|
||||||
|
to.append(1,130);
|
||||||
|
to.append(1,172);
|
||||||
|
}
|
||||||
|
if(c==133){//fix IBM mess, add NEL = \n\r
|
||||||
|
to.append(1,10);
|
||||||
|
to.append(1,13);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}else if(c<192){//invalid for UTF8, converting ASCII
|
||||||
|
to.append(1,(unsigned char)194);
|
||||||
|
to.append(1,c);
|
||||||
|
continue;
|
||||||
|
}else if(c<194){//invalid for UTF8, converting ASCII
|
||||||
|
to.append(1,(unsigned char)195);
|
||||||
|
to.append(1,c-64);
|
||||||
|
continue;
|
||||||
|
}else if(c<224 && i+1<f_size){//possibly 2byte UTF8
|
||||||
|
c2=(unsigned char)(str[i+1]);
|
||||||
|
if(c2>127 && c2<192){//valid 2byte UTF8
|
||||||
|
if(c==194 && c2<160){//control char, skipping
|
||||||
|
;
|
||||||
|
}else{
|
||||||
|
to.append(1,c);
|
||||||
|
to.append(1,c2);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}else if(c<240 && i+2<f_size){//possibly 3byte UTF8
|
||||||
|
c2=(unsigned char)(str[i+1]);
|
||||||
|
c3=(unsigned char)(str[i+2]);
|
||||||
|
if(c2>127 && c2<192 && c3>127 && c3<192){//valid 3byte UTF8
|
||||||
|
to.append(1,c);
|
||||||
|
to.append(1,c2);
|
||||||
|
to.append(1,c3);
|
||||||
|
i+=2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}else if(c<245 && i+3<f_size){//possibly 4byte UTF8
|
||||||
|
c2=(unsigned char)(str[i+1]);
|
||||||
|
c3=(unsigned char)(str[i+2]);
|
||||||
|
c4=(unsigned char)(str[i+3]);
|
||||||
|
if(c2>127 && c2<192 && c3>127 && c3<192 && c4>127 && c4<192){//valid 4byte UTF8
|
||||||
|
to.append(1,c);
|
||||||
|
to.append(1,c2);
|
||||||
|
to.append(1,c3);
|
||||||
|
to.append(1,c4);
|
||||||
|
i+=3;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//invalid UTF8, converting ASCII (c>245 || string too short for multi-byte))
|
||||||
|
to.append(1,(unsigned char)195);
|
||||||
|
to.append(1,c-64);
|
||||||
|
}
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
static void patchHtmlQuirks(std::string &htmlString)
|
||||||
|
{
|
||||||
|
size_t npos = std::string::npos;
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
// get rid of BOM (some ingame help files does not show up otherwise)
|
||||||
|
if (htmlString.substr(0, 3) == "\xEF\xBB\xBF")
|
||||||
|
{
|
||||||
|
htmlString.erase(0, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if any element is before <html>, then parser adds <html><body>
|
||||||
|
// and original tags are ignored (their attributes not processed)
|
||||||
|
//
|
||||||
|
// only fix situation when there is <body> tag with attributes
|
||||||
|
//
|
||||||
|
// tags are considered to be lowercase
|
||||||
|
|
||||||
|
pos = htmlString.find("<body ");
|
||||||
|
if (pos != npos)
|
||||||
|
{
|
||||||
|
size_t start = htmlString.find("<");
|
||||||
|
// skip <!doctype html>
|
||||||
|
if (htmlString.substr(start, 2) == "<!")
|
||||||
|
start = htmlString.find("<", start + 1);
|
||||||
|
|
||||||
|
// if there is no html tag, then abort
|
||||||
|
size_t end = htmlString.find("<html>");
|
||||||
|
if (end != npos && start < end && end < pos)
|
||||||
|
{
|
||||||
|
// body tag end position
|
||||||
|
size_t insert = htmlString.find(">", pos);
|
||||||
|
if (insert != npos)
|
||||||
|
{
|
||||||
|
std::string str = htmlString.substr(start, end - start);
|
||||||
|
htmlString.insert(insert+1, str);
|
||||||
|
htmlString.erase(start, str.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure </html> (if present) is last in document or tags coming after it are ignored
|
||||||
|
pos = htmlString.find("</html>");
|
||||||
|
if (pos != npos && htmlString.find("<", pos+1) > pos)
|
||||||
|
{
|
||||||
|
htmlString.erase(pos, 7);
|
||||||
|
htmlString += "</html>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there is invalid utf-8 chars, then libxml will break everything after first it finds.
|
||||||
|
htmlString = correct_non_utf_8(htmlString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
bool CGroupHTML::parseHtml(std::string htmlString)
|
||||||
|
{
|
||||||
|
htmlParserCtxtPtr parser = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL, XML_CHAR_ENCODING_UTF8);
|
||||||
|
if (!parser)
|
||||||
|
{
|
||||||
|
nlwarning("Creating html parser context failed");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
htmlCtxtUseOptions(parser, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
|
||||||
|
|
||||||
|
// parser is little strict on tag order, so fix whats needed
|
||||||
|
patchHtmlQuirks(htmlString);
|
||||||
|
|
||||||
|
htmlParseChunk(parser, htmlString.c_str(), htmlString.size(), 0);
|
||||||
|
htmlParseChunk(parser, "", 0, 1);
|
||||||
|
|
||||||
|
bool success = true;
|
||||||
|
if (parser->myDoc)
|
||||||
|
{
|
||||||
|
xmlNode *root = xmlDocGetRootElement(parser->myDoc);
|
||||||
|
if (root)
|
||||||
|
{
|
||||||
|
htmlWalkDOM(root);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("html root node failed");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("htmlstring parsing failed");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
htmlFreeParserCtxt(parser);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
int CGroupHTML::luaParseHtml(CLuaState &ls)
|
||||||
|
{
|
||||||
|
const char *funcName = "parseHtml";
|
||||||
|
CLuaIHM::checkArgCount(ls, funcName, 1);
|
||||||
|
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
|
||||||
|
std::string html = ls.toString(1);
|
||||||
|
|
||||||
|
parseHtml(html);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,633 +0,0 @@
|
|||||||
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
#include "stdpch.h"
|
|
||||||
#include <nel/misc/file.h>
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Library Includes */
|
|
||||||
#include "wwwsys.h"
|
|
||||||
#include "WWWUtil.h"
|
|
||||||
#include "WWWCore.h"
|
|
||||||
#include "WWWDir.h"
|
|
||||||
#include "WWWTrans.h"
|
|
||||||
#include "HTReqMan.h"
|
|
||||||
#include "HTBind.h"
|
|
||||||
#include "HTMulti.h"
|
|
||||||
#include "HTNetMan.h"
|
|
||||||
#include "HTChannl.h"
|
|
||||||
#include "nel/gui/libwww_nel_stream.h" /* Implemented here */
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace NLMISC;
|
|
||||||
|
|
||||||
extern "C"
|
|
||||||
{
|
|
||||||
|
|
||||||
/* Final states have negative value */
|
|
||||||
typedef enum _FileState
|
|
||||||
{
|
|
||||||
FS_RETRY = -4,
|
|
||||||
FS_ERROR = -3,
|
|
||||||
FS_NO_DATA = -2,
|
|
||||||
FS_GOT_DATA = -1,
|
|
||||||
FS_BEGIN = 0,
|
|
||||||
FS_PENDING,
|
|
||||||
FS_DO_CN,
|
|
||||||
FS_NEED_OPEN_FILE,
|
|
||||||
FS_NEED_BODY,
|
|
||||||
FS_PARSE_DIR,
|
|
||||||
FS_TRY_FTP
|
|
||||||
} FileState;
|
|
||||||
|
|
||||||
/* This is the context structure for the this module */
|
|
||||||
typedef struct _file_info
|
|
||||||
{
|
|
||||||
FileState state; /* Current state of the connection */
|
|
||||||
char * local; /* Local representation of file name */
|
|
||||||
struct stat stat_info; /* Contains actual file chosen */
|
|
||||||
HTNet * net;
|
|
||||||
HTTimer * timer;
|
|
||||||
} file_info;
|
|
||||||
|
|
||||||
struct _HTStream
|
|
||||||
{
|
|
||||||
const HTStreamClass * isa;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _HTInputStream
|
|
||||||
{
|
|
||||||
const HTInputStreamClass * isa;
|
|
||||||
HTChannel * ch;
|
|
||||||
HTHost * host;
|
|
||||||
char * write; /* Last byte written */
|
|
||||||
char * read; /* Last byte read */
|
|
||||||
int b_read;
|
|
||||||
char data [INPUT_BUFFER_SIZE]; /* buffer */
|
|
||||||
};
|
|
||||||
|
|
||||||
PRIVATE int FileCleanup (HTRequest *req, int status)
|
|
||||||
{
|
|
||||||
HTNet * net = HTRequest_net(req);
|
|
||||||
file_info * file = (file_info *) HTNet_context(net);
|
|
||||||
HTStream * input = HTRequest_inputStream(req);
|
|
||||||
|
|
||||||
/* Free stream with data TO Local file system */
|
|
||||||
if (input)
|
|
||||||
{
|
|
||||||
if (status == HT_INTERRUPTED)
|
|
||||||
(*input->isa->abort)(input, NULL);
|
|
||||||
else
|
|
||||||
(*input->isa->_free)(input);
|
|
||||||
HTRequest_setInputStream(req, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Remove if we have registered a timer function as a callback
|
|
||||||
*/
|
|
||||||
if (file->timer)
|
|
||||||
{
|
|
||||||
HTTimer_delete(file->timer);
|
|
||||||
file->timer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
HT_FREE(file->local);
|
|
||||||
HT_FREE(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
HTNet_delete(net, status);
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PRIVATE int FileEvent (SOCKET soc, void * pVoid, HTEventType type);
|
|
||||||
|
|
||||||
PUBLIC int HTLoadNeLFile (SOCKET soc, HTRequest * request)
|
|
||||||
{
|
|
||||||
file_info *file; /* Specific access information */
|
|
||||||
HTNet * net = HTRequest_net(request);
|
|
||||||
HTParentAnchor * anchor = HTRequest_anchor(request);
|
|
||||||
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Looking for `%s\'\n" _ HTAnchor_physical(anchor));
|
|
||||||
if ((file = (file_info *) HT_CALLOC(1, sizeof(file_info))) == NULL) HT_OUTOFMEM("HTLoadFILE");
|
|
||||||
file->state = FS_BEGIN;
|
|
||||||
file->net = net;
|
|
||||||
HTNet_setContext(net, file);
|
|
||||||
HTNet_setEventCallback(net, FileEvent);
|
|
||||||
HTNet_setEventParam(net, file); /* callbacks get http* */
|
|
||||||
|
|
||||||
return FileEvent(soc, file, HTEvent_BEGIN); /* get it started - ops is ignored */
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int ReturnEvent (HTTimer * timer, void * param, HTEventType /* type */)
|
|
||||||
{
|
|
||||||
file_info * file = (file_info *) param;
|
|
||||||
if (timer != file->timer) HTDEBUGBREAK("File timer %p not in sync\n" _ timer);
|
|
||||||
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Continuing %p with timer %p\n" _ file _ timer);
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Delete the timer
|
|
||||||
*/
|
|
||||||
HTTimer_delete(file->timer);
|
|
||||||
file->timer = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Now call the event again
|
|
||||||
*/
|
|
||||||
return FileEvent(INVSOC, file, HTEvent_READ);
|
|
||||||
}
|
|
||||||
|
|
||||||
PUBLIC int HTNeLFileOpen (HTNet * net, char * local, HTLocalMode /* mode */)
|
|
||||||
{
|
|
||||||
HTRequest * request = HTNet_request(net);
|
|
||||||
HTHost * host = HTNet_host(net);
|
|
||||||
CIFile* fp = new CIFile;
|
|
||||||
|
|
||||||
if (!fp->open (local))
|
|
||||||
{
|
|
||||||
HTRequest_addSystemError(request, ERR_FATAL, errno, NO, "CIFile::open");
|
|
||||||
return HT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
HTHost_setChannel(host, HTChannel_new(INVSOC, (FILE*)fp, YES));
|
|
||||||
|
|
||||||
HTHost_getInput(host, HTNet_transport(net), NULL, 0);
|
|
||||||
HTHost_getOutput(host, HTNet_transport(net), NULL, 0);
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int FileEvent (SOCKET /* soc */, void * pVoid, HTEventType type)
|
|
||||||
{
|
|
||||||
file_info *file = (file_info *)pVoid; /* Specific access information */
|
|
||||||
int status = HT_ERROR;
|
|
||||||
HTNet * net = file->net;
|
|
||||||
HTRequest * request = HTNet_request(net);
|
|
||||||
HTParentAnchor * anchor = HTRequest_anchor(request);
|
|
||||||
|
|
||||||
if (type == HTEvent_CLOSE)
|
|
||||||
{
|
|
||||||
/* Interrupted */
|
|
||||||
HTRequest_addError(request, ERR_FATAL, NO, HTERR_INTERRUPTED,
|
|
||||||
NULL, 0, "HTLoadFile");
|
|
||||||
FileCleanup(request, HT_INTERRUPTED);
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Now jump into the machine. We know the state from the previous run */
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
switch (file->state)
|
|
||||||
{
|
|
||||||
case FS_BEGIN:
|
|
||||||
|
|
||||||
/* We only support safe (GET, HEAD, etc) methods for the moment */
|
|
||||||
if (!HTMethod_isSafe(HTRequest_method(request))) {
|
|
||||||
HTRequest_addError(request, ERR_FATAL, NO, HTERR_NOT_ALLOWED,
|
|
||||||
NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check whether we have access to local disk at all */
|
|
||||||
if (HTLib_secure())
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "LoadFile.... No access to local file system\n");
|
|
||||||
file->state = FS_TRY_FTP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*file->local = HTWWWToLocal(HTAnchor_physical(anchor), "",
|
|
||||||
HTRequest_userProfile(request));*/
|
|
||||||
{
|
|
||||||
string tmp = HTAnchor_physical(anchor);
|
|
||||||
if (strlwr(tmp).find("file:/") == 0)
|
|
||||||
{
|
|
||||||
tmp = tmp.substr(6, tmp.size()-6);
|
|
||||||
}
|
|
||||||
StrAllocCopy(file->local, tmp.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file->local)
|
|
||||||
{
|
|
||||||
file->state = FS_TRY_FTP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a new host object and link it to the net object */
|
|
||||||
{
|
|
||||||
HTHost * host = NULL;
|
|
||||||
if ((host = HTHost_new("localhost", 0)) == NULL) return HT_ERROR;
|
|
||||||
HTNet_setHost(net, host);
|
|
||||||
if (HTHost_addNet(host, net) == HT_PENDING)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Pending...\n");
|
|
||||||
/* move to the hack state */
|
|
||||||
file->state = FS_PENDING;
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file->state = FS_DO_CN;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_PENDING:
|
|
||||||
{
|
|
||||||
HTHost * host = NULL;
|
|
||||||
if ((host = HTHost_new((char*)"localhost", 0)) == NULL) return HT_ERROR;
|
|
||||||
HTNet_setHost(net, host);
|
|
||||||
if (HTHost_addNet(host, net) == HT_PENDING)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Pending...\n");
|
|
||||||
file->state = FS_PENDING;
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
file->state = FS_DO_CN;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_DO_CN:
|
|
||||||
if (HTRequest_negotiation(request) &&
|
|
||||||
HTMethod_isSafe(HTRequest_method(request)))
|
|
||||||
{
|
|
||||||
HTAnchor_setPhysical(anchor, file->local);
|
|
||||||
HTTRACE(PROT_TRACE, "Load File... Found `%s\'\n" _ file->local);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (HT_STAT(file->local, &file->stat_info) == -1)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "Load File... Not found `%s\'\n" _ file->local);
|
|
||||||
HTRequest_addError(request, ERR_FATAL, NO, HTERR_NOT_FOUND, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_ERROR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((file->stat_info.st_mode) & S_IFMT) == S_IFDIR)
|
|
||||||
{
|
|
||||||
if (HTRequest_method(request) == METHOD_GET)
|
|
||||||
{
|
|
||||||
file->state = FS_PARSE_DIR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HTRequest_addError(request, ERR_INFO, NO, HTERR_NO_CONTENT, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_NO_DATA;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
BOOL editable = FALSE;
|
|
||||||
HTBind_getAnchorBindings(anchor);
|
|
||||||
if (editable) HTAnchor_appendAllow(anchor, METHOD_PUT);
|
|
||||||
|
|
||||||
/* Set the file size */
|
|
||||||
CIFile nelFile;
|
|
||||||
if (nelFile.open (file->local))
|
|
||||||
{
|
|
||||||
file->stat_info.st_size = nelFile.getFileSize();
|
|
||||||
}
|
|
||||||
nelFile.close();
|
|
||||||
|
|
||||||
if (file->stat_info.st_size)
|
|
||||||
HTAnchor_setLength(anchor, file->stat_info.st_size);
|
|
||||||
|
|
||||||
/* Set the file last modified time stamp */
|
|
||||||
if (file->stat_info.st_mtime > 0)
|
|
||||||
HTAnchor_setLastModified(anchor, file->stat_info.st_mtime);
|
|
||||||
|
|
||||||
/* Check to see if we can edit it */
|
|
||||||
if (!editable && !file->stat_info.st_size)
|
|
||||||
{
|
|
||||||
HTRequest_addError(request, ERR_INFO, NO, HTERR_NO_CONTENT, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_NO_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
file->state = (HTRequest_method(request)==METHOD_GET) ? FS_NEED_OPEN_FILE : FS_GOT_DATA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_NEED_OPEN_FILE:
|
|
||||||
status = HTNeLFileOpen(net, file->local, HT_FB_RDONLY);
|
|
||||||
if (status == HT_OK)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
HTStream * rstream = HTStreamStack(HTAnchor_format(anchor),
|
|
||||||
HTRequest_outputFormat(request),
|
|
||||||
HTRequest_outputStream(request),
|
|
||||||
request, YES);
|
|
||||||
HTNet_setReadStream(net, rstream);
|
|
||||||
HTRequest_setOutputConnected(request, YES);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
HTOutputStream * output = HTNet_getOutput(net, NULL, 0);
|
|
||||||
HTRequest_setInputStream(request, (HTStream *) output);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HTRequest_isSource(request) && !HTRequest_destinationsReady(request)) return HT_OK;
|
|
||||||
|
|
||||||
HTRequest_addError(request, ERR_INFO, NO, HTERR_OK, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_NEED_BODY;
|
|
||||||
|
|
||||||
if (HTEvent_isCallbacksRegistered())
|
|
||||||
{
|
|
||||||
if (!HTRequest_preemptive(request))
|
|
||||||
{
|
|
||||||
if (!HTNet_preemptive(net))
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Returning\n");
|
|
||||||
HTHost_register(HTNet_host(net), net, HTEvent_READ);
|
|
||||||
}
|
|
||||||
else if (!file->timer)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "HTLoadFile.. Returning\n");
|
|
||||||
file->timer = HTTimer_new(NULL, ReturnEvent, file, 1, YES, NO);
|
|
||||||
}
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (status == HT_WOULD_BLOCK || status == HT_PENDING)
|
|
||||||
{
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HTRequest_addError(request, ERR_INFO, NO, HTERR_INTERNAL, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_ERROR; /* Error or interrupt */
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_NEED_BODY:
|
|
||||||
status = HTHost_read(HTNet_host(net), net);
|
|
||||||
if (status == HT_WOULD_BLOCK)
|
|
||||||
{
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
else if (status == HT_LOADED || status == HT_CLOSED)
|
|
||||||
{
|
|
||||||
file->state = FS_GOT_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HTRequest_addError(request, ERR_INFO, NO, HTERR_FORBIDDEN, NULL, 0, "HTLoadFile");
|
|
||||||
file->state = FS_ERROR;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_TRY_FTP:
|
|
||||||
{
|
|
||||||
char *url = HTAnchor_physical(anchor);
|
|
||||||
HTAnchor *anchor;
|
|
||||||
char *newname = NULL;
|
|
||||||
StrAllocCopy(newname, "ftp:");
|
|
||||||
if (!strncmp(url, "file:", 5))
|
|
||||||
{
|
|
||||||
StrAllocCat(newname, url+5);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StrAllocCat(newname, url);
|
|
||||||
}
|
|
||||||
anchor = HTAnchor_findAddress(newname);
|
|
||||||
HTRequest_setAnchor(request, anchor);
|
|
||||||
HT_FREE(newname);
|
|
||||||
FileCleanup(request, HT_IGNORE);
|
|
||||||
return HTLoad(request, YES);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_GOT_DATA:
|
|
||||||
FileCleanup(request, HT_LOADED);
|
|
||||||
return HT_OK;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_NO_DATA:
|
|
||||||
FileCleanup(request, HT_NO_DATA);
|
|
||||||
return HT_OK;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_RETRY:
|
|
||||||
FileCleanup(request, HT_RETRY);
|
|
||||||
return HT_OK;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_ERROR:
|
|
||||||
FileCleanup(request, HT_ERROR);
|
|
||||||
return HT_OK;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} /* End of while(1) */
|
|
||||||
}
|
|
||||||
|
|
||||||
// *************************************************************************
|
|
||||||
// HTNeLReader
|
|
||||||
// *************************************************************************
|
|
||||||
|
|
||||||
size_t nel_fread (void *buffer, uint size, FILE *fp)
|
|
||||||
{
|
|
||||||
CIFile *file = (CIFile *)fp;
|
|
||||||
int toRead = std::min ((int)(file->getFileSize () - file->getPos ()), (int)size);
|
|
||||||
file->serialBuffer((uint8*)buffer, toRead);
|
|
||||||
return toRead;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int HTNeLReader_read (HTInputStream * me)
|
|
||||||
{
|
|
||||||
FILE * fp = HTChannel_file(me->ch);
|
|
||||||
HTNet * net = HTHost_getReadNet(me->host);
|
|
||||||
int status;
|
|
||||||
|
|
||||||
/* Read the file desriptor */
|
|
||||||
while (fp)
|
|
||||||
{
|
|
||||||
if ((me->b_read = (int)nel_fread(me->data, FILE_BUFFER_SIZE, fp)) == 0)
|
|
||||||
{
|
|
||||||
HTAlertCallback *cbf = HTAlert_find(HT_PROG_DONE);
|
|
||||||
// HTTRACE(PROT_TRACE, "ANSI read... Finished loading file %p\n" _ fp);
|
|
||||||
if (cbf)
|
|
||||||
(*cbf)(net->request, HT_PROG_DONE, HT_MSG_NULL,NULL,NULL,NULL);
|
|
||||||
return HT_CLOSED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Remember how much we have read from the input socket */
|
|
||||||
HTTRACEDATA(me->data, me->b_read, "HTANSIReader_read me->data:");
|
|
||||||
me->write = me->data;
|
|
||||||
me->read = me->data + me->b_read;
|
|
||||||
|
|
||||||
{
|
|
||||||
HTAlertCallback * cbf = HTAlert_find(HT_PROG_READ);
|
|
||||||
HTNet_addBytesRead(net, me->b_read);
|
|
||||||
if (cbf)
|
|
||||||
{
|
|
||||||
int tr = HTNet_bytesRead(net);
|
|
||||||
(*cbf)(net->request, HT_PROG_READ, HT_MSG_NULL, NULL, &tr, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!net->readStream)
|
|
||||||
return HT_ERROR;
|
|
||||||
|
|
||||||
/* Now push the data down the stream */
|
|
||||||
if ((status = (*net->readStream->isa->put_block)
|
|
||||||
(net->readStream, me->data, me->b_read)) != HT_OK)
|
|
||||||
{
|
|
||||||
if (status == HT_WOULD_BLOCK)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "ANSI read... Target WOULD BLOCK\n");
|
|
||||||
return HT_WOULD_BLOCK;
|
|
||||||
}
|
|
||||||
else if (status == HT_PAUSE)
|
|
||||||
{
|
|
||||||
HTTRACE(PROT_TRACE, "ANSI read... Target PAUSED\n");
|
|
||||||
return HT_PAUSE;
|
|
||||||
}
|
|
||||||
else if (status > 0)
|
|
||||||
{
|
|
||||||
/* Stream specific return code */
|
|
||||||
HTTRACE(PROT_TRACE, "ANSI read... Target returns %d\n" _ status);
|
|
||||||
me->write = me->data + me->b_read;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We have a real error */
|
|
||||||
HTTRACE(PROT_TRACE, "ANSI read... Target ERROR\n");
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
me->write = me->data + me->b_read;
|
|
||||||
}
|
|
||||||
HTTRACE(PROT_TRACE, "ANSI read... File descriptor is NULL...\n");
|
|
||||||
return HT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int HTNeLReader_close (HTInputStream * me)
|
|
||||||
{
|
|
||||||
CIFile *file = (CIFile *)HTChannel_file(me->ch);
|
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
file->close();
|
|
||||||
}
|
|
||||||
|
|
||||||
int status = HT_OK;
|
|
||||||
HTNet * net = HTHost_getReadNet(me->host);
|
|
||||||
|
|
||||||
|
|
||||||
if (net && net->readStream)
|
|
||||||
{
|
|
||||||
if ((status = (*net->readStream->isa->_free)(net->readStream))==HT_WOULD_BLOCK) return HT_WOULD_BLOCK;
|
|
||||||
net->readStream = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HTTRACE(STREAM_TRACE, "Socket read. FREEING....\n");
|
|
||||||
HT_FREE(me);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
PUBLIC int HTNeLReader_consumed (HTInputStream * me, size_t bytes)
|
|
||||||
{
|
|
||||||
me->write += bytes;
|
|
||||||
me->b_read -= (int)bytes;
|
|
||||||
HTHost_setRemainingRead(me->host, me->b_read);
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int HTNeLReader_flush (HTInputStream * me)
|
|
||||||
{
|
|
||||||
HTNet * net = HTHost_getReadNet(me->host);
|
|
||||||
return net && net->readStream ? (*net->readStream->isa->flush)(net->readStream) : HT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int HTNeLReader_free (HTInputStream * me)
|
|
||||||
{
|
|
||||||
CIFile *file = (CIFile *)HTChannel_file(me->ch);
|
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
delete file;
|
|
||||||
HTChannel_setFile (me->ch, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
HTNet * net = HTHost_getReadNet(me->host);
|
|
||||||
if (net && net->readStream)
|
|
||||||
{
|
|
||||||
int status = (*net->readStream->isa->_free)(net->readStream);
|
|
||||||
if (status == HT_OK) net->readStream = NULL;
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
return HT_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE int HTNeLReader_abort (HTInputStream * me, HTList * /* e */)
|
|
||||||
{
|
|
||||||
HTNet * net = HTHost_getReadNet(me->host);
|
|
||||||
if (net && net->readStream)
|
|
||||||
{
|
|
||||||
int status = (*net->readStream->isa->abort)(net->readStream, NULL);
|
|
||||||
if (status != HT_IGNORE) net->readStream = NULL;
|
|
||||||
}
|
|
||||||
return HT_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRIVATE const HTInputStreamClass HTNeLReader =
|
|
||||||
{
|
|
||||||
"SocketReader",
|
|
||||||
HTNeLReader_flush,
|
|
||||||
HTNeLReader_free,
|
|
||||||
HTNeLReader_abort,
|
|
||||||
HTNeLReader_read,
|
|
||||||
HTNeLReader_close,
|
|
||||||
HTNeLReader_consumed
|
|
||||||
};
|
|
||||||
|
|
||||||
PUBLIC HTInputStream * HTNeLReader_new (HTHost * host, HTChannel * ch, void * /* param */, int /* mode */)
|
|
||||||
{
|
|
||||||
if (host && ch)
|
|
||||||
{
|
|
||||||
HTInputStream * me = HTChannel_input(ch);
|
|
||||||
if (me == NULL)
|
|
||||||
{
|
|
||||||
if ((me=(HTInputStream *) HT_CALLOC(1, sizeof(HTInputStream))) == NULL) HT_OUTOFMEM("HTNeLReader_new");
|
|
||||||
me->isa = &HTNeLReader;
|
|
||||||
me->ch = ch;
|
|
||||||
me->host = host;
|
|
||||||
HTTRACE(STREAM_TRACE, "Reader...... Created reader stream %p\n" _ me);
|
|
||||||
}
|
|
||||||
return me;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//PUBLIC unsigned int WWW_TraceFlag = 0;
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,797 @@
|
|||||||
|
/**
|
||||||
|
libwww Copyright Notice
|
||||||
|
[This notice should be placed within redistributed or derivative software
|
||||||
|
code when appropriate. This particular formulation of W3C's notice for
|
||||||
|
inclusion in libwww code became active on August 14 1998.]
|
||||||
|
|
||||||
|
LIBWWW COPYRIGHT NOTICE
|
||||||
|
|
||||||
|
libwww: W3C's implementation of HTTP can be found at:
|
||||||
|
http://www.w3.org/Library/
|
||||||
|
|
||||||
|
Copyright ¨ 1995-2002 World Wide Web Consortium,
|
||||||
|
(Massachusetts Institute of Technology, Institut
|
||||||
|
National de Recherche en Informatique et en
|
||||||
|
Automatique, Keio University). All Rights Reserved.
|
||||||
|
This program is distributed under the W3C's
|
||||||
|
Intellectual Property License. This program is
|
||||||
|
distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. See W3C License
|
||||||
|
http://www.w3.org/Consortium/Legal/ for more details.
|
||||||
|
|
||||||
|
Copyright ¨ 1995 CERN. "This product includes computer
|
||||||
|
software created and made available by CERN. This
|
||||||
|
acknowledgment shall be mentioned in full in any
|
||||||
|
product which includes the CERN computer software
|
||||||
|
included herein or parts thereof."
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "nel/gui/libwww_types.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
** ATTRIBUTE DEFINITION MACROS (see HTMLPDTD.h)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* redefine the macros, so that the "stringized" attribute name
|
||||||
|
* is generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef HTML_ATTR
|
||||||
|
#define HTML_ATTR(t,a) { (char *) #a }
|
||||||
|
#undef HTML_ATTRIBUTES
|
||||||
|
#define HTML_ATTRIBUTES(t) { 0 }
|
||||||
|
|
||||||
|
/*
|
||||||
|
** ATTRIBUTE LISTS
|
||||||
|
*/
|
||||||
|
|
||||||
|
static HTAttr no_attr[1] = {
|
||||||
|
{ 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr body_attr[HTML_BODY_ATTRIBUTES+1] = { /* to catch images */
|
||||||
|
HTML_ATTR(BODY,ALINK),
|
||||||
|
HTML_ATTR(BODY,BACKGROUND),
|
||||||
|
HTML_ATTR(BODY,BGCOLOR),
|
||||||
|
HTML_ATTR(BODY,CLASS),
|
||||||
|
HTML_ATTR(BODY,DIR),
|
||||||
|
HTML_ATTR(BODY,ID),
|
||||||
|
HTML_ATTR(BODY,LANG),
|
||||||
|
HTML_ATTR(BODY,LINK),
|
||||||
|
HTML_ATTR(BODY,STYLE),
|
||||||
|
HTML_ATTR(BODY,TEXT),
|
||||||
|
HTML_ATTR(BODY,TITLE),
|
||||||
|
HTML_ATTR(BODY,VLINK),
|
||||||
|
HTML_ATTRIBUTES(BODY)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr frame_attr[HTML_FRAME_ATTRIBUTES+1] = { /* frame attributes */
|
||||||
|
HTML_ATTR(FRAME,CLASS),
|
||||||
|
HTML_ATTR(FRAME,FRAMEBORDER),
|
||||||
|
HTML_ATTR(FRAME,ID),
|
||||||
|
HTML_ATTR(FRAME,NAME),
|
||||||
|
HTML_ATTR(FRAME,MARGINHEIGHT),
|
||||||
|
HTML_ATTR(FRAME,MARGINWIDTH),
|
||||||
|
HTML_ATTR(FRAME,NORESIZE),
|
||||||
|
HTML_ATTR(FRAME,LONGDESC),
|
||||||
|
HTML_ATTR(FRAME,SCROLLING),
|
||||||
|
HTML_ATTR(FRAME,SRC),
|
||||||
|
HTML_ATTR(FRAME,STYLE),
|
||||||
|
HTML_ATTR(FRAME,TARGET),
|
||||||
|
HTML_ATTR(FRAME,TITLE),
|
||||||
|
HTML_ATTRIBUTES(FRAME)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr frameset_attr[HTML_FRAMESET_ATTRIBUTES+1] = { /* frameset attributes */
|
||||||
|
HTML_ATTR(FRAMESET,CLASS),
|
||||||
|
HTML_ATTR(FRAMESET,COLS),
|
||||||
|
HTML_ATTR(FRAMESET,ID),
|
||||||
|
HTML_ATTR(FRAMESET,ROWS),
|
||||||
|
HTML_ATTR(FRAMESET,STYLE),
|
||||||
|
HTML_ATTR(FRAMESET,TITLE),
|
||||||
|
HTML_ATTRIBUTES(FRAMESET)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr a_attr[HTML_A_ATTRIBUTES+1] = { /* Anchor attributes */
|
||||||
|
HTML_ATTR(A,ACCESSKEY),
|
||||||
|
HTML_ATTR(A,CHARSET),
|
||||||
|
HTML_ATTR(A,CLASS),
|
||||||
|
HTML_ATTR(A,COORDS),
|
||||||
|
HTML_ATTR(A,DIR),
|
||||||
|
HTML_ATTR(A,HREF),
|
||||||
|
HTML_ATTR(A,HREFLANG),
|
||||||
|
HTML_ATTR(A,ID),
|
||||||
|
HTML_ATTR(A,NAME),
|
||||||
|
HTML_ATTR(A,REL),
|
||||||
|
HTML_ATTR(A,REV),
|
||||||
|
HTML_ATTR(A,SHAPE),
|
||||||
|
HTML_ATTR(A,STYLE),
|
||||||
|
HTML_ATTR(A,TABINDEX),
|
||||||
|
HTML_ATTR(A,TARGET),
|
||||||
|
HTML_ATTR(A,TYPE),
|
||||||
|
HTML_ATTR(A,TITLE),
|
||||||
|
HTML_ATTRIBUTES(A)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr applet_attr[HTML_APPLET_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(APPLET,ALIGN),
|
||||||
|
HTML_ATTR(APPLET,ALT),
|
||||||
|
HTML_ATTR(APPLET,ARCHIVE),
|
||||||
|
HTML_ATTR(APPLET,CLASS),
|
||||||
|
HTML_ATTR(APPLET,CODE),
|
||||||
|
HTML_ATTR(APPLET,CODEBASE),
|
||||||
|
HTML_ATTR(APPLET,HEIGHT),
|
||||||
|
HTML_ATTR(APPLET,HSPACE),
|
||||||
|
HTML_ATTR(APPLET,ID),
|
||||||
|
HTML_ATTR(APPLET,NAME),
|
||||||
|
HTML_ATTR(APPLET,OBJECT),
|
||||||
|
HTML_ATTR(APPLET,STYLE),
|
||||||
|
HTML_ATTR(APPLET,TITLE),
|
||||||
|
HTML_ATTR(APPLET,VSPACE),
|
||||||
|
HTML_ATTR(APPLET,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(APPLET)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr area_attr[HTML_AREA_ATTRIBUTES+1] = { /* Area attributes */
|
||||||
|
HTML_ATTR(AREA,ACCESSKEY),
|
||||||
|
HTML_ATTR(AREA,ALT),
|
||||||
|
HTML_ATTR(AREA,CLASS),
|
||||||
|
HTML_ATTR(AREA,COORDS),
|
||||||
|
HTML_ATTR(AREA,DIR),
|
||||||
|
HTML_ATTR(AREA,HREF),
|
||||||
|
HTML_ATTR(AREA,ID),
|
||||||
|
HTML_ATTR(AREA,NAME),
|
||||||
|
HTML_ATTR(AREA,NOHREF),
|
||||||
|
HTML_ATTR(AREA,LANG),
|
||||||
|
HTML_ATTR(AREA,SHAPE),
|
||||||
|
HTML_ATTR(AREA,STYLE),
|
||||||
|
HTML_ATTR(AREA,TABINDEX),
|
||||||
|
HTML_ATTR(AREA,TARGET),
|
||||||
|
HTML_ATTR(AREA,TITLE),
|
||||||
|
HTML_ATTRIBUTES(AREA)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr base_attr[HTML_BASE_ATTRIBUTES+1] = { /* BASE attributes */
|
||||||
|
HTML_ATTR(BASE,HREF),
|
||||||
|
HTML_ATTR(BASE,TARGET),
|
||||||
|
HTML_ATTRIBUTES(BASE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr bdo_attr[HTML_BDO_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(BDO,CLASS),
|
||||||
|
HTML_ATTR(BDO,DIR),
|
||||||
|
HTML_ATTR(BDO,ID),
|
||||||
|
HTML_ATTR(BDO,LANG),
|
||||||
|
HTML_ATTR(BDO,STYLE),
|
||||||
|
HTML_ATTR(BDO,TITLE),
|
||||||
|
HTML_ATTRIBUTES(BDO)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr bq_attr[HTML_BQ_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(BQ,CITE),
|
||||||
|
HTML_ATTR(BQ,CLASS),
|
||||||
|
HTML_ATTR(BQ,DIR),
|
||||||
|
HTML_ATTR(BQ,ID),
|
||||||
|
HTML_ATTR(BQ,LANG),
|
||||||
|
HTML_ATTR(BQ,STYLE),
|
||||||
|
HTML_ATTR(BQ,TITLE),
|
||||||
|
HTML_ATTRIBUTES(BQ)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr br_attr[HTML_BR_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(BR,CLASS),
|
||||||
|
HTML_ATTR(BR,CLEAR),
|
||||||
|
HTML_ATTR(BR,ID),
|
||||||
|
HTML_ATTR(BR,STYLE),
|
||||||
|
HTML_ATTR(BR,TITLE),
|
||||||
|
HTML_ATTRIBUTES(BR)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr button_attr[HTML_BUTTON_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(BUTTON,ACCESSKEY),
|
||||||
|
HTML_ATTR(BUTTON,CLASS),
|
||||||
|
HTML_ATTR(BUTTON,DIR),
|
||||||
|
HTML_ATTR(BUTTON,DISABLED),
|
||||||
|
HTML_ATTR(BUTTON,ID),
|
||||||
|
HTML_ATTR(BUTTON,LANG),
|
||||||
|
HTML_ATTR(BUTTON,NAME),
|
||||||
|
HTML_ATTR(BUTTON,STYLE),
|
||||||
|
HTML_ATTR(BUTTON,TABINDEX),
|
||||||
|
HTML_ATTR(BUTTON,TITLE),
|
||||||
|
HTML_ATTR(BUTTON,TYPE),
|
||||||
|
HTML_ATTR(BUTTON,VALUE),
|
||||||
|
HTML_ATTRIBUTES(BUTTON),
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr col_attr[HTML_COL_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(COL,CLASS),
|
||||||
|
HTML_ATTR(COL,DIR),
|
||||||
|
HTML_ATTR(COL,ID),
|
||||||
|
HTML_ATTR(COL,LANG),
|
||||||
|
HTML_ATTR(COL,SPAN),
|
||||||
|
HTML_ATTR(COL,STYLE),
|
||||||
|
HTML_ATTR(COL,TITLE),
|
||||||
|
HTML_ATTR(COL,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(COL)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr changes_attr[HTML_CHANGES_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(CHANGES,CITE),
|
||||||
|
HTML_ATTR(CHANGES,CLASS),
|
||||||
|
HTML_ATTR(CHANGES,DATETIME),
|
||||||
|
HTML_ATTR(CHANGES,DIR),
|
||||||
|
HTML_ATTR(CHANGES,ID),
|
||||||
|
HTML_ATTR(CHANGES,LANG),
|
||||||
|
HTML_ATTR(CHANGES,STYLE),
|
||||||
|
HTML_ATTR(CHANGES,TITLE),
|
||||||
|
HTML_ATTRIBUTES(CHANGES)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr font_attr[HTML_FONT_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(FONT,CLASS),
|
||||||
|
HTML_ATTR(FONT,COLOR),
|
||||||
|
HTML_ATTR(FONT,DIR),
|
||||||
|
HTML_ATTR(FONT,FACE),
|
||||||
|
HTML_ATTR(FONT,ID),
|
||||||
|
HTML_ATTR(FONT,LANG),
|
||||||
|
HTML_ATTR(FONT,SIZE),
|
||||||
|
HTML_ATTR(FONT,STYLE),
|
||||||
|
HTML_ATTR(FONT,TITLE),
|
||||||
|
HTML_ATTRIBUTES(FONT)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr form_attr[HTML_FORM_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(FORM,ACCEPT),
|
||||||
|
{ (char *) "ACCEPT-CHARSET" }, /* HTML_ATTR(FORM,ACCEPT_CHARSET) */
|
||||||
|
HTML_ATTR(FORM,ACTION),
|
||||||
|
HTML_ATTR(FORM,CLASS),
|
||||||
|
HTML_ATTR(FORM,DIR),
|
||||||
|
HTML_ATTR(FORM,ENCTYPE),
|
||||||
|
HTML_ATTR(FORM,ID),
|
||||||
|
HTML_ATTR(FORM,LANG),
|
||||||
|
HTML_ATTR(FORM,METHOD),
|
||||||
|
HTML_ATTR(FORM,STYLE),
|
||||||
|
HTML_ATTR(FORM,TARGET),
|
||||||
|
HTML_ATTR(FORM,TITLE),
|
||||||
|
HTML_ATTRIBUTES(FORM)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr gen_attr[HTML_GEN_ATTRIBUTES+1] = { /* General, for many things */
|
||||||
|
HTML_ATTR(GEN,CLASS),
|
||||||
|
HTML_ATTR(GEN,DIR),
|
||||||
|
HTML_ATTR(GEN,ID),
|
||||||
|
HTML_ATTR(GEN,LANG),
|
||||||
|
HTML_ATTR(GEN,STYLE),
|
||||||
|
HTML_ATTR(GEN,TITLE),
|
||||||
|
HTML_ATTRIBUTES(GEN)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr block_attr[HTML_BLOCK_ATTRIBUTES+1] = { /* DIV, SPAN, H1-H6 */
|
||||||
|
HTML_ATTR(BLOCK,ALIGN),
|
||||||
|
HTML_ATTR(BLOCK,CLASS),
|
||||||
|
HTML_ATTR(BLOCK,DIR),
|
||||||
|
HTML_ATTR(BLOCK,ID),
|
||||||
|
HTML_ATTR(BLOCK,LANG),
|
||||||
|
HTML_ATTR(BLOCK,STYLE),
|
||||||
|
HTML_ATTR(BLOCK,TITLE),
|
||||||
|
HTML_ATTRIBUTES(BLOCK)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr head_attr[HTML_HEAD_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(HEAD,DIR),
|
||||||
|
HTML_ATTR(HEAD,LANG),
|
||||||
|
HTML_ATTR(HEAD,PROFILE),
|
||||||
|
HTML_ATTRIBUTES(HEAD)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr hr_attr[HTML_HR_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(HR,ALIGN),
|
||||||
|
HTML_ATTR(HR,CLASS),
|
||||||
|
HTML_ATTR(HR,DIR),
|
||||||
|
HTML_ATTR(HR,ID),
|
||||||
|
HTML_ATTR(HR,LANG),
|
||||||
|
HTML_ATTR(HR,NOSHADE),
|
||||||
|
HTML_ATTR(HR,SIZE),
|
||||||
|
HTML_ATTR(HR,STYLE),
|
||||||
|
HTML_ATTR(HR,TITLE),
|
||||||
|
HTML_ATTR(HR,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(HR)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr html_attr[HTML_HTML_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(HTML,DIR),
|
||||||
|
HTML_ATTR(HTML,LANG),
|
||||||
|
HTML_ATTR(HTML,VERSION),
|
||||||
|
HTML_ATTRIBUTES(HTML)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr iframe_attr[HTML_IFRAME_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(IFRAME,ALIGN),
|
||||||
|
HTML_ATTR(IFRAME,CLASS),
|
||||||
|
HTML_ATTR(IFRAME,FRAMEBORDER),
|
||||||
|
HTML_ATTR(IFRAME,HEIGHT),
|
||||||
|
HTML_ATTR(IFRAME,ID),
|
||||||
|
HTML_ATTR(IFRAME,LONGDESC),
|
||||||
|
HTML_ATTR(IFRAME,MARGINHEIGHT),
|
||||||
|
HTML_ATTR(IFRAME,MARGINWIDTH),
|
||||||
|
HTML_ATTR(IFRAME,NAME),
|
||||||
|
HTML_ATTR(IFRAME,SCROLLING),
|
||||||
|
HTML_ATTR(IFRAME,SRC),
|
||||||
|
HTML_ATTR(IFRAME,STYLE),
|
||||||
|
HTML_ATTR(IFRAME,TARGET),
|
||||||
|
HTML_ATTR(IFRAME,TITLE),
|
||||||
|
HTML_ATTR(IFRAME,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(IFRAME)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr img_attr[HTML_IMG_ATTRIBUTES+1] = { /* IMG attributes */
|
||||||
|
HTML_ATTR(IMG,ALIGN),
|
||||||
|
HTML_ATTR(IMG,ALT),
|
||||||
|
HTML_ATTR(IMG,BORDER),
|
||||||
|
HTML_ATTR(IMG,CLASS),
|
||||||
|
HTML_ATTR(IMG,DIR),
|
||||||
|
HTML_ATTR(IMG,HEIGHT),
|
||||||
|
HTML_ATTR(IMG,HSPACE),
|
||||||
|
HTML_ATTR(IMG,ID),
|
||||||
|
HTML_ATTR(IMG,ISMAP),
|
||||||
|
HTML_ATTR(IMG,LANG),
|
||||||
|
HTML_ATTR(IMG,LONGDESC),
|
||||||
|
HTML_ATTR(IMG,SRC),
|
||||||
|
HTML_ATTR(IMG,STYLE),
|
||||||
|
HTML_ATTR(IMG,TITLE),
|
||||||
|
HTML_ATTR(IMG,USEMAP),
|
||||||
|
HTML_ATTR(IMG,VSPACE),
|
||||||
|
HTML_ATTR(IMG,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(IMG)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(INPUT,ACCEPT),
|
||||||
|
HTML_ATTR(INPUT,ACCESSKEY),
|
||||||
|
HTML_ATTR(INPUT,ALIGN),
|
||||||
|
HTML_ATTR(INPUT,ALT),
|
||||||
|
HTML_ATTR(INPUT,CHECKED),
|
||||||
|
HTML_ATTR(INPUT,CLASS),
|
||||||
|
HTML_ATTR(INPUT,DIR),
|
||||||
|
HTML_ATTR(INPUT,DISABLED),
|
||||||
|
HTML_ATTR(INPUT,ID),
|
||||||
|
HTML_ATTR(INPUT,LANG),
|
||||||
|
HTML_ATTR(INPUT,MAXLENGTH),
|
||||||
|
HTML_ATTR(INPUT,NAME),
|
||||||
|
HTML_ATTR(INPUT,READONLY),
|
||||||
|
HTML_ATTR(INPUT,SIZE),
|
||||||
|
HTML_ATTR(INPUT,SRC),
|
||||||
|
HTML_ATTR(INPUT,STYLE),
|
||||||
|
HTML_ATTR(INPUT,TABINDEX),
|
||||||
|
HTML_ATTR(INPUT,TITLE),
|
||||||
|
HTML_ATTR(INPUT,TYPE),
|
||||||
|
HTML_ATTR(INPUT,USEMAP),
|
||||||
|
HTML_ATTR(INPUT,VALUE),
|
||||||
|
HTML_ATTRIBUTES(INPUT)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr isindex_attr[HTML_ISINDEX_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(ISINDEX,CLASS),
|
||||||
|
HTML_ATTR(ISINDEX,DIR),
|
||||||
|
HTML_ATTR(ISINDEX,ID),
|
||||||
|
HTML_ATTR(ISINDEX,LANG),
|
||||||
|
HTML_ATTR(ISINDEX,PROMPT),
|
||||||
|
HTML_ATTR(ISINDEX,STYLE),
|
||||||
|
HTML_ATTR(ISINDEX,TITLE),
|
||||||
|
HTML_ATTRIBUTES(ISINDEX)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr label_attr[HTML_LABEL_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(LABEL,ACCESSKEY),
|
||||||
|
HTML_ATTR(LABEL,CLASS),
|
||||||
|
HTML_ATTR(LABEL,DIR),
|
||||||
|
HTML_ATTR(LABEL,FOR),
|
||||||
|
HTML_ATTR(LABEL,ID),
|
||||||
|
HTML_ATTR(LABEL,LANG),
|
||||||
|
HTML_ATTR(LABEL,STYLE),
|
||||||
|
HTML_ATTR(LABEL,TITLE),
|
||||||
|
HTML_ATTRIBUTES(LABEL)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr legend_attr[HTML_LEGEND_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(LEGEND,ACCESSKEY),
|
||||||
|
HTML_ATTR(LEGEND,ALIGN),
|
||||||
|
HTML_ATTR(LEGEND,CLASS),
|
||||||
|
HTML_ATTR(LEGEND,DIR),
|
||||||
|
HTML_ATTR(LEGEND,ID),
|
||||||
|
HTML_ATTR(LEGEND,LANG),
|
||||||
|
HTML_ATTR(LEGEND,STYLE),
|
||||||
|
HTML_ATTR(LEGEND,TITLE),
|
||||||
|
HTML_ATTRIBUTES(LEGEND)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr li_attr[HTML_LI_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(LI,CLASS),
|
||||||
|
HTML_ATTR(LI,COMPACT),
|
||||||
|
HTML_ATTR(LI,DIR),
|
||||||
|
HTML_ATTR(LI,ID),
|
||||||
|
HTML_ATTR(LI,LANG),
|
||||||
|
HTML_ATTR(LI,STYLE),
|
||||||
|
HTML_ATTR(LI,TITLE),
|
||||||
|
HTML_ATTR(LI,TYPE),
|
||||||
|
HTML_ATTR(LI,VALUE),
|
||||||
|
HTML_ATTRIBUTES(LI)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr link_attr[HTML_LINK_ATTRIBUTES+1] = { /* link attributes */
|
||||||
|
HTML_ATTR(LINK,CHARSET),
|
||||||
|
HTML_ATTR(LINK,CLASS),
|
||||||
|
HTML_ATTR(LINK,DIR),
|
||||||
|
HTML_ATTR(LINK,HREF),
|
||||||
|
HTML_ATTR(LINK,HREFLANG),
|
||||||
|
HTML_ATTR(LINK,ID),
|
||||||
|
HTML_ATTR(LINK,LANG),
|
||||||
|
HTML_ATTR(LINK,MEDIA),
|
||||||
|
HTML_ATTR(LINK,REL),
|
||||||
|
HTML_ATTR(LINK,REV),
|
||||||
|
HTML_ATTR(LINK,STYLE),
|
||||||
|
HTML_ATTR(LINK,TARGET),
|
||||||
|
HTML_ATTR(LINK,TITLE),
|
||||||
|
HTML_ATTR(LINK,TYPE),
|
||||||
|
HTML_ATTRIBUTES(LINK)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr map_attr[HTML_MAP_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(MAP,CLASS),
|
||||||
|
HTML_ATTR(MAP,DIR),
|
||||||
|
HTML_ATTR(MAP,ID),
|
||||||
|
HTML_ATTR(MAP,LANG),
|
||||||
|
HTML_ATTR(MAP,NAME),
|
||||||
|
HTML_ATTR(MAP,STYLE),
|
||||||
|
HTML_ATTR(MAP,TITLE),
|
||||||
|
HTML_ATTRIBUTES(MAP)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr meta_attr[HTML_META_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(META,CONTENT),
|
||||||
|
HTML_ATTR(META,DIR),
|
||||||
|
{ (char *)"HTTP-EQUIV" }, /* HTML_ATTR(META,HTTP_EQUIV) */
|
||||||
|
HTML_ATTR(META,LANG),
|
||||||
|
HTML_ATTR(META,NAME),
|
||||||
|
HTML_ATTR(META,SCHEME),
|
||||||
|
HTML_ATTRIBUTES(META)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
|
||||||
|
{ (char *)"N" },
|
||||||
|
{ 0 } /* Terminate list */
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr object_attr[HTML_OBJECT_ATTRIBUTES+1] = { /* object attributes */
|
||||||
|
HTML_ATTR(OBJECT,ALIGN),
|
||||||
|
HTML_ATTR(OBJECT,ARCHIVE),
|
||||||
|
HTML_ATTR(OBJECT,BORDER),
|
||||||
|
HTML_ATTR(OBJECT,CLASS),
|
||||||
|
HTML_ATTR(OBJECT,CLASSID),
|
||||||
|
HTML_ATTR(OBJECT,CODEBASE),
|
||||||
|
HTML_ATTR(OBJECT,CODETYPE),
|
||||||
|
HTML_ATTR(OBJECT,DATA),
|
||||||
|
HTML_ATTR(OBJECT,DECLARE),
|
||||||
|
HTML_ATTR(OBJECT,DIR),
|
||||||
|
HTML_ATTR(OBJECT,HEIGHT),
|
||||||
|
HTML_ATTR(OBJECT,HSPACE),
|
||||||
|
HTML_ATTR(OBJECT,ID),
|
||||||
|
HTML_ATTR(OBJECT,LANG),
|
||||||
|
HTML_ATTR(OBJECT,NAME),
|
||||||
|
HTML_ATTR(OBJECT,STANDBY),
|
||||||
|
HTML_ATTR(OBJECT,STYLE),
|
||||||
|
HTML_ATTR(OBJECT,TABINDEX),
|
||||||
|
HTML_ATTR(OBJECT,TITLE),
|
||||||
|
HTML_ATTR(OBJECT,TYPE),
|
||||||
|
HTML_ATTR(OBJECT,USEMAP),
|
||||||
|
HTML_ATTR(OBJECT,VSPACE),
|
||||||
|
HTML_ATTR(OBJECT,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(OBJECT)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr ol_attr[HTML_OL_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(OL,CLASS),
|
||||||
|
HTML_ATTR(OL,COMPACT),
|
||||||
|
HTML_ATTR(OL,DIR),
|
||||||
|
HTML_ATTR(OL,ID),
|
||||||
|
HTML_ATTR(OL,LANG),
|
||||||
|
HTML_ATTR(OL,START),
|
||||||
|
HTML_ATTR(OL,STYLE),
|
||||||
|
HTML_ATTR(OL,TITLE),
|
||||||
|
HTML_ATTR(OL,TYPE),
|
||||||
|
HTML_ATTRIBUTES(OL)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr optgroup_attr[HTML_OPTGROUP_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(OPTGROUP,CLASS),
|
||||||
|
HTML_ATTR(OPTGROUP,DISABLED),
|
||||||
|
HTML_ATTR(OPTGROUP,DIR),
|
||||||
|
HTML_ATTR(OPTGROUP,ID),
|
||||||
|
HTML_ATTR(OPTGROUP,LABEL),
|
||||||
|
HTML_ATTR(OPTGROUP,LANG),
|
||||||
|
HTML_ATTR(OPTGROUP,STYLE),
|
||||||
|
HTML_ATTR(OPTGROUP,TITLE),
|
||||||
|
HTML_ATTRIBUTES(OPTGROUP)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(OPTION,CLASS),
|
||||||
|
HTML_ATTR(OPTION,DISABLED),
|
||||||
|
HTML_ATTR(OPTION,DIR),
|
||||||
|
HTML_ATTR(OPTION,ID),
|
||||||
|
HTML_ATTR(OPTION,LABEL),
|
||||||
|
HTML_ATTR(OPTION,LANG),
|
||||||
|
HTML_ATTR(OPTION,SELECTED),
|
||||||
|
HTML_ATTR(OPTION,STYLE),
|
||||||
|
HTML_ATTR(OPTION,TITLE),
|
||||||
|
HTML_ATTR(OPTION,VALUE),
|
||||||
|
HTML_ATTRIBUTES(OPTION)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr param_attr[HTML_PARAM_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(PARAM,ID),
|
||||||
|
HTML_ATTR(PARAM,NAME),
|
||||||
|
HTML_ATTR(PARAM,TYPE),
|
||||||
|
HTML_ATTR(PARAM,VALUE),
|
||||||
|
HTML_ATTR(PARAM,VALUETYPE),
|
||||||
|
HTML_ATTRIBUTES(PARAM)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(PRE,CLASS),
|
||||||
|
HTML_ATTR(PRE,DIR),
|
||||||
|
HTML_ATTR(PRE,ID),
|
||||||
|
HTML_ATTR(PRE,LANG),
|
||||||
|
HTML_ATTR(PRE,STYLE),
|
||||||
|
HTML_ATTR(PRE,TITLE),
|
||||||
|
HTML_ATTR(PRE,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(PRE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr script_attr[HTML_SCRIPT_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(SCRIPT,CHARSET),
|
||||||
|
HTML_ATTR(SCRIPT,DEFER),
|
||||||
|
HTML_ATTR(SCRIPT,LANGUAGE),
|
||||||
|
HTML_ATTR(SCRIPT,SRC),
|
||||||
|
HTML_ATTR(SCRIPT,TYPE),
|
||||||
|
HTML_ATTRIBUTES(SCRIPT)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(SELECT,CLASS),
|
||||||
|
HTML_ATTR(SELECT,DIR),
|
||||||
|
HTML_ATTR(SELECT,DISABLED),
|
||||||
|
HTML_ATTR(SELECT,ID),
|
||||||
|
HTML_ATTR(SELECT,LANG),
|
||||||
|
HTML_ATTR(SELECT,MULTIPLE),
|
||||||
|
HTML_ATTR(SELECT,NAME),
|
||||||
|
HTML_ATTR(SELECT,SIZE),
|
||||||
|
HTML_ATTR(SELECT,STYLE),
|
||||||
|
HTML_ATTR(SELECT,TABINDEX),
|
||||||
|
HTML_ATTR(SELECT,TITLE),
|
||||||
|
HTML_ATTRIBUTES(SELECT)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr style_attr[HTML_STYLE_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(STYLE,DIR),
|
||||||
|
HTML_ATTR(STYLE,LANG),
|
||||||
|
HTML_ATTR(STYLE,MEDIA),
|
||||||
|
HTML_ATTR(STYLE,TITLE),
|
||||||
|
HTML_ATTR(STYLE,TYPE),
|
||||||
|
HTML_ATTRIBUTES(STYLE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(TABLE,ALIGN),
|
||||||
|
HTML_ATTR(TABLE,BGCOLOR),
|
||||||
|
HTML_ATTR(TABLE,BORDER),
|
||||||
|
HTML_ATTR(TABLE,CELLPADDING),
|
||||||
|
HTML_ATTR(TABLE,CELLSPACING),
|
||||||
|
HTML_ATTR(TABLE,CLASS),
|
||||||
|
HTML_ATTR(TABLE,DIR),
|
||||||
|
HTML_ATTR(TABLE,FRAME),
|
||||||
|
HTML_ATTR(TABLE,ID),
|
||||||
|
HTML_ATTR(TABLE,LANG),
|
||||||
|
HTML_ATTR(TABLE,RULES),
|
||||||
|
HTML_ATTR(TABLE,SUMMARY),
|
||||||
|
HTML_ATTR(TABLE,STYLE),
|
||||||
|
HTML_ATTR(TABLE,TITLE),
|
||||||
|
HTML_ATTR(TABLE,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(TABLE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr tele_attr[HTML_TELE_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(TELE,ALIGN),
|
||||||
|
HTML_ATTR(TELE,CHAR),
|
||||||
|
HTML_ATTR(TELE,CHAROFF),
|
||||||
|
HTML_ATTR(TELE,CLASS),
|
||||||
|
HTML_ATTR(TELE,DIR),
|
||||||
|
HTML_ATTR(TELE,ID),
|
||||||
|
HTML_ATTR(TELE,LANG),
|
||||||
|
HTML_ATTR(TELE,STYLE),
|
||||||
|
HTML_ATTR(TELE,TITLE),
|
||||||
|
HTML_ATTR(TELE,VALIGN),
|
||||||
|
HTML_ATTRIBUTES(TELE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr td_attr[HTML_TD_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(TD,ABBR),
|
||||||
|
HTML_ATTR(TD,ALIGN),
|
||||||
|
HTML_ATTR(TD,AXIS),
|
||||||
|
HTML_ATTR(TD,BGCOLOR),
|
||||||
|
HTML_ATTR(TD,CHAR),
|
||||||
|
HTML_ATTR(TD,CHAROFF),
|
||||||
|
HTML_ATTR(TD,CLASS),
|
||||||
|
HTML_ATTR(TD,COLSPAN),
|
||||||
|
HTML_ATTR(TD,DIR),
|
||||||
|
HTML_ATTR(TD,ID),
|
||||||
|
HTML_ATTR(TD,HEADERS),
|
||||||
|
HTML_ATTR(TD,HEIGHT),
|
||||||
|
HTML_ATTR(TD,LANG),
|
||||||
|
HTML_ATTR(TD,NOWRAP),
|
||||||
|
HTML_ATTR(TD,ROWSPAN),
|
||||||
|
HTML_ATTR(TD,SCOPE),
|
||||||
|
HTML_ATTR(TD,STYLE),
|
||||||
|
HTML_ATTR(TD,TITLE),
|
||||||
|
HTML_ATTR(TD,VALIGN),
|
||||||
|
HTML_ATTR(TD,WIDTH),
|
||||||
|
HTML_ATTRIBUTES(TD)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(TEXTAREA,CLASS),
|
||||||
|
HTML_ATTR(TEXTAREA,COLS),
|
||||||
|
HTML_ATTR(TEXTAREA,DIR),
|
||||||
|
HTML_ATTR(TEXTAREA,DISABLED),
|
||||||
|
HTML_ATTR(TEXTAREA,ID),
|
||||||
|
HTML_ATTR(TEXTAREA,LANG),
|
||||||
|
HTML_ATTR(TEXTAREA,NAME),
|
||||||
|
HTML_ATTR(TEXTAREA,READONLY),
|
||||||
|
HTML_ATTR(TEXTAREA,ROWS),
|
||||||
|
HTML_ATTR(TEXTAREA,STYLE),
|
||||||
|
HTML_ATTR(TEXTAREA,TABINDEX),
|
||||||
|
HTML_ATTR(TEXTAREA,TITLE),
|
||||||
|
HTML_ATTRIBUTES(TEXTAREA)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr title_attr[HTML_TITLE_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(TITLE,DIR),
|
||||||
|
HTML_ATTR(TITLE,LANG),
|
||||||
|
HTML_ATTRIBUTES(TITLE)
|
||||||
|
};
|
||||||
|
|
||||||
|
static HTAttr ul_attr[HTML_UL_ATTRIBUTES+1] = {
|
||||||
|
HTML_ATTR(UL,CLASS),
|
||||||
|
HTML_ATTR(UL,COMPACT),
|
||||||
|
HTML_ATTR(UL,DIR),
|
||||||
|
HTML_ATTR(UL,ID),
|
||||||
|
HTML_ATTR(UL,LANG),
|
||||||
|
HTML_ATTR(UL,STYLE),
|
||||||
|
HTML_ATTR(UL,TITLE),
|
||||||
|
HTML_ATTR(UL,TYPE),
|
||||||
|
HTML_ATTRIBUTES(UL)
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** ELEMENTS
|
||||||
|
** Must match definitions in HTMLPDTD.html!
|
||||||
|
** Must be in alphabetical order.
|
||||||
|
**
|
||||||
|
** Name, Attributes, content
|
||||||
|
*/
|
||||||
|
static HTTag tags[HTML_ELEMENTS] = {
|
||||||
|
{ "A" , a_attr, HTML_A_ATTRIBUTES },
|
||||||
|
{ "ABBR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "ACRONYM" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "ADDRESS" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "APPLET" , applet_attr, HTML_APPLET_ATTRIBUTES },
|
||||||
|
{ "AREA" , area_attr, HTML_AREA_ATTRIBUTES },
|
||||||
|
{ "B" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "BASE" , base_attr, HTML_BASE_ATTRIBUTES },
|
||||||
|
{ "BASEFONT", font_attr, HTML_FONT_ATTRIBUTES },
|
||||||
|
{ "BDO" , bdo_attr, HTML_BDO_ATTRIBUTES },
|
||||||
|
{ "BIG" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "BLOCKQUOTE", bq_attr, HTML_BQ_ATTRIBUTES },
|
||||||
|
{ "BODY" , body_attr, HTML_BODY_ATTRIBUTES },
|
||||||
|
{ "BR" , br_attr, HTML_BR_ATTRIBUTES },
|
||||||
|
{ "BUTTON" , button_attr, HTML_BUTTON_ATTRIBUTES },
|
||||||
|
{ "CAPTION" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "CENTER" , no_attr, 0 },
|
||||||
|
{ "CITE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "CODE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "COL" , col_attr, HTML_COL_ATTRIBUTES },
|
||||||
|
{ "COLGROUP", col_attr, HTML_COL_ATTRIBUTES },
|
||||||
|
{ "DD" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "DEL" , changes_attr, HTML_CHANGES_ATTRIBUTES },
|
||||||
|
{ "DFN" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "DIR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "DIV" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "DL" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "DT" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "EM" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "FIELDSET", gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "FONT" , font_attr, HTML_FONT_ATTRIBUTES },
|
||||||
|
{ "FORM" , form_attr, HTML_FORM_ATTRIBUTES },
|
||||||
|
{ "FRAME" , frame_attr, HTML_FRAME_ATTRIBUTES },
|
||||||
|
{ "FRAMESET", frameset_attr,HTML_FRAMESET_ATTRIBUTES },
|
||||||
|
{ "H1" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "H2" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "H3" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "H4" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "H5" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "H6" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "HEAD" , head_attr, HTML_HEAD_ATTRIBUTES },
|
||||||
|
{ "HR" , hr_attr, HTML_HR_ATTRIBUTES },
|
||||||
|
{ "HTML" , html_attr, HTML_HTML_ATTRIBUTES },
|
||||||
|
{ "I" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "IFRAME" , iframe_attr, HTML_IFRAME_ATTRIBUTES },
|
||||||
|
{ "IMG" , img_attr, HTML_IMG_ATTRIBUTES },
|
||||||
|
{ "INPUT" , input_attr, HTML_INPUT_ATTRIBUTES },
|
||||||
|
{ "INS" , changes_attr, HTML_CHANGES_ATTRIBUTES },
|
||||||
|
{ "ISINDEX" , isindex_attr, HTML_ISINDEX_ATTRIBUTES },
|
||||||
|
{ "KBD" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "LABEL" , label_attr, HTML_LABEL_ATTRIBUTES },
|
||||||
|
{ "LEGEND" , legend_attr, HTML_LEGEND_ATTRIBUTES },
|
||||||
|
{ "LI" , li_attr, HTML_LI_ATTRIBUTES },
|
||||||
|
{ "LINK" , link_attr, HTML_LINK_ATTRIBUTES },
|
||||||
|
{ "MAP" , map_attr, HTML_MAP_ATTRIBUTES },
|
||||||
|
{ "MENU" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "META" , meta_attr, HTML_META_ATTRIBUTES },
|
||||||
|
{ "NEXTID" , nextid_attr, 1 },
|
||||||
|
{ "NOFRAMES", gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "NOSCRIPT", gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "OBJECT" , object_attr, HTML_OBJECT_ATTRIBUTES },
|
||||||
|
{ "OL" , ol_attr, HTML_OL_ATTRIBUTES },
|
||||||
|
{ "OPTGROUP", optgroup_attr,HTML_OPTGROUP_ATTRIBUTES },
|
||||||
|
{ "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES },
|
||||||
|
{ "P" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "PARAM" , param_attr, HTML_PARAM_ATTRIBUTES },
|
||||||
|
{ "PRE" , pre_attr, HTML_PRE_ATTRIBUTES },
|
||||||
|
{ "Q" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "S" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "SAMP" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "SCRIPT" , script_attr, HTML_SCRIPT_ATTRIBUTES },
|
||||||
|
{ "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES },
|
||||||
|
{ "SMALL" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "SPAN" , block_attr, HTML_BLOCK_ATTRIBUTES },
|
||||||
|
{ "STRIKE" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "STRONG" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "STYLE" , style_attr, HTML_STYLE_ATTRIBUTES },
|
||||||
|
{ "SUB" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "SUP" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "TABLE" , table_attr, HTML_TABLE_ATTRIBUTES },
|
||||||
|
{ "TBODY" , tele_attr, HTML_TELE_ATTRIBUTES },
|
||||||
|
{ "TD" , td_attr, HTML_TD_ATTRIBUTES },
|
||||||
|
{ "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES },
|
||||||
|
{ "TFOOT" , tele_attr, HTML_TELE_ATTRIBUTES },
|
||||||
|
{ "TH" , td_attr, HTML_TD_ATTRIBUTES },
|
||||||
|
{ "THEAD" , tele_attr, HTML_TELE_ATTRIBUTES },
|
||||||
|
{ "TITLE" , title_attr, HTML_TITLE_ATTRIBUTES },
|
||||||
|
{ "TR" , tele_attr, HTML_TELE_ATTRIBUTES },
|
||||||
|
{ "TT" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "U" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
{ "UL" , ul_attr, HTML_UL_ATTRIBUTES },
|
||||||
|
{ "VAR" , gen_attr, HTML_GEN_ATTRIBUTES },
|
||||||
|
};
|
||||||
|
|
||||||
|
static SGML_dtd HTMLP_dtd = {
|
||||||
|
tags,
|
||||||
|
HTML_ELEMENTS
|
||||||
|
};
|
||||||
|
|
||||||
|
static SGML_dtd * DTD = &HTMLP_dtd;
|
||||||
|
|
||||||
|
SGML_dtd * HTML_dtd (void)
|
||||||
|
{
|
||||||
|
return DTD;
|
||||||
|
}
|
||||||
|
|
||||||
|
}// namespace
|
||||||
|
|
@ -0,0 +1,222 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/url_parser.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
// ***************************************************************************
|
||||||
|
CUrlParser::CUrlParser(const std::string &uri)
|
||||||
|
{
|
||||||
|
parse(uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
void CUrlParser::parse(std::string uri)
|
||||||
|
{
|
||||||
|
const size_t npos = std::string::npos;
|
||||||
|
size_t pos;
|
||||||
|
size_t offset = 0;
|
||||||
|
|
||||||
|
// strip fragment if present
|
||||||
|
pos = uri.find("#");
|
||||||
|
if (pos != npos)
|
||||||
|
{
|
||||||
|
hash = uri.substr(pos + 1);
|
||||||
|
uri = uri.substr(0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan for scheme
|
||||||
|
pos = uri.find(":");
|
||||||
|
if (pos != npos && pos >= 1)
|
||||||
|
{
|
||||||
|
for (uint i=0; i<pos; i++)
|
||||||
|
{
|
||||||
|
if (!isalnum(uri[i]))
|
||||||
|
{
|
||||||
|
pos = npos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pos != npos)
|
||||||
|
{
|
||||||
|
scheme = uri.substr(0, pos);
|
||||||
|
uri = uri.substr(pos + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan for domain
|
||||||
|
if (uri.substr(0, 2) == "//")
|
||||||
|
{
|
||||||
|
pos = uri.find("/", 3);
|
||||||
|
domain = uri.substr(0, pos);
|
||||||
|
if (pos != npos)
|
||||||
|
uri = uri.substr(pos);
|
||||||
|
else
|
||||||
|
uri.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan for query
|
||||||
|
pos = uri.find("?");
|
||||||
|
if (pos != npos)
|
||||||
|
{
|
||||||
|
query = uri.substr(pos + 1);
|
||||||
|
uri = uri.substr(0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// all that is remaining is path
|
||||||
|
path = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CUrlParser::inherit(const std::string &url)
|
||||||
|
{
|
||||||
|
// we have scheme, so we already absolute url
|
||||||
|
if (!scheme.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const size_t npos = std::string::npos;
|
||||||
|
size_t pos;
|
||||||
|
|
||||||
|
CUrlParser base(url);
|
||||||
|
|
||||||
|
scheme = base.scheme;
|
||||||
|
|
||||||
|
// if we already have domain, then ignore base path
|
||||||
|
if (!domain.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
domain = base.domain;
|
||||||
|
if (path.empty())
|
||||||
|
{
|
||||||
|
path = base.path;
|
||||||
|
if (query.empty())
|
||||||
|
query = base.query;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (path[0] != '/')
|
||||||
|
{
|
||||||
|
// find start of last path segment from base path
|
||||||
|
// if not found, then dont inherit base path at all
|
||||||
|
pos = base.path.find_last_of("/");
|
||||||
|
if (pos != npos)
|
||||||
|
path = base.path.substr(0, pos) + "/" + path;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolveRelativePath(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CUrlParser::resolveRelativePath(std::string &path)
|
||||||
|
{
|
||||||
|
const size_t npos = std::string::npos;
|
||||||
|
|
||||||
|
// no relative components in path. filename.ext is also matched, but that's fine
|
||||||
|
size_t pos = path.find(".");
|
||||||
|
if (pos == npos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// normalize path
|
||||||
|
size_t lhp = 0;
|
||||||
|
while(pos < path.size())
|
||||||
|
{
|
||||||
|
if (path[pos] == '.')
|
||||||
|
{
|
||||||
|
// scan ahead to see what we have
|
||||||
|
std::string sub = path.substr(pos, 2);
|
||||||
|
if (sub == "./" || sub == ".")
|
||||||
|
{
|
||||||
|
// starts with
|
||||||
|
if (pos == 0)
|
||||||
|
path.replace(pos, sub.size(), "/");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// full or last segment
|
||||||
|
sub = path.substr(pos-1, 3);
|
||||||
|
if (sub == "/./" || sub == "/.")
|
||||||
|
{
|
||||||
|
path.replace(pos, sub.size()-1, "");
|
||||||
|
// we just removed char that pos was pointing, so rewind
|
||||||
|
pos--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (sub == "..")
|
||||||
|
{
|
||||||
|
// starts with
|
||||||
|
if (pos == 0 && path.substr(pos, 3) == "../")
|
||||||
|
path.replace(pos, 3, "/");
|
||||||
|
else
|
||||||
|
if (pos > 0)
|
||||||
|
{
|
||||||
|
// full or last segment
|
||||||
|
sub = path.substr(pos-1, 4);
|
||||||
|
if (sub == "/../" || sub == "/..")
|
||||||
|
{
|
||||||
|
if (pos > 1)
|
||||||
|
lhp = path.find_last_of("/", pos - 2);
|
||||||
|
else
|
||||||
|
lhp = 0;
|
||||||
|
|
||||||
|
// pos points to first dot in ..
|
||||||
|
// lhp points to start slash (/) of last segment
|
||||||
|
pos += sub.size() - 1;
|
||||||
|
path.replace(lhp, pos - lhp, "/");
|
||||||
|
pos = lhp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}// sub == ".."
|
||||||
|
} // path[pos] == '.'
|
||||||
|
pos++;
|
||||||
|
}// while
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CUrlParser::isAbsolute() const
|
||||||
|
{
|
||||||
|
return !scheme.empty() && !domain.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
// serialize URL back to string
|
||||||
|
std::string CUrlParser::toString() const
|
||||||
|
{
|
||||||
|
std::string result;
|
||||||
|
if (!scheme.empty())
|
||||||
|
result += scheme + ":";
|
||||||
|
|
||||||
|
if (!domain.empty())
|
||||||
|
{
|
||||||
|
result += domain;
|
||||||
|
}
|
||||||
|
|
||||||
|
// path already has leading slash
|
||||||
|
if (!path.empty())
|
||||||
|
result += path;
|
||||||
|
|
||||||
|
if (!query.empty())
|
||||||
|
result += "?" + query;
|
||||||
|
|
||||||
|
if (!hash.empty())
|
||||||
|
result += "#" + hash;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}// namespace
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue