summaryrefslogtreecommitdiff
path: root/php/src/php5/Logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'php/src/php5/Logger.cpp')
-rw-r--r--php/src/php5/Logger.cpp325
1 files changed, 325 insertions, 0 deletions
diff --git a/php/src/php5/Logger.cpp b/php/src/php5/Logger.cpp
new file mode 100644
index 00000000000..eb911c71de7
--- /dev/null
+++ b/php/src/php5/Logger.cpp
@@ -0,0 +1,325 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+
+#include <Logger.h>
+#include <Util.h>
+
+using namespace std;
+using namespace IcePHP;
+
+ZEND_EXTERN_MODULE_GLOBALS(ice)
+
+//
+// Class entries represent the PHP class implementations we have registered.
+//
+namespace IcePHP
+{
+zend_class_entry* loggerClassEntry = 0;
+}
+
+//
+// Logger support.
+//
+static zend_object_handlers _loggerHandlers;
+
+extern "C"
+{
+static zend_object_value handleAlloc(zend_class_entry* TSRMLS_DC);
+static void handleFreeStorage(void* TSRMLS_DC);
+static zend_object_value handleClone(zval* TSRMLS_DC);
+}
+
+ZEND_METHOD(Ice_Logger, __construct)
+{
+ runtimeError("logger objects cannot be instantiated" TSRMLS_CC);
+}
+
+ZEND_METHOD(Ice_Logger, __toString)
+{
+ if(ZEND_NUM_ARGS() > 0)
+ {
+ WRONG_PARAM_COUNT;
+ }
+
+ RETURN_NULL();
+}
+
+ZEND_METHOD(Ice_Logger, print)
+{
+ char* m;
+ int mLen;
+
+ if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char*>("s"), &m, &mLen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ Ice::LoggerPtr _this = Wrapper<Ice::LoggerPtr>::value(getThis() TSRMLS_CC);
+ assert(_this);
+
+ string msg(m, mLen);
+ try
+ {
+ _this->print(msg);
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ throwException(ex TSRMLS_CC);
+ RETURN_NULL();
+ }
+}
+
+ZEND_METHOD(Ice_Logger, trace)
+{
+ char* c;
+ int cLen;
+ char* m;
+ int mLen;
+
+ if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char*>("ss"), &c, &cLen, &m, &mLen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ Ice::LoggerPtr _this = Wrapper<Ice::LoggerPtr>::value(getThis() TSRMLS_CC);
+ assert(_this);
+
+ string category(c, cLen);
+ string msg(m, mLen);
+ try
+ {
+ _this->trace(category, msg);
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ throwException(ex TSRMLS_CC);
+ RETURN_NULL();
+ }
+}
+
+ZEND_METHOD(Ice_Logger, warning)
+{
+ char* m;
+ int mLen;
+
+ if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char*>("s"), &m, &mLen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ Ice::LoggerPtr _this = Wrapper<Ice::LoggerPtr>::value(getThis() TSRMLS_CC);
+ assert(_this);
+
+ string msg(m, mLen);
+ try
+ {
+ _this->warning(msg);
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ throwException(ex TSRMLS_CC);
+ RETURN_NULL();
+ }
+}
+
+ZEND_METHOD(Ice_Logger, error)
+{
+ char* m;
+ int mLen;
+
+ if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char*>("s"), &m, &mLen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ Ice::LoggerPtr _this = Wrapper<Ice::LoggerPtr>::value(getThis() TSRMLS_CC);
+ assert(_this);
+
+ string msg(m, mLen);
+ try
+ {
+ _this->error(msg);
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ throwException(ex TSRMLS_CC);
+ RETURN_NULL();
+ }
+}
+
+ZEND_METHOD(Ice_Logger, cloneWithPrefix)
+{
+ char* p;
+ int pLen;
+
+ if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, const_cast<char*>("s"), &p, &pLen) == FAILURE)
+ {
+ RETURN_NULL();
+ }
+
+ Ice::LoggerPtr _this = Wrapper<Ice::LoggerPtr>::value(getThis() TSRMLS_CC);
+ assert(_this);
+
+ Ice::LoggerPtr clone;
+
+ string prefix(p, pLen);
+ try
+ {
+ clone = _this->cloneWithPrefix(prefix);
+ }
+ catch(const IceUtil::Exception& ex)
+ {
+ throwException(ex TSRMLS_CC);
+ RETURN_NULL();
+ }
+
+ if(!createLogger(return_value, clone TSRMLS_CC))
+ {
+ RETURN_NULL();
+ }
+}
+
+#ifdef _WIN32
+extern "C"
+#endif
+static zend_object_value
+handleAlloc(zend_class_entry* ce TSRMLS_DC)
+{
+ zend_object_value result;
+
+ Wrapper<Ice::LoggerPtr>* obj = Wrapper<Ice::LoggerPtr>::create(ce TSRMLS_CC);
+ assert(obj);
+
+ result.handle = zend_objects_store_put(obj, 0, (zend_objects_free_object_storage_t)handleFreeStorage, 0 TSRMLS_CC);
+ result.handlers = &_loggerHandlers;
+
+ return result;
+}
+
+#ifdef _WIN32
+extern "C"
+#endif
+static void
+handleFreeStorage(void* p TSRMLS_DC)
+{
+ Wrapper<Ice::LoggerPtr>* obj = static_cast<Wrapper<Ice::LoggerPtr>*>(p);
+ delete obj->ptr;
+ zend_object_std_dtor(static_cast<zend_object*>(p) TSRMLS_CC);
+ efree(p);
+}
+
+#ifdef _WIN32
+extern "C"
+#endif
+static zend_object_value
+handleClone(zval* zv TSRMLS_DC)
+{
+ php_error_docref(0 TSRMLS_CC, E_ERROR, "loggers cannot be cloned");
+ return zend_object_value();
+}
+
+//
+// Necessary to suppress warnings from zend_function_entry in php-5.2.
+//
+#if defined(__GNUC__)
+# pragma GCC diagnostic ignored "-Wwrite-strings"
+#endif
+
+//
+// Predefined methods for Logger.
+//
+static zend_function_entry _interfaceMethods[] =
+{
+ {0, 0, 0}
+};
+static zend_function_entry _classMethods[] =
+{
+ ZEND_ME(Ice_Logger, __construct, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_CTOR)
+ ZEND_ME(Ice_Logger, __toString, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(Ice_Logger, print, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(Ice_Logger, trace, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(Ice_Logger, warning, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(Ice_Logger, error, NULL, ZEND_ACC_PUBLIC)
+ ZEND_ME(Ice_Logger, cloneWithPrefix, NULL, ZEND_ACC_PUBLIC)
+ {0, 0, 0}
+};
+//
+// enable warning again
+//
+#if defined(__GNUC__)
+# pragma GCC diagnostic error "-Wwrite-strings"
+#endif
+
+bool
+IcePHP::loggerInit(TSRMLS_D)
+{
+ //
+ // We register an interface and a class that implements the interface. This allows
+ // applications to safely include the Slice-generated code for the type.
+ //
+
+ //
+ // Register the Logger interface.
+ //
+ zend_class_entry ce;
+#ifdef ICEPHP_USE_NAMESPACES
+ INIT_NS_CLASS_ENTRY(ce, "Ice", "Logger", _interfaceMethods);
+#else
+ INIT_CLASS_ENTRY(ce, "Ice_Logger", _interfaceMethods);
+#endif
+ zend_class_entry* interface = zend_register_internal_interface(&ce TSRMLS_CC);
+
+ //
+ // Register the Logger class.
+ //
+ INIT_CLASS_ENTRY(ce, "IcePHP_Logger", _classMethods);
+ ce.create_object = handleAlloc;
+ loggerClassEntry = zend_register_internal_class(&ce TSRMLS_CC);
+ memcpy(&_loggerHandlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+ _loggerHandlers.clone_obj = handleClone;
+ zend_class_implements(loggerClassEntry TSRMLS_CC, 1, interface);
+
+ return true;
+}
+
+bool
+IcePHP::createLogger(zval* zv, const Ice::LoggerPtr& p TSRMLS_DC)
+{
+ if(object_init_ex(zv, loggerClassEntry) != SUCCESS)
+ {
+ runtimeError("unable to initialize logger object" TSRMLS_CC);
+ return false;
+ }
+
+ Wrapper<Ice::LoggerPtr>* obj = Wrapper<Ice::LoggerPtr>::extract(zv TSRMLS_CC);
+ assert(!obj->ptr);
+ obj->ptr = new Ice::LoggerPtr(p);
+
+ return true;
+}
+
+bool
+IcePHP::fetchLogger(zval* zv, Ice::LoggerPtr& p TSRMLS_DC)
+{
+ if(!ZVAL_IS_NULL(zv))
+ {
+ if(Z_TYPE_P(zv) != IS_OBJECT || Z_OBJCE_P(zv) != loggerClassEntry)
+ {
+ invalidArgument("value is not a logger object" TSRMLS_CC);
+ return false;
+ }
+ p = Wrapper<Ice::LoggerPtr>::value(zv TSRMLS_CC);
+ if(!p)
+ {
+ runtimeError("unable to retrieve logger object from object store" TSRMLS_CC);
+ return false;
+ }
+ }
+ return true;
+}