From f6871bc421840e0cabff34f2f477a9e53d14f812 Mon Sep 17 00:00:00 2001 From: Mark Spruiell Date: Mon, 21 Jul 2014 17:14:45 -0700 Subject: ICE-5580 - port connection ACM functionality to scripting languages --- php/src/IcePHP/Connection.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) (limited to 'php/src/IcePHP/Connection.cpp') diff --git a/php/src/IcePHP/Connection.cpp b/php/src/IcePHP/Connection.cpp index db55120acae..a9b780bab82 100644 --- a/php/src/IcePHP/Connection.cpp +++ b/php/src/IcePHP/Connection.cpp @@ -9,6 +9,7 @@ #include #include +#include #include using namespace std; @@ -136,6 +137,97 @@ ZEND_METHOD(Ice_Connection, flushBatchRequests) } } +ZEND_METHOD(Ice_Connection, setACM) +{ + Ice::ConnectionPtr _this = Wrapper::value(getThis() TSRMLS_CC); + assert(_this); + + zval* t; + zval* c; + zval* h; + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast("zzz"), &t, &c, &h TSRMLS_CC) != SUCCESS) + { + RETURN_NULL(); + } + + IceUtil::Optional timeout; + IceUtil::Optional close; + IceUtil::Optional heartbeat; + + if(!isUnset(t TSRMLS_CC)) + { + if(Z_TYPE_P(t) != IS_LONG) + { + invalidArgument("value for 'timeout' argument must be Unset or an integer"); + RETURN_NULL(); + } + timeout = static_cast(Z_LVAL_P(t)); + } + + if(!isUnset(c TSRMLS_CC)) + { + if(Z_TYPE_P(c) != IS_LONG) + { + invalidArgument("value for 'close' argument must be Unset or an enumerator of ACMClose"); + RETURN_NULL(); + } + close = static_cast(Z_LVAL_P(c)); + } + + if(!isUnset(h TSRMLS_CC)) + { + if(Z_TYPE_P(h) != IS_LONG) + { + invalidArgument("value for 'heartbeat' argument must be Unset or an enumerator of ACMHeartbeat"); + RETURN_NULL(); + } + heartbeat = static_cast(Z_LVAL_P(h)); + } + + try + { + _this->setACM(timeout, close, heartbeat); + } + catch(const IceUtil::Exception& ex) + { + throwException(ex TSRMLS_CC); + RETURN_NULL(); + } +} + +ZEND_METHOD(Ice_Connection, getACM) +{ + if(ZEND_NUM_ARGS() > 0) + { + WRONG_PARAM_COUNT; + } + + Ice::ConnectionPtr _this = Wrapper::value(getThis() TSRMLS_CC); + assert(_this); + + try + { + Ice::ACM acm = _this->getACM(); + + zend_class_entry* acmClass = idToClass("::Ice::ACM" TSRMLS_CC); + + if(object_init_ex(return_value, const_cast(acmClass)) != SUCCESS) + { + runtimeError("unable to initialize object of type %s" TSRMLS_CC, acmClass->name); + RETURN_NULL(); + } + + add_property_long(return_value, STRCAST("timeout"), static_cast(acm.timeout)); + add_property_long(return_value, STRCAST("close"), static_cast(acm.close)); + add_property_long(return_value, STRCAST("heartbeat"), static_cast(acm.heartbeat)); + } + catch(const IceUtil::Exception& ex) + { + throwException(ex TSRMLS_CC); + RETURN_NULL(); + } +} + ZEND_METHOD(Ice_Connection, type) { if(ZEND_NUM_ARGS() > 0) @@ -290,6 +382,8 @@ static zend_function_entry _connectionClassMethods[] = ZEND_ME(Ice_Connection, close, NULL, ZEND_ACC_PUBLIC) ZEND_ME(Ice_Connection, getEndpoint, NULL, ZEND_ACC_PUBLIC) ZEND_ME(Ice_Connection, flushBatchRequests, NULL, ZEND_ACC_PUBLIC) + ZEND_ME(Ice_Connection, setACM, NULL, ZEND_ACC_PUBLIC) + ZEND_ME(Ice_Connection, getACM, NULL, ZEND_ACC_PUBLIC) ZEND_ME(Ice_Connection, type, NULL, ZEND_ACC_PUBLIC) ZEND_ME(Ice_Connection, timeout, NULL, ZEND_ACC_PUBLIC) ZEND_ME(Ice_Connection, toString, NULL, ZEND_ACC_PUBLIC) -- cgit v1.2.3