mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-01-02 13:53:40 +01:00
fix: unsafe implementation of SeString.Parse()
This commit is contained in:
parent
ef60d29ae0
commit
e5cad2edde
1 changed files with 25 additions and 11 deletions
|
|
@ -28,23 +28,17 @@ namespace Dalamud.Game.Text.SeStringHandling
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parse a binary game message into an SeString.
|
/// Parse a binary game message into an SeString.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data">Binary message payload data in SE's internal format.</param>
|
/// <param name="ptr">Pointer to the string's data in memory.</param>
|
||||||
|
/// <param name="len">Length of the string's data in memory.</param>
|
||||||
/// <returns>An SeString containing parsed Payload objects for each payload in the data.</returns>
|
/// <returns>An SeString containing parsed Payload objects for each payload in the data.</returns>
|
||||||
public SeString Parse(ReadOnlySpan<byte> data) => this.Parse(data.ToArray());
|
public unsafe SeString Parse(byte* ptr, int len)
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Parse a binary game message into an SeString.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="bytes">Binary message payload data in SE's internal format.</param>
|
|
||||||
/// <returns>An SeString containing parsed Payload objects for each payload in the data.</returns>
|
|
||||||
public SeString Parse(byte[] bytes)
|
|
||||||
{
|
{
|
||||||
var payloads = new List<Payload>();
|
var payloads = new List<Payload>();
|
||||||
|
|
||||||
using (var stream = new MemoryStream(bytes))
|
using (var stream = new UnmanagedMemoryStream(ptr, len))
|
||||||
using (var reader = new BinaryReader(stream))
|
using (var reader = new BinaryReader(stream))
|
||||||
{
|
{
|
||||||
while (stream.Position < bytes.Length)
|
while (stream.Position < len)
|
||||||
{
|
{
|
||||||
var payload = Payload.Decode(reader);
|
var payload = Payload.Decode(reader);
|
||||||
if (payload != null)
|
if (payload != null)
|
||||||
|
|
@ -55,6 +49,26 @@ namespace Dalamud.Game.Text.SeStringHandling
|
||||||
return new SeString(payloads);
|
return new SeString(payloads);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse a binary game message into an SeString.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data">Binary message payload data in SE's internal format.</param>
|
||||||
|
/// <returns>An SeString containing parsed Payload objects for each payload in the data.</returns>
|
||||||
|
public unsafe SeString Parse(ReadOnlySpan<byte> data)
|
||||||
|
{
|
||||||
|
fixed (byte* ptr = data)
|
||||||
|
{
|
||||||
|
return this.Parse(ptr, data.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse a binary game message into an SeString.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bytes">Binary message payload data in SE's internal format.</param>
|
||||||
|
/// <returns>An SeString containing parsed Payload objects for each payload in the data.</returns>
|
||||||
|
public SeString Parse(byte[] bytes) => this.Parse(new ReadOnlySpan<byte>(bytes));
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates an SeString representing an entire Payload chain that can be used to link an item in the chat log.
|
/// Creates an SeString representing an entire Payload chain that can be used to link an item in the chat log.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue