1 module decklink4d.port;
2 
3 version(Windows)
4 {
5     public import std.c.windows.windows;
6     public import std.c.windows.com;
7     alias OLECHAR* BSTR;
8 }
9 
10 version(DEBUG)
11 {
12     import std.stdio;
13 	void trace (T...)(string fmt, T args)
14 	{
15 		writefln(fmt, args);
16 	}
17 }
18 else
19 {
20 	void trace (T...) (string fmt, T args) {}
21 }
22 
23 // Mac COM
24 version(OSX)
25 {
26     struct GUID {
27         align(1):
28         uint   Data1;
29         ushort Data2;
30         ushort Data3;
31         ubyte  Data4[8];
32     }
33     alias const(GUID) IID;
34     alias const(GUID) CLSID;
35     alias const(GUID)* REFGUID, REFIID, REFCLSID, REFFMTID;
36 
37     alias int HRESULT;
38 	alias long LONGLONG;
39 	alias ulong ULONGLONG;
40 	alias int BOOL;
41 	
42 	enum : int
43 	{
44         S_OK = 0,
45         S_FALSE = 0x00000001,
46         NOERROR = 0,
47         E_NOTIMPL     = cast(int)0x80004001,
48         E_NOINTERFACE = cast(int)0x80004002,
49         E_POINTER     = cast(int)0x80004003,
50         E_ABORT       = cast(int)0x80004004,
51         E_FAIL        = cast(int)0x80004005,
52         E_HANDLE      = cast(int)0x80070006,
53         CLASS_E_NOAGGREGATION = cast(int)0x80040110,
54         E_OUTOFMEMORY = cast(int)0x8007000E,
55         E_INVALIDARG  = cast(int)0x80070057,
56         E_UNEXPECTED  = cast(int)0x8000FFFF,
57 	}
58 
59     const GUID IID_IUnknown = IUnknown.iid;
60   
61     interface IUnknown
62     {
63         extern(System):
64         static const GUID iid = { 0x00000000,0x0000,0x0000,[0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46]};
65         int QueryInterface(IID iid, void** ppvObject);
66         uint AddRef();
67         uint Release();
68     }
69 }
70 
71 // *************************** Core Foundation helper
72 version(OSX)
73 {
74     alias void* CFStringRef;
75     alias void* CFTypeRef;
76     alias size_t CFIndex;
77     alias uint CFStringEncoding;
78     alias ubyte Boolean;
79     alias CFStringRef BMDSTR;
80 
81     enum {
82         kCFStringEncodingMacRoman = 0,
83         kCFStringEncodingWindowsLatin1 = 0x0500, /* ANSI codepage 1252 */
84         kCFStringEncodingISOLatin1 = 0x0201, /* ISO 8859-1 */
85         kCFStringEncodingNextStepLatin = 0x0B01, /* NextStep encoding*/
86         kCFStringEncodingASCII = 0x0600, /* 0..127 (in creating CFString, values greater than 0x7F are treated as corresponding Unicode value) */
87         kCFStringEncodingUnicode = 0x0100, /* kTextEncodingUnicodeDefault  + kTextEncodingDefaultFormat (aka kUnicode16BitFormat) */
88         kCFStringEncodingUTF8 = 0x08000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF8Format */
89         kCFStringEncodingNonLossyASCII = 0x0BFF, /* 7bit Unicode variants used by Cocoa & Java */
90 
91         kCFStringEncodingUTF16 = 0x0100, /* kTextEncodingUnicodeDefault + kUnicodeUTF16Format (alias of kCFStringEncodingUnicode) */
92         kCFStringEncodingUTF16BE = 0x10000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF16BEFormat */
93         kCFStringEncodingUTF16LE = 0x14000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF16LEFormat */
94 
95         kCFStringEncodingUTF32 = 0x0c000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF32Format */
96         kCFStringEncodingUTF32BE = 0x18000100, /* kTextEncodingUnicodeDefault + kUnicodeUTF32BEFormat */
97         kCFStringEncodingUTF32LE = 0x1c000100 /* kTextEncodingUnicodeDefault + kUnicodeUTF32LEFormat */
98     }
99     extern(System)
100     {
101         CFIndex CFStringGetLength(CFStringRef theString);
102         CFIndex CFStringGetMaximumSizeForEncoding(CFIndex length, CFStringEncoding encoding);
103         Boolean CFStringGetCString(CFStringRef theString, char *buffer, CFIndex bufferSize, CFStringEncoding encoding);
104 		const char* CFStringGetCStringPtr (CFStringRef theString, CFStringEncoding encoding);
105         void CFRelease(CFTypeRef cf);
106     }
107     string consume(ref CFStringRef cfstr)
108     {
109 		if (!cfstr)
110 			return "";
111 
112 		scope(exit)
113 		{
114             CFRelease(cfstr);
115 			cfstr = null;
116 		}
117 
118 		immutable encoding = kCFStringEncodingMacRoman;
119 
120 		auto p = CFStringGetCStringPtr(cfstr, encoding);
121 		size_t len = CFStringGetLength(cfstr);
122 		
123 		if (p)
124 			return p[0..len].idup;
125 
126         char[] buf = new char[1 + CFStringGetMaximumSizeForEncoding(len, encoding)];
127         CFStringGetCString(cfstr, buf.ptr, buf.length, encoding);
128         return buf[0..$-1].idup;
129     }
130 }
131 
132 // *************************** COM String helper
133 version(Windows)
134 {
135     alias BSTR BMDSTR;
136     extern(Windows) uint SysStringLen(BSTR bstr);
137     extern(Windows) uint SysFreeString(BSTR bstr);
138     string consume(ref BSTR bstr)
139     {
140 		if (!bstr)
141 			return "";
142 		
143         scope(exit)
144 		{
145             SysFreeString(bstr);
146 			bstr = null;
147 		}
148         return std.utf.toUTF8(bstr[0 .. SysStringLen(bstr)]);
149     }
150 }