[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