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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsdutil.h
  3.  * @author Phoenix
  4.  * @date 2006-05-24
  5.  * @brief Utility classes, functions, etc, for using structured data.
  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_LLSDUTIL_H
  35. #define LL_LLSDUTIL_H
  36. class LLSD;
  37. // U32
  38. LL_COMMON_API LLSD ll_sd_from_U32(const U32);
  39. LL_COMMON_API U32 ll_U32_from_sd(const LLSD& sd);
  40. // U64
  41. LL_COMMON_API LLSD ll_sd_from_U64(const U64);
  42. LL_COMMON_API U64 ll_U64_from_sd(const LLSD& sd);
  43. // IP Address
  44. LL_COMMON_API LLSD ll_sd_from_ipaddr(const U32);
  45. LL_COMMON_API U32 ll_ipaddr_from_sd(const LLSD& sd);
  46. // Binary to string
  47. LL_COMMON_API LLSD ll_string_from_binary(const LLSD& sd);
  48. //String to binary
  49. LL_COMMON_API LLSD ll_binary_from_string(const LLSD& sd);
  50. // Serializes sd to static buffer and returns pointer, useful for gdb debugging.
  51. LL_COMMON_API char* ll_print_sd(const LLSD& sd);
  52. // Serializes sd to static buffer and returns pointer, using "pretty printing" mode.
  53. LL_COMMON_API char* ll_pretty_print_sd_ptr(const LLSD* sd);
  54. LL_COMMON_API char* ll_pretty_print_sd(const LLSD& sd);
  55. //compares the structure of an LLSD to a template LLSD and stores the
  56. //"valid" values in a 3rd LLSD. Default values
  57. //are pulled from the template.  Extra keys/values in the test
  58. //are ignored in the resultant LLSD.  Ordering of arrays matters
  59. //Returns false if the test is of same type but values differ in type
  60. //Otherwise, returns true
  61. LL_COMMON_API BOOL compare_llsd_with_template(
  62. const LLSD& llsd_to_test,
  63. const LLSD& template_llsd,
  64. LLSD& resultant_llsd);
  65. /**
  66.  * Recursively determine whether a given LLSD data block "matches" another
  67.  * LLSD prototype. The returned string is empty() on success, non-empty() on
  68.  * mismatch.
  69.  *
  70.  * This function tests structure (types) rather than data values. It is
  71.  * intended for when a consumer expects an LLSD block with a particular
  72.  * structure, and must succinctly detect whether the arriving block is
  73.  * well-formed. For instance, a test of the form:
  74.  * @code
  75.  * if (! (data.has("request") && data.has("target") && data.has("modifier") ...))
  76.  * @endcode
  77.  * could instead be expressed by initializing a prototype LLSD map with the
  78.  * required keys and writing:
  79.  * @code
  80.  * if (! llsd_matches(prototype, data).empty())
  81.  * @endcode
  82.  *
  83.  * A non-empty return value is an error-message fragment intended to indicate
  84.  * to (English-speaking) developers where in the prototype structure the
  85.  * mismatch occurred.
  86.  *
  87.  * * If a slot in the prototype isUndefined(), then anything is valid at that
  88.  *   place in the real object. (Passing prototype == LLSD() matches anything
  89.  *   at all.)
  90.  * * An array in the prototype must match a data array at least that large.
  91.  *   (Additional entries in the data array are ignored.) Every isDefined()
  92.  *   entry in the prototype array must match the corresponding entry in the
  93.  *   data array.
  94.  * * A map in the prototype must match a map in the data. Every key in the
  95.  *   prototype map must match a corresponding key in the data map. (Additional
  96.  *   keys in the data map are ignored.) Every isDefined() value in the
  97.  *   prototype map must match the corresponding key's value in the data map.
  98.  * * Scalar values in the prototype are tested for @em type rather than value.
  99.  *   For instance, a String in the prototype matches any String at all. In
  100.  *   effect, storing an Integer at a particular place in the prototype asserts
  101.  *   that the caller intends to apply asInteger() to the corresponding slot in
  102.  *   the data.
  103.  * * A String in the prototype matches String, Boolean, Integer, Real, UUID,
  104.  *   Date and URI, because asString() applied to any of these produces a
  105.  *   meaningful result.
  106.  * * Similarly, a Boolean, Integer or Real in the prototype can match any of
  107.  *   Boolean, Integer or Real in the data -- or even String.
  108.  * * UUID matches UUID or String.
  109.  * * Date matches Date or String.
  110.  * * URI matches URI or String.
  111.  * * Binary in the prototype matches only Binary in the data.
  112.  *
  113.  * @TODO: when a Boolean, Integer or Real in the prototype matches a String in
  114.  * the data, we should examine the String @em value to ensure it can be
  115.  * meaningfully converted to the requested type. The same goes for UUID, Date
  116.  * and URI.
  117.  */
  118. LL_COMMON_API std::string llsd_matches(const LLSD& prototype, const LLSD& data, const std::string& pfx="");
  119. /// Deep equality
  120. LL_COMMON_API bool llsd_equals(const LLSD& lhs, const LLSD& rhs);
  121. // Simple function to copy data out of input & output iterators if
  122. // there is no need for casting.
  123. template<typename Input> LLSD llsd_copy_array(Input iter, Input end)
  124. {
  125. LLSD dest;
  126. for (; iter != end; ++iter)
  127. {
  128. dest.append(*iter);
  129. }
  130. return dest;
  131. }
  132. #endif // LL_LLSDUTIL_H