File: SafeStringMarshal.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (46 lines) | stat: -rw-r--r-- 1,121 bytes parent folder | download | duplicates (4)
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
//
// Safe wrapper for a string and its UTF8 encoding
//
// Authors:
//   Aleksey Kliger <aleksey@xamarin.com>
//   Rodrigo Kumpera <kumpera@xamarin.com>
//
// Copyright 2016 Dot net foundation.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//

using System;
using System.Runtime.CompilerServices;

namespace Mono  {
	internal struct SafeStringMarshal : IDisposable {
		readonly string str;
		IntPtr marshaled_string;

		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		public extern static IntPtr StringToUtf8 (string str);

		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		public extern static void GFree (IntPtr ptr);

		public SafeStringMarshal (string str) {
			this.str = str;
			this.marshaled_string = IntPtr.Zero;
		}

		public IntPtr Value {
			get {
				if (marshaled_string == IntPtr.Zero && str != null)
					marshaled_string = StringToUtf8 (str);
				return marshaled_string;
			}
		}

		public void Dispose () {
			if (marshaled_string != IntPtr.Zero) {
				GFree (marshaled_string);
				marshaled_string = IntPtr.Zero;
			}
		}
	}
}