summaryrefslogtreecommitdiff
path: root/ext/com_dotnet/com_misc.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2013-03-14 05:42:27 +0000
committer <>2013-04-03 16:25:08 +0000
commitc4dd7a1a684490673e25aaf4fabec5df138854c4 (patch)
tree4d57c44caae4480efff02b90b9be86f44bf25409 /ext/com_dotnet/com_misc.c
downloadphp2-master.tar.gz
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/com_dotnet/com_misc.c')
-rw-r--r--ext/com_dotnet/com_misc.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/ext/com_dotnet/com_misc.c b/ext/com_dotnet/com_misc.c
new file mode 100644
index 0000000..023c5b8
--- /dev/null
+++ b/ext/com_dotnet/com_misc.c
@@ -0,0 +1,144 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2013 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.01 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_01.txt |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Wez Furlong <wez@thebrainroom.com> |
+ +----------------------------------------------------------------------+
+ */
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_com_dotnet.h"
+#include "php_com_dotnet_internal.h"
+#include "Zend/zend_exceptions.h"
+
+void php_com_throw_exception(HRESULT code, char *message TSRMLS_DC)
+{
+ int free_msg = 0;
+ if (message == NULL) {
+ message = php_win32_error_to_msg(code);
+ free_msg = 1;
+ }
+ zend_throw_exception(php_com_exception_class_entry, message, (long)code TSRMLS_CC);
+ if (free_msg) {
+ LocalFree(message);
+ }
+}
+
+PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp,
+ int codepage TSRMLS_DC)
+{
+ php_com_dotnet_object *obj;
+
+ obj = emalloc(sizeof(*obj));
+ memset(obj, 0, sizeof(*obj));
+ obj->code_page = codepage;
+ obj->ce = php_com_variant_class_entry;
+ obj->zo.ce = php_com_variant_class_entry;
+
+ VariantInit(&obj->v);
+ V_VT(&obj->v) = VT_DISPATCH;
+ V_DISPATCH(&obj->v) = disp;
+
+ IDispatch_AddRef(V_DISPATCH(&obj->v));
+ IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo);
+
+ Z_TYPE_P(z) = IS_OBJECT;
+ z->value.obj.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
+ z->value.obj.handlers = &php_com_object_handlers;
+}
+
+PHP_COM_DOTNET_API void php_com_wrap_variant(zval *z, VARIANT *v,
+ int codepage TSRMLS_DC)
+{
+ php_com_dotnet_object *obj;
+
+ obj = emalloc(sizeof(*obj));
+ memset(obj, 0, sizeof(*obj));
+ obj->code_page = codepage;
+ obj->ce = php_com_variant_class_entry;
+ obj->zo.ce = php_com_variant_class_entry;
+
+ VariantInit(&obj->v);
+ VariantCopyInd(&obj->v, v);
+ obj->modified = 0;
+
+ if ((V_VT(&obj->v) == VT_DISPATCH) && (V_DISPATCH(&obj->v) != NULL)) {
+ IDispatch_GetTypeInfo(V_DISPATCH(&obj->v), 0, LANG_NEUTRAL, &obj->typeinfo);
+ }
+
+ Z_TYPE_P(z) = IS_OBJECT;
+
+ z->value.obj.handle = zend_objects_store_put(obj, NULL, php_com_object_free_storage, php_com_object_clone TSRMLS_CC);
+ z->value.obj.handlers = &php_com_object_handlers;
+}
+
+/* this is a convenience function for fetching a particular
+ * element from a (possibly multi-dimensional) safe array */
+PHP_COM_DOTNET_API int php_com_safearray_get_elem(VARIANT *array, VARIANT *dest, LONG dim1 TSRMLS_DC)
+{
+ UINT dims;
+ LONG lbound, ubound;
+ LONG indices[1];
+ VARTYPE vt;
+
+ if (!V_ISARRAY(array)) {
+ return 0;
+ }
+
+ dims = SafeArrayGetDim(V_ARRAY(array));
+
+ if (dims != 1) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING,
+ "Can only handle single dimension variant arrays (this array has %d)", dims);
+ return 0;
+ }
+
+ if (FAILED(SafeArrayGetVartype(V_ARRAY(array), &vt)) || vt == VT_EMPTY) {
+ vt = V_VT(array) & ~VT_ARRAY;
+ }
+
+ /* determine the bounds */
+ SafeArrayGetLBound(V_ARRAY(array), 1, &lbound);
+ SafeArrayGetUBound(V_ARRAY(array), 1, &ubound);
+
+ /* check bounds */
+ if (dim1 < lbound || dim1 > ubound) {
+ php_com_throw_exception(DISP_E_BADINDEX, "index out of bounds" TSRMLS_CC);
+ return 0;
+ }
+
+ /* now fetch that element */
+ VariantInit(dest);
+
+ indices[0] = dim1;
+
+ if (vt == VT_VARIANT) {
+ SafeArrayGetElement(V_ARRAY(array), indices, dest);
+ } else {
+ V_VT(dest) = vt;
+ /* store the value into "lVal" member of the variant.
+ * This works because it is a union; since we know the variant
+ * type, we end up with a working variant */
+ SafeArrayGetElement(V_ARRAY(array), indices, &dest->lVal);
+ }
+
+ return 1;
+}