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 }