mime.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:13k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * mime.h
  3.  *
  4.  * Multipurpose Internet Mail Extensions support classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: mime.h,v $
  30.  * Revision 1.13  1999/03/09 08:01:46  robertj
  31.  * Changed comments for doc++ support (more to come).
  32.  *
  33.  * Revision 1.12  1999/02/16 08:07:10  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.11  1998/11/30 02:50:52  robertj
  37.  * New directory structure
  38.  *
  39.  * Revision 1.10  1998/09/23 06:19:42  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.9  1997/02/05 11:53:11  robertj
  43.  * Changed construction of MIME dictionary to be delayed untill it is used.
  44.  *
  45.  * Revision 1.8  1996/09/14 13:09:15  robertj
  46.  * Major upgrade:
  47.  *   rearranged sockets to help support IPX.
  48.  *   added indirect channel class and moved all protocols to descend from it,
  49.  *   separating the protocol from the low level byte transport.
  50.  *
  51.  * Revision 1.7  1996/07/15 10:28:31  robertj
  52.  * Changed memory block base64 conversion functions to be void *.
  53.  *
  54.  * Revision 1.6  1996/03/16 04:38:09  robertj
  55.  * Fixed bug in MIME write function, should be const.
  56.  *
  57.  * Revision 1.5  1996/02/25 03:04:32  robertj
  58.  * Added decoding of Base64 to a block of memory instead of PBYTEArray.
  59.  *
  60.  * Revision 1.4  1996/01/28 14:14:30  robertj
  61.  * Further implementation of secure config.
  62.  *
  63.  * Revision 1.3  1996/01/28 02:46:07  robertj
  64.  * Removal of MemoryPointer classes as usage didn't work for GNU.
  65.  *
  66.  * Revision 1.2  1996/01/26 02:24:27  robertj
  67.  * Further implemetation.
  68.  *
  69.  * Revision 1.1  1996/01/23 13:06:18  robertj
  70.  * Initial revision
  71.  *
  72.  */
  73. #ifndef _PMIME
  74. #define _PMIME
  75. #ifdef __GNUC__
  76. #pragma interface
  77. #endif
  78. #include <ptclib/inetprot.h>
  79. //////////////////////////////////////////////////////////////////////////////
  80. // PMIMEInfo
  81. /** This class contains the Multipurpose Internet Mail Extensions parameters
  82.    and variables.
  83.  */
  84. #ifdef DOC_PLUS_PLUS
  85. class PMIMEInfo : public PStringToString {
  86. #endif
  87. PDECLARE_STRING_DICTIONARY(PMIMEInfo, PCaselessString);
  88.   public:
  89.     PMIMEInfo(
  90.       istream &strm   // Stream to read the objects contents from.
  91.     );
  92.     PMIMEInfo(
  93.       PInternetProtocol & socket   // Application socket to read MIME info.
  94.     );
  95.     // Construct a MIME infromation dictionary from the specified source.
  96.   // Overrides from class PObject
  97.     /** Output the contents of the MIME dictionary to the stream. This is
  98.        primarily used by the standard ##operator<<## function.
  99.      */
  100.     virtual void PrintOn(
  101.       ostream &strm   // Stream to print the object into.
  102.     ) const;
  103.     /** Input the contents of the MIME dictionary from the stream. This is
  104.        primarily used by the standard ##operator>>## function.
  105.      */
  106.     virtual void ReadFrom(
  107.       istream &strm   // Stream to read the objects contents from.
  108.     );
  109.   // New functions for class.
  110.     /** Read MIME information from the socket.
  111.        @return
  112.        TRUE if the MIME information was successfully read.
  113.      */
  114.     BOOL Read(
  115.       PInternetProtocol & socket   // Application socket to read MIME info.
  116.     );
  117.     /** Write MIME information to the socket.
  118.        @return
  119.        TRUE if the MIME information was successfully read.
  120.      */
  121.     BOOL Write(
  122.       PInternetProtocol & socket   // Application socket to write MIME info.
  123.     ) const;
  124.     /** Determine if the specified key is present in the MIME information
  125.        set.
  126.        @return
  127.        TRUE if the MIME variable is present.
  128.      */
  129.     BOOL HasKey(
  130.       const PString & key       // Key into MIME dictionary to get info.
  131.     ) const { return GetAt(PCaselessString(key)) != NULL; }
  132.     /** Get a string for the particular MIME info field with checking for
  133.        existance. The #dflt# parameter is substituted if the field
  134.        does not exist in the MIME information read in.
  135.        @return
  136.        String for the value of the MIME variable.
  137.      */
  138.     PString GetString(
  139.       const PString & key,       // Key into MIME dictionary to get info.
  140.       const PString & dflt       // Default value of field if not in MIME info.
  141.     ) const;
  142.     /** Get an integer value for the particular MIME info field with checking
  143.        for existance. The #dflt# parameter is substituted if the
  144.        field does not exist in the MIME information read in.
  145.        @return
  146.        Integer value for the MIME variable.
  147.      */
  148.     long GetInteger(
  149.       const PString & key,    // Key into MIME dictionary to get info.
  150.       long dflt               // Default value of field if not in MIME info.
  151.     ) const;
  152.     /** Set an association between a file type and a MIME content type. The
  153.        content type is then sent for any file in the directory sub-tree that
  154.        has the same extension.
  155.        Note that if the #merge# parameter if TRUE then the
  156.        dictionary is merged into the current association list and is not a
  157.        simple replacement.
  158.        The default values placed in this dictionary are:
  159. begin{verbatim}
  160.           ".txt", "text/plain"
  161.           ".text", "text/plain"
  162.           ".html", "text/html"
  163.           ".htm", "text/html"
  164.           ".aif", "audio/aiff"
  165.           ".aiff", "audio/aiff"
  166.           ".au", "audio/basic"
  167.           ".snd", "audio/basic"
  168.           ".wav", "audio/wav"
  169.           ".gif", "image/gif"
  170.           ".xbm", "image/x-bitmap"
  171.           ".tif", "image/tiff"
  172.           ".tiff", "image/tiff"
  173.           ".jpg", "image/jpeg"
  174.           ".jpe", "image/jpeg"
  175.           ".jpeg", "image/jpeg"
  176.           ".avi", "video/avi"
  177.           ".mpg", "video/mpeg"
  178.           ".mpeg", "video/mpeg"
  179.           ".qt", "video/quicktime"
  180.           ".mov", "video/quicktime"
  181. end{verbatim}
  182.        The default content type will be "application/octet-stream".
  183.      */
  184.     static void SetAssociation(
  185.       const PStringToString & allTypes,  // MIME content type associations.
  186.       BOOL merge = TRUE                  // Flag for merging associations.
  187.     );
  188.     static void SetAssociation(
  189.       const PString & fileType,         // File type (extension) to match.
  190.       const PString & contentType       // MIME content type string.
  191.     ) { GetContentTypes().SetAt(fileType, contentType); }
  192.     /** Look up the file type to MIME content type association dictionary and
  193.        return the MIME content type string. If the file type is not found in
  194.        the dictionary then the string "application/octet-stream" is returned.
  195.        @return
  196.        MIME content type for file type.
  197.      */
  198.     static PString GetContentType(
  199.       const PString & fileType   // File type (extension) to look up.
  200.     );
  201.   private:
  202.     static PStringToString & GetContentTypes();
  203. };
  204. /** This class is used to encode/decode data using the MIME standard base64
  205.    encoding mechanism as defined in RFC1521.
  206.    To encode a large block of data use the following seqeunce:
  207. begin{verbatim}
  208.       PBase64 base;
  209.       base.StartEncoding();
  210.       while (Read(dataChunk)) {
  211.         base.ProcessEncoding(dataChunk);
  212.         out << base.GetEncodedString();
  213.       }
  214.       out << base.CompleteEncoding();
  215. end{verbatim}
  216.     if smaller blocks that fit easily in memory are to be encoded the
  217.     #Encode()# functions can be used to everything in one go.
  218.     To decode a large block of data use the following sequence:
  219. begin{verbatim}
  220.       PBase64 base;
  221.       base.StartDecoding();
  222.       while (Read(str) && ProcessDecoding(str))
  223.         Write(base.GetDecodedData());
  224.       Write(base.GetDecodedData());
  225. end{verbatim}
  226.     if smaller blocks that fit easily in memory are to be decoded the
  227.     #Decode()# functions can be used to everything in one go.
  228.  */
  229. class PBase64 : public PObject
  230. {
  231.   PCLASSINFO(PBase64, PObject);
  232.   public:
  233.     /** Construct a base 64 encoder/decoder and initialise both encode and
  234.        decode members as in #StartEncoding()# and #StartDecoding()#.
  235.      */
  236.     PBase64();
  237.     void StartEncoding(
  238.       BOOL useCRLFs = TRUE  // Use CR, LF pairs in end of line characters.
  239.     );
  240.     // Begin a base 64 encoding operation, initialising the object instance.
  241.     void ProcessEncoding(
  242.       const PString & str      // String to be encoded
  243.     );
  244.     void ProcessEncoding(
  245.       const char * cstr        // C String to be encoded
  246.     );
  247.     void ProcessEncoding(
  248.       const PBYTEArray & data  // Data block to be encoded
  249.     );
  250.     void ProcessEncoding(
  251.       const void * dataBlock,  // Pointer to data to be encoded
  252.       PINDEX length            // Length of the data block.
  253.     );
  254.     // Incorporate the specified data into the base 64 encoding.
  255.     /** Get the partial Base64 string for the data encoded so far.
  256.     
  257.        @return
  258.        Base64 encoded string for the processed data.
  259.      */
  260.     PString GetEncodedString();
  261.     /** Complete the base 64 encoding and return the remainder of the encoded
  262.        Base64 string. Previous data may have been already removed by the
  263.        #GetInterim()# function.
  264.     
  265.        @return
  266.        Base64 encoded string for the processed data.
  267.      */
  268.     PString CompleteEncoding();
  269.     static PString Encode(
  270.       const PString & str     // String to be encoded to Base64
  271.     );
  272.     static PString Encode(
  273.       const char * cstr       // C String to be encoded to Base64
  274.     );
  275.     static PString Encode(
  276.       const PBYTEArray & data // Data block to be encoded to Base64
  277.     );
  278.     static PString Encode(
  279.       const void * dataBlock, // Pointer to data to be encoded to Base64
  280.       PINDEX length           // Length of the data block.
  281.     );
  282.     // Encode the data in memory to Base 64 data returnin the string.
  283.     void StartDecoding();
  284.     // Begin a base 64 decoding operation, initialising the object instance.
  285.     /** Incorporate the specified data into the base 64 decoding.
  286.     
  287.        @return
  288.        TRUE if block was last in the Base64 encoded string.
  289.      */
  290.     BOOL ProcessDecoding(
  291.       const PString & str      // String to be encoded
  292.     );
  293.     BOOL ProcessDecoding(
  294.       const char * cstr        // C String to be encoded
  295.     );
  296.     /** Get the data decoded so far from the Base64 strings processed.
  297.     
  298.        @return
  299.        Decoded data for the processed Base64 string.
  300.      */
  301.     BOOL GetDecodedData(
  302.       void * dataBlock,    // Pointer to data to be decoded from base64
  303.       PINDEX length        // Length of the data block.
  304.     );
  305.     PBYTEArray GetDecodedData();
  306.     /** Return a flag to indicate that the input was decoded without any
  307.        extraneous or illegal characters in it that were ignored. This does not
  308.        mean that the data is not valid, only that it is suspect.
  309.     
  310.        @return
  311.        Decoded data for the processed Base64 string.
  312.      */
  313.     BOOL IsDecodeOK() { return perfectDecode; }
  314.     /** Convert a printable text string to binary data using the Internet MIME
  315.        standard base 64 content transfer encoding.
  316.        The base64 string is checked and TRUE returned if all perfectly correct.
  317.        If FALSE is returned then the string had extraneous or illegal
  318.        characters in it that were ignored. This does not mean that the data is
  319.        not valid, only that it is suspect.
  320.     
  321.        @return
  322.        Base 64 string decoded from input string.
  323.      */
  324.     static PString Decode(
  325.       const PString & str // Encoded base64 string to be decoded.
  326.     );
  327.     static BOOL Decode(
  328.       const PString & str, // Encoded base64 string to be decoded.
  329.       PBYTEArray & data    // Converted binary data from base64.
  330.     );
  331.     static BOOL Decode(
  332.       const PString & str, // Encoded base64 string to be decoded.
  333.       void * dataBlock,    // Pointer to data to be decoded from base64
  334.       PINDEX length        // Length of the data block.
  335.     );
  336.   private:
  337.     void OutputBase64(const BYTE * data);
  338.     PString encodedString;
  339.     PINDEX  encodeLength;
  340.     BYTE    saveTriple[3];
  341.     PINDEX  saveCount;
  342.     PINDEX  nextLine;
  343.     BOOL    useCRLFs;
  344.     BOOL       perfectDecode;
  345.     PINDEX     quadPosition;
  346.     PBYTEArray decodedData;
  347.     PINDEX     decodeSize;
  348. };
  349. #endif
  350. // End Of File ///////////////////////////////////////////////////////////////