app/django/contrib/gis/gdal/prototypes/errcheck.py
changeset 323 ff1a9aa48cfd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/django/contrib/gis/gdal/prototypes/errcheck.py	Tue Oct 14 16:00:59 2008 +0000
@@ -0,0 +1,125 @@
+"""
+ This module houses the error-checking routines used by the GDAL
+ ctypes prototypes.
+"""
+from ctypes import c_void_p, string_at
+from django.contrib.gis.gdal.error import check_err, OGRException, SRSException
+from django.contrib.gis.gdal.libgdal import lgdal
+
+# Helper routines for retrieving pointers and/or values from 
+# arguments passed in by reference. 
+def arg_byref(args, offset=-1):
+    "Returns the pointer argument's by-refernece value."
+    return args[offset]._obj.value
+
+def ptr_byref(args, offset=-1):
+    "Returns the pointer argument passed in by-reference."
+    return args[offset]._obj
+
+def check_bool(result, func, cargs):
+    "Returns the boolean evaluation of the value."
+    if bool(result): return True
+    else: return False
+
+### String checking Routines ###
+def check_const_string(result, func, cargs, offset=None):
+    """
+    Similar functionality to `check_string`, but does not free the pointer.
+    """
+    if offset:
+        check_err(result)
+        ptr = ptr_byref(cargs, offset)
+        return ptr.value
+    else:
+        return result
+
+def check_string(result, func, cargs, offset=-1, str_result=False):
+    """
+    Checks the string output returned from the given function, and frees
+    the string pointer allocated by OGR.  The `str_result` keyword
+    may be used when the result is the string pointer, otherwise
+    the OGR error code is assumed.  The `offset` keyword may be used
+    to extract the string pointer passed in by-reference at the given
+    slice offset in the function arguments.
+    """
+    if str_result:
+        # For routines that return a string.
+        ptr = result
+        if not ptr: s = None
+        else: s = string_at(result)
+    else:
+        # Error-code return specified.
+        check_err(result)
+        ptr = ptr_byref(cargs, offset)
+        # Getting the string value
+        s = ptr.value
+    # Correctly freeing the allocated memory beind GDAL pointer 
+    # w/the VSIFree routine.
+    if ptr: lgdal.VSIFree(ptr)
+    return s
+
+### DataSource, Layer error-checking ###
+
+### Envelope checking ###
+def check_envelope(result, func, cargs, offset=-1):
+    "Checks a function that returns an OGR Envelope by reference."
+    env = ptr_byref(cargs, offset)
+    return env
+
+### Geometry error-checking routines ###
+def check_geom(result, func, cargs):
+    "Checks a function that returns a geometry."
+    # OGR_G_Clone may return an integer, even though the
+    # restype is set to c_void_p
+    if isinstance(result, int):
+        result = c_void_p(result)
+    if not result: 
+        raise OGRException('Invalid geometry pointer returned from "%s".' % func.__name__)
+    return result
+
+def check_geom_offset(result, func, cargs, offset=-1):
+    "Chcks the geometry at the given offset in the C parameter list."
+    check_err(result)
+    geom = ptr_byref(cargs, offset=offset)
+    return check_geom(geom, func, cargs)
+
+### Spatial Reference error-checking routines ###
+def check_srs(result, func, cargs):
+    if isinstance(result, int):
+        result = c_void_p(result)
+    if not result:
+        raise SRSException('Invalid spatial reference pointer returned from "%s".' % func.__name__)
+    return result
+
+### Other error-checking routines ###
+def check_arg_errcode(result, func, cargs):
+    """
+    The error code is returned in the last argument, by reference.
+    Check its value with `check_err` before returning the result.
+    """
+    check_err(arg_byref(cargs))
+    return result
+
+def check_errcode(result, func, cargs):
+    """
+    Check the error code returned (c_int).
+    """
+    check_err(result)
+    return
+
+def check_pointer(result, func, cargs):
+    "Makes sure the result pointer is valid."
+    if bool(result): 
+        return result
+    else: 
+        raise OGRException('Invalid pointer returned from "%s"' % func.__name__)
+
+def check_str_arg(result, func, cargs):
+    """
+    This is for the OSRGet[Angular|Linear]Units functions, which
+    require that the returned string pointer not be freed.  This
+    returns both the double and tring values.
+    """
+    dbl = result
+    ptr = cargs[-1]._obj
+    return dbl, ptr.value