Files
Ragon/Ragon.Client/Sources/RagonUserData.cs
T

104 lines
2.5 KiB
C#
Raw Normal View History

2024-05-09 10:50:59 +03:00
/*
* Copyright 2024 Eduard Kargin <kargin.eduard@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using Ragon.Protocol;
namespace Ragon.Client
{
public class RagonUserData : IUserData
{
public byte[] this[string key]
{
get => _properties[key];
set
{
_properties[key] = value;
2024-05-09 21:26:32 +03:00
if (!_changesCache.ContainsKey(key))
{
_localChanges.Add(key);
_changesCache.Add(key, true);
}
}
}
2024-05-09 21:26:32 +03:00
public void Remove(string key)
{
if (_properties.Remove(key))
{
if (!_changesCache.ContainsKey(key))
{
_localChanges.Add(key);
_changesCache.Add(key, true);
}
}
}
2024-05-09 21:26:32 +03:00
public bool Dirty => _localChanges.Count > 0;
private readonly List<string> _localChanges = new();
2024-05-09 21:26:32 +03:00
private readonly Dictionary<string, bool> _changesCache = new();
private readonly Dictionary<string, byte[]> _properties = new();
public RagonUserData()
{
}
2024-05-09 10:50:59 +03:00
2024-05-09 21:26:32 +03:00
public IReadOnlyList<string> Read(RagonBuffer buffer)
{
var len = buffer.ReadUShort();
2024-05-09 21:26:32 +03:00
var changes = new List<string>(len);
for (int i = 0; i < len; i++)
{
var key = buffer.ReadString();
var valueSize = buffer.ReadUShort();
2024-05-09 21:26:32 +03:00
if (valueSize > 0)
{
var value = buffer.ReadBytes(valueSize);
_properties[key] = value;
}
else
{
_properties.Remove(key);
}
2024-05-09 21:26:32 +03:00
changes.Add(key);
}
2024-05-09 21:26:32 +03:00
return changes;
}
2024-05-09 10:50:59 +03:00
public void Write(RagonBuffer buffer)
{
2024-05-09 21:26:32 +03:00
buffer.WriteUShort((ushort)_localChanges.Count);
foreach (var propertyChanged in _localChanges)
{
2024-05-09 21:26:32 +03:00
buffer.WriteString(propertyChanged);
if (_properties.TryGetValue(propertyChanged, out var property))
{
buffer.WriteUShort((ushort)property.Length);
buffer.WriteBytes(property);
2024-05-09 21:26:32 +03:00
}
else
{
buffer.WriteUShort(0);
}
}
2024-05-09 21:26:32 +03:00
_localChanges.Clear();
}
}
}