llmime.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmime.h
  3.  * @author Phoenix
  4.  * @date 2006-12-20
  5.  * @brief Declaration of mime tools.
  6.  *
  7.  * $LicenseInfo:firstyear=2006&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2006-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #ifndef LL_LLMIME_H
  35. #define LL_LLMIME_H
  36. #include <string>
  37. #include "llsd.h"
  38. /**
  39.  * This file declares various tools for parsing and creating MIME
  40.  * objects as described in RFCs 2045, 2046, 2047, 2048, and 2049.
  41.  */
  42. /** 
  43.  * @class LLMimeIndex
  44.  * @brief Skeletal information useful for handling mime packages.
  45.  * @see LLMimeParser
  46.  *
  47.  * An instance of this class is the parsed output from a LLMimeParser
  48.  * which then allows for easy access into a data stream to find and
  49.  * get what you want out of it.
  50.  *
  51.  * This class meant as a tool to quickly find what you seek in a
  52.  * parsed mime entity. As such, it does not have useful support for
  53.  * modification of a mime entity and specializes the interface toward
  54.  * querying data from a fixed mime entity. Modifying an instance of
  55.  * LLMimeIndx does not alter a mime entity and changes to a mime
  56.  * entity itself are not propogated into an instance of a LLMimeIndex.
  57.  *
  58.  * Usage:<br>
  59.  *  LLMimeIndex mime_index;<br>
  60.  *  std::ifstream fstr("package.mime", ios::binary);<br>
  61.  *  LLMimeParser parser;<br>
  62.  *  if(parser.parseIndex(fstr, mime_index))<br>
  63.  *  {<br>
  64.  *    std::vector<U8> content;<br>
  65.  *    content.resize(mime_index.contentLength());<br>
  66.  *    fstr.seekg(mime_index.offset(), ios::beg);<br>
  67.  *    // ...do work on fstr and content<br>
  68.  *  }<br>
  69.  */
  70. class LLMimeIndex
  71. {
  72. public:
  73. /* @name Client interface.
  74.  */
  75. //@{
  76. /** 
  77.  * @brief Get the full parsed headers for this.
  78.  *
  79.  * If there are any headers, it will be a map of header name to
  80.  * the value found on the line. The name is everything before the
  81.  * colon, and the value is the string found after the colon to the
  82.  * end of the line after trimming leading whitespace. So, for
  83.  * example:
  84.  * Content-Type:  text/plain
  85.  * would become an entry in the headers of:
  86.  * headers["Content-Type"] == "text/plain"
  87.  *
  88.  * If this instance of an index was generated by the
  89.  * LLMimeParser::parseIndex() call, all header names in rfc2045
  90.  * will be capitalized as in rfc, eg Content-Length and
  91.  * MIME-Version, not content-length and mime-version.
  92.  * @return Returns an LLSD map of header name to value. Returns
  93.  * undef if there are no headers.
  94.  */
  95. LLSD headers() const;
  96. /** 
  97.  * @brief Get the content offset.
  98.  *
  99.  * @return Returns the number of bytes to the start of the data
  100.  * segment from the start of serialized mime entity. Returns -1 if
  101.  * offset is not known.
  102.  */
  103. S32 offset() const;
  104. /** 
  105.  * @brief Get the length of the data segment for this mime part.
  106.  *
  107.  * @return Returns the content length in bytes. Returns -1 if
  108.  * length is not known.
  109.  */
  110. S32 contentLength() const;
  111. /** 
  112.  * @brief Get the mime type associated with this node.
  113.  *
  114.  * @return Returns the mimetype.
  115.  */
  116. std::string contentType() const;
  117. /** 
  118.  * @brief Helper method which simplifies parsing the return from type()
  119.  *
  120.  * @return Returns true if this is a multipart mime, and therefore
  121.  * getting subparts will succeed.
  122.  */
  123. bool isMultipart() const;
  124. /** 
  125.  * @brief Get the number of atachments.
  126.  *
  127.  * @return Returns the number of sub-parts for this.
  128.  */
  129. S32 subPartCount() const;
  130. /** 
  131.  * @brief Get the indicated attachment.
  132.  *
  133.  * @param index Value from 0 to (subPartCount() - 1).
  134.  * @return Returns the indicated sub-part, or an invalid mime
  135.  * index on failure.
  136.  */
  137. LLMimeIndex subPart(S32 index) const;
  138. //@}
  139. /* @name Interface for building, testing, and helpers for typical use.
  140.  */
  141. //@{
  142. /**
  143.  * @brief Default constructor - creates a useless LLMimeIndex.
  144.  */
  145. LLMimeIndex();
  146. /**
  147.  * @brief Full constructor.
  148.  *
  149.  * @param headers The complete headers.
  150.  * @param content_offset The number of bytes to the start of the
  151.  * data segment of this mime entity from the start of the stream
  152.  * or buffer.
  153.  */
  154. LLMimeIndex(LLSD headers, S32 content_offset);
  155. /**
  156.  * @brief Copy constructor.
  157.  *
  158.  * @param mime The other mime object.
  159.  */
  160. LLMimeIndex(const LLMimeIndex& mime);
  161. // @brief Destructor.
  162. ~LLMimeIndex();
  163. /*
  164.  * @breif Assignment operator.
  165.  *
  166.  * @param mime The other mime object.
  167.  * @return Returns this after assignment.
  168.  */
  169. LLMimeIndex& operator=(const LLMimeIndex& mime);
  170. /** 
  171.  * @brief Add attachment information as a sub-part to a multipart mime.
  172.  *
  173.  * @param sub_part the part to attach.
  174.  * @return Returns true on success, false on failure.
  175.  */
  176. bool attachSubPart(LLMimeIndex sub_part);
  177. //@}
  178. protected:
  179. // Implementation.
  180. class Impl;
  181. Impl* mImpl;
  182. };
  183. /** 
  184.  * @class LLMimeParser
  185.  * @brief This class implements a MIME parser and verifier.
  186.  *
  187.  * THOROUGH_DESCRIPTION
  188.  */
  189. class LLMimeParser
  190. {
  191. public:
  192. // @brief Make a new mime parser.
  193. LLMimeParser();
  194. // @brief Mime parser Destructor.
  195. ~LLMimeParser();
  196. // @brief Reset internal state of this parser.
  197. void reset();
  198. /* @name Index generation interface.
  199.  */
  200. //@{
  201. /** 
  202.  * @brief Parse a stream to find the mime index information.
  203.  *
  204.  * This method will scan the istr until a single complete mime
  205.  * entity is read or EOF. The istr will be modified by this
  206.  * parsing, so pass in a temporary stream or rewind/reset the
  207.  * stream after this call.
  208.  * @param istr An istream which contains a mime entity.
  209.  * @param index[out] The parsed output.
  210.  * @return Returns true if an index was parsed and no errors occurred.
  211.  */
  212. bool parseIndex(std::istream& istr, LLMimeIndex& index);
  213. /** 
  214.  * @brief Parse a vector to find the mime index information.
  215.  *
  216.  * @param buffer A vector with data to parse.
  217.  * @param index[out] The parsed output.
  218.  * @return Returns true if an index was parsed and no errors occurred.
  219.  */
  220. bool parseIndex(const std::vector<U8>& buffer, LLMimeIndex& index);
  221. /** 
  222.  * @brief Parse a stream to find the mime index information.
  223.  *
  224.  * This method will scan the istr until a single complete mime
  225.  * entity is read, an EOF, or limit bytes have been scanned. The
  226.  * istr will be modified by this parsing, so pass in a temporary
  227.  * stream or rewind/reset the stream after this call.
  228.  * @param istr An istream which contains a mime entity.
  229.  * @param limit The maximum number of bytes to scan.
  230.  * @param index[out] The parsed output.
  231.  * @return Returns true if an index was parsed and no errors occurred.
  232.  */
  233. bool parseIndex(std::istream& istr, S32 limit, LLMimeIndex& index);
  234. /** 
  235.  * @brief Parse a memory bufffer to find the mime index information.
  236.  *
  237.  * @param buffer The start of the buffer to parse.
  238.  * @param buffer_length The length of the buffer.
  239.  * @param index[out] The parsed output.
  240.  * @return Returns true if an index was parsed and no errors occurred.
  241.  */
  242. bool parseIndex(const U8* buffer, S32 buffer_length, LLMimeIndex& index);
  243. //@}
  244. /** 
  245.  * @brief 
  246.  *
  247.  * @return
  248.  */
  249. //bool verify(std::istream& istr, LLMimeIndex& index) const;
  250. /** 
  251.  * @brief 
  252.  *
  253.  * @return
  254.  */
  255. //bool verify(U8* buffer, S32 buffer_length, LLMimeIndex& index) const;
  256. protected:
  257. // Implementation.
  258. class Impl;
  259. Impl& mImpl;
  260. private:
  261. // @brief Not implemneted to prevent copy consturction.
  262. LLMimeParser(const LLMimeParser& parser);
  263. // @brief Not implemneted to prevent assignment.
  264. LLMimeParser& operator=(const LLMimeParser& mime);
  265. };
  266. #endif // LL_LLMIME_H