Annotation of embedaddon/php/ext/com_dotnet/com_extension.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 The PHP Group |
! 6: +----------------------------------------------------------------------+
! 7: | This source file is subject to version 3.01 of the PHP license, |
! 8: | that is bundled with this package in the file LICENSE, and is |
! 9: | available through the world-wide-web at the following url: |
! 10: | http://www.php.net/license/3_01.txt |
! 11: | If you did not receive a copy of the PHP license and are unable to |
! 12: | obtain it through the world-wide-web, please send a note to |
! 13: | license@php.net so we can mail you a copy immediately. |
! 14: +----------------------------------------------------------------------+
! 15: | Author: Wez Furlong <wez@thebrainroom.com> |
! 16: +----------------------------------------------------------------------+
! 17: */
! 18:
! 19: /* $Id: com_extension.c 321634 2012-01-01 13:15:04Z felipe $ */
! 20:
! 21: #ifdef HAVE_CONFIG_H
! 22: #include "config.h"
! 23: #endif
! 24:
! 25: #include "php.h"
! 26: #include "php_ini.h"
! 27: #include "ext/standard/info.h"
! 28: #include "php_com_dotnet.h"
! 29: #include "php_com_dotnet_internal.h"
! 30: #include "Zend/zend_exceptions.h"
! 31:
! 32: ZEND_DECLARE_MODULE_GLOBALS(com_dotnet)
! 33: static PHP_GINIT_FUNCTION(com_dotnet);
! 34:
! 35: TsHashTable php_com_typelibraries;
! 36:
! 37: zend_class_entry
! 38: *php_com_variant_class_entry,
! 39: *php_com_exception_class_entry,
! 40: *php_com_saproxy_class_entry;
! 41:
! 42: /* {{{ arginfo */
! 43: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_set, 0, 0, 2)
! 44: ZEND_ARG_INFO(0, variant)
! 45: ZEND_ARG_INFO(0, value)
! 46: ZEND_END_ARG_INFO()
! 47:
! 48: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_add, 0, 0, 2)
! 49: ZEND_ARG_INFO(0, left)
! 50: ZEND_ARG_INFO(0, right)
! 51: ZEND_END_ARG_INFO()
! 52:
! 53: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_cat, 0, 0, 2)
! 54: ZEND_ARG_INFO(0, left)
! 55: ZEND_ARG_INFO(0, right)
! 56: ZEND_END_ARG_INFO()
! 57:
! 58: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_sub, 0, 0, 2)
! 59: ZEND_ARG_INFO(0, left)
! 60: ZEND_ARG_INFO(0, right)
! 61: ZEND_END_ARG_INFO()
! 62:
! 63: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_mul, 0, 0, 2)
! 64: ZEND_ARG_INFO(0, left)
! 65: ZEND_ARG_INFO(0, right)
! 66: ZEND_END_ARG_INFO()
! 67:
! 68: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_and, 0, 0, 2)
! 69: ZEND_ARG_INFO(0, left)
! 70: ZEND_ARG_INFO(0, right)
! 71: ZEND_END_ARG_INFO()
! 72:
! 73: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_div, 0, 0, 2)
! 74: ZEND_ARG_INFO(0, left)
! 75: ZEND_ARG_INFO(0, right)
! 76: ZEND_END_ARG_INFO()
! 77:
! 78: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_eqv, 0, 0, 2)
! 79: ZEND_ARG_INFO(0, left)
! 80: ZEND_ARG_INFO(0, right)
! 81: ZEND_END_ARG_INFO()
! 82:
! 83: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_idiv, 0, 0, 2)
! 84: ZEND_ARG_INFO(0, left)
! 85: ZEND_ARG_INFO(0, right)
! 86: ZEND_END_ARG_INFO()
! 87:
! 88: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_imp, 0, 0, 2)
! 89: ZEND_ARG_INFO(0, left)
! 90: ZEND_ARG_INFO(0, right)
! 91: ZEND_END_ARG_INFO()
! 92:
! 93: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_mod, 0, 0, 2)
! 94: ZEND_ARG_INFO(0, left)
! 95: ZEND_ARG_INFO(0, right)
! 96: ZEND_END_ARG_INFO()
! 97:
! 98: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_or, 0, 0, 2)
! 99: ZEND_ARG_INFO(0, left)
! 100: ZEND_ARG_INFO(0, right)
! 101: ZEND_END_ARG_INFO()
! 102:
! 103: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_pow, 0, 0, 2)
! 104: ZEND_ARG_INFO(0, left)
! 105: ZEND_ARG_INFO(0, right)
! 106: ZEND_END_ARG_INFO()
! 107:
! 108: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_xor, 0, 0, 2)
! 109: ZEND_ARG_INFO(0, left)
! 110: ZEND_ARG_INFO(0, right)
! 111: ZEND_END_ARG_INFO()
! 112:
! 113: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_abs, 0, 0, 1)
! 114: ZEND_ARG_INFO(0, left)
! 115: ZEND_END_ARG_INFO()
! 116:
! 117: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_fix, 0, 0, 1)
! 118: ZEND_ARG_INFO(0, left)
! 119: ZEND_END_ARG_INFO()
! 120:
! 121: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_int, 0, 0, 1)
! 122: ZEND_ARG_INFO(0, left)
! 123: ZEND_END_ARG_INFO()
! 124:
! 125: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_neg, 0, 0, 1)
! 126: ZEND_ARG_INFO(0, left)
! 127: ZEND_END_ARG_INFO()
! 128:
! 129: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_not, 0, 0, 1)
! 130: ZEND_ARG_INFO(0, left)
! 131: ZEND_END_ARG_INFO()
! 132:
! 133: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_round, 0, 0, 2)
! 134: ZEND_ARG_INFO(0, left)
! 135: ZEND_ARG_INFO(0, decimals)
! 136: ZEND_END_ARG_INFO()
! 137:
! 138: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_cmp, 0, 0, 2)
! 139: ZEND_ARG_INFO(0, left)
! 140: ZEND_ARG_INFO(0, right)
! 141: ZEND_ARG_INFO(0, lcid)
! 142: ZEND_ARG_INFO(0, flags)
! 143: ZEND_END_ARG_INFO()
! 144:
! 145: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_date_to_timestamp, 0, 0, 1)
! 146: ZEND_ARG_INFO(0, variant)
! 147: ZEND_END_ARG_INFO()
! 148:
! 149: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_date_from_timestamp, 0, 0, 1)
! 150: ZEND_ARG_INFO(0, timestamp)
! 151: ZEND_END_ARG_INFO()
! 152:
! 153: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_get_type, 0, 0, 1)
! 154: ZEND_ARG_INFO(0, variant)
! 155: ZEND_END_ARG_INFO()
! 156:
! 157: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_set_type, 0, 0, 2)
! 158: ZEND_ARG_INFO(0, variant)
! 159: ZEND_ARG_INFO(0, type)
! 160: ZEND_END_ARG_INFO()
! 161:
! 162: ZEND_BEGIN_ARG_INFO_EX(arginfo_variant_cast, 0, 0, 2)
! 163: ZEND_ARG_INFO(0, variant)
! 164: ZEND_ARG_INFO(0, type)
! 165: ZEND_END_ARG_INFO()
! 166:
! 167: ZEND_BEGIN_ARG_INFO_EX(arginfo_com_get_active_object, 0, 0, 1)
! 168: ZEND_ARG_INFO(0, progid)
! 169: ZEND_ARG_INFO(0, code_page)
! 170: ZEND_END_ARG_INFO()
! 171:
! 172: ZEND_BEGIN_ARG_INFO(arginfo_com_create_guid, 0)
! 173: ZEND_END_ARG_INFO()
! 174:
! 175: ZEND_BEGIN_ARG_INFO_EX(arginfo_com_event_sink, 0, 0, 2)
! 176: ZEND_ARG_INFO(0, comobject)
! 177: ZEND_ARG_INFO(0, sinkobject)
! 178: ZEND_ARG_INFO(0, sinkinterface)
! 179: ZEND_END_ARG_INFO()
! 180:
! 181: ZEND_BEGIN_ARG_INFO_EX(arginfo_com_print_typeinfo, 0, 0, 1)
! 182: ZEND_ARG_INFO(0, comobject)
! 183: ZEND_ARG_INFO(0, dispinterface)
! 184: ZEND_ARG_INFO(0, wantsink)
! 185: ZEND_END_ARG_INFO()
! 186:
! 187: ZEND_BEGIN_ARG_INFO_EX(arginfo_com_message_pump, 0, 0, 0)
! 188: ZEND_ARG_INFO(0, timeoutms)
! 189: ZEND_END_ARG_INFO()
! 190:
! 191: ZEND_BEGIN_ARG_INFO_EX(arginfo_com_load_typelib, 0, 0, 1)
! 192: ZEND_ARG_INFO(0, typelib_name)
! 193: ZEND_ARG_INFO(0, case_insensitive)
! 194: ZEND_END_ARG_INFO()
! 195: /* }}} */
! 196:
! 197: const zend_function_entry com_dotnet_functions[] = {
! 198: PHP_FE(variant_set, arginfo_variant_set)
! 199: PHP_FE(variant_add, arginfo_variant_add)
! 200: PHP_FE(variant_cat, arginfo_variant_cat)
! 201: PHP_FE(variant_sub, arginfo_variant_sub)
! 202: PHP_FE(variant_mul, arginfo_variant_mul)
! 203: PHP_FE(variant_and, arginfo_variant_and)
! 204: PHP_FE(variant_div, arginfo_variant_div)
! 205: PHP_FE(variant_eqv, arginfo_variant_eqv)
! 206: PHP_FE(variant_idiv, arginfo_variant_idiv)
! 207: PHP_FE(variant_imp, arginfo_variant_imp)
! 208: PHP_FE(variant_mod, arginfo_variant_mod)
! 209: PHP_FE(variant_or, arginfo_variant_or)
! 210: PHP_FE(variant_pow, arginfo_variant_pow)
! 211: PHP_FE(variant_xor, arginfo_variant_xor)
! 212: PHP_FE(variant_abs, arginfo_variant_abs)
! 213: PHP_FE(variant_fix, arginfo_variant_fix)
! 214: PHP_FE(variant_int, arginfo_variant_int)
! 215: PHP_FE(variant_neg, arginfo_variant_neg)
! 216: PHP_FE(variant_not, arginfo_variant_not)
! 217: PHP_FE(variant_round, arginfo_variant_round)
! 218: PHP_FE(variant_cmp, arginfo_variant_cmp)
! 219: PHP_FE(variant_date_to_timestamp, arginfo_variant_date_to_timestamp)
! 220: PHP_FE(variant_date_from_timestamp, arginfo_variant_date_from_timestamp)
! 221: PHP_FE(variant_get_type, arginfo_variant_get_type)
! 222: PHP_FE(variant_set_type, arginfo_variant_set_type)
! 223: PHP_FE(variant_cast, arginfo_variant_cast)
! 224: /* com_com.c */
! 225: PHP_FE(com_create_guid, arginfo_com_create_guid)
! 226: PHP_FE(com_event_sink, arginfo_com_event_sink)
! 227: PHP_FE(com_print_typeinfo, arginfo_com_print_typeinfo)
! 228: PHP_FE(com_message_pump, arginfo_com_message_pump)
! 229: PHP_FE(com_load_typelib, arginfo_com_load_typelib)
! 230: PHP_FE(com_get_active_object, arginfo_com_get_active_object)
! 231: PHP_FE_END
! 232: };
! 233:
! 234: /* {{{ com_dotnet_module_entry
! 235: */
! 236: zend_module_entry com_dotnet_module_entry = {
! 237: STANDARD_MODULE_HEADER,
! 238: "com_dotnet",
! 239: com_dotnet_functions,
! 240: PHP_MINIT(com_dotnet),
! 241: PHP_MSHUTDOWN(com_dotnet),
! 242: PHP_RINIT(com_dotnet),
! 243: PHP_RSHUTDOWN(com_dotnet),
! 244: PHP_MINFO(com_dotnet),
! 245: "0.1",
! 246: PHP_MODULE_GLOBALS(com_dotnet),
! 247: PHP_GINIT(com_dotnet),
! 248: NULL,
! 249: NULL,
! 250: STANDARD_MODULE_PROPERTIES_EX
! 251: };
! 252: /* }}} */
! 253:
! 254: #ifdef COMPILE_DL_COM_DOTNET
! 255: ZEND_GET_MODULE(com_dotnet)
! 256: #endif
! 257:
! 258: /* {{{ PHP_INI
! 259: */
! 260:
! 261: /* com.typelib_file is the path to a file containing a
! 262: * list of typelibraries to register *persistently*.
! 263: * lines starting with ; are comments
! 264: * append #cis to end of typelib name to cause its constants
! 265: * to be loaded case insensitively */
! 266: static PHP_INI_MH(OnTypeLibFileUpdate)
! 267: {
! 268: FILE *typelib_file;
! 269: char *typelib_name_buffer;
! 270: char *strtok_buf = NULL;
! 271: int cached;
! 272:
! 273: if (!new_value || !new_value[0] || (typelib_file = VCWD_FOPEN(new_value, "r"))==NULL) {
! 274: return FAILURE;
! 275: }
! 276:
! 277: typelib_name_buffer = (char *) emalloc(sizeof(char)*1024);
! 278:
! 279: while (fgets(typelib_name_buffer, 1024, typelib_file)) {
! 280: ITypeLib *pTL;
! 281: char *typelib_name;
! 282: char *modifier, *ptr;
! 283: int mode = CONST_CS | CONST_PERSISTENT; /* CONST_PERSISTENT is ok here */
! 284:
! 285: if (typelib_name_buffer[0]==';') {
! 286: continue;
! 287: }
! 288: typelib_name = php_strtok_r(typelib_name_buffer, "\r\n", &strtok_buf); /* get rid of newlines */
! 289: if (typelib_name == NULL) {
! 290: continue;
! 291: }
! 292: typelib_name = php_strtok_r(typelib_name, "#", &strtok_buf);
! 293: modifier = php_strtok_r(NULL, "#", &strtok_buf);
! 294: if (modifier != NULL) {
! 295: if (!strcmp(modifier, "cis") || !strcmp(modifier, "case_insensitive")) {
! 296: mode &= ~CONST_CS;
! 297: }
! 298: }
! 299:
! 300: /* Remove leading/training white spaces on search_string */
! 301: while (isspace(*typelib_name)) {/* Ends on '\0' in worst case */
! 302: typelib_name ++;
! 303: }
! 304: ptr = typelib_name + strlen(typelib_name) - 1;
! 305: while ((ptr != typelib_name) && isspace(*ptr)) {
! 306: *ptr = '\0';
! 307: ptr--;
! 308: }
! 309:
! 310: if ((pTL = php_com_load_typelib_via_cache(typelib_name, COMG(code_page), &cached TSRMLS_CC)) != NULL) {
! 311: if (!cached) {
! 312: php_com_import_typelib(pTL, mode, COMG(code_page) TSRMLS_CC);
! 313: }
! 314: ITypeLib_Release(pTL);
! 315: }
! 316: }
! 317:
! 318: efree(typelib_name_buffer);
! 319: fclose(typelib_file);
! 320:
! 321: return SUCCESS;
! 322: }
! 323:
! 324: PHP_INI_BEGIN()
! 325: STD_PHP_INI_ENTRY("com.allow_dcom", "0", PHP_INI_SYSTEM, OnUpdateBool, allow_dcom, zend_com_dotnet_globals, com_dotnet_globals)
! 326: STD_PHP_INI_ENTRY("com.autoregister_verbose", "0", PHP_INI_ALL, OnUpdateBool, autoreg_verbose, zend_com_dotnet_globals, com_dotnet_globals)
! 327: STD_PHP_INI_ENTRY("com.autoregister_typelib", "0", PHP_INI_ALL, OnUpdateBool, autoreg_on, zend_com_dotnet_globals, com_dotnet_globals)
! 328: STD_PHP_INI_ENTRY("com.autoregister_casesensitive", "1", PHP_INI_ALL, OnUpdateBool, autoreg_case_sensitive, zend_com_dotnet_globals, com_dotnet_globals)
! 329: STD_PHP_INI_ENTRY("com.code_page", "", PHP_INI_ALL, OnUpdateLong, code_page, zend_com_dotnet_globals, com_dotnet_globals)
! 330: PHP_INI_ENTRY("com.typelib_file", "", PHP_INI_SYSTEM, OnTypeLibFileUpdate)
! 331: PHP_INI_END()
! 332: /* }}} */
! 333:
! 334: /* {{{ PHP_GINIT_FUNCTION
! 335: */
! 336: static PHP_GINIT_FUNCTION(com_dotnet)
! 337: {
! 338: memset(com_dotnet_globals, 0, sizeof(*com_dotnet_globals));
! 339: com_dotnet_globals->code_page = CP_ACP;
! 340: }
! 341: /* }}} */
! 342:
! 343: /* {{{ PHP_MINIT_FUNCTION
! 344: */
! 345: PHP_MINIT_FUNCTION(com_dotnet)
! 346: {
! 347: zend_class_entry ce, *tmp;
! 348:
! 349: php_com_wrapper_minit(INIT_FUNC_ARGS_PASSTHRU);
! 350: php_com_persist_minit(INIT_FUNC_ARGS_PASSTHRU);
! 351:
! 352: INIT_CLASS_ENTRY(ce, "com_exception", NULL);
! 353: php_com_exception_class_entry = zend_register_internal_class_ex(&ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
! 354: php_com_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
! 355: /* php_com_exception_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
! 356:
! 357: INIT_CLASS_ENTRY(ce, "com_safearray_proxy", NULL);
! 358: php_com_saproxy_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
! 359: php_com_saproxy_class_entry->ce_flags |= ZEND_ACC_FINAL;
! 360: /* php_com_saproxy_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
! 361: php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get;
! 362:
! 363: INIT_CLASS_ENTRY(ce, "variant", NULL);
! 364: ce.create_object = php_com_object_new;
! 365: php_com_variant_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
! 366: php_com_variant_class_entry->get_iterator = php_com_iter_get;
! 367:
! 368: INIT_CLASS_ENTRY(ce, "com", NULL);
! 369: ce.create_object = php_com_object_new;
! 370: tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry, "variant" TSRMLS_CC);
! 371: tmp->get_iterator = php_com_iter_get;
! 372:
! 373: zend_ts_hash_init(&php_com_typelibraries, 0, NULL, php_com_typelibrary_dtor, 1);
! 374:
! 375: #if HAVE_MSCOREE_H
! 376: INIT_CLASS_ENTRY(ce, "dotnet", NULL);
! 377: ce.create_object = php_com_object_new;
! 378: tmp = zend_register_internal_class_ex(&ce, php_com_variant_class_entry, "variant" TSRMLS_CC);
! 379: tmp->get_iterator = php_com_iter_get;
! 380: #endif
! 381:
! 382: REGISTER_INI_ENTRIES();
! 383:
! 384: #define COM_CONST(x) REGISTER_LONG_CONSTANT(#x, x, CONST_CS|CONST_PERSISTENT)
! 385:
! 386: COM_CONST(CLSCTX_INPROC_SERVER);
! 387: COM_CONST(CLSCTX_INPROC_HANDLER);
! 388: COM_CONST(CLSCTX_LOCAL_SERVER);
! 389: COM_CONST(CLSCTX_REMOTE_SERVER);
! 390: COM_CONST(CLSCTX_SERVER);
! 391: COM_CONST(CLSCTX_ALL);
! 392:
! 393: #if 0
! 394: COM_CONST(DISPATCH_METHOD);
! 395: COM_CONST(DISPATCH_PROPERTYGET);
! 396: COM_CONST(DISPATCH_PROPERTYPUT);
! 397: #endif
! 398:
! 399: COM_CONST(VT_NULL);
! 400: COM_CONST(VT_EMPTY);
! 401: COM_CONST(VT_UI1);
! 402: COM_CONST(VT_I1);
! 403: COM_CONST(VT_UI2);
! 404: COM_CONST(VT_I2);
! 405: COM_CONST(VT_UI4);
! 406: COM_CONST(VT_I4);
! 407: COM_CONST(VT_R4);
! 408: COM_CONST(VT_R8);
! 409: COM_CONST(VT_BOOL);
! 410: COM_CONST(VT_ERROR);
! 411: COM_CONST(VT_CY);
! 412: COM_CONST(VT_DATE);
! 413: COM_CONST(VT_BSTR);
! 414: COM_CONST(VT_DECIMAL);
! 415: COM_CONST(VT_UNKNOWN);
! 416: COM_CONST(VT_DISPATCH);
! 417: COM_CONST(VT_VARIANT);
! 418: COM_CONST(VT_INT);
! 419: COM_CONST(VT_UINT);
! 420: COM_CONST(VT_ARRAY);
! 421: COM_CONST(VT_BYREF);
! 422:
! 423: COM_CONST(CP_ACP);
! 424: COM_CONST(CP_MACCP);
! 425: COM_CONST(CP_OEMCP);
! 426: COM_CONST(CP_UTF7);
! 427: COM_CONST(CP_UTF8);
! 428: COM_CONST(CP_SYMBOL);
! 429: COM_CONST(CP_THREAD_ACP);
! 430:
! 431: COM_CONST(VARCMP_LT);
! 432: COM_CONST(VARCMP_EQ);
! 433: COM_CONST(VARCMP_GT);
! 434: COM_CONST(VARCMP_NULL);
! 435:
! 436: COM_CONST(NORM_IGNORECASE);
! 437: COM_CONST(NORM_IGNORENONSPACE);
! 438: COM_CONST(NORM_IGNORESYMBOLS);
! 439: COM_CONST(NORM_IGNOREWIDTH);
! 440: COM_CONST(NORM_IGNOREKANATYPE);
! 441: #ifdef NORM_IGNOREKASHIDA
! 442: COM_CONST(NORM_IGNOREKASHIDA);
! 443: #endif
! 444: COM_CONST(DISP_E_DIVBYZERO);
! 445: COM_CONST(DISP_E_OVERFLOW);
! 446: COM_CONST(DISP_E_BADINDEX);
! 447: COM_CONST(MK_E_UNAVAILABLE);
! 448:
! 449: return SUCCESS;
! 450: }
! 451: /* }}} */
! 452:
! 453: /* {{{ PHP_MSHUTDOWN_FUNCTION
! 454: */
! 455: PHP_MSHUTDOWN_FUNCTION(com_dotnet)
! 456: {
! 457: UNREGISTER_INI_ENTRIES();
! 458: #if HAVE_MSCOREE_H
! 459: if (COMG(dotnet_runtime_stuff)) {
! 460: php_com_dotnet_mshutdown(TSRMLS_C);
! 461: }
! 462: #endif
! 463:
! 464: zend_ts_hash_destroy(&php_com_typelibraries);
! 465: return SUCCESS;
! 466: }
! 467: /* }}} */
! 468:
! 469: /* {{{ PHP_RINIT_FUNCTION
! 470: */
! 471: PHP_RINIT_FUNCTION(com_dotnet)
! 472: {
! 473: COMG(rshutdown_started) = 0;
! 474: return SUCCESS;
! 475: }
! 476: /* }}} */
! 477:
! 478: /* {{{ PHP_RSHUTDOWN_FUNCTION
! 479: */
! 480: PHP_RSHUTDOWN_FUNCTION(com_dotnet)
! 481: {
! 482: #if HAVE_MSCOREE_H
! 483: if (COMG(dotnet_runtime_stuff)) {
! 484: php_com_dotnet_rshutdown(TSRMLS_C);
! 485: }
! 486: #endif
! 487: COMG(rshutdown_started) = 1;
! 488: return SUCCESS;
! 489: }
! 490: /* }}} */
! 491:
! 492: /* {{{ PHP_MINFO_FUNCTION
! 493: */
! 494: PHP_MINFO_FUNCTION(com_dotnet)
! 495: {
! 496: php_info_print_table_start();
! 497:
! 498: php_info_print_table_header(2, "COM support", "enabled");
! 499: php_info_print_table_header(2, "DCOM support", COMG(allow_dcom) ? "enabled" : "disabled");
! 500:
! 501: #if HAVE_MSCOREE_H
! 502: php_info_print_table_header(2, ".Net support", "enabled");
! 503: #else
! 504: php_info_print_table_header(2, ".Net support", "not present in this build");
! 505: #endif
! 506:
! 507: php_info_print_table_end();
! 508:
! 509: DISPLAY_INI_ENTRIES();
! 510: }
! 511: /* }}} */
! 512:
! 513: /*
! 514: * Local variables:
! 515: * tab-width: 4
! 516: * c-basic-offset: 4
! 517: * End:
! 518: * vim600: noet sw=4 ts=4 fdm=marker
! 519: * vim<600: noet sw=4 ts=4
! 520: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>