private static OSD DeserializeLLSDNotationInteger(StringReader reader)
        {
            int           character;
            StringBuilder s = new StringBuilder();

            if (((character = reader.Peek()) > 0) && ((char)character == '-'))
            {
                s.Append((char)character);
                reader.Read();
            }

            while ((character = reader.Peek()) > 0 &&
                   Char.IsDigit((char)character))
            {
                s.Append((char)character);
                reader.Read();
            }
            int integer;

            if (!Int32.TryParse(s.ToString(), out integer))
            {
                throw new OSDException("Notation LLSD parsing: Can't parse integer value." + s);
            }

            return(OSD.FromInteger(integer));
        }
        public static OSD DeserializeJson(JsonData json)
        {
            if (json == null)
            {
                return(new OSD());
            }

            switch (json.GetJsonType())
            {
            case JsonType.Boolean:
                return(OSD.FromBoolean((bool)json));

            case JsonType.Int:
                return(OSD.FromInteger((int)json));

            case JsonType.Long:
                return(OSD.FromLong((long)json));

            case JsonType.Double:
                return(OSD.FromReal((double)json));

            case JsonType.String:
                string str = (string)json;
                if (String.IsNullOrEmpty(str))
                {
                    return(new OSD());
                }
                else
                {
                    return(OSD.FromString(str));
                }

            case JsonType.Array:
                OSDArray array = new OSDArray(json.Count);
                for (int i = 0; i < json.Count; i++)
                {
                    array.Add(DeserializeJson(json[i]));
                }
                return(array);

            case JsonType.Object:
                OSDMap map = new OSDMap(json.Count);
                IDictionaryEnumerator e = ((IOrderedDictionary)json).GetEnumerator();
                while (e.MoveNext())
                {
                    map.Add((string)e.Key, DeserializeJson((JsonData)e.Value));
                }
                return(map);

            case JsonType.None:
            default:
                return(new OSD());
            }
        }
        private static OSD DeserializeLLSDNotationInteger(TextReader reader)
        {
            char character;
            bool neg = false;

            if (((character = (char)reader.Peek()) > 0) && (character == '-'))
            {
                neg = true;
                reader.Read();
            }
            int integer = 0;

            while ((character = (char)reader.Peek()) > 0 && Char.IsDigit(character))
            {
                integer *= 10;
                integer += character - '0';
                reader.Read();
            }
            if (neg)
            {
                return(OSD.FromInteger(-integer));
            }
            return(OSD.FromInteger(integer));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private static OSD ParseLLSDXmlElement(XmlTextReader reader)
        {
            SkipWhitespace(reader);

            if (reader.NodeType != XmlNodeType.Element)
            {
                throw new OSDException("Expected an element");
            }

            string type = reader.LocalName;
            OSD    ret;

            switch (type)
            {
            case "undef":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(new OSD());
                }

                reader.Read();
                SkipWhitespace(reader);
                ret = new OSD();
                break;

            case "boolean":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromBoolean(false));
                }

                if (reader.Read())
                {
                    string s = reader.ReadString().Trim();

                    if (!String.IsNullOrEmpty(s) && (s == "true" || s == "1"))
                    {
                        ret = OSD.FromBoolean(true);
                        break;
                    }
                }

                ret = OSD.FromBoolean(false);
                break;

            case "integer":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromInteger(0));
                }

                if (reader.Read())
                {
                    int value = 0;
                    Int32.TryParse(reader.ReadString().Trim(), out value);
                    ret = OSD.FromInteger(value);
                    break;
                }

                ret = OSD.FromInteger(0);
                break;

            case "real":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromReal(0d));
                }

                if (reader.Read())
                {
                    double value = 0d;
                    string str   = reader.ReadString().Trim().ToLower();

                    if (str == "nan")
                    {
                        value = Double.NaN;
                    }
                    else
                    {
                        Utils.TryParseDouble(str, out value);
                    }

                    ret = OSD.FromReal(value);
                    break;
                }

                ret = OSD.FromReal(0d);
                break;

            case "uuid":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromUUID(UUID.Zero));
                }

                if (reader.Read())
                {
                    UUID value = UUID.Zero;
                    UUID.TryParse(reader.ReadString().Trim(), out value);
                    ret = OSD.FromUUID(value);
                    break;
                }

                ret = OSD.FromUUID(UUID.Zero);
                break;

            case "date":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromDate(Utils.Epoch));
                }

                if (reader.Read())
                {
                    DateTime value = Utils.Epoch;
                    DateTime.TryParse(reader.ReadString().Trim(), out value);
                    ret = OSD.FromDate(value);
                    break;
                }

                ret = OSD.FromDate(Utils.Epoch);
                break;

            case "string":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromString(String.Empty));
                }

                if (reader.Read())
                {
                    ret = OSD.FromString(reader.ReadString());
                    break;
                }

                ret = OSD.FromString(String.Empty);
                break;

            case "binary":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromBinary(Utils.EmptyBytes));
                }

                if (reader.GetAttribute("encoding") != null && reader.GetAttribute("encoding") != "base64")
                {
                    throw new OSDException("Unsupported binary encoding: " + reader.GetAttribute("encoding"));
                }

                if (reader.Read())
                {
                    try
                    {
                        ret = OSD.FromBinary(Convert.FromBase64String(reader.ReadString().Trim()));
                        break;
                    }
                    catch (FormatException ex)
                    {
                        throw new OSDException("Binary decoding exception: " + ex.Message);
                    }
                }

                ret = OSD.FromBinary(Utils.EmptyBytes);
                break;

            case "uri":
                if (reader.IsEmptyElement)
                {
                    reader.Read();
                    return(OSD.FromUri(new Uri(String.Empty, UriKind.RelativeOrAbsolute)));
                }

                if (reader.Read())
                {
                    ret = OSD.FromUri(new Uri(reader.ReadString(), UriKind.RelativeOrAbsolute));
                    break;
                }

                ret = OSD.FromUri(new Uri(String.Empty, UriKind.RelativeOrAbsolute));
                break;

            case "map":
                return(ParseLLSDXmlMap(reader));

            case "array":
                return(ParseLLSDXmlArray(reader));

            default:
                reader.Read();
                ret = null;
                break;
            }

            if (reader.NodeType != XmlNodeType.EndElement || reader.LocalName != type)
            {
                throw new OSDException("Expected </" + type + ">");
            }
            else
            {
                reader.Read();
                return(ret);
            }
        }
        private static OSD ParseLLSDBinaryElement(Stream stream)
        {
            SkipWhiteSpace(stream);
            OSD osd;

            int marker = stream.ReadByte();

            if (marker < 0)
            {
                throw new OSDException("Binary LLSD parsing: Unexpected end of stream.");
            }

            switch ((byte)marker)
            {
            case undefBinaryValue:
                osd = new OSD();
                break;

            case trueBinaryValue:
                osd = OSD.FromBoolean(true);
                break;

            case falseBinaryValue:
                osd = OSD.FromBoolean(false);
                break;

            case integerBinaryMarker:
                int integer = Utils.BytesToIntBig(ConsumeBytes(stream, int32Length));
                osd = OSD.FromInteger(integer);
                break;

            case realBinaryMarker:
                double dbl = Utils.BytesToDoubleBig(ConsumeBytes(stream, doubleLength));
                osd = OSD.FromReal(dbl);
                break;

            case uuidBinaryMarker:
                osd = OSD.FromUUID(new UUID(ConsumeBytes(stream, 16), 0));
                break;

            case binaryBinaryMarker:
                int binaryLength = Utils.BytesToIntBig(ConsumeBytes(stream, int32Length));
                osd = OSD.FromBinary(ConsumeBytes(stream, binaryLength));
                break;

            case stringBinaryMarker:
                int    stringLength = Utils.BytesToIntBig(ConsumeBytes(stream, int32Length));
                string ss           = Encoding.UTF8.GetString(ConsumeBytes(stream, stringLength));
                osd = OSD.FromString(ss);
                break;

            case uriBinaryMarker:
                int    uriLength = Utils.BytesToIntBig(ConsumeBytes(stream, int32Length));
                string sUri      = Encoding.UTF8.GetString(ConsumeBytes(stream, uriLength));
                Uri    uri;
                try
                {
                    uri = new Uri(sUri, UriKind.RelativeOrAbsolute);
                }
                catch
                {
                    throw new OSDException("Binary LLSD parsing: Invalid Uri format detected.");
                }
                osd = OSD.FromUri(uri);
                break;

            case dateBinaryMarker:
                double   timestamp = Utils.BytesToDouble(ConsumeBytes(stream, doubleLength));
                DateTime dateTime  = DateTime.SpecifyKind(Utils.Epoch, DateTimeKind.Utc);
                dateTime = dateTime.AddSeconds(timestamp);
                osd      = OSD.FromDate(dateTime.ToLocalTime());
                break;

            case arrayBeginBinaryMarker:
                osd = ParseLLSDBinaryArray(stream);
                break;

            case mapBeginBinaryMarker:
                osd = ParseLLSDBinaryMap(stream);
                break;

            default:
                throw new OSDException("Binary LLSD parsing: Unknown type marker.");
            }
            return(osd);
        }
Exemple #6
0
        public static OSD DeserializeJson(JsonData json)
        {
            switch (json.GetJsonType())
            {
            case JsonType.Boolean:
                return(OSD.FromBoolean((bool)json));

            case JsonType.Int:
                return(OSD.FromInteger((int)json));

            case JsonType.Long:
                return(OSD.FromLong((long)json));

            case JsonType.Double:
                return(OSD.FromReal((double)json));

            case JsonType.String:
                string str = (string)json;

                if (String.IsNullOrEmpty(str))
                {
                    return(new OSD());
                }
                else
                {
                    switch (str[0])
                    {
                    case 'd':
                        if (str.StartsWith("date::"))
                        {
                            DateTime dt;
                            if (DateTime.TryParse(str.Substring(6), out dt))
                            {
                                return(OSD.FromDate(dt));
                            }
                        }
                        break;

                    case 'u':
                        if (str.StartsWith("uuid::"))
                        {
                            UUID id;
                            if (UUID.TryParse(str.Substring(6), out id))
                            {
                                return(OSD.FromUUID(id));
                            }
                        }
                        else if (str.StartsWith("uri::"))
                        {
                            try
                            {
                                Uri uri = new Uri(str.Substring(5));
                                return(OSD.FromUri(uri));
                            }
                            catch (UriFormatException) { }
                        }
                        break;

                    case 'b':
                        if (str.StartsWith("b64::"))
                        {
                            try
                            {
                                byte[] data = Convert.FromBase64String(str.Substring(5));
                                return(OSD.FromBinary(data));
                            }
                            catch (FormatException) { }
                        }
                        break;
                    }

                    return(OSD.FromString((string)json));
                }

            case JsonType.Array:
                OSDArray array = new OSDArray(json.Count);
                for (int i = 0; i < json.Count; i++)
                {
                    array.Add(DeserializeJson(json[i]));
                }
                return(array);

            case JsonType.Object:
                OSDMap map = new OSDMap(json.Count);
                foreach (KeyValuePair <string, JsonData> kvp in json)
                {
                    map.Add(kvp.Key, DeserializeJson(kvp.Value));
                }
                return(map);

            case JsonType.None:
            default:
                return(new OSD());
            }
        }