]> git.cworth.org Git - apitrace/blob - windows.py
b6721fa4a2867784572696927746348487d5e339
[apitrace] / windows.py
1 #############################################################################
2 #
3 # Copyright 2008 Tungsten Graphics, Inc.
4 #
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
20 """windows.h"""
21
22 from base import *
23
24 SHORT = Intrinsic("SHORT", "%i")
25 USHORT = Intrinsic("USHORT", "%u")
26 INT = Intrinsic("INT", "%i")
27 UINT = Intrinsic("UINT", "%u")
28 LONG = Intrinsic("LONG", "%li")
29 ULONG = Intrinsic("ULONG", "%lu")
30 FLOAT = Intrinsic("FLOAT", "%f")
31
32 INT32 = Intrinsic("INT32", "%i")
33 UINT32 = Intrinsic("UINT32", "%i")
34
35 BYTE = Intrinsic("BYTE", "0x%02lx")
36 WORD = Intrinsic("WORD", "0x%04lx")
37 DWORD = Intrinsic("DWORD", "0x%08lx")
38
39 BOOL = Intrinsic("BOOL", "%i")
40
41 LPLONG = Pointer(LONG)
42 LPWORD = Pointer(WORD)
43 LPDWORD = Pointer(DWORD)
44 LPBOOL = Pointer(BOOL)
45 LPSIZE = LPDWORD
46
47 LPSTR = String
48 LPWSTR = String
49
50 LARGE_INTEGER = Intrinsic("LARGE_INTEGER", "0x%llx")
51
52 HRESULT = Alias("HRESULT", Int)
53
54 PVOID = Intrinsic("PVOID", "%p")
55 LPVOID = PVOID
56 HANDLE = Intrinsic("HANDLE", "%p")
57 HWND = Intrinsic("HWND", "%p")
58 HDC = Intrinsic("HDC", "%p")
59 HMONITOR = Intrinsic("HMONITOR", "%p")
60
61 GUID = 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 ])
74 LPGUID = Pointer(GUID)
75
76 #REFGUID = Alias("REFGUID", Pointer(GUID))
77 REFGUID = Alias("REFGUID", GUID)
78
79 IID = Alias("IID", GUID)
80 #REFIID = Alias("REFIID", Pointer(IID))
81 REFIID = Alias("REFIID", IID)
82
83 CLSID = Alias("CLSID", GUID)
84 #REFCLSID = Alias("REFCLSID", Pointer(CLSID))
85 REFCLSID = Alias("REFCLSID", CLSID)
86
87 LUID = Struct("LUID", [
88     (DWORD, "LowPart"),
89     (LONG, "HighPart"),
90 ])
91
92 POINT = Struct("POINT", (
93   (LONG, "x"),
94   (LONG, "y"),
95 )) 
96 LPPOINT = Pointer(POINT)
97
98 RECT = Struct("RECT", (
99   (LONG, "left"),
100   (LONG, "top"),
101   (LONG, "right"), 
102   (LONG, "bottom"), 
103 )) 
104 LPRECT = Pointer(RECT)
105
106 PALETTEENTRY = Struct("PALETTEENTRY", (
107   (BYTE, "peRed"),
108   (BYTE, "peGreen"),
109   (BYTE, "peBlue"), 
110   (BYTE, "peFlags"), 
111 )) 
112 LPPALETTEENTRY = Pointer(PALETTEENTRY)
113
114
115 RGNDATAHEADER = Struct("RGNDATAHEADER", [
116     (DWORD, "dwSize"),
117     (DWORD, "iType"),
118     (DWORD, "nCount"),
119     (DWORD, "nRgnSize"),
120     (RECT, "rcBound"),
121 ])
122
123 RGNDATA = Struct("RGNDATA", [
124     (RGNDATAHEADER, "rdh"),
125     #(Char, "Buffer[1]"),
126 ])
127 LPRGNDATA = Pointer(RGNDATA)
128
129
130 IUnknown = Interface("IUnknown")
131
132 IUnknown.methods = (
133         Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(Pointer(Void)), "ppvObj"))),
134         Method(ULONG, "AddRef", ()),
135         Method(ULONG, "Release", ()),
136 )
137
138
139 class 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):
154         print 'static HINSTANCE g_hDll = NULL;'
155         print 'static TCHAR g_szDll[MAX_PATH] = {0};'
156         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) {'
162         print r'    switch(fdwReason) {'
163         print r'    case DLL_PROCESS_ATTACH:'
164         print r'        if(!GetSystemDirectory(g_szDll, MAX_PATH))'
165         print r'            return FALSE;'
166         print r'        _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
167         print r'        Log::Open("%s");' % self.name
168         print r'    case DLL_THREAD_ATTACH:'
169         print r'        return TRUE;'
170         print r'    case DLL_THREAD_DETACH:'
171         print r'        return TRUE;'
172         print r'    case DLL_PROCESS_DETACH:'
173         print r'        Log::Close();'
174         print r'        if(g_hDll) {'
175         print r'            FreeLibrary(g_hDll);'
176         print r'            g_hDll = NULL;'
177         print r'        }'
178         print r'        return TRUE;'
179         print r'    }'
180         print r'    (void)hinstDLL;'
181         print r'    (void)lpvReserved;'
182         print r'    return TRUE;'
183         print r'}'
184         print
185         for function in self.functions:
186             type = 'P' + function.name
187             print function.prototype() + ' {'
188             if 0:
189                 print '    Log::Close();'
190                 print '    Log::Open("%s");' % self.name
191             #print '    Log::ReOpen();'
192             print '    typedef ' + function.prototype('* %s' % type) + ';'
193             print '    %s pFunction;' % type
194             if function.type is Void:
195                 result = ''
196             else:
197                 print '    %s result;' % function.type
198                 result = 'result = '
199             print '    if(!g_hDll) {'
200             print '        g_hDll = LoadLibrary(g_szDll);'
201             print '        if(!g_hDll)'
202             print '            ExitProcess(0);'
203             print '    }'
204             print '    pFunction = (%s)GetProcAddress( g_hDll, "%s");' % (type, function.name)
205             print '    if(!pFunction)'
206             print '        ExitProcess(0);'
207             print '    Log::BeginCall("%s");' % (function.name)
208             for type, name in function.args:
209                 if not type.isoutput():
210                     type.unwrap_instance(name)
211                     print '    Log::BeginArg("%s", "%s");' % (type, name)
212                     type.dump(name)
213                     print '    Log::EndArg();'
214             print '    %spFunction(%s);' % (result, ', '.join([str(name) for type, name in function.args]))
215             for type, name in function.args:
216                 if type.isoutput():
217                     print '    Log::BeginArg("%s", "%s");' % (type, name)
218                     type.dump(name)
219                     print '    Log::EndArg();'
220                     type.wrap_instance(name)
221             if function.type is not Void:
222                 print '    Log::BeginReturn("%s");' % function.type
223                 function.type.dump("result")
224                 print '    Log::EndReturn();'
225                 function.type.wrap_instance('result')
226             print '    Log::EndCall();'
227             if function.type is not Void:
228                 print '    return result;'
229             print '}'
230             print
231         print
232