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