File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / com_dotnet / com_misc.c
Revision 1.1.1.3 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:31:38 2013 UTC (11 years ago) by misho
Branches: php, MAIN
CVS tags: v5_4_29p0, v5_4_20p0, v5_4_20, v5_4_17, HEAD
5.4.17

    1: /*
    2:    +----------------------------------------------------------------------+
    3:    | PHP Version 5                                                        |
    4:    +----------------------------------------------------------------------+
    5:    | Copyright (c) 1997-2013 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,v 1.1.1.3 2013/07/22 01:31:38 misho Exp $ */
   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_win32_error_to_msg(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: PHP_COM_DOTNET_API 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: PHP_COM_DOTNET_API 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: PHP_COM_DOTNET_API 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>