blob: 6b17df4cb6d6997213de5c341227becb6b83aadc (
plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
using System;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;
namespace LibGit2Sharp.Core
{
/// <summary>
/// This marshaler is to be used for capturing a UTF-8 string owned by libgit2 and
/// converting it to a managed FilePath instance. The marshaler will not attempt to
/// free the native pointer after conversion, because the memory is owned by libgit2.
///
/// Use this marshaler for return values, for example:
/// [return: MarshalAs(UnmanagedType.CustomMarshaler,
/// MarshalCookie = UniqueId.UniqueIdentifier,
/// MarshalTypeRef = typeof(LaxFilePathNoCleanupMarshaler))]
/// </summary>
internal class LaxFilePathNoCleanupMarshaler : LaxFilePathMarshaler
{
private static readonly LaxFilePathNoCleanupMarshaler staticInstance = new LaxFilePathNoCleanupMarshaler();
public new static ICustomMarshaler GetInstance(String cookie)
{
return staticInstance;
}
#region ICustomMarshaler
public override void CleanUpNativeData(IntPtr pNativeData)
{
}
#endregion
}
/// <summary>
/// This marshaler is to be used for sending managed FilePath instances to libgit2.
/// The marshaler will allocate a buffer in native memory to hold the UTF-8 string
/// and perform the encoding conversion using that buffer as the target. The pointer
/// received by libgit2 will be to this buffer. After the function call completes, the
/// native buffer is freed.
///
/// Use this marshaler for function parameters, for example:
/// [DllImport(libgit2)]
/// internal static extern int git_index_open(out IndexSafeHandle index,
/// [MarshalAs(UnmanagedType.CustomMarshaler,
/// MarshalCookie = UniqueId.UniqueIdentifier,
/// MarshalTypeRef = typeof(StrictFilePathMarshaler))] FilePath indexpath);
/// </summary>
internal class StrictFilePathMarshaler : StrictUtf8Marshaler
{
private static readonly StrictFilePathMarshaler staticInstance = new StrictFilePathMarshaler();
public new static ICustomMarshaler GetInstance(String cookie)
{
return staticInstance;
}
#region ICustomMarshaler
public override IntPtr MarshalManagedToNative(Object managedObj)
{
if (null == managedObj)
{
return IntPtr.Zero;
}
var filePath = managedObj as FilePath;
if (null == filePath)
{
throw new MarshalDirectiveException(
string.Format(CultureInfo.InvariantCulture, "{0} must be used on a FilePath.", GetType().Name));
}
return FromManaged(filePath);
}
#endregion
public static IntPtr FromManaged(FilePath filePath)
{
if (filePath == null)
{
return IntPtr.Zero;
}
return StrictUtf8Marshaler.FromManaged(filePath.Posix);
}
}
/// <summary>
/// This marshaler is to be used for capturing a UTF-8 string allocated by libgit2 and
/// converting it to a managed FilePath instance. The marshaler will free the native pointer
/// after conversion.
/// </summary>
internal class LaxFilePathMarshaler : LaxUtf8Marshaler
{
private static readonly LaxFilePathMarshaler staticInstance = new LaxFilePathMarshaler();
public new static ICustomMarshaler GetInstance(String cookie)
{
return staticInstance;
}
#region ICustomMarshaler
public override Object MarshalNativeToManaged(IntPtr pNativeData)
{
return FromNative(pNativeData);
}
#endregion
public new static FilePath FromNative(IntPtr pNativeData)
{
return LaxUtf8Marshaler.FromNative(pNativeData);
}
public new static FilePath FromBuffer(byte[] buffer)
{
return LaxUtf8Marshaler.FromBuffer(buffer);
}
}
}
|