-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSafeUTF8String.cs
More file actions
83 lines (60 loc) · 1.94 KB
/
SafeUTF8String.cs
File metadata and controls
83 lines (60 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// !! // Steamworks.Core - SafeUTF8String.cs
// *.-". // Created: 2016-10-16 [3:01 PM]
// | | // Copyright 2016 // MIT License // The Fox Council
// Modified by: Fox Diller on 2016-10-22 @ 3:02 PM
#region Usings
using System;
using System.Runtime.InteropServices;
using System.Text;
#endregion
namespace Steamworks.Core
{
public class SafeUtf8String : SafeHandle
{
public SafeUtf8String(string c_sourceString) : base(IntPtr.Zero, true)
{
if (c_sourceString == null)
{
SetHandle(IntPtr.Zero);
return;
}
var a_byteArray = new byte[Encoding.UTF8.GetByteCount(c_sourceString) + 1];
Encoding.UTF8.GetBytes(c_sourceString, 0, c_sourceString.Length, a_byteArray, 0);
var a_byteBuffer = Marshal.AllocHGlobal(a_byteArray.Length);
Marshal.Copy(a_byteArray, 0, a_byteBuffer, a_byteArray.Length);
SetHandle(a_byteBuffer);
}
#region Static Methods
public static string ToString(IntPtr c_nativeStringPtr)
{
if (c_nativeStringPtr == IntPtr.Zero)
{
return string.Empty;
}
var a_length = 0;
while (Marshal.ReadByte(c_nativeStringPtr, a_length) != 0)
{
++a_length;
}
if (a_length == 0)
{
return string.Empty;
}
var a_buffer = new byte[a_length];
Marshal.Copy(c_nativeStringPtr, a_buffer, 0, a_buffer.Length);
return Encoding.UTF8.GetString(a_buffer);
}
#endregion
#region Overrides of SafeHandle
protected override bool ReleaseHandle()
{
if (!IsInvalid)
{
Marshal.FreeHGlobal(handle);
}
return true;
}
public override bool IsInvalid { get; }
#endregion
}
}