blob: d9b915b8a72d9f82a9f74137d37113350a8fa636 [file] [log] [blame]
José Fonseca95442442008-07-08 10:32:53 +09001#############################################################################
2#
José Fonsecaf6c86992008-07-10 22:44:57 +09003# Copyright 2008 Tungsten Graphics, Inc.
José Fonseca95442442008-07-08 10:32:53 +09004#
5# This program is free software: you can redistribute it and/or modify it
6# under the terms of the GNU Lesser General Public License as published
7# by the Free Software Foundation, either version 3 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU Lesser General Public License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public License
16# along with this program. If not, see <http://www.gnu.org/licenses/>.
17#
18#############################################################################
19
José Fonsecad626cf42008-07-07 07:43:16 +090020"""windows.h"""
21
22from base import *
23
José Fonseca73f33cc2008-07-09 02:17:51 +090024SHORT = Intrinsic("SHORT", "%i")
25USHORT = Intrinsic("USHORT", "%u")
26INT = Intrinsic("INT", "%i")
José Fonsecad626cf42008-07-07 07:43:16 +090027UINT = Intrinsic("UINT", "%u")
28LONG = Intrinsic("LONG", "%li")
29ULONG = Intrinsic("ULONG", "%lu")
José Fonseca73f33cc2008-07-09 02:17:51 +090030FLOAT = Intrinsic("FLOAT", "%f")
31
32INT32 = Intrinsic("INT32", "%i")
33UINT32 = Intrinsic("UINT32", "%i")
José Fonsecad626cf42008-07-07 07:43:16 +090034
José Fonseca0dcc85c2008-07-08 07:34:54 +090035BYTE = Intrinsic("BYTE", "0x%02lx")
36WORD = Intrinsic("WORD", "0x%04lx")
37DWORD = Intrinsic("DWORD", "0x%08lx")
José Fonsecad626cf42008-07-07 07:43:16 +090038
39BOOL = Intrinsic("BOOL", "%i")
40
José Fonsecac569f872009-01-04 16:45:17 +000041LPLONG = Pointer(LONG)
42LPWORD = Pointer(WORD)
43LPDWORD = Pointer(DWORD)
44LPBOOL = Pointer(BOOL)
45LPSIZE = LPDWORD
46
47LPSTR = String
48LPWSTR = String
49
José Fonseca4a9c40c2008-07-07 18:04:53 +090050LARGE_INTEGER = Intrinsic("LARGE_INTEGER", "0x%llx")
José Fonsecad626cf42008-07-07 07:43:16 +090051
52HRESULT = Alias("HRESULT", Int)
53
54PVOID = Intrinsic("PVOID", "%p")
José Fonsecac569f872009-01-04 16:45:17 +000055LPVOID = PVOID
José Fonseca73f33cc2008-07-09 02:17:51 +090056HANDLE = Intrinsic("HANDLE", "%p")
José Fonsecad626cf42008-07-07 07:43:16 +090057HWND = Intrinsic("HWND", "%p")
José Fonseca73f33cc2008-07-09 02:17:51 +090058HDC = Intrinsic("HDC", "%p")
José Fonsecad626cf42008-07-07 07:43:16 +090059HMONITOR = Intrinsic("HMONITOR", "%p")
60
José Fonseca8a56d142008-07-09 12:18:08 +090061GUID = Struct("GUID", [
62 (DWORD, "Data1"),
63 (WORD, "Data2"),
64 (WORD, "Data3"),
65 (BYTE, "Data4[0]"),
66 (BYTE, "Data4[1]"),
67 (BYTE, "Data4[2]"),
68 (BYTE, "Data4[3]"),
69 (BYTE, "Data4[4]"),
70 (BYTE, "Data4[5]"),
71 (BYTE, "Data4[6]"),
72 (BYTE, "Data4[7]"),
73])
José Fonsecac569f872009-01-04 16:45:17 +000074LPGUID = Pointer(GUID)
José Fonseca8a56d142008-07-09 12:18:08 +090075
76#REFGUID = Alias("REFGUID", Pointer(GUID))
77REFGUID = Alias("REFGUID", GUID)
78
79IID = Alias("IID", GUID)
80#REFIID = Alias("REFIID", Pointer(IID))
81REFIID = Alias("REFIID", IID)
82
José Fonsecac569f872009-01-04 16:45:17 +000083CLSID = Alias("CLSID", GUID)
84#REFCLSID = Alias("REFCLSID", Pointer(CLSID))
85REFCLSID = Alias("REFCLSID", CLSID)
86
José Fonseca8a56d142008-07-09 12:18:08 +090087LUID = Struct("LUID", [
88 (DWORD, "LowPart"),
89 (LONG, "HighPart"),
90])
José Fonsecad626cf42008-07-07 07:43:16 +090091
92POINT = Struct("POINT", (
93 (LONG, "x"),
94 (LONG, "y"),
95))
José Fonsecac569f872009-01-04 16:45:17 +000096LPPOINT = Pointer(POINT)
José Fonsecad626cf42008-07-07 07:43:16 +090097
98RECT = Struct("RECT", (
99 (LONG, "left"),
100 (LONG, "top"),
101 (LONG, "right"),
102 (LONG, "bottom"),
103))
José Fonsecac569f872009-01-04 16:45:17 +0000104LPRECT = Pointer(RECT)
José Fonsecad626cf42008-07-07 07:43:16 +0900105
106PALETTEENTRY = Struct("PALETTEENTRY", (
107 (BYTE, "peRed"),
108 (BYTE, "peGreen"),
109 (BYTE, "peBlue"),
110 (BYTE, "peFlags"),
111))
José Fonsecac569f872009-01-04 16:45:17 +0000112LPPALETTEENTRY = Pointer(PALETTEENTRY)
José Fonsecad626cf42008-07-07 07:43:16 +0900113
José Fonseca8a56d142008-07-09 12:18:08 +0900114
115RGNDATAHEADER = Struct("RGNDATAHEADER", [
116 (DWORD, "dwSize"),
117 (DWORD, "iType"),
118 (DWORD, "nCount"),
119 (DWORD, "nRgnSize"),
120 (RECT, "rcBound"),
121])
122
123RGNDATA = Struct("RGNDATA", [
124 (RGNDATAHEADER, "rdh"),
125 #(Char, "Buffer[1]"),
126])
José Fonsecac569f872009-01-04 16:45:17 +0000127LPRGNDATA = Pointer(RGNDATA)
José Fonsecad626cf42008-07-07 07:43:16 +0900128
129
130IUnknown = Interface("IUnknown")
131
132IUnknown.methods = (
133 Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(Pointer(Void)), "ppvObj"))),
134 Method(ULONG, "AddRef", ()),
135 Method(ULONG, "Release", ()),
136)
137
138
139class Dll:
140
141 def __init__(self, name):
142 self.name = name
143 self.functions = []
144 if self not in towrap:
145 towrap.append(self)
146
147 def wrap_name(self):
148 return "Wrap" + self.name
149
150 def wrap_pre_decl(self):
151 pass
152
153 def wrap_decl(self):
José Fonsecad626cf42008-07-07 07:43:16 +0900154 print 'static HINSTANCE g_hDll = NULL;'
José Fonsecad7605892008-07-07 13:09:31 +0900155 print 'static TCHAR g_szDll[MAX_PATH] = {0};'
José Fonsecad626cf42008-07-07 07:43:16 +0900156 print
157 print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
158 print
159
160 def wrap_impl(self):
161 print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
José Fonsecad626cf42008-07-07 07:43:16 +0900162 print r' switch(fdwReason) {'
163 print r' case DLL_PROCESS_ATTACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900164 print r' if(!GetSystemDirectory(g_szDll, MAX_PATH))'
José Fonsecad626cf42008-07-07 07:43:16 +0900165 print r' return FALSE;'
José Fonsecad7605892008-07-07 13:09:31 +0900166 print r' _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
José Fonsecad626cf42008-07-07 07:43:16 +0900167 print r' case DLL_THREAD_ATTACH:'
168 print r' return TRUE;'
169 print r' case DLL_THREAD_DETACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900170 print r' return TRUE;'
171 print r' case DLL_PROCESS_DETACH:'
José Fonseca22aec832008-07-09 09:38:45 +0900172 print r' Log::Close();'
José Fonsecad7605892008-07-07 13:09:31 +0900173 print r' if(g_hDll) {'
174 print r' FreeLibrary(g_hDll);'
175 print r' g_hDll = NULL;'
176 print r' }'
José Fonsecad626cf42008-07-07 07:43:16 +0900177 print r' return TRUE;'
178 print r' }'
José Fonsecad7605892008-07-07 13:09:31 +0900179 print r' (void)hinstDLL;'
José Fonsecad626cf42008-07-07 07:43:16 +0900180 print r' (void)lpvReserved;'
181 print r' return TRUE;'
182 print r'}'
183 print
184 for function in self.functions:
185 type = 'P' + function.name
186 print function.prototype() + ' {'
José Fonsecad7605892008-07-07 13:09:31 +0900187 if 1:
José Fonseca22aec832008-07-09 09:38:45 +0900188 print ' Log::Close();'
José Fonseca1f4fc972008-09-12 20:02:53 +0900189 print ' Log::Open("%s");' % self.name
José Fonseca22aec832008-07-09 09:38:45 +0900190 #print ' Log::ReOpen();'
José Fonsecad626cf42008-07-07 07:43:16 +0900191 print ' typedef ' + function.prototype('* %s' % type) + ';'
192 print ' %s pFunction;' % type
193 if function.type is Void:
194 result = ''
195 else:
196 print ' %s result;' % function.type
197 result = 'result = '
José Fonsecaa83fb242008-07-07 16:55:52 +0900198 print ' if(!g_hDll) {'
199 print ' g_hDll = LoadLibrary(g_szDll);'
200 print ' if(!g_hDll)'
201 print ' ExitProcess(0);'
202 print ' }'
José Fonsecad626cf42008-07-07 07:43:16 +0900203 print ' pFunction = (%s)GetProcAddress( g_hDll, "%s");' % (type, function.name)
204 print ' if(!pFunction)'
205 print ' ExitProcess(0);'
José Fonseca22aec832008-07-09 09:38:45 +0900206 print ' Log::BeginCall("%s");' % (function.name)
José Fonsecad626cf42008-07-07 07:43:16 +0900207 print ' %spFunction(%s);' % (result, ', '.join([str(name) for type, name in function.args]))
José Fonseca22aec832008-07-09 09:38:45 +0900208 print ' Log::EndCall();'
José Fonsecad626cf42008-07-07 07:43:16 +0900209 for type, name in function.args:
210 if type.isoutput():
211 type.wrap_instance(name)
212 if function.type is not Void:
213 function.type.wrap_instance('result')
José Fonsecad626cf42008-07-07 07:43:16 +0900214 if function.type is not Void:
215 print ' return result;'
216 print '}'
217 print
218 print
219