[geos-commits] r3067 - in trunk/php: . test

svn_geos at osgeo.org svn_geos at osgeo.org
Thu Jun 24 04:28:41 EDT 2010


Author: strk
Date: 2010-06-24 08:28:41 +0000 (Thu, 24 Jun 2010)
New Revision: 3067

Modified:
   trunk/php/geos.c
   trunk/php/test/test.php
Log:
PHP: WKBWriter: ctor, getOutputDimension, setOutputDimension, writeHEX and tests


Modified: trunk/php/geos.c
===================================================================
--- trunk/php/geos.c	2010-06-24 08:27:46 UTC (rev 3066)
+++ trunk/php/geos.c	2010-06-24 08:28:41 UTC (rev 3067)
@@ -1624,10 +1624,10 @@
 
 PHP_METHOD(WKTReader, __construct)
 {
-	GEOSWKTReader* obj;
+    GEOSWKTReader* obj;
     zval *object = getThis();
 
-	obj = GEOSWKTReader_create();
+    obj = GEOSWKTReader_create();
     if ( ! obj ) {
         php_error_docref(NULL TSRMLS_CC, E_ERROR,
                 "GEOSWKTReader_create() failed (didn't initGEOS?)");
@@ -1704,10 +1704,10 @@
 
 PHP_METHOD(WKTWriter, __construct)
 {
-	GEOSWKTWriter* obj;
+    GEOSWKTWriter* obj;
     zval *object = getThis();
 
-	obj = GEOSWKTWriter_create();
+    obj = GEOSWKTWriter_create();
     if ( ! obj ) {
         php_error_docref(NULL TSRMLS_CC, E_ERROR,
                 "GEOSWKTWriter_create() failed (didn't initGEOS?)");
@@ -1742,11 +1742,6 @@
     GEOSFree(wkt);
 
     RETURN_STRING(retstr, 0);
- 
-    /* return_value is a zval */
-    object_init_ex(return_value, Geometry_ce_ptr);
-    setRelay(return_value, geom);
-
 }
 
 PHP_METHOD(WKTWriter, setTrim)
@@ -1817,6 +1812,129 @@
     GEOSWKTWriter_setOld3D(writer, val);
 }
 
+/* -- class GEOSWKBWriter -------------------- */
+
+PHP_METHOD(WKBWriter, __construct);
+PHP_METHOD(WKBWriter, getOutputDimension);
+PHP_METHOD(WKBWriter, setOutputDimension);
+PHP_METHOD(WKBWriter, writeHEX);
+
+static function_entry WKBWriter_methods[] = {
+    PHP_ME(WKBWriter, __construct, NULL, 0)
+    PHP_ME(WKBWriter, getOutputDimension, NULL, 0)
+    PHP_ME(WKBWriter, setOutputDimension, NULL, 0)
+    PHP_ME(WKBWriter, writeHEX, NULL, 0)
+    {NULL, NULL, NULL}
+};
+
+static zend_class_entry *WKBWriter_ce_ptr;
+
+static zend_object_handlers WKBWriter_object_handlers;
+
+static void
+WKBWriter_dtor (void *object TSRMLS_DC)
+{
+    Proxy *obj = (Proxy *)object;
+    GEOSWKBWriter_destroy((GEOSWKBWriter*)obj->relay);
+
+    zend_hash_destroy(obj->std.properties);
+    FREE_HASHTABLE(obj->std.properties);
+
+    efree(obj);
+}
+
+static zend_object_value
+WKBWriter_create_obj (zend_class_entry *type TSRMLS_DC)
+{
+    return Gen_create_obj(type, WKBWriter_dtor, &WKBWriter_object_handlers);
+}
+
+/**
+ * GEOSWKBWriter w = new GEOSWKBWriter()
+ */
+PHP_METHOD(WKBWriter, __construct)
+{
+    GEOSWKBWriter* obj;
+    zval *object = getThis();
+
+    obj = GEOSWKBWriter_create();
+    if ( ! obj ) {
+        php_error_docref(NULL TSRMLS_CC, E_ERROR,
+                "GEOSWKBWriter_create() failed (didn't initGEOS?)");
+    }
+
+    setRelay(object, obj);
+}
+
+/**
+ * long GEOSWKBWriter::getOutputDimension();
+ */
+PHP_METHOD(WKBWriter, getOutputDimension)
+{
+    GEOSWKBWriter *writer;
+    long int ret;
+
+    writer = (GEOSWKBWriter*)getRelay(getThis(), WKBWriter_ce_ptr);
+
+    ret = GEOSWKBWriter_getOutputDimension(writer);
+
+    RETURN_LONG(ret);
+}
+
+/**
+ * void GEOSWKBWriter::setOutputDimension(dims);
+ */
+PHP_METHOD(WKBWriter, setOutputDimension)
+{
+    GEOSWKBWriter *writer;
+    long int dim;
+
+    writer = (GEOSWKBWriter*)getRelay(getThis(), WKBWriter_ce_ptr);
+
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &dim)
+        == FAILURE)
+    {
+        RETURN_NULL();
+    }
+
+    GEOSWKBWriter_setOutputDimension(writer, dim);
+
+}
+
+/**
+ * string GEOSWKBWriter::writeHEX(GEOSGeometry)
+ */
+PHP_METHOD(WKBWriter, writeHEX)
+{
+    GEOSWKBWriter *writer;
+    zval *zobj;
+    GEOSGeometry *geom;
+    char *ret;
+    size_t retsize; /* useless... */
+    char* retstr;
+
+    writer = (GEOSWKBWriter*)getRelay(getThis(), WKBWriter_ce_ptr);
+
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &zobj)
+        == FAILURE)
+    {
+        RETURN_NULL();
+    }
+
+    geom = getRelay(zobj, Geometry_ce_ptr);
+
+    ret = (char*)GEOSWKBWriter_writeHEX(writer, geom, &retsize);
+    /* we'll probably get an exception if ret is null */
+    if ( ! ret ) RETURN_NULL();
+
+    retstr = estrndup(ret, retsize);
+    GEOSFree(ret);
+
+    RETURN_STRING(retstr, 0);
+}
+
+
+
 /* -- Free functions ------------------------- */
 
 /**
@@ -1958,6 +2076,15 @@
         zend_get_std_object_handlers(), sizeof(zend_object_handlers));
     Geometry_object_handlers.clone_obj = NULL;
 
+    /* WKBWriter */
+    INIT_CLASS_ENTRY(ce, "GEOSWKBWriter", WKBWriter_methods);
+    WKBWriter_ce_ptr = zend_register_internal_class(&ce TSRMLS_CC);
+    WKBWriter_ce_ptr->create_object = WKBWriter_create_obj;
+    memcpy(&WKBWriter_object_handlers,
+        zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+    WKBWriter_object_handlers.clone_obj = NULL;
+
+
     /* Constants */
     REGISTER_LONG_CONSTANT("GEOSBUF_CAP_ROUND",  GEOSBUF_CAP_ROUND,
         CONST_CS|CONST_PERSISTENT);

Modified: trunk/php/test/test.php
===================================================================
--- trunk/php/test/test.php	2010-06-24 08:27:46 UTC (rev 3066)
+++ trunk/php/test/test.php	2010-06-24 08:28:41 UTC (rev 3067)
@@ -210,6 +210,22 @@
         $this->assertEquals('POINT Z (1 2 3)', $writer->write($g3d));
         $this->assertEquals('POINT (3 2)', $writer->write($g2d));
 
+	# 1 is invalid
+        try {
+            $writer->setOutputDimension(1);
+            $this->assertTrue(FALSE);
+        } catch (Exception $e) {
+            $this->assertContains('must be 2 or 3', $e->getMessage());
+        }
+
+	# 4 is invalid
+        try {
+            $writer->setOutputDimension(4);
+            $this->assertTrue(FALSE);
+        } catch (Exception $e) {
+            $this->assertContains('must be 2 or 3', $e->getMessage());
+        }
+
     }
 
     public function testWKTWriter_setOld3D()
@@ -1697,4 +1713,63 @@
         $this->assertEquals( 9.0, round($g->hausdorffDistance($g2)) );
 
     }
+
+    public function testWKBWriter__construct()
+    {
+        $writer = new GEOSWKBWriter();
+        $this->assertNotNull($writer);
+    }
+
+    public function testWKBWriter_getOutputDimension()
+    {
+        $writer = new GEOSWKBWriter();
+        $this->assertEquals(2, $writer->getOutputDimension());
+    }
+
+    public function testWKBWriter_setOutputDimension()
+    {
+        $writer = new GEOSWKBWriter();
+        $writer->setOutputDimension(3);
+        $this->assertEquals(3, $writer->getOutputDimension());
+        $writer->setOutputDimension(2);
+        $this->assertEquals(2, $writer->getOutputDimension());
+
+	# 1 is invalid
+        try {
+            $writer->setOutputDimension(1);
+            $this->assertTrue(FALSE);
+        } catch (Exception $e) {
+            $this->assertContains('must be 2 or 3', $e->getMessage());
+        }
+
+	# 4 is invalid
+        try {
+            $writer->setOutputDimension(4);
+            $this->assertTrue(FALSE);
+        } catch (Exception $e) {
+            $this->assertContains('must be 2 or 3', $e->getMessage());
+        }
+    }
+
+    public function testWKBWriter_writeHEX()
+    {
+        $writer = new GEOSWKBWriter();
+        $reader = new GEOSWKTReader();
+
+        try {
+            $writer->writeHEX(1);
+            $this->assertTrue(FALSE); # this is just to fail if we get here
+        } catch (Exception $e) {
+            $this->assertContains('expects parameter 1', $e->getMessage());
+        }
+
+        $g = $reader->read('POINT(6 7)');
+
+        $this->assertEquals('010100000000000000000018400000000000001C40',
+            $writer->writeHEX($g));
+
+        $g = $reader->read('POINT(6 7 8)');
+        $this->assertEquals('010100000000000000000018400000000000001C40',
+            $writer->writeHEX($g));
+    }
 }



More information about the geos-commits mailing list