forked from libgit2/libgit2sharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilePathMarshaler.cs
More file actions
130 lines (107 loc) · 4.27 KB
/
FilePathMarshaler.cs
File metadata and controls
130 lines (107 loc) · 4.27 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
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
126
127
128
129
130
using System;
using System.Globalization;
using System.Runtime.InteropServices;
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.",
this.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 unsafe FilePath FromNative(char* buffer)
{
return LaxUtf8Marshaler.FromNative(buffer);
}
public new static FilePath FromBuffer(byte[] buffer)
{
return LaxUtf8Marshaler.FromBuffer(buffer);
}
}
}