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

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) 2001, 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: Base64.hpp,v 1.3 2001/10/10 19:14:08 peiyongz Exp $
  58.  */
  59. #ifndef BASE64_HPP
  60. #define BASE64_HPP
  61. #include <util/XercesDefs.hpp>
  62. #include <util/XMLUniDefs.hpp>
  63. //
  64. // This class provides encode/decode for RFC 2045 Base64 as
  65. // defined by RFC 2045, N. Freed and N. Borenstein.
  66. // RFC 2045: Multipurpose Internet Mail Extensions (MIME)
  67. // Part One: Format of Internet Message Bodies. Reference
  68. // 1996 Available at: http://www.ietf.org/rfc/rfc2045.txt
  69. // This class is used by XML Schema binary format validation
  70. //  
  71. //
  72. class XMLUTIL_EXPORT Base64
  73. {
  74. public :
  75.     //@{
  76.     /**
  77.      * Encodes octets into Base64 data
  78.      * 
  79.      * @param inputData Byte array containing binary data.
  80.      * @param inputLength Length of the input array.
  81.      * @param outputLength Pointer to variable, where will be
  82.      *     stored length of returned data.
  83.      * @return Byte array containing encoded Base64 data,
  84.      *     or NULL if input data can not be encoded.
  85.      */
  86.     static XMLCh* encode (
  87.         const XMLCh* const inputData,
  88.         const int inputLength,
  89.         int *outputLength = 0 );
  90.     /**
  91.      * Get data length
  92.      * returns length of decoded data given an array 
  93.      * containing encoded data.
  94.      *
  95.      * @param inputData Byte array containing Base64 data.
  96.      * @return Length of decoded data, or -1 if input data
  97.      *     can not be decoded.
  98.      */
  99.     static int getDataLength(
  100.         const XMLCh* const inputData );
  101.     /**
  102.      * Decodes Base64 data into octets
  103.      * 
  104.      * @param inputData Byte array containing Base64 data.
  105.      * @param outputLength Reference to variable, where will be
  106.      *     stored length of returned data.
  107.      * @return Byte array containing decoded binary data, or 
  108.      *     NULL if input data can not be decoded.
  109.      */
  110.     static XMLCh* decode(
  111.         const XMLCh* const inputData,
  112.         int& outputLength );
  113.     //@}
  114. private :
  115.     // -----------------------------------------------------------------------
  116.     //  Helper methods
  117.     // -----------------------------------------------------------------------
  118.     static void init();
  119.     static bool isData(const XMLCh& octet);
  120.     static bool isPad(const XMLCh& octet);
  121.     static XMLCh set1stOctet(const XMLCh&, const XMLCh&);
  122.     static XMLCh set2ndOctet(const XMLCh&, const XMLCh&);
  123.     static XMLCh set3rdOctet(const XMLCh&, const XMLCh&);
  124.     static void split1stOctet(const XMLCh&, XMLCh&, XMLCh&);
  125.     static void split2ndOctet(const XMLCh&, XMLCh&, XMLCh&);
  126.     static void split3rdOctet(const XMLCh&, XMLCh&, XMLCh&);
  127.     // -----------------------------------------------------------------------
  128.     //  Unimplemented constructors and operators
  129.     // -----------------------------------------------------------------------
  130.     Base64();
  131.     Base64(const Base64&);
  132.     // -----------------------------------------------------------------------
  133.     //  Private data members
  134.     //
  135.     //  base64Alphabet
  136.     //     The Base64 alphabet (see RFC 2045).
  137.     //
  138.     //  base64Padding
  139.     //     Padding character (see RFC 2045).
  140.     //
  141.     //  base64Inverse
  142.     //     Table used in decoding base64.
  143.     //
  144.     //  isInitialized
  145.     //     Set once base64Inverse is initalized.
  146.     //
  147.     //  quadsPerLine
  148.     //     Number of quadruplets per one line. The encoded output
  149.     //     stream must be represented in lines of no more 
  150.     //     than 19 quadruplets each.
  151.     //
  152.     // -----------------------------------------------------------------------
  153.     static const XMLCh  base64Alphabet[];
  154.     static const XMLCh  base64Padding;
  155.     static XMLCh  base64Inverse[];
  156.     static bool  isInitialized;
  157.     static const unsigned int  quadsPerLine;
  158. };
  159. // -----------------------------------------------------------------------
  160. //  Helper methods
  161. // -----------------------------------------------------------------------
  162. inline bool Base64::isPad(const XMLCh& octet) 
  163. {
  164.     return ( octet == base64Padding );
  165. }
  166. inline XMLCh Base64::set1stOctet(const XMLCh& b1, const XMLCh& b2)
  167. {
  168.     return (( b1 << 2 ) | ( b2 >> 4 ));
  169. }
  170. inline XMLCh Base64::set2ndOctet(const XMLCh& b2, const XMLCh& b3)
  171. {
  172.     return (( b2 << 4 ) | ( b3 >> 2 ));
  173. }
  174. inline XMLCh Base64::set3rdOctet(const XMLCh& b3, const XMLCh& b4)
  175. {
  176.     return (( b3 << 6 ) | b4 );
  177. }
  178. inline void Base64::split1stOctet(const XMLCh& ch, XMLCh& b1, XMLCh& b2) {
  179.     b1 = ch >> 2;
  180.     b2 = ( ch & 0x3 ) << 4;
  181. }
  182. inline void Base64::split2ndOctet(const XMLCh& ch, XMLCh& b2, XMLCh& b3) {
  183.     b2 |= ch >> 4;  // combine with previous value
  184.     b3 = ( ch & 0xf ) << 2;
  185. }
  186. inline void Base64::split3rdOctet(const XMLCh& ch, XMLCh& b3, XMLCh& b4) {
  187.     b3 |= ch >> 6;  // combine with previous value 
  188.     b4 = ( ch & 0x3f );
  189. }
  190. #endif