示例#1
0
        T GetAtt <T>(AttributeType type, Int32 position = 0)
        {
            StunAttribute att = GetAtt(type, false);

            if (att == null)
            {
                return(default(T));
            }

            Object v = null;

            switch (type)
            {
            case AttributeType.ChangeRequest:
                Int32 d = att.Int;
                if (position == 0)
                {
                    v = (d & 4) != 0;
                }
                else
                {
                    v = (d & 2) != 0;
                }
                return((T)v);

            case AttributeType.ErrorCode:
                var  data = att.Data;
                Type t    = typeof(T);
                if (t == typeof(Int32))
                {
                    v = (data[2] & 0x7) * 100 + (data[3] & 0xFF);
                }
                else if (t == typeof(String))
                {
                    v = Encoding.UTF8.GetString(data, 4, data.Length - 4);
                }
                return((T)v);

            default:
                return(att.GetValue <T>());
            }
        }
示例#2
0
        StunAttribute GetAtt(AttributeType type, Boolean create = false)
        {
            if (Atts.TryGetValue(type, out var att))
            {
                return(att);
            }

            if (!create)
            {
                return(null);
            }

            lock (Atts)
            {
                att      = new StunAttribute();
                att.Type = type;
                Atts.Add(type, att);
                return(att);
            }
        }