summaryrefslogtreecommitdiff
path: root/ext/com/com.h
blob: e1f04c75c7718949d4bdb206025b90d236900d80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef COM_H
#define COM_H

#if PHP_WIN32

#include "oleauto.h"

typedef struct comval_ {
#ifdef _DEBUG
	int resourceindex;
#endif	
	BOOL typelib;
	BOOL enumeration;
	int refcount;
	struct {
		IDispatch *dispatch;
		ITypeInfo *typeinfo;
		IEnumVARIANT *enumvariant;
	} i;
} comval;

#define ZVAL_COM(z,o) {																\
			zval *handle;															\
																					\
			/* OBJECTS_FIXME */														\
			Z_TYPE_P(z) = IS_OBJECT;												\
			Z_OBJCE_P(z) = &com_class_entry;										\
																					\
			ALLOC_HASHTABLE(Z_OBJPROP_P(z));										\
			zend_hash_init(Z_OBJPROP_P(z), 0, NULL, ZVAL_PTR_DTOR, 0);				\
																					\
			ALLOC_ZVAL(handle);														\
			INIT_PZVAL(handle);														\
			ZVAL_LONG(handle, zend_list_insert((o), IS_COM));						\
																					\
			zval_copy_ctor(handle);													\
			zend_hash_index_update(Z_OBJPROP_P(z), 0, &handle, sizeof(zval *), NULL);	\
		}

#define RETVAL_COM(o)	ZVAL_COM(&return_value, o)
#define RETURN_COM(o)	RETVAL_COM(o)												\
						return;

#define ALLOC_COM(z)	(z) = (comval *) emalloc(sizeof(comval))
#define IS_COM			php_COM_get_le_comval()

#define C_HASTLIB(x)	((x)->typelib)
#define C_HASENUM(x)	((x)->enumeration)
#define C_REFCOUNT(x)	((x)->refcount)
#define C_ISREFD(x)		C_REFCOUNT(x)

#define C_ADDREF(x)		(++((x)->refcount))
#define C_RELEASE(x)	(--((x)->refcount))

#define C_DISPATCH(x)		((x)->i.dispatch)
#define C_TYPEINFO(x)		((x)->i.typeinfo)
#define C_ENUMVARIANT(x)	((x)->i.enumvariant)

#define C_DISPATCH_VT(x)	(C_DISPATCH(x)->lpVtbl)
#define C_TYPEINFO_VT(x)	(C_TYPEINFO(x)->lpVtbl)
#define C_ENUMVARIANT_VT(x)	(C_ENUMVARIANT(x)->lpVtbl)

#endif  /* PHP_WIN32 */

#endif  /* COM_H */