diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/extension.cpp | 112 | ||||
-rw-r--r-- | src/includes.h | 14 |
2 files changed, 96 insertions, 30 deletions
diff --git a/src/extension.cpp b/src/extension.cpp index 1677ec1..0a7def6 100644 --- a/src/extension.cpp +++ b/src/extension.cpp @@ -12,40 +12,98 @@ namespace PhpCpp { /** + * Pointer to the one and only extension + * @var Extension + */ +static Extension *extension; + +/** * Constructor * @param name Name of the extension * @param version Version number */ -Extension::Extension(const char *name, const char *version) +Extension::Extension(const char *name, const char *version) : _name(name), _version(version), _entry(NULL) +{ + // store pointer to the one and only extension + extension = this; +} + +/** + * Destructor + */ +Extension::~Extension() +{ + // deallocate entry + if (_entry) delete _entry; +} + +/** + * Function that is called when the extension initializes + * @param type Module type + * @param number Module number + * @param tsrm_ls Optional thread safety thing + * @return int 0 on success + */ +static int extension_startup(INIT_FUNC_ARGS) +{ + return BOOL2SUCCESS(extension->initialize()); +} + +/** + * Function that is called when the extension is about to be stopped + * @param type Module type + * @param number Module number + * @return int + */ +static int extension_shutdown(SHUTDOWN_FUNC_ARGS) +{ + return BOOL2SUCCESS(extension->finalize()); +} + +/** + * Retrieve a pointer to the entry + * @return zend_module_entry + */ +zend_module_entry *Extension::entry() { - // initialize the entry - _entry.size = sizeof(zend_module_entry); // size of the data - _entry.zend_api = ZEND_MODULE_API_NO; // api number - _entry.zend_debug = ZEND_DEBUG; // debug mode enabled? - _entry.zts = USING_ZTS; // is thread safety enabled? - _entry.ini_entry = NULL; // the php.ini record - _entry.deps = NULL; // dependencies on other modules - _entry.name = name; // extension name - _entry.functions = NULL; // functions supported by this module - _entry.module_startup_func = NULL; // startup function for the whole extension - _entry.module_shutdown_func = NULL; // shutdown function for the whole extension - _entry.request_startup_func = NULL; // startup function per request - _entry.request_shutdown_func = NULL; // shutdown function per request - _entry.info_func = NULL; // information for retrieving info - _entry.version = version; // version string - _entry.globals_size = 0; // number of global variables + // already initialized? + if (_entry) return _entry; + + // allocate now + _entry = new zend_module_entry; + + // assign all members + _entry->size = sizeof(zend_module_entry); // size of the data + _entry->zend_api = ZEND_MODULE_API_NO; // api number + _entry->zend_debug = ZEND_DEBUG; // debug mode enabled? + _entry->zts = USING_ZTS; // is thread safety enabled? + _entry->ini_entry = NULL; // the php.ini record + _entry->deps = NULL; // dependencies on other modules + _entry->name = _name; // extension name + _entry->functions = NULL; // functions supported by this module + _entry->module_startup_func = extension_startup; // startup function for the whole extension + _entry->module_shutdown_func = extension_shutdown; // shutdown function for the whole extension + _entry->request_startup_func = NULL; // startup function per request + _entry->request_shutdown_func = NULL; // shutdown function per request + _entry->info_func = NULL; // information for retrieving info + _entry->version = _version; // version string + _entry->globals_size = 0; // number of global variables #ifdef ZTS - _entry.globals_id_ptr = NULL; // pointer to the globals, thread safe + _entry->globals_id_ptr = NULL; // pointer to the globals, thread safe #else - _entry.globals_ptr = NULL; // pointer to the globals - _entry.globals_ctor = NULL; // constructor for global variables - _entry.globals_dtor = NULL; // destructor for global variables - _entry.post_deactivate_func = NULL; // unknown function - _entry.module_started = 0; // module is not yet started - _entry.type = 0; // temporary or persistent module, will be filled by Zend engine - _entry.handle = NULL; // dlopen() handle, will be filled by Zend engine - _entry.module_number = 0; // module number will be filled in by Zend engine - _entry.build_id = ZEND_MODULE_BUILD_ID; // check if extension and zend engine are compatible + _entry->globals_ptr = NULL; // pointer to the globals +#endif + _entry->globals_ctor = NULL; // constructor for global variables + _entry->globals_dtor = NULL; // destructor for global variables + _entry->post_deactivate_func = NULL; // unknown function + _entry->module_started = 0; // module is not yet started + _entry->type = 0; // temporary or persistent module, will be filled by Zend engine + _entry->handle = NULL; // dlopen() handle, will be filled by Zend engine + _entry->module_number = 0; // module number will be filled in by Zend engine + _entry->build_id = ZEND_MODULE_BUILD_ID; // check if extension and zend engine are compatible + + // done + return _entry; } /** diff --git a/src/includes.h b/src/includes.h index 385d033..5d8fb8c 100644 --- a/src/includes.h +++ b/src/includes.h @@ -11,11 +11,19 @@ * Include standard C and C++ libraries */ #include <stdlib.h> -#include <php5/main/php.h> -#include <php5/main/php_ini.h> + +/** + * PHP includes + */ +#include "php.h" + +/** + * Macro to convert results to success status + */ +#define BOOL2SUCCESS(b) ((b) ? SUCCESS : FAILURE) /** * Include other files from this library - */ + */ #include "../include/extension.h" |