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>()); } }
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); } }