XMLUri.hpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:16k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  * 
  4.  * Copyright (c) 2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  * 
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer. 
  13.  * 
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  * 
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:  
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  * 
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written 
  29.  *    permission, please contact apache@apache.org.
  30.  * 
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  * 
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  * 
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /*
  57.  * $Id: XMLUri.hpp,v 1.3 2001/08/29 19:03:03 peiyongz Exp $
  58.  * $Log: XMLUri.hpp,v $
  59.  * Revision 1.3  2001/08/29 19:03:03  peiyongz
  60.  * Bugzilla# 2816:on AIX 4.2, xlC 3 r ev.1, Compilation error on inline method
  61.  *
  62.  * Revision 1.2  2001/08/16 14:09:44  peiyongz
  63.  * Removed unused ctors and methods
  64.  *
  65.  * Revision 1.1  2001/08/10 16:23:41  peiyongz
  66.  * XMLUri: creation
  67.  *
  68.  *
  69.  */
  70. #if !defined(XMLURI_HPP)
  71. #define XMLURI_HPP
  72. #include <util/XercesDefs.hpp>
  73. #include <util/XMLException.hpp>
  74. #include <util/XMLUniDefs.hpp>
  75. #include <util/XMLString.hpp>
  76. /*
  77.  * This class is a direct port of Java's URI class, to distinguish 
  78.  * itself from the XMLURL, we use the name XMLUri instead of 
  79.  * XMLURI.
  80.  * 
  81.  * TODO: how to relate XMLUri and XMLURL since URL is part of URI.
  82.  *
  83.  */
  84. class XMLUTIL_EXPORT XMLUri
  85. {
  86. public:
  87.     // -----------------------------------------------------------------------
  88.     //  Constructors and Destructor
  89.     // -----------------------------------------------------------------------
  90.     /**
  91.      * Construct a new URI from a URI specification string. 
  92.      *  
  93.      * If the specification follows the "generic URI" syntax, (two slashes
  94.      * following the first colon), the specification will be parsed
  95.      * accordingly - setting the 
  96.      *                           scheme, 
  97.      *                           userinfo, 
  98.      *                           host,
  99.      *                           port, 
  100.      *                           path, 
  101.      *                           querystring and 
  102.      *                           fragment 
  103.      * fields as necessary. 
  104.      * 
  105.      * If the specification does not follow the "generic URI" syntax, 
  106.      * the specification is parsed into a 
  107.      *                           scheme and 
  108.      *                           scheme-specific part (stored as the path) only.
  109.      *
  110.      * @param uriSpec the URI specification string (cannot be null or empty)
  111.      *
  112.      * ctor# 2
  113.      *
  114.      */
  115.     XMLUri(const XMLCh* const    uriSpec);
  116.     /**
  117.      * Construct a new URI from a base URI and a URI specification string.
  118.      * The URI specification string may be a relative URI.
  119.      *
  120.      * @param base the base URI (cannot be null if uriSpec is null or
  121.      *               empty)
  122.      * @param uriSpec the URI specification string (cannot be null or
  123.      *                  empty if base is null)
  124.      *
  125.      * ctor# 7 relative ctor
  126.      *
  127.      */
  128.     XMLUri(const XMLUri* const     baseURI
  129.          , const XMLCh* const      uriSpec);
  130.     virtual ~XMLUri();
  131.     // -----------------------------------------------------------------------
  132.     //  Operators
  133.     // -----------------------------------------------------------------------
  134.     // -----------------------------------------------------------------------
  135.     //  Getter methods
  136.     // -----------------------------------------------------------------------
  137.     /**
  138.      * Get the scheme for this URI.
  139.      *
  140.      * @return the scheme for this URI
  141.      */
  142.      const XMLCh* getScheme() const;
  143.  
  144.     /**
  145.      * Get the userinfo for this URI.
  146.      *
  147.      * @return the userinfo for this URI (null if not specified).
  148.      */
  149.      const XMLCh* getUserInfo() const;
  150.     /**
  151.      * Get the host for this URI.
  152.      *
  153.      * @return the host for this URI (null if not specified).
  154.      */
  155.      const XMLCh* getHost() const;
  156.     /**
  157.      * Get the port for this URI.
  158.      *
  159.      * @return the port for this URI (-1 if not specified).
  160.      */
  161.      int getPort() const;
  162.     /**
  163.      * Get the path for this URI. Note that the value returned is the path
  164.      * only and does not include the query string or fragment.
  165.      *
  166.      * @return the path for this URI.
  167.      */
  168.      const XMLCh* getPath() const;
  169.     /**
  170.      * Get the query string for this URI.
  171.      *
  172.      * @return the query string for this URI. Null is returned if there
  173.      *         was no "?" in the URI spec, empty string if there was a
  174.      *         "?" but no query string following it.
  175.      */
  176.      const XMLCh* getQueryString() const;
  177.     /**
  178.      * Get the fragment for this URI.
  179.      *
  180.      * @return the fragment for this URI. Null is returned if there
  181.      *         was no "#" in the URI spec, empty string if there was a
  182.      *         "#" but no fragment following it.
  183.      */
  184.      const XMLCh* getFragment() const;
  185.     // -----------------------------------------------------------------------
  186.     //  Setter methods
  187.     // -----------------------------------------------------------------------
  188.  
  189.     /**
  190.      * Set the scheme for this URI. The scheme is converted to lowercase
  191.      * before it is set.
  192.      *
  193.      * @param newScheme the scheme for this URI (cannot be null)
  194.      *
  195.      */
  196.      void setScheme(const XMLCh* const newScheme);
  197.     /**
  198.      * Set the userinfo for this URI. If a non-null value is passed in and
  199.      * the host value is null, then an exception is thrown.
  200.      *
  201.      * @param newUserinfo the userinfo for this URI
  202.      *
  203.      */
  204.      void setUserInfo(const XMLCh* const newUserInfo);
  205.     /**
  206.      * Set the host for this URI. If null is passed in, the userinfo
  207.      * field is also set to null and the port is set to -1.
  208.      *
  209.      * @param newHost the host for this URI
  210.      *
  211.      */
  212.      void setHost(const XMLCh* const newHost);
  213.     /**
  214.      * Set the port for this URI. -1 is used to indicate that the port is
  215.      * not specified, otherwise valid port numbers are  between 0 and 65535.
  216.      * If a valid port number is passed in and the host field is null,
  217.      * an exception is thrown.
  218.      *
  219.      * @param newPort the port number for this URI
  220.      *
  221.      */
  222.      void setPort(int newPort);
  223.   
  224.     /**
  225.      * Set the path for this URI. 
  226.      *
  227.      * If the supplied path is null, then the
  228.      * query string and fragment are set to null as well. 
  229.      *
  230.      * If the supplied path includes a query string and/or fragment, 
  231.      * these fields will be parsed and set as well. 
  232.      *
  233.      * Note:
  234.      *
  235.      * For URIs following the "generic URI" syntax, the path 
  236.      * specified should start with a slash.
  237.      *
  238.      * For URIs that do not follow the generic URI syntax, this method
  239.      * sets the scheme-specific part.
  240.      *
  241.      * @param newPath the path for this URI (may be null)
  242.      *
  243.      */
  244.      void setPath(const XMLCh* const newPath);
  245.     /**
  246.      * Set the query string for this URI. A non-null value is valid only
  247.      * if this is an URI conforming to the generic URI syntax and
  248.      * the path value is not null.
  249.      *
  250.      * @param newQueryString the query string for this URI
  251.      *
  252.      */
  253.      void setQueryString(const XMLCh* const newQueryString);
  254.     /**
  255.      * Set the fragment for this URI. A non-null value is valid only
  256.      * if this is a URI conforming to the generic URI syntax and
  257.      * the path value is not null.
  258.      *
  259.      * @param fragment the fragment for this URI
  260.      *
  261.      */
  262.      void setFragment(const XMLCh* const newFragment);
  263.      // -----------------------------------------------------------------------
  264.     //  Miscellaneous methods
  265.     // -----------------------------------------------------------------------
  266. private:
  267.     static const XMLCh RESERVED_CHARACTERS[];
  268.     static const XMLCh MARK_CHARACTERS[];
  269.     static const XMLCh SCHEME_CHARACTERS[];
  270.     static const XMLCh USERINFO_CHARACTERS[];
  271.     /**
  272.      * Unimplemented copy ctor
  273.      */
  274.     XMLUri(const XMLUri& toCopy);    
  275.     XMLUri& operator=(const XMLUri& toAssign);
  276.     // -----------------------------------------------------------------------
  277.     //  Private helper methods
  278.     // -----------------------------------------------------------------------
  279.     /**
  280.      * Determine whether a character is a reserved character:
  281.      *
  282.      * @return true if the string contains any reserved characters
  283.      */
  284.     static bool isReservedCharacter(const XMLCh theChar);
  285.     /**
  286.      * Determine whether a char is an unreserved character.
  287.      *
  288.      * @return true if the char is unreserved, false otherwise
  289.      */
  290.     static bool isUnreservedCharacter(const XMLCh theChar);
  291.     /**
  292.      * Determine whether a scheme conforms to the rules for a scheme name.
  293.      * A scheme is conformant if it starts with an alphanumeric, and
  294.      * contains only alphanumerics, '+','-' and '.'.
  295.      *
  296.      * @return true if the scheme is conformant, false otherwise
  297.      */
  298.     static bool isConformantSchemeName(const XMLCh* const scheme);
  299.     /**
  300.      * Determine whether a userInfo conforms to the rules for a userinfo.
  301.      *
  302.      * @return true if the scheme is conformant, false otherwise
  303.      */
  304.     static void isConformantUserInfo(const XMLCh* const userInfo);
  305.     /**
  306.      * Determine whether a given string contains only URI characters (also
  307.      * called "uric" in RFC 2396). uric consist of all reserved
  308.      * characters, unreserved characters and escaped characters.
  309.      *
  310.      * @return true if the string is comprised of uric, false otherwise
  311.      */
  312.     static bool isURIString(const XMLCh* const uric);
  313.     /**
  314.      * Determine whether a string is syntactically capable of representing
  315.      * a valid IPv4 address or the domain name of a network host. 
  316.      *
  317.      * A valid IPv4 address consists of four decimal digit groups 
  318.      * separated by a '.'. 
  319.      *
  320.      * A hostname consists of domain labels (each of which must begin and 
  321.      * end with an alphanumeric but may contain '-') separated by a '.'. 
  322.      * See RFC 2396 Section 3.2.2.
  323.      *
  324.      * @return true if the string is a syntactically valid IPv4 address
  325.      *              or hostname
  326.      */
  327.      static bool isWellFormedAddress(const XMLCh* const addr);
  328.     /**
  329.      * Get the indicator as to whether this URI uses the "generic URI"
  330.      * syntax.
  331.      *
  332.      * @return true if this URI uses the "generic URI" syntax, false
  333.      *         otherwise
  334.      */
  335.      bool isGenericURI();
  336.     // -----------------------------------------------------------------------
  337.     //  Miscellaneous methods
  338.     // -----------------------------------------------------------------------
  339.     /**
  340.      * Initialize all fields of this URI from another URI.
  341.      *
  342.      * @param toCopy the URI to copy (cannot be null)
  343.      */
  344.      void initialize(const XMLUri& toCopy);
  345.     /**
  346.      * Initializes this URI from a base URI and a URI specification string.
  347.      * See RFC 2396 Section 4 and Appendix B for specifications on parsing
  348.      * the URI and Section 5 for specifications on resolving relative URIs
  349.      * and relative paths.
  350.      *
  351.      * @param baseURI the base URI (may be null if uriSpec is an absolute
  352.      *               URI)
  353.      *
  354.      * @param uriSpec the URI spec string which may be an absolute or
  355.      *                  relative URI (can only be null/empty if base
  356.      *                  is not null)
  357.      *
  358.      */
  359.      void initialize(const XMLUri* const baseURI
  360.                    , const XMLCh*  const uriSpec);
  361.     /**
  362.      * Initialize the scheme for this URI from a URI string spec.
  363.      *
  364.      * @param uriSpec the URI specification (cannot be null)
  365.      *
  366.      */
  367.      void initializeScheme(const XMLCh* const uriSpec);
  368.                  
  369.     /**
  370.      * Initialize the authority (userinfo, host and port) for this
  371.      * URI from a URI string spec.
  372.      *
  373.      * @param uriSpec the URI specification (cannot be null)
  374.      *
  375.      */
  376.      void initializeAuthority(const XMLCh* const uriSpec);
  377.     /**
  378.      * Initialize the path for this URI from a URI string spec.
  379.      *
  380.      * @param uriSpec the URI specification (cannot be null)
  381.      *
  382.      */
  383.      void initializePath(const XMLCh* const uriSpec);
  384.     // -----------------------------------------------------------------------
  385.     //  Data members
  386.     //
  387.     //  for all the data member, we own it, 
  388.     //  responsible for the creation and/or deletion for
  389.     //  the memory allocated.
  390.     //
  391.     // -----------------------------------------------------------------------
  392.     XMLCh*          fScheme;
  393.     XMLCh*          fUserInfo;
  394.     XMLCh*          fHost;
  395.     int             fPort;
  396.     XMLCh*          fPath;
  397.     XMLCh*          fQueryString;
  398.     XMLCh*          fFragment;
  399.     
  400. };
  401. // ---------------------------------------------------------------------------
  402. //  XMLUri: Public operators
  403. // ---------------------------------------------------------------------------
  404. // ctor# 2
  405. inline XMLUri::XMLUri(const XMLCh* const uriSpec)
  406. :fScheme(0)
  407. ,fUserInfo(0)
  408. ,fHost(0)
  409. ,fPort(-1)
  410. ,fPath(0)
  411. ,fQueryString(0)
  412. ,fFragment(0)
  413. {
  414.     initialize((XMLUri *)0, uriSpec);
  415. }
  416. // ctor# 7 relative ctor
  417. inline XMLUri::XMLUri(const XMLUri* const      baseURI
  418.                     , const XMLCh* const       uriSpec)
  419. :fScheme(0)
  420. ,fUserInfo(0)
  421. ,fHost(0)
  422. ,fPort(-1)
  423. ,fPath(0)
  424. ,fQueryString(0)
  425. ,fFragment(0)
  426. {
  427.     initialize(baseURI, uriSpec);
  428. }  
  429. // ---------------------------------------------------------------------------
  430. //  XMLUri: Getter methods
  431. // ---------------------------------------------------------------------------
  432. inline const XMLCh* XMLUri::getScheme() const
  433. {
  434.     return fScheme;
  435. }
  436. inline const XMLCh* XMLUri::getUserInfo() const
  437. {
  438. return fUserInfo;
  439. }
  440. inline const XMLCh* XMLUri::getHost() const
  441. {
  442. return fHost;
  443. }
  444. inline int XMLUri::getPort() const
  445. {
  446. return fPort;
  447. }
  448. inline const XMLCh* XMLUri::getPath() const
  449. {
  450. return fPath;
  451. }
  452. inline const XMLCh* XMLUri::getQueryString() const
  453. {
  454. return fQueryString;
  455. }
  456. inline const XMLCh* XMLUri::getFragment() const
  457. {
  458. return fFragment;
  459. }
  460. // ---------------------------------------------------------------------------
  461. //  XMLUri: Helper methods
  462. // ---------------------------------------------------------------------------
  463. inline bool XMLUri::isReservedCharacter(const XMLCh theChar)
  464. {
  465.     return (XMLString::indexOf(RESERVED_CHARACTERS, theChar) != -1);
  466. }  
  467. inline bool XMLUri::isUnreservedCharacter(const XMLCh theChar)
  468. {
  469.     return (XMLString::isAlphaNum(theChar) ||
  470.             XMLString::indexOf(MARK_CHARACTERS, theChar) != -1);
  471. }  
  472. #endif