Annotation of embedaddon/php/ext/com_dotnet/com_misc.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_misc.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: void php_com_throw_exception(HRESULT code, char *message TSRMLS_DC)
! 33: {
! 34: int free_msg = 0;
! 35: if (message == NULL) {
! 36: message = php_win_err(code);
! 37: free_msg = 1;
! 38: }
! 39: zend_throw_exception(php_com_exception_class_entry, message, (long)code TSRMLS_CC);
! 40: if (free_msg) {
! 41: LocalFree(message);
! 42: }
! 43: }
! 44:
! 45: PHPAPI void php_com_wrap_dispatch(zval *z, IDispatch *disp,
! 46: int codepage TSRMLS_DC)
! 47: {
! 48: php_com_dotnet_object *obj;
! 49:
! 50: obj = emalloc(sizeof(*obj));
! 51: memset(obj, 0, sizeof(*obj));
! 52: obj->code_page = codepage;
! 53: obj->ce = php_com_variant_class_entry;
! 54: obj->zo.ce = php_com_variant_class_entry;
! 55:
! 56: VariantInit(&obj->v);
! 57: V_VT(&obj->v) = VT_DISPATCH;
! 58: V_DISPATCH(&obj->v) = disp;
! 59:
! 60: IDispatch_AddRef(V_DISPATCH(&obj->v));
! 61: IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo);
! 62:
! 63: Z_TYPE_P(z) = IS_OBJECT;
! 64: z->value.obj.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
! 65: z->value.obj.handlers = &php_com_object_handlers;
! 66: }
! 67:
! 68: PHPAPI void php_com_wrap_variant(zval *z, VARIANT *v,
! 69: int codepage TSRMLS_DC)
! 70: {
! 71: php_com_dotnet_object *obj;
! 72:
! 73: obj = emalloc(sizeof(*obj));
! 74: memset(obj, 0, sizeof(*obj));
! 75: obj->code_page = codepage;
! 76: obj->ce = php_com_variant_class_entry;
! 77: obj->zo.ce = php_com_variant_class_entry;
! 78:
! 79: VariantInit(&obj->v);
! 80: VariantCopyInd(&obj->v, v);
! 81: obj->modified = 0;
! 82:
! 83: if ((V_VT(&obj->v) == VT_DISPATCH) && (V_DISPATCH(&obj->v) != NULL)) {
! 84: IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo);
! 85: }
! 86:
! 87: Z_TYPE_P(z) = IS_OBJECT;
! 88:
! 89: z->value.obj.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
! 90: z->value.obj.handlers = &php_com_object_handlers;
! 91: }
! 92:
! 93: /* this is a convenience function for fetching a particular
! 94: * element from a (possibly multi-dimensional) safe array */
! 95: PHPAPI int php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1 TSRMLS_DC)
! 96: {
! 97: UINT dims;
! 98: LONG lbound, ubound;
! 99: LONG indices[1];
! 100: VARTYPE vt;
! 101:
! 102: if (!V_ISARRAY(array)) {
! 103: return 0;
! 104: }
! 105:
! 106: dims = SafeArrayGetDim(V_ARRAY(array));
! 107:
! 108: if (dims != 1) {
! 109: php_error_docref(NULL TSRMLS_CC, E_WARNING,
! 110: "Can only handle single dimension variant arrays (this array has %d)", dims);
! 111: return 0;
! 112: }
! 113:
! 114: if (FAILED(SafeArrayGetVartype(V_ARRAY(array), &vt)) || vt == VT_EMPTY) {
! 115: vt = V_VT(array) & ~VT_ARRAY;
! 116: }
! 117:
! 118: /* determine the bounds */
! 119: SafeArrayGetLBound(V_ARRAY(array), 1, &lbound);
! 120: SafeArrayGetUBound(V_ARRAY(array), 1, &ubound);
! 121:
! 122: /* check bounds */
! 123: if (dim1 < lbound || dim1 > ubound) {
! 124: php_com_throw_exception(DISP_E_BADINDEX, "index out of bounds" TSRMLS_CC);
! 125: return 0;
! 126: }
! 127:
! 128: /* now fetch that element */
! 129: VariantInit(dest);
! 130:
! 131: indices[0] = dim1;
! 132:
! 133: if (vt == VT_VARIANT) {
! 134: SafeArrayGetElement(V_ARRAY(array), indices, dest);
! 135: } else {
! 136: V_VT(dest) = vt;
! 137: /* store the value into "lVal" member of the variant.
! 138: * This works because it is a union; since we know the variant
! 139: * type, we end up with a working variant */
! 140: SafeArrayGetElement(V_ARRAY(array), indices, &dest->lVal);
! 141: }
! 142:
! 143: return 1;
! 144: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>