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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsdserialize.h
  3.  * @author Phoenix
  4.  * @date 2006-02-26
  5.  * @brief Declaration of parsers and formatters for LLSD
  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_LLSDSERIALIZE_H
  35. #define LL_LLSDSERIALIZE_H
  36. #include <iosfwd>
  37. #include "llpointer.h"
  38. #include "llrefcount.h"
  39. #include "llsd.h"
  40. /** 
  41.  * @class LLSDParser
  42.  * @brief Abstract base class for LLSD parsers.
  43.  */
  44. class LL_COMMON_API LLSDParser : public LLRefCount
  45. {
  46. protected:
  47. /** 
  48.  * @brief Destructor
  49.  */
  50. virtual ~LLSDParser();
  51. public:
  52. /** 
  53.  * @brief Anonymous enum to indicate parsing failure.
  54.  */
  55. enum
  56. {
  57. PARSE_FAILURE = -1
  58. };
  59. /** 
  60.  * @brief Constructor
  61.  */
  62. LLSDParser();
  63. /** 
  64.  * @brief Call this method to parse a stream for LLSD.
  65.  *
  66.  * This method parses the istream for a structured data. This
  67.  * method assumes that the istream is a complete llsd object --
  68.  * for example an opened and closed map with an arbitrary nesting
  69.  * of elements. This method will return after reading one data
  70.  * object, allowing continued reading from the stream by the
  71.  * caller.
  72.  * @param istr The input stream.
  73.  * @param data[out] The newly parse structured data.
  74.  * @param max_bytes The maximum number of bytes that will be in
  75.  * the stream. Pass in LLSDSerialize::SIZE_UNLIMITED (-1) to set no
  76.  * byte limit.
  77.  * @return Returns the number of LLSD objects parsed into
  78.  * data. Returns PARSE_FAILURE (-1) on parse failure.
  79.  */
  80. S32 parse(std::istream& istr, LLSD& data, S32 max_bytes);
  81. /** Like parse(), but uses a different call (istream.getline()) to read by lines
  82.  *  This API is better suited for XML, where the parse cannot tell
  83.  *  where the document actually ends.
  84.  */
  85. S32 parseLines(std::istream& istr, LLSD& data);
  86. /** 
  87.  * @brief Resets the parser so parse() or parseLines() can be called again for another <llsd> chunk.
  88.  */
  89. void reset() { doReset(); };
  90. protected:
  91. /** 
  92.  * @brief Pure virtual base for doing the parse.
  93.  *
  94.  * This method parses the istream for a structured data. This
  95.  * method assumes that the istream is a complete llsd object --
  96.  * for example an opened and closed map with an arbitrary nesting
  97.  * of elements. This method will return after reading one data
  98.  * object, allowing continued reading from the stream by the
  99.  * caller.
  100.  * @param istr The input stream.
  101.  * @param data[out] The newly parse structured data.
  102.  * @return Returns the number of LLSD objects parsed into
  103.  * data. Returns PARSE_FAILURE (-1) on parse failure.
  104.  */
  105. virtual S32 doParse(std::istream& istr, LLSD& data) const = 0;
  106. /** 
  107.  * @brief Virtual default function for resetting the parser
  108.  */
  109. virtual void doReset() {};
  110. /* @name Simple istream helper methods 
  111.  *
  112.  * These helper methods exist to help correctly use the
  113.  * mMaxBytesLeft without really thinking about it for most simple
  114.  * operations. Use of the streamtools in llstreamtools.h will
  115.  * require custom wrapping.
  116.  */
  117. //@{
  118. /** 
  119.  * @brief get a byte off the stream
  120.  *
  121.  * @param istr The istream to work with.
  122.  * @return returns the next character.
  123.  */
  124. int get(std::istream& istr) const;
  125. /** 
  126.  * @brief get several bytes off the stream into a buffer.
  127.  *
  128.  * @param istr The istream to work with.
  129.  * @param s The buffer to get into
  130.  * @param n Extract maximum of n-1 bytes and null temrinate.
  131.  * @param delim Delimiter to get until found.
  132.  * @return Returns istr.
  133.  */
  134. std::istream& get(
  135. std::istream& istr,
  136. char* s,
  137. std::streamsize n,
  138. char delim) const;
  139. /** 
  140.  * @brief get several bytes off the stream into a streambuf
  141.  *
  142.  * @param istr The istream to work with.
  143.  * @param sb The streambuf to read into
  144.  * @param delim Delimiter to get until found.
  145.  * @return Returns istr.
  146.  */
  147. std::istream& get(
  148. std::istream& istr,
  149. std::streambuf& sb,
  150. char delim) const;
  151. /** 
  152.  * @brief ignore the next byte on the istream
  153.  *
  154.  * @param istr The istream to work with.
  155.  * @return Returns istr.
  156.  */
  157. std::istream& ignore(std::istream& istr) const;
  158. /** 
  159.  * @brief put the last character retrieved back on the stream
  160.  *
  161.  * @param istr The istream to work with.
  162.  * @param c The character to put back
  163.  * @return Returns istr.
  164.  */
  165. std::istream& putback(std::istream& istr, char c) const;
  166. /** 
  167.  * @brief read a block of n characters into a buffer
  168.  *
  169.  * @param istr The istream to work with.
  170.  * @param s The buffer to read into
  171.  * @param n The number of bytes to read.
  172.  * @return Returns istr.
  173.  */
  174. std::istream& read(std::istream& istr, char* s, std::streamsize n) const;
  175. //@}
  176. protected:
  177. /**
  178.  * @brief Accunt for bytes read outside of the istream helpers.
  179.  *
  180.  * Conceptually const since it only modifies mutable members.
  181.  * @param bytes The number of bytes read.
  182.  */
  183. void account(S32 bytes) const;
  184. protected:
  185. /**
  186.  * @brief boolean to set if byte counts should be checked during parsing.
  187.  */
  188. bool mCheckLimits;
  189. /**
  190.  * @brief The maximum number of bytes left to be parsed.
  191.  */
  192. mutable S32 mMaxBytesLeft;
  193. /**
  194.  * @brief Use line-based reading to get text
  195.  */
  196. bool mParseLines;
  197. };
  198. /** 
  199.  * @class LLSDNotationParser
  200.  * @brief Parser which handles the original notation format for LLSD.
  201.  */
  202. class LL_COMMON_API LLSDNotationParser : public LLSDParser
  203. {
  204. protected:
  205. /** 
  206.  * @brief Destructor
  207.  */
  208. virtual ~LLSDNotationParser();
  209. public:
  210. /** 
  211.  * @brief Constructor
  212.  */
  213. LLSDNotationParser();
  214. protected:
  215. /** 
  216.  * @brief Call this method to parse a stream for LLSD.
  217.  *
  218.  * This method parses the istream for a structured data. This
  219.  * method assumes that the istream is a complete llsd object --
  220.  * for example an opened and closed map with an arbitrary nesting
  221.  * of elements. This method will return after reading one data
  222.  * object, allowing continued reading from the stream by the
  223.  * caller.
  224.  * @param istr The input stream.
  225.  * @param data[out] The newly parse structured data. Undefined on failure.
  226.  * @return Returns the number of LLSD objects parsed into
  227.  * data. Returns PARSE_FAILURE (-1) on parse failure.
  228.  */
  229. virtual S32 doParse(std::istream& istr, LLSD& data) const;
  230. private:
  231. /** 
  232.  * @brief Parse a map from the istream
  233.  *
  234.  * @param istr The input stream.
  235.  * @param map The map to add the parsed data.
  236.  * @return Returns The number of LLSD objects parsed into data.
  237.  */
  238. S32 parseMap(std::istream& istr, LLSD& map) const;
  239. /** 
  240.  * @brief Parse an array from the istream.
  241.  *
  242.  * @param istr The input stream.
  243.  * @param array The array to append the parsed data.
  244.  * @return Returns The number of LLSD objects parsed into data.
  245.  */
  246. S32 parseArray(std::istream& istr, LLSD& array) const;
  247. /** 
  248.  * @brief Parse a string from the istream and assign it to data.
  249.  *
  250.  * @param istr The input stream.
  251.  * @param data[out] The data to assign.
  252.  * @return Retuns true if a complete string was parsed.
  253.  */
  254. bool parseString(std::istream& istr, LLSD& data) const;
  255. /** 
  256.  * @brief Parse binary data from the stream.
  257.  *
  258.  * @param istr The input stream.
  259.  * @param data[out] The data to assign.
  260.  * @return Retuns true if a complete blob was parsed.
  261.  */
  262. bool parseBinary(std::istream& istr, LLSD& data) const;
  263. };
  264. /** 
  265.  * @class LLSDXMLParser
  266.  * @brief Parser which handles XML format LLSD.
  267.  */
  268. class LL_COMMON_API LLSDXMLParser : public LLSDParser
  269. {
  270. protected:
  271. /** 
  272.  * @brief Destructor
  273.  */
  274. virtual ~LLSDXMLParser();
  275. public:
  276. /** 
  277.  * @brief Constructor
  278.  */
  279. LLSDXMLParser();
  280. protected:
  281. /** 
  282.  * @brief Call this method to parse a stream for LLSD.
  283.  *
  284.  * This method parses the istream for a structured data. This
  285.  * method assumes that the istream is a complete llsd object --
  286.  * for example an opened and closed map with an arbitrary nesting
  287.  * of elements. This method will return after reading one data
  288.  * object, allowing continued reading from the stream by the
  289.  * caller.
  290.  * @param istr The input stream.
  291.  * @param data[out] The newly parse structured data.
  292.  * @return Returns the number of LLSD objects parsed into
  293.  * data. Returns PARSE_FAILURE (-1) on parse failure.
  294.  */
  295. virtual S32 doParse(std::istream& istr, LLSD& data) const;
  296. /** 
  297.  * @brief Virtual default function for resetting the parser
  298.  */
  299. virtual void doReset();
  300. private:
  301. class Impl;
  302. Impl& impl;
  303. void parsePart(const char* buf, int len);
  304. friend class LLSDSerialize;
  305. };
  306. /** 
  307.  * @class LLSDBinaryParser
  308.  * @brief Parser which handles binary formatted LLSD.
  309.  */
  310. class LL_COMMON_API LLSDBinaryParser : public LLSDParser
  311. {
  312. protected:
  313. /** 
  314.  * @brief Destructor
  315.  */
  316. virtual ~LLSDBinaryParser();
  317. public:
  318. /** 
  319.  * @brief Constructor
  320.  */
  321. LLSDBinaryParser();
  322. protected:
  323. /** 
  324.  * @brief Call this method to parse a stream for LLSD.
  325.  *
  326.  * This method parses the istream for a structured data. This
  327.  * method assumes that the istream is a complete llsd object --
  328.  * for example an opened and closed map with an arbitrary nesting
  329.  * of elements. This method will return after reading one data
  330.  * object, allowing continued reading from the stream by the
  331.  * caller.
  332.  * @param istr The input stream.
  333.  * @param data[out] The newly parse structured data.
  334.  * @return Returns the number of LLSD objects parsed into
  335.  * data. Returns -1 on parse failure.
  336.  */
  337. virtual S32 doParse(std::istream& istr, LLSD& data) const;
  338. private:
  339. /** 
  340.  * @brief Parse a map from the istream
  341.  *
  342.  * @param istr The input stream.
  343.  * @param map The map to add the parsed data.
  344.  * @return Returns The number of LLSD objects parsed into data.
  345.  */
  346. S32 parseMap(std::istream& istr, LLSD& map) const;
  347. /** 
  348.  * @brief Parse an array from the istream.
  349.  *
  350.  * @param istr The input stream.
  351.  * @param array The array to append the parsed data.
  352.  * @return Returns The number of LLSD objects parsed into data.
  353.  */
  354. S32 parseArray(std::istream& istr, LLSD& array) const;
  355. /** 
  356.  * @brief Parse a string from the istream and assign it to data.
  357.  *
  358.  * @param istr The input stream.
  359.  * @param value[out] The string to assign.
  360.  * @return Retuns true if a complete string was parsed.
  361.  */
  362. bool parseString(std::istream& istr, std::string& value) const;
  363. };
  364. /** 
  365.  * @class LLSDFormatter
  366.  * @brief Abstract base class for formatting LLSD.
  367.  */
  368. class LL_COMMON_API LLSDFormatter : public LLRefCount
  369. {
  370. protected:
  371. /** 
  372.  * @brief Destructor
  373.  */
  374. virtual ~LLSDFormatter();
  375. public:
  376. /**
  377.  * Options for output
  378.  */
  379. typedef enum e_formatter_options_type
  380. {
  381. OPTIONS_NONE = 0,
  382. OPTIONS_PRETTY = 1
  383. } EFormatterOptions;
  384. /** 
  385.  * @brief Constructor
  386.  */
  387. LLSDFormatter();
  388. /** 
  389.  * @brief Set the boolean serialization format.
  390.  *
  391.  * @param alpha Serializes boolean as alpha if true.
  392.  */
  393. void boolalpha(bool alpha);
  394. /** 
  395.  * @brief Set the real format
  396.  *
  397.  * By default, the formatter will use default double serialization
  398.  * which is frequently frustrating for many applications. You can
  399.  * set the precision on the stream independently, but that still
  400.  * might not work depending on the value.
  401.  * EXAMPLES:<br>
  402.  * %.2f<br>
  403.  * @param format A format string which follows the printf format
  404.  * rules. Specify an empty string to return to default formatting.
  405.  */
  406. void realFormat(const std::string& format);
  407. /** 
  408.  * @brief Call this method to format an LLSD to a stream.
  409.  *
  410.  * @param data The data to write.
  411.  * @param ostr The destination stream for the data.
  412.  * @return Returns The number of LLSD objects fomatted out
  413.  */
  414. virtual S32 format(const LLSD& data, std::ostream& ostr, U32 options = LLSDFormatter::OPTIONS_NONE) const = 0;
  415. protected:
  416. /** 
  417.  * @brief Helper method which appropriately obeys the real format.
  418.  *
  419.  * @param real The real value to format.
  420.  * @param ostr The destination stream for the data.
  421.  */
  422. void formatReal(LLSD::Real real, std::ostream& ostr) const;
  423. protected:
  424. bool mBoolAlpha;
  425. std::string mRealFormat;
  426. };
  427. /** 
  428.  * @class LLSDNotationFormatter
  429.  * @brief Formatter which outputs the original notation format for LLSD.
  430.  */
  431. class LL_COMMON_API LLSDNotationFormatter : public LLSDFormatter
  432. {
  433. protected:
  434. /** 
  435.  * @brief Destructor
  436.  */
  437. virtual ~LLSDNotationFormatter();
  438. public:
  439. /** 
  440.  * @brief Constructor
  441.  */
  442. LLSDNotationFormatter();
  443. /** 
  444.  * @brief Helper static method to return a notation escaped string
  445.  *
  446.  * This method will return the notation escaped string, but not
  447.  * the surrounding serialization identifiers such as a double or
  448.  * single quote. It will be up to the caller to embed those as
  449.  * appropriate.
  450.  * @param in The raw, unescaped string.
  451.  * @return Returns an escaped string appropriate for serialization.
  452.  */
  453. static std::string escapeString(const std::string& in);
  454. /** 
  455.  * @brief Call this method to format an LLSD to a stream.
  456.  *
  457.  * @param data The data to write.
  458.  * @param ostr The destination stream for the data.
  459.  * @return Returns The number of LLSD objects fomatted out
  460.  */
  461. virtual S32 format(const LLSD& data, std::ostream& ostr, U32 options = LLSDFormatter::OPTIONS_NONE) const;
  462. };
  463. /** 
  464.  * @class LLSDXMLFormatter
  465.  * @brief Formatter which outputs the LLSD as XML.
  466.  */
  467. class LL_COMMON_API LLSDXMLFormatter : public LLSDFormatter
  468. {
  469. protected:
  470. /** 
  471.  * @brief Destructor
  472.  */
  473. virtual ~LLSDXMLFormatter();
  474. public:
  475. /** 
  476.  * @brief Constructor
  477.  */
  478. LLSDXMLFormatter();
  479. /** 
  480.  * @brief Helper static method to return an xml escaped string
  481.  *
  482.  * @param in A valid UTF-8 string.
  483.  * @return Returns an escaped string appropriate for serialization.
  484.  */
  485. static std::string escapeString(const std::string& in);
  486. /** 
  487.  * @brief Call this method to format an LLSD to a stream.
  488.  *
  489.  * @param data The data to write.
  490.  * @param ostr The destination stream for the data.
  491.  * @return Returns The number of LLSD objects fomatted out
  492.  */
  493. virtual S32 format(const LLSD& data, std::ostream& ostr, U32 options = LLSDFormatter::OPTIONS_NONE) const;
  494. protected:
  495. /** 
  496.  * @brief Implementation to format the data. This is called recursively.
  497.  *
  498.  * @param data The data to write.
  499.  * @param ostr The destination stream for the data.
  500.  * @return Returns The number of LLSD objects fomatted out
  501.  */
  502. S32 format_impl(const LLSD& data, std::ostream& ostr, U32 options, U32 level) const;
  503. };
  504. /** 
  505.  * @class LLSDBinaryFormatter
  506.  * @brief Formatter which outputs the LLSD as a binary notation format.
  507.  *
  508.  * The binary format is a compact and efficient representation of
  509.  * structured data useful for when transmitting over a small data pipe
  510.  * or when transmission frequency is very high.<br>
  511.  *
  512.  * The normal boolalpha and real format commands are ignored.<br>
  513.  *
  514.  * All integers are transmitted in network byte order. The format is:<br>
  515.  * Undefined: '!'<br>
  516.  * Boolean: character '1' for true character '0' for false<br>
  517.  * Integer: 'i' + 4 bytes network byte order<br>
  518.  * Real: 'r' + 8 bytes IEEE double<br>
  519.  * UUID: 'u' + 16 byte unsigned integer<br>
  520.  * String: 's' + 4 byte integer size + string<br>
  521.  * Date: 'd' + 8 byte IEEE double for seconds since epoch<br>
  522.  * URI: 'l' + 4 byte integer size + string uri<br>
  523.  * Binary: 'b' + 4 byte integer size + binary data<br>
  524.  * Array: '[' + 4 byte integer size  + all values + ']'<br>
  525.  * Map: '{' + 4 byte integer size  every(key + value) + '}'<br>
  526.  *  map keys are serialized as 'k' + 4 byte integer size + string
  527.  */
  528. class LL_COMMON_API LLSDBinaryFormatter : public LLSDFormatter
  529. {
  530. protected:
  531. /** 
  532.  * @brief Destructor
  533.  */
  534. virtual ~LLSDBinaryFormatter();
  535. public:
  536. /** 
  537.  * @brief Constructor
  538.  */
  539. LLSDBinaryFormatter();
  540. /** 
  541.  * @brief Call this method to format an LLSD to a stream.
  542.  *
  543.  * @param data The data to write.
  544.  * @param ostr The destination stream for the data.
  545.  * @return Returns The number of LLSD objects fomatted out
  546.  */
  547. virtual S32 format(const LLSD& data, std::ostream& ostr, U32 options = LLSDFormatter::OPTIONS_NONE) const;
  548. protected:
  549. /** 
  550.  * @brief Helper method to serialize strings
  551.  *
  552.  * This method serializes a network byte order size and the raw
  553.  * string contents.
  554.  * @param string The string to write.
  555.  * @param ostr The destination stream for the data.
  556.  */
  557. void formatString(const std::string& string, std::ostream& ostr) const;
  558. };
  559. /** 
  560.  * @class LLSDNotationStreamFormatter
  561.  * @brief Formatter which is specialized for use on streams which
  562.  * outputs the original notation format for LLSD.
  563.  *
  564.  * This class is useful for doing inline stream operations. For example:
  565.  *
  566.  * <code>
  567.  *  LLSD sd;<br>
  568.  *  sd["foo"] = "bar";<br>
  569.  *  std::stringstream params;<br>
  570.  * params << "[{'version':i1}," << LLSDOStreamer<LLSDNotationFormatter>(sd)
  571.  *    << "]";
  572.  *  </code>
  573.  *
  574.  * *NOTE - formerly this class inherited from its template parameter Formatter,
  575.  * but all insnatiations passed in LLRefCount subclasses.  This conflicted with
  576.  * the auto allocation intended for this class template (demonstrated in the
  577.  * example above).  -brad
  578.  */
  579. template <class Formatter>
  580. class LLSDOStreamer
  581. {
  582. public:
  583. /** 
  584.  * @brief Constructor
  585.  */
  586. LLSDOStreamer(const LLSD& data, U32 options = LLSDFormatter::OPTIONS_NONE) :
  587. mSD(data), mOptions(options) {}
  588. /**
  589.  * @brief Stream operator.
  590.  *
  591.  * Use this inline during construction during a stream operation.
  592.  * @param str The destination stream for serialized output.
  593.  * @param The formatter which will output it's LLSD.
  594.  * @return Returns the stream passed in after streaming mSD.
  595.  */
  596. friend std::ostream& operator<<(
  597. std::ostream& str,
  598. const LLSDOStreamer<Formatter>& formatter)
  599. {
  600. LLPointer<Formatter> f = new Formatter;
  601. f->format(formatter.mSD, str, formatter.mOptions);
  602. return str;
  603. }
  604. protected:
  605. LLSD mSD;
  606. U32 mOptions;
  607. };
  608. typedef LLSDOStreamer<LLSDNotationFormatter> LLSDNotationStreamer;
  609. typedef LLSDOStreamer<LLSDXMLFormatter> LLSDXMLStreamer;
  610. /** 
  611.  * @class LLSDSerialize
  612.  * @brief Serializer / deserializer for the various LLSD formats
  613.  */
  614. class LL_COMMON_API LLSDSerialize
  615. {
  616. public:
  617. enum ELLSD_Serialize
  618. {
  619. LLSD_BINARY, LLSD_XML
  620. };
  621. /**
  622.  * @brief anonymouse enumeration for useful max_bytes constants.
  623.  */
  624. enum
  625. {
  626. // Setting an unlimited size is discouraged and should only be
  627. // used when reading cin or another stream source which does
  628. // not provide access to size.
  629. SIZE_UNLIMITED = -1,
  630. };
  631. /*
  632.  * Generic in/outs
  633.  */
  634. static void serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize,
  635. U32 options = LLSDFormatter::OPTIONS_NONE);
  636. /**
  637.  * @brief Examine a stream, and parse 1 sd object out based on contents.
  638.  *
  639.  * @param sd [out] The data found on the stream
  640.  * @param str The incoming stream
  641.  * @param max_bytes the maximum number of bytes to parse
  642.  * @return Returns true if the stream appears to contain valid data
  643.  */
  644. static bool deserialize(LLSD& sd, std::istream& str, S32 max_bytes);
  645. /*
  646.  * Notation Methods
  647.  */
  648. static S32 toNotation(const LLSD& sd, std::ostream& str)
  649. {
  650. LLPointer<LLSDNotationFormatter> f = new LLSDNotationFormatter;
  651. return f->format(sd, str, LLSDFormatter::OPTIONS_NONE);
  652. }
  653. static S32 fromNotation(LLSD& sd, std::istream& str, S32 max_bytes)
  654. {
  655. LLPointer<LLSDNotationParser> p = new LLSDNotationParser;
  656. return p->parse(str, sd, max_bytes);
  657. }
  658. static LLSD fromNotation(std::istream& str, S32 max_bytes)
  659. {
  660. LLPointer<LLSDNotationParser> p = new LLSDNotationParser;
  661. LLSD sd;
  662. (void)p->parse(str, sd, max_bytes);
  663. return sd;
  664. }
  665. /*
  666.  * XML Methods
  667.  */
  668. static S32 toXML(const LLSD& sd, std::ostream& str)
  669. {
  670. LLPointer<LLSDXMLFormatter> f = new LLSDXMLFormatter;
  671. return f->format(sd, str, LLSDFormatter::OPTIONS_NONE);
  672. }
  673. static S32 toPrettyXML(const LLSD& sd, std::ostream& str)
  674. {
  675. LLPointer<LLSDXMLFormatter> f = new LLSDXMLFormatter;
  676. return f->format(sd, str, LLSDFormatter::OPTIONS_PRETTY);
  677. }
  678. static S32 fromXMLEmbedded(LLSD& sd, std::istream& str)
  679. {
  680. // no need for max_bytes since xml formatting is not
  681. // subvertable by bad sizes.
  682. LLPointer<LLSDXMLParser> p = new LLSDXMLParser;
  683. return p->parse(str, sd, LLSDSerialize::SIZE_UNLIMITED);
  684. }
  685. // Line oriented parser, 30% faster than fromXML(), but can
  686. // only be used when you know you have the complete XML
  687. // document available in the stream.
  688. static S32 fromXMLDocument(LLSD& sd, std::istream& str)
  689. {
  690. LLPointer<LLSDXMLParser> p = new LLSDXMLParser();
  691. return p->parseLines(str, sd);
  692. }
  693. static S32 fromXML(LLSD& sd, std::istream& str)
  694. {
  695. return fromXMLEmbedded(sd, str);
  696. // return fromXMLDocument(sd, str);
  697. }
  698. /*
  699.  * Binary Methods
  700.  */
  701. static S32 toBinary(const LLSD& sd, std::ostream& str)
  702. {
  703. LLPointer<LLSDBinaryFormatter> f = new LLSDBinaryFormatter;
  704. return f->format(sd, str, LLSDFormatter::OPTIONS_NONE);
  705. }
  706. static S32 fromBinary(LLSD& sd, std::istream& str, S32 max_bytes)
  707. {
  708. LLPointer<LLSDBinaryParser> p = new LLSDBinaryParser;
  709. return p->parse(str, sd, max_bytes);
  710. }
  711. static LLSD fromBinary(std::istream& str, S32 max_bytes)
  712. {
  713. LLPointer<LLSDBinaryParser> p = new LLSDBinaryParser;
  714. LLSD sd;
  715. (void)p->parse(str, sd, max_bytes);
  716. return sd;
  717. }
  718. };
  719. #endif // LL_LLSDSERIALIZE_H