40 CONST_VTBL
struct IStreamVtbl *
lpVtbl;
49 php_istream *stm = (php_istream*)This; \
50 if (GetCurrentThreadId() != stm->engine_thread) \
51 return RPC_E_WRONG_THREAD;
53#define FETCH_STM_EX() \
54 php_istream *stm = (php_istream*)This; \
55 if (GetCurrentThreadId() != stm->engine_thread) \
56 return RPC_E_WRONG_THREAD;
58static HRESULT STDMETHODCALLTYPE stm_queryinterface(
65 if (IsEqualGUID(&IID_IUnknown, riid) ||
66 IsEqualGUID(&IID_IStream, riid)) {
68 InterlockedIncrement(&stm->refcount);
76static ULONG STDMETHODCALLTYPE stm_addref(IStream *This)
80 return InterlockedIncrement(&stm->refcount);
83static ULONG STDMETHODCALLTYPE stm_release(IStream *This)
88 ret = InterlockedDecrement(&stm->refcount);
91 istream_destructor(stm);
96static HRESULT STDMETHODCALLTYPE stm_read(IStream *This,
void *pv, ULONG
cb, ULONG *pcbRead)
104 *pcbRead = nread > 0 ? nread : 0;
112static HRESULT STDMETHODCALLTYPE stm_write(IStream *This,
void const *pv, ULONG
cb, ULONG *pcbWritten)
120 *pcbWritten = nwrote > 0 ? (ULONG)nwrote : 0;
128static HRESULT STDMETHODCALLTYPE stm_seek(IStream *This, LARGE_INTEGER dlibMove,
129 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
137 case STREAM_SEEK_SET: whence =
SEEK_SET;
break;
138 case STREAM_SEEK_CUR: whence =
SEEK_CUR;
break;
139 case STREAM_SEEK_END: whence =
SEEK_END;
break;
141 return STG_E_INVALIDFUNCTION;
144 if (dlibMove.HighPart) {
146 return STG_E_INVALIDFUNCTION;
149 offset = (off_t) dlibMove.QuadPart;
153 if (plibNewPosition) {
154 plibNewPosition->QuadPart = (ULONGLONG)(
ret >= 0 ?
ret : 0);
157 return ret >= 0 ? S_OK : STG_E_INVALIDFUNCTION;
160static HRESULT STDMETHODCALLTYPE stm_set_size(IStream *This, ULARGE_INTEGER libNewSize)
164 if (libNewSize.HighPart) {
165 return STG_E_INVALIDFUNCTION;
176 return STG_E_INVALIDFUNCTION;
179static HRESULT STDMETHODCALLTYPE stm_copy_to(IStream *This, IStream *pstm, ULARGE_INTEGER
cb,
180 ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
187static HRESULT STDMETHODCALLTYPE stm_commit(IStream *This,
DWORD grfCommitFlags)
196static HRESULT STDMETHODCALLTYPE stm_revert(IStream *This)
202static HRESULT STDMETHODCALLTYPE stm_lock_region(IStream *This,
203 ULARGE_INTEGER libOffset, ULARGE_INTEGER
cb,
DWORD lockType)
205 return STG_E_INVALIDFUNCTION;
208static HRESULT STDMETHODCALLTYPE stm_unlock_region(IStream *This,
209 ULARGE_INTEGER libOffset, ULARGE_INTEGER
cb,
DWORD lockType)
211 return STG_E_INVALIDFUNCTION;
214static HRESULT STDMETHODCALLTYPE stm_stat(IStream *This,
215 STATSTG *pstatstg,
DWORD grfStatFlag)
217 return STG_E_INVALIDFUNCTION;
220static HRESULT STDMETHODCALLTYPE stm_clone(IStream *This, IStream **ppstm)
222 return STG_E_INVALIDFUNCTION;
225static struct IStreamVtbl php_istream_vtbl = {
245 CoDisconnectObject((IUnknown*)stm, 0);
261 memset(stm, 0,
sizeof(*stm));
263 stm->
lpVtbl = &php_istream_vtbl;
269 return (IStream*)stm;
272#define CPH_METHOD(fname) PHP_METHOD(COMPersistHelper, fname)
274#define CPH_FETCH() php_com_persist_helper *helper = (php_com_persist_helper*)Z_OBJ_P(ZEND_THIS);
276#define CPH_NO_OBJ() if (helper->unk == NULL) { php_com_throw_exception(E_INVALIDARG, "No COM object is associated with this helper instance"); RETURN_THROWS(); }
292 if (!helper->
ips && helper->
unk) {
293 return IUnknown_QueryInterface(helper->
unk, &IID_IPersistStream, &helper->
ips);
295 return helper->
ips ? S_OK : E_NOTIMPL;
300 if (!helper->
ipsi && helper->
unk) {
301 return IUnknown_QueryInterface(helper->
unk, &IID_IPersistStreamInit, &helper->
ipsi);
303 return helper->
ipsi ? S_OK : E_NOTIMPL;
308 if (!helper->
ipf && helper->
unk) {
309 return IUnknown_QueryInterface(helper->
unk, &IID_IPersistFile, &helper->
ipf);
311 return helper->
ipf ? S_OK : E_NOTIMPL;
319 OLECHAR *olename =
NULL;
328 res = get_persist_file(helper);
330 res = IPersistFile_GetCurFile(helper->
ipf, &olename);
334 CoTaskMemFree(olename);
336 }
else if (
res == S_FALSE) {
337 CoTaskMemFree(olename);
352 char *filename, *fullpath =
NULL;
354 bool remember =
TRUE;
355 OLECHAR *olefilename =
NULL;
365 res = get_persist_file(helper);
381 res = IPersistFile_Save(helper->
ipf, olefilename, remember);
382 if (SUCCEEDED(
res)) {
384 res = IPersistFile_GetCurFile(helper->
ipf, &olefilename);
386 IPersistFile_SaveCompleted(helper->
ipf, olefilename);
387 CoTaskMemFree(olefilename);
390 }
else if (remember) {
391 IPersistFile_SaveCompleted(helper->
ipf, olefilename);
413 char *filename, *fullpath;
416 OLECHAR *olefilename;
426 res = get_persist_file(helper);
466 res = get_persist_stream_init(helper);
468 res = IPersistStreamInit_GetSizeMax(helper->
ipsi, &
size);
470 res = get_persist_stream(helper);
472 res = IPersistStream_GetSizeMax(helper->
ips, &
size);
500 res = get_persist_stream_init(helper);
502 res = IPersistStreamInit_InitNew(helper->
ipsi);
530 if (stream ==
NULL) {
545 IDispatch *disp =
NULL;
548 res = OleLoadFromStream(stm, &IID_IDispatch, &disp);
550 if (SUCCEEDED(
res)) {
554 res = get_persist_stream_init(helper);
556 res = IPersistStreamInit_Load(helper->
ipsi, stm);
558 res = get_persist_stream(helper);
560 res = IPersistStreamInit_Load(helper->
ipsi, stm);
564 IStream_Release(stm);
590 if (stream ==
NULL) {
601 res = get_persist_stream_init(helper);
603 res = IPersistStreamInit_Save(helper->
ipsi, stm,
TRUE);
605 res = get_persist_stream(helper);
607 res = IPersistStream_Save(helper->
ips, stm,
TRUE);
611 IStream_Release(stm);
646 helper->
unk = (IUnknown*)V_DISPATCH(&obj->
v);
647 IUnknown_AddRef(helper->
unk);
658 IPersistFile_Release(
object->ipf);
661 IPersistStream_Release(
object->ips);
664 IPersistStreamInit_Release(
object->ipsi);
667 IUnknown_Release(
object->unk);
677 clone =
emalloc(
sizeof(*
object));
678 memcpy(clone,
object,
sizeof(*
object));
683 IPersistFile_AddRef(clone->
ipf);
686 IPersistStream_AddRef(clone->
ips);
689 IPersistStreamInit_AddRef(clone->
ipsi);
692 IUnknown_AddRef(clone->
unk);
701 helper =
emalloc(
sizeof(*helper));
702 memset(helper, 0,
sizeof(*helper));
712 helper_handlers.free_obj = helper_free_storage;
713 helper_handlers.clone_obj = helper_clone;
715 helper_ce = register_class_COMPersistHelper();
716 helper_ce->create_object = helper_new;
717 helper_ce->default_object_handlers = &helper_handlers;
zend_class_entry * php_com_variant_class_entry
void php_com_throw_exception(HRESULT code, char *message)
PHP_COM_DOTNET_API void php_com_wrap_dispatch(zval *z, IDispatch *disp, int codepage)
PHP_COM_DOTNET_API zend_string * php_com_olestring_to_string(OLECHAR *olestring, int codepage)
PHP_COM_DOTNET_API OLECHAR * php_com_string_to_olestring(const char *string, size_t string_len, int codepage)
void php_com_persist_minit(INIT_FUNC_ARGS)
#define CPH_METHOD(fname)
PHP_COM_DOTNET_API IStream * php_com_wrapper_export_stream(php_stream *stream)
memset(ptr, 0, type->size)
PHPAPI int php_check_open_basedir(const char *path)
PHPAPI char * expand_filepath(const char *filepath, char *real_path)
#define PHP_COM_DOTNET_API
struct _php_com_dotnet_object php_com_dotnet_object
#define php_stream_truncate_supported(stream)
struct _php_stream php_stream
#define php_stream_read(stream, buf, count)
#define php_stream_seek(stream, offset, whence)
#define php_stream_flush(stream)
#define php_stream_truncate_set_size(stream, size)
#define php_stream_from_zval_no_verify(xstr, pzval)
#define php_stream_write(stream, buf, count)
IPersistStreamInit * ipsi
CONST_VTBL struct IStreamVtbl * lpVtbl
ZEND_API zend_result zend_parse_parameters(uint32_t num_args, const char *type_spec,...)
#define zend_parse_parameters_none()
ZEND_API zend_result ZEND_FASTCALL zend_list_delete(zend_resource *res)
struct _zend_string zend_string
ZEND_API const zend_object_handlers std_object_handlers
ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class_entry *ce)
ZEND_API void zend_object_std_dtor(zend_object *object)
struct _zend_class_entry zend_class_entry
struct _zend_object zend_object
struct _zend_object_handlers zend_object_handlers