summaryrefslogtreecommitdiffstats
path: root/webapp/django/contrib/gis/gdal/prototypes/errcheck.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/contrib/gis/gdal/prototypes/errcheck.py')
-rw-r--r--webapp/django/contrib/gis/gdal/prototypes/errcheck.py125
1 files changed, 125 insertions, 0 deletions
diff --git a/webapp/django/contrib/gis/gdal/prototypes/errcheck.py b/webapp/django/contrib/gis/gdal/prototypes/errcheck.py
new file mode 100644
index 0000000000..c66be9adfb
--- /dev/null
+++ b/webapp/django/contrib/gis/gdal/prototypes/errcheck.py
@@ -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