]> git.cworth.org Git - apitrace/blobdiff - windows.py
Unify GL specs.
[apitrace] / windows.py
index 65517d74636434a954596898a68cfc032cb2fd6d..245a16b3569414e691ef3e11fcdcb753c44c6b20 100644 (file)
-#############################################################################
+##########################################################################
 #
-# Copyright 2008 Jose Fonseca
+# Copyright 2008-2009 VMware, Inc.
+# All Rights Reserved.
 #
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Lesser General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Lesser General Public License for more details.
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 #
-# You should have received a copy of the GNU Lesser General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
 #
-#############################################################################
+##########################################################################/
 
 """windows.h"""
 
 from base import *
 
-INT = Intrinsic("INT", "%u")
-UINT = Intrinsic("UINT", "%u")
-LONG = Intrinsic("LONG", "%li")
-ULONG = Intrinsic("ULONG", "%lu")
+SHORT = Alias("SHORT", Short)
+USHORT = Alias("USHORT", UShort)
+INT = Alias("INT", Int)
+UINT = Alias("UINT", UInt)
+LONG = Alias("LONG", Long)
+ULONG = Alias("ULONG", ULong)
+LONGLONG = Alias("LONGLONG", LongLong)
+FLOAT = Alias("FLOAT", Float)
 
-BYTE = Intrinsic("BYTE", "0x%02lx")
-WORD = Intrinsic("WORD", "0x%04lx")
-DWORD = Intrinsic("DWORD", "0x%08lx")
+INT32 = Literal("INT32", "UInt")
+UINT32 = Literal("UINT32", "UInt")
 
-BOOL = Intrinsic("BOOL", "%i")
+BYTE = Literal("BYTE", "UInt", base=16)
+WORD = Literal("WORD", "UInt", base=16)
+DWORD = Literal("DWORD", "UInt", base=16)
 
-LARGE_INTEGER = Intrinsic("LARGE_INTEGER", "0x%llx")
+BOOL = Alias("BOOL", Bool)
 
-HRESULT = Alias("HRESULT", Int)
+LPLONG = Pointer(LONG)
+LPWORD = Pointer(WORD)
+LPDWORD = Pointer(DWORD)
+LPBOOL = Pointer(BOOL)
+LPSIZE = LPDWORD
+
+LPSTR = String
+LPCSTR = Const(String)
+LPWSTR = WString
+LPCWSTR = Const(WString)
 
-PVOID = Intrinsic("PVOID", "%p")
-HWND = Intrinsic("HWND", "%p")
-HMONITOR = Intrinsic("HMONITOR", "%p")
+LARGE_INTEGER = Struct("LARGE_INTEGER", [
+    (LONGLONG, 'QuadPart'),
+])
 
-REFIID = Alias("REFIID", PVOID)
-GUID = Alias("GUID", PVOID)
+SIZE_T = Alias("SIZE_T", SizeT)
+
+HRESULT = Alias("HRESULT", Int)
+
+PVOID = Opaque("PVOID")
+LPVOID = PVOID
+HANDLE = Opaque("HANDLE")
+HWND = Opaque("HWND")
+HDC = Opaque("HDC")
+HMONITOR = Opaque("HMONITOR")
+
+GUID = Struct("GUID", [
+    (DWORD, "Data1"),
+    (WORD, "Data2"),
+    (WORD, "Data3"),
+    (BYTE, "Data4[0]"),
+    (BYTE, "Data4[1]"),
+    (BYTE, "Data4[2]"),
+    (BYTE, "Data4[3]"),
+    (BYTE, "Data4[4]"),
+    (BYTE, "Data4[5]"),
+    (BYTE, "Data4[6]"),
+    (BYTE, "Data4[7]"),
+])
+LPGUID = Pointer(GUID)
+
+#REFGUID = Alias("REFGUID", Pointer(GUID))
+REFGUID = Alias("REFGUID", GUID)
+
+IID = Alias("IID", GUID)
+#REFIID = Alias("REFIID", Pointer(IID))
+REFIID = Alias("REFIID", IID)
+
+CLSID = Alias("CLSID", GUID)
+#REFCLSID = Alias("REFCLSID", Pointer(CLSID))
+REFCLSID = Alias("REFCLSID", CLSID)
+
+LUID = Struct("LUID", [
+    (DWORD, "LowPart"),
+    (LONG, "HighPart"),
+])
 
 POINT = Struct("POINT", (
   (LONG, "x"),
   (LONG, "y"),
 )) 
+LPPOINT = Pointer(POINT)
 
 RECT = Struct("RECT", (
   (LONG, "left"),
@@ -54,6 +114,7 @@ RECT = Struct("RECT", (
   (LONG, "right"), 
   (LONG, "bottom"), 
 )) 
+LPRECT = Pointer(RECT)
 
 PALETTEENTRY = Struct("PALETTEENTRY", (
   (BYTE, "peRed"),
@@ -61,10 +122,24 @@ PALETTEENTRY = Struct("PALETTEENTRY", (
   (BYTE, "peBlue"), 
   (BYTE, "peFlags"), 
 )) 
+LPPALETTEENTRY = Pointer(PALETTEENTRY)
+
+
+RGNDATAHEADER = Struct("RGNDATAHEADER", [
+    (DWORD, "dwSize"),
+    (DWORD, "iType"),
+    (DWORD, "nCount"),
+    (DWORD, "nRgnSize"),
+    (RECT, "rcBound"),
+])
 
-RGNDATA = Struct("RGNDATA", ())
-REFGUID = Alias("REFGUID", PVOID)
+RGNDATA = Struct("RGNDATA", [
+    (RGNDATAHEADER, "rdh"),
+    #(Char, "Buffer[1]"),
+])
+LPRGNDATA = Pointer(RGNDATA)
 
+HMODULE = Alias("HMODULE", LPVOID)
 
 IUnknown = Interface("IUnknown")
 
@@ -75,6 +150,23 @@ IUnknown.methods = (
 )
 
 
+class DllFunction(Function):
+
+    def get_true_pointer(self):
+        ptype = self.pointer_type()
+        pvalue = self.pointer_value()
+        print '    if(!g_hDll) {'
+        print '        g_hDll = LoadLibrary(g_szDll);'
+        print '        if(!g_hDll)'
+        self.fail_impl()
+        print '    }'
+        print '    if(!%s) {' % (pvalue,)
+        print '        %s = (%s)GetProcAddress(g_hDll, "%s");' % (pvalue, ptype, self.name)
+        print '        if(!%s)' % (pvalue,)
+        self.fail_impl()
+        print '    }'
+
+
 class Dll:
 
     def __init__(self, name):
@@ -91,42 +183,28 @@ class Dll:
 
     def wrap_decl(self):
         print 'static HINSTANCE g_hDll = NULL;'
-        print 'Log * g_pLog = NULL;'
         print 'static TCHAR g_szDll[MAX_PATH] = {0};'
         print
         print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
         print
+        for function in self.functions:
+            function.wrap_decl()
+        print
 
     def wrap_impl(self):
         print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
-        #print r'    Log * pLog;'
         print r'    switch(fdwReason) {'
         print r'    case DLL_PROCESS_ATTACH:'
         print r'        if(!GetSystemDirectory(g_szDll, MAX_PATH))'
         print r'            return FALSE;'
         print r'        _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
-        #print r'        if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)' 
-        #print r'            return FALSE;' 
-        #print r'        if(!g_pLog)'
-        #print r'            g_pLog = new Log(TEXT("%s"));' % self.name
+        print r'        Log::Open("%s");' % self.name
         print r'    case DLL_THREAD_ATTACH:'
-        #print r'        pLog = new Log(TEXT("%s"));' % self.name
-        #print r'        TlsSetValue(dwTlsIndex, pLog);'
         print r'        return TRUE;'
         print r'    case DLL_THREAD_DETACH:'
-        #print r'        pLog = (Log *)TlsGetValue(dwTlsIndex);' 
-        #print r'        if (pLog != NULL)'
-        #print r'            delete pLog;'
         print r'        return TRUE;'
         print r'    case DLL_PROCESS_DETACH:'
-        #print r'        pLog = (Log *)TlsGetValue(dwTlsIndex);' 
-        #print r'        if (pLog != NULL)'
-        #print r'            delete pLog;'
-        #print r'        TlsFree(dwTlsIndex);' 
-        print r'        if(g_pLog) {'
-        print r'            delete g_pLog;'
-        print r'            g_pLog = NULL;'
-        print r'        }'
+        print r'        Log::Close();'
         print r'        if(g_hDll) {'
         print r'            FreeLibrary(g_hDll);'
         print r'            g_hDll = NULL;'
@@ -139,39 +217,6 @@ class Dll:
         print r'}'
         print
         for function in self.functions:
-            type = 'P' + function.name
-            print function.prototype() + ' {'
-            if 1:
-                print '    if(g_pLog)'
-                print '        delete g_pLog;'
-                print '    g_pLog = new Log(TEXT("%s"));' % self.name
-            #print '    g_pLog->ReOpen();'
-            print '    typedef ' + function.prototype('* %s' % type) + ';'
-            print '    %s pFunction;' % type
-            if function.type is Void:
-                result = ''
-            else:
-                print '    %s result;' % function.type
-                result = 'result = '
-            print '    if(!g_hDll) {'
-            print '        g_hDll = LoadLibrary(g_szDll);'
-            print '        if(!g_hDll)'
-            print '            ExitProcess(0);'
-            print '    }'
-            print '    pFunction = (%s)GetProcAddress( g_hDll, "%s");' % (type, function.name)
-            print '    if(!pFunction)'
-            print '        ExitProcess(0);'
-            print '    g_pLog->BeginCall("%s");' % (function.name)
-            print '    %spFunction(%s);' % (result, ', '.join([str(name) for type, name in function.args]))
-            print '    g_pLog->EndCall();'
-            for type, name in function.args:
-                if type.isoutput():
-                    type.wrap_instance(name)
-            if function.type is not Void:
-                function.type.wrap_instance('result')
-            if function.type is not Void:
-                print '    return result;'
-            print '}'
-            print
+            function.wrap_impl()
         print