183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh###################################################################### 283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# This file should be kept compatible with Python 2.3, see PEP 291. # 383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh###################################################################### 483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""create and manipulate C data types in Python""" 583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport os as _os, sys as _sys 783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh__version__ = "1.1.0" 983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import Union, Structure, Array 1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import _Pointer 1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import CFuncPtr as _CFuncPtr 1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import __version__ as _ctypes_version 1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import RTLD_LOCAL, RTLD_GLOBAL 1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import ArgumentError 1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom struct import calcsize as _calcsize 1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __version__ != _ctypes_version: 2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise Exception("Version number mismatch", __version__, _ctypes_version) 2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): 2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import FormatError 2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehDEFAULT_MODE = RTLD_LOCAL 2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name == "posix" and _sys.platform == "darwin": 2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # On OS X 10.3, we use RTLD_GLOBAL as default mode 2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # because RTLD_LOCAL does not work at least on some 2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # libraries. OS X 10.3 is Darwin 7, so we check for 3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # that. 3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if int(_os.uname()[2].split('.')[0]) < 8: 3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh DEFAULT_MODE = RTLD_GLOBAL 3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import FUNCFLAG_CDECL as _FUNCFLAG_CDECL, \ 3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh FUNCFLAG_PYTHONAPI as _FUNCFLAG_PYTHONAPI, \ 3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh FUNCFLAG_USE_ERRNO as _FUNCFLAG_USE_ERRNO, \ 3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh FUNCFLAG_USE_LASTERROR as _FUNCFLAG_USE_LASTERROR 3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh""" 4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehWINOLEAPI -> HRESULT 4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehWINOLEAPI_(type) 4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSTDMETHODCALLTYPE 4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSTDMETHOD(name) 4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSTDMETHOD_(type, name) 4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehSTDAPICALLTYPE 5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh""" 5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef create_string_buffer(init, size=None): 5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """create_string_buffer(aString) -> character array 5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh create_string_buffer(anInteger) -> character array 5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh create_string_buffer(aString, anInteger) -> character array 5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if isinstance(init, (str, unicode)): 5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if size is None: 5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh size = len(init)+1 6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buftype = c_char * size 6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = buftype() 6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf.value = init 6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf 6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif isinstance(init, (int, long)): 6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buftype = c_char * init 6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = buftype() 6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf 6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError(init) 6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef c_buffer(init, size=None): 7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## "deprecated, use create_string_buffer instead" 7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## import warnings 7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## warnings.warn("c_buffer is deprecated, use create_string_buffer instead", 7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## DeprecationWarning, stacklevel=2) 7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return create_string_buffer(init, size) 7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_c_functype_cache = {} 7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef CFUNCTYPE(restype, *argtypes, **kw): 7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """CFUNCTYPE(restype, *argtypes, 8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh use_errno=False, use_last_error=False) -> function prototype. 8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh restype: the result type 8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh argtypes: a sequence specifying the argument types 8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The function prototype can be called in different ways to create a 8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh callable object: 8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh prototype(integer address) -> foreign function 8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh prototype(callable) -> create and return a C callable function from callable 9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh prototype(integer index, method name[, paramflags]) -> foreign function calling a COM method 9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh prototype((ordinal number, dll object)[, paramflags]) -> foreign function exported by ordinal 9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh prototype((function name, dll object)[, paramflags]) -> foreign function exported by name 9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags = _FUNCFLAG_CDECL 9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw.pop("use_errno", False): 9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_ERRNO 9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw.pop("use_last_error", False): 9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_LASTERROR 9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw: 10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("unexpected keyword argument(s) %s" % kw.keys()) 10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _c_functype_cache[(restype, argtypes, flags)] 10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except KeyError: 10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class CFunctionType(_CFuncPtr): 10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _argtypes_ = argtypes 10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _restype_ = restype 10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _flags_ = flags 10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _c_functype_cache[(restype, argtypes, flags)] = CFunctionType 10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return CFunctionType 11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): 11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import LoadLibrary as _dlopen 11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import FUNCFLAG_STDCALL as _FUNCFLAG_STDCALL 11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _os.name == "ce": 11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 'ce' doesn't have the stdcall calling convention 11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _FUNCFLAG_STDCALL = _FUNCFLAG_CDECL 11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _win_functype_cache = {} 11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def WINFUNCTYPE(restype, *argtypes, **kw): 12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # docstring set later (very similar to CFUNCTYPE.__doc__) 12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags = _FUNCFLAG_STDCALL 12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw.pop("use_errno", False): 12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_ERRNO 12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw.pop("use_last_error", False): 12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_LASTERROR 12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if kw: 12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise ValueError("unexpected keyword argument(s) %s" % kw.keys()) 12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _win_functype_cache[(restype, argtypes, flags)] 13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except KeyError: 13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class WinFunctionType(_CFuncPtr): 13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _argtypes_ = argtypes 13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _restype_ = restype 13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _flags_ = flags 13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _win_functype_cache[(restype, argtypes, flags)] = WinFunctionType 13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return WinFunctionType 13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if WINFUNCTYPE.__doc__: 13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh WINFUNCTYPE.__doc__ = CFUNCTYPE.__doc__.replace("CFUNCTYPE", "WINFUNCTYPE") 13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelif _os.name == "posix": 14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import dlopen as _dlopen 14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import sizeof, byref, addressof, alignment, resize 14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import get_errno, set_errno 14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import _SimpleCData 14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _check_size(typ, typecode=None): 14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Check if sizeof(ctypes_type) against struct.calcsize. This 14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # should protect somewhat against a misconfigured libffi. 15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from struct import calcsize 15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if typecode is None: 15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Most _type_ codes are the same as used in struct 15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh typecode = typ._type_ 15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh actual, required = sizeof(typ), calcsize(typecode) 15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if actual != required: 15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise SystemError("sizeof(%s) wrong: %d instead of %d" % \ 15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (typ, actual, required)) 15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass py_object(_SimpleCData): 16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "O" 16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return super(py_object, self).__repr__() 16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except ValueError: 16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "%s(<NULL>)" % type(self).__name__ 16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(py_object, "P") 16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_short(_SimpleCData): 16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "h" 17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_short) 17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_ushort(_SimpleCData): 17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "H" 17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_ushort) 17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_long(_SimpleCData): 17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "l" 17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_long) 17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_ulong(_SimpleCData): 18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "L" 18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_ulong) 18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _calcsize("i") == _calcsize("l"): 18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # if int and long have the same size, make c_int an alias for c_long 18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_int = c_long 18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_uint = c_ulong 18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse: 18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_int(_SimpleCData): 19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "i" 19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _check_size(c_int) 19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_uint(_SimpleCData): 19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "I" 19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _check_size(c_uint) 19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_float(_SimpleCData): 19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "f" 19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_float) 20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_double(_SimpleCData): 20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "d" 20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_double) 20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_longdouble(_SimpleCData): 20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "g" 20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif sizeof(c_longdouble) == sizeof(c_double): 20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_longdouble = c_double 20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _calcsize("l") == _calcsize("q"): 21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # if long and long long have the same size, make c_longlong an alias for c_long 21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_longlong = c_long 21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_ulonglong = c_ulong 21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse: 21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_longlong(_SimpleCData): 21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "q" 21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _check_size(c_longlong) 21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_ulonglong(_SimpleCData): 22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "Q" 22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ## def from_param(cls, val): 22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ## return ('d', float(val), val) 22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ## from_param = classmethod(from_param) 22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _check_size(c_ulonglong) 22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_ubyte(_SimpleCData): 22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "B" 22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_ubyte.__ctype_le__ = c_ubyte.__ctype_be__ = c_ubyte 22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# backward compatibility: 23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh##c_uchar = c_ubyte 23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_ubyte) 23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_byte(_SimpleCData): 23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "b" 23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_byte.__ctype_le__ = c_byte.__ctype_be__ = c_byte 23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_byte) 23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_char(_SimpleCData): 23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "c" 24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_char.__ctype_le__ = c_char.__ctype_be__ = c_char 24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_char) 24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_char_p(_SimpleCData): 24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "z" 24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _os.name == "nt": 24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not windll.kernel32.IsBadStringPtrA(self, -1): 24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "%s(%r)" % (self.__class__.__name__, self.value) 24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "%s(%s)" % (self.__class__.__name__, cast(self, c_void_p).value) 25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "%s(%s)" % (self.__class__.__name__, cast(self, c_void_p).value) 25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_char_p, "P") 25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_void_p(_SimpleCData): 25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "P" 25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_voidp = c_void_p # backwards compatibility (to a bug) 25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_check_size(c_void_p) 25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass c_bool(_SimpleCData): 26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "?" 26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import POINTER, pointer, _pointer_type_cache 26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef _reset_cache(): 26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _pointer_type_cache.clear() 26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _c_functype_cache.clear() 26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _os.name in ("nt", "ce"): 26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _win_functype_cache.clear() 27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # _SimpleCData.c_wchar_p_from_param 27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh POINTER(c_wchar).from_param = c_wchar_p.from_param 27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # _SimpleCData.c_char_p_from_param 27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh POINTER(c_char).from_param = c_char_p.from_param 27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _pointer_type_cache[None] = c_void_p 27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX for whatever reasons, creating the first instance of a callback 27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # function is needed for the unittests on Win64 to succeed. This MAY 27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # be a compiler bug, since the problem occurs only when _ctypes is 27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # compiled with the MS SDK compiler. Or an uninitialized variable? 27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh CFUNCTYPE(c_int)(lambda: None) 28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry: 28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import set_conversion_mode 28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept ImportError: 28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse: 28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _os.name in ("nt", "ce"): 28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh set_conversion_mode("mbcs", "ignore") 28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh set_conversion_mode("ascii", "strict") 29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_wchar_p(_SimpleCData): 29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "Z" 29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class c_wchar(_SimpleCData): 29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "u" 29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def create_unicode_buffer(init, size=None): 29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """create_unicode_buffer(aString) -> character array 29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh create_unicode_buffer(anInteger) -> character array 30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh create_unicode_buffer(aString, anInteger) -> character array 30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if isinstance(init, (str, unicode)): 30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if size is None: 30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh size = len(init)+1 30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buftype = c_wchar * size 30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = buftype() 30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf.value = init 30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf 30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif isinstance(init, (int, long)): 31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buftype = c_wchar * init 31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh buf = buftype() 31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return buf 31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise TypeError(init) 31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# XXX Deprecated 31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef SetPointerType(pointer, cls): 31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _pointer_type_cache.get(cls, None) is not None: 31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise RuntimeError("This type already exists in the cache") 31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if id(pointer) not in _pointer_type_cache: 32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise RuntimeError("What's this???") 32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pointer.set_type(cls) 32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _pointer_type_cache[cls] = pointer 32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh del _pointer_type_cache[id(pointer)] 32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# XXX Deprecated 32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef ARRAY(typ, len): 32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return typ * len 32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh################################################################ 33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass CDLL(object): 33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """An instance of this class represents a loaded dll/shared 33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh library, exporting functions using the standard C calling 33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh convention (named 'cdecl' on Windows). 33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh The exported functions can be accessed as attributes, or by 33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh indexing with the function name. Examples: 33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh <obj>.qsort -> callable object 34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh <obj>['qsort'] -> callable object 34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Calling the functions releases the Python GIL during the call and 34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh reacquires it afterwards. 34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_flags_ = _FUNCFLAG_CDECL 34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_restype_ = c_int 34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, name, mode=DEFAULT_MODE, handle=None, 35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh use_errno=False, 35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh use_last_error=False): 35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._name = name 35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags = self._func_flags_ 35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if use_errno: 35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_ERRNO 35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if use_last_error: 35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh flags |= _FUNCFLAG_USE_LASTERROR 35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class _FuncPtr(_CFuncPtr): 36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _flags_ = flags 36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _restype_ = self._func_restype_ 36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._FuncPtr = _FuncPtr 36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if handle is None: 36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._handle = _dlopen(self._name, mode) 36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._handle = handle 36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __repr__(self): 37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return "<%s '%s', handle %x at %x>" % \ 37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (self.__class__.__name__, self._name, 37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh (self._handle & (_sys.maxint*2 + 1)), 37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh id(self) & (_sys.maxint*2 + 1)) 37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __getattr__(self, name): 37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if name.startswith('__') and name.endswith('__'): 37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise AttributeError(name) 37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh func = self.__getitem__(name) 37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh setattr(self, name, func) 38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return func 38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __getitem__(self, name_or_ordinal): 38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh func = self._FuncPtr((name_or_ordinal, self)) 38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if not isinstance(name_or_ordinal, (int, long)): 38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh func.__name__ = name_or_ordinal 38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return func 38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass PyDLL(CDLL): 38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """This class represents the Python library itself. It allows to 39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh access Python API functions. The GIL is not released, and 39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Python exceptions are handled correctly. 39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI 39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): 39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class WinDLL(CDLL): 39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """This class represents a dll exporting functions using the 39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Windows stdcall calling convention. 40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_flags_ = _FUNCFLAG_STDCALL 40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # XXX Hm, what about HRESULT as normal parameter? 40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # Mustn't it derive from c_long then? 40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import _check_HRESULT, _SimpleCData 40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class HRESULT(_SimpleCData): 40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _type_ = "l" 40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # _check_retval_ is called with the function's result when it 40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # is used as restype. It checks for the FAILED bit, and 41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # raises a WindowsError if it is set. 41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # 41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # The _check_retval_ method is implemented in C, so that the 41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # method definition itself is not included in the traceback 41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # when it raises an error - that is what we want (and Python 41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # doesn't have a way to raise an exception in the caller's 41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh # frame). 41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _check_retval_ = _check_HRESULT 41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class OleDLL(CDLL): 42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """This class represents a dll exporting functions using the 42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Windows stdcall calling convention, and returning HRESULT. 42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh HRESULT error values are automatically raised as WindowsError 42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh exceptions. 42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """ 42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_flags_ = _FUNCFLAG_STDCALL 42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _func_restype_ = HRESULT 42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass LibraryLoader(object): 42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __init__(self, dlltype): 43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh self._dlltype = dlltype 43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __getattr__(self, name): 43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if name[0] == '_': 43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh raise AttributeError(name) 43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh dll = self._dlltype(name) 43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh setattr(self, name, dll) 43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return dll 43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def __getitem__(self, name): 44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return getattr(self, name) 44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def LoadLibrary(self, name): 44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return self._dlltype(name) 44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehcdll = LibraryLoader(CDLL) 44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehpydll = LibraryLoader(PyDLL) 44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): 44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pythonapi = PyDLL("python dll", None, _sys.dllhandle) 45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelif _sys.platform == "cygwin": 45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pythonapi = PyDLL("libpython%d.%d.dll" % _sys.version_info[:2]) 45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse: 45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pythonapi = PyDLL(None) 45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): 45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh windll = LibraryLoader(WinDLL) 45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh oledll = LibraryLoader(OleDLL) 45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if _os.name == "nt": 46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh GetLastError = windll.kernel32.GetLastError 46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh GetLastError = windll.coredll.GetLastError 46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import get_last_error, set_last_error 46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def WinError(code=None, descr=None): 46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if code is None: 46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh code = GetLastError() 46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if descr is None: 47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh descr = FormatError(code).strip() 47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return WindowsError(code, descr) 47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif sizeof(c_uint) == sizeof(c_void_p): 47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_size_t = c_uint 47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_ssize_t = c_int 47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelif sizeof(c_ulong) == sizeof(c_void_p): 47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_size_t = c_ulong 47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_ssize_t = c_long 47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelif sizeof(c_ulonglong) == sizeof(c_void_p): 48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_size_t = c_ulonglong 48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh c_ssize_t = c_longlong 48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# functions 48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom _ctypes import _memmove_addr, _memset_addr, _string_at_addr, _cast_addr 48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## void *memmove(void *, const void *, size_t); 48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehmemmove = CFUNCTYPE(c_void_p, c_void_p, c_void_p, c_size_t)(_memmove_addr) 48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh## void *memset(void *, int, size_t) 49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehmemset = CFUNCTYPE(c_void_p, c_void_p, c_int, c_size_t)(_memset_addr) 49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef PYFUNCTYPE(restype, *argtypes): 49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh class CFunctionType(_CFuncPtr): 49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _argtypes_ = argtypes 49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _restype_ = restype 49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _flags_ = _FUNCFLAG_CDECL | _FUNCFLAG_PYTHONAPI 49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return CFunctionType 49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_cast = PYFUNCTYPE(py_object, c_void_p, py_object, py_object)(_cast_addr) 50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef cast(obj, typ): 50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _cast(obj, obj, typ) 50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_string_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_string_at_addr) 50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdef string_at(ptr, size=-1): 50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """string_at(addr[, size]) -> string 50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Return the string at addr.""" 50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _string_at(ptr, size) 51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehtry: 51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh from _ctypes import _wstring_at_addr 51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehexcept ImportError: 51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh pass 51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehelse: 51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh _wstring_at = PYFUNCTYPE(py_object, c_void_p, c_int)(_wstring_at_addr) 51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def wstring_at(ptr, size=-1): 51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh """wstring_at(addr[, size]) -> string 51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh Return the string at addr.""" 52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return _wstring_at(ptr, size) 52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif _os.name in ("nt", "ce"): # COM stuff 52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def DllGetClassObject(rclsid, riid, ppv): 52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ccom = __import__("comtypes.server.inprocserver", globals(), locals(), ['*']) 52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except ImportError: 52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return -2147221231 # CLASS_E_CLASSNOTAVAILABLE 53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh else: 53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return ccom.DllGetClassObject(rclsid, riid, ppv) 53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh def DllCanUnloadNow(): 53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh try: 53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh ccom = __import__("comtypes.server.inprocserver", globals(), locals(), ['*']) 53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh except ImportError: 53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return 0 # S_OK 53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh return ccom.DllCanUnloadNow() 53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom ctypes._endian import BigEndianStructure, LittleEndianStructure 54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh# Fill in specifically-sized types 54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_int8 = c_byte 54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehc_uint8 = c_ubyte 54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfor kind in [c_short, c_int, c_long, c_longlong]: 54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if sizeof(kind) == 2: c_int16 = kind 54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif sizeof(kind) == 4: c_int32 = kind 54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif sizeof(kind) == 8: c_int64 = kind 54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfor kind in [c_ushort, c_uint, c_ulong, c_ulonglong]: 55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh if sizeof(kind) == 2: c_uint16 = kind 55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif sizeof(kind) == 4: c_uint32 = kind 55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh elif sizeof(kind) == 8: c_uint64 = kind 55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdel(kind) 55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh 55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh_reset_cache() 556