app/django/contrib/gis/gdal/prototypes/generation.py
changeset 323 ff1a9aa48cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/django/contrib/gis/gdal/prototypes/generation.py	Tue Oct 14 16:00:59 2008 +0000
@@ -0,0 +1,116 @@
+"""
+ This module contains functions that generate ctypes prototypes for the
+ GDAL routines.
+"""
+
+from ctypes import c_char_p, c_double, c_int, c_void_p
+from django.contrib.gis.gdal.prototypes.errcheck import \
+    check_arg_errcode, check_errcode, check_geom, check_geom_offset, \
+    check_pointer, check_srs, check_str_arg, check_string, check_const_string
+
+def double_output(func, argtypes, errcheck=False, strarg=False):
+    "Generates a ctypes function that returns a double value."
+    func.argtypes = argtypes
+    func.restype = c_double
+    if errcheck: func.errcheck = check_arg_errcode
+    if strarg: func.errcheck = check_str_arg
+    return func
+
+def geom_output(func, argtypes, offset=None):
+    """
+    Generates a function that returns a Geometry either by reference
+    or directly (if the return_geom keyword is set to True).
+    """
+    # Setting the argument types
+    func.argtypes = argtypes
+
+    if not offset:
+        # When a geometry pointer is directly returned.
+        func.restype = c_void_p
+        func.errcheck = check_geom
+    else:
+        # Error code returned, geometry is returned by-reference.
+        func.restype = c_int
+        def geomerrcheck(result, func, cargs):
+            return check_geom_offset(result, func, cargs, offset)
+        func.errcheck = geomerrcheck
+
+    return func
+
+def int_output(func, argtypes):
+    "Generates a ctypes function that returns an integer value."
+    func.argtypes = argtypes
+    func.restype = c_int
+    return func
+
+def srs_output(func, argtypes):
+    """
+    Generates a ctypes prototype for the given function with
+    the given C arguments that returns a pointer to an OGR
+    Spatial Reference System.
+    """
+    func.argtypes = argtypes
+    func.restype = c_void_p
+    func.errcheck = check_srs
+    return func
+
+def const_string_output(func, argtypes, offset=None):
+    func.argtypes = argtypes
+    if offset:
+        func.restype = c_int
+    else:
+        func.restype = c_char_p
+
+    def _check_const(result, func, cargs):
+        return check_const_string(result, func, cargs, offset=offset)
+    func.errcheck = _check_const
+
+    return func
+
+def string_output(func, argtypes, offset=-1, str_result=False):
+    """
+    Generates a ctypes prototype for the given function with the
+    given argument types that returns a string from a GDAL pointer.
+    The `const` flag indicates whether the allocated pointer should 
+    be freed via the GDAL library routine VSIFree -- but only applies
+    only when `str_result` is True.
+    """
+    func.argtypes = argtypes
+    if str_result:
+        # String is the result, don't explicitly define
+        # the argument type so we can get the pointer.
+        pass
+    else:
+        # Error code is returned
+        func.restype = c_int
+
+    # Dynamically defining our error-checking function with the
+    # given offset.
+    def _check_str(result, func, cargs):
+        return check_string(result, func, cargs,
+                            offset=offset, str_result=str_result)
+    func.errcheck = _check_str
+    return func
+
+def void_output(func, argtypes, errcheck=True):
+    """
+    For functions that don't only return an error code that needs to
+    be examined.
+    """
+    if argtypes: func.argtypes = argtypes
+    if errcheck:
+        # `errcheck` keyword may be set to False for routines that
+        # return void, rather than a status code.
+        func.restype = c_int
+        func.errcheck = check_errcode
+    else:
+        func.restype = None
+        
+    return func
+
+def voidptr_output(func, argtypes):
+    "For functions that return c_void_p."
+    func.argtypes = argtypes
+    func.restype = c_void_p
+    func.errcheck = check_pointer
+    return func