File: CFHelpers.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 (112 lines) | stat: -rw-r--r-- 3,291 bytes parent folder | download | duplicates (6)
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
#if MONO_FEATURE_APPLETLS || MONO_FEATURE_APPLE_X509
using System;
using System.Runtime.InteropServices;

namespace XamMac.CoreFoundation
{
	internal static class CFHelpers
	{
		internal const string CoreFoundationLibrary = "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation";
		internal const string SecurityLibrary = "/System/Library/Frameworks/Security.framework/Security";

		[DllImport (CoreFoundationLibrary)]
		internal extern static void CFRelease (IntPtr obj);

		[DllImport (CoreFoundationLibrary)]
		internal extern static IntPtr CFRetain (IntPtr obj);

		[StructLayout (LayoutKind.Sequential)]
		struct CFRange {
			public IntPtr loc;
			public IntPtr len;

			public CFRange (int loc, int len)
				: this ((long) loc, (long) len)
			{
			}

			public CFRange (long l, long len)
			{
				this.loc = (IntPtr) l;
				this.len = (IntPtr) len;
			}
		}

		[DllImport (CoreFoundationLibrary, CharSet=CharSet.Unicode)]
		extern static IntPtr CFStringCreateWithCharacters (IntPtr allocator, string str, IntPtr count);

		[DllImport (CoreFoundationLibrary, CharSet=CharSet.Unicode)]
		extern static IntPtr CFStringGetLength (IntPtr handle);

		[DllImport (CoreFoundationLibrary, CharSet=CharSet.Unicode)]
		extern static IntPtr CFStringGetCharactersPtr (IntPtr handle);

		[DllImport (CoreFoundationLibrary, CharSet=CharSet.Unicode)]
		extern static IntPtr CFStringGetCharacters (IntPtr handle, CFRange range, IntPtr buffer);

		internal static string FetchString (IntPtr handle)
		{
			if (handle == IntPtr.Zero)
				return null;

			string str;

			int l = (int)CFStringGetLength (handle);
			IntPtr u = CFStringGetCharactersPtr (handle);
			IntPtr buffer = IntPtr.Zero;
			if (u == IntPtr.Zero){
				CFRange r = new CFRange (0, l);
				buffer = Marshal.AllocCoTaskMem (l * 2);
				CFStringGetCharacters (handle, r, buffer);
				u = buffer;
			}
			unsafe {
				str = new string ((char *) u, 0, l);
			}

			if (buffer != IntPtr.Zero)
				Marshal.FreeCoTaskMem (buffer);

			return str;
		}

		[DllImport (CoreFoundationLibrary)]
		extern static IntPtr CFDataGetLength (IntPtr handle);

		[DllImport (CoreFoundationLibrary)]
		extern static IntPtr CFDataGetBytePtr (IntPtr handle);

		internal static byte[] FetchDataBuffer (IntPtr handle)
		{
			var length = (int)CFDataGetLength (handle);
			var buffer = new byte [length];
			var ptr = CFDataGetBytePtr (handle);
			Marshal.Copy (ptr, buffer, 0, buffer.Length);
			return buffer;
		}

		[DllImport (CoreFoundationLibrary)]
		extern static IntPtr CFDataCreateWithBytesNoCopy (IntPtr allocator, IntPtr bytes, IntPtr length, IntPtr bytesDeallocator);

		[DllImport (CoreFoundationLibrary)]
		extern static IntPtr CFDataCreate (IntPtr allocator, IntPtr bytes, IntPtr length);

		[DllImport (SecurityLibrary)]
		extern static IntPtr SecCertificateCreateWithData (IntPtr allocator, IntPtr cfData);

		unsafe internal static IntPtr CreateCertificateFromData (byte[] data)
		{
			fixed (void *ptr = data) {
				var cfdata = CFDataCreate (IntPtr.Zero, (IntPtr)ptr, new IntPtr (data.Length));
				if (cfdata == IntPtr.Zero)
					return IntPtr.Zero;

				var certificate = SecCertificateCreateWithData (IntPtr.Zero, cfdata);
				if (cfdata != IntPtr.Zero)
					CFRelease (cfdata);
				return certificate;
			}
		}
	}
}
#endif