From aeb8791dab0accdf4847fe9d35bea1e1907803dc Mon Sep 17 00:00:00 2001 From: suke Date: Tue, 12 Aug 2014 14:21:22 +0000 Subject: * ext/win32ole/win32ole.c: refactoring. move some methods into win32ole_type.c / win32ole_method.c * ext/win32ole/win32ole.h: ditto. * ext/win32ole/win32ole_method.c: ditto. * ext/win32ole/win32ole_method.h: ditto. * ext/win32ole/win32ole_type.h: ditto. * ext/win32ole/win32ole_type.h: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/win32ole/win32ole.c | 58 ++---------------------------------------- ext/win32ole/win32ole.h | 3 +-- ext/win32ole/win32ole_method.c | 42 +++++++++++++++++++++++++++++- ext/win32ole/win32ole_method.h | 4 +-- ext/win32ole/win32ole_type.c | 24 +++++++++++++++++ ext/win32ole/win32ole_type.h | 1 + 6 files changed, 71 insertions(+), 61 deletions(-) (limited to 'ext/win32ole') diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index fee388ba3c..d4886d1430 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -103,7 +103,6 @@ typedef struct tagIEVENTSINKOBJ { }IEVENTSINKOBJ, *PIEVENTSINKOBJ; VALUE cWIN32OLE; -VALUE cWIN32OLE_METHOD; VALUE cWIN32OLE_PARAM; VALUE cWIN32OLE_EVENT; VALUE cWIN32OLE_VARIANT; @@ -3752,35 +3751,6 @@ fole_missing(int argc, VALUE *argv, VALUE self) } } -VALUE -ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask) -{ - HRESULT hr; - TYPEATTR *pTypeAttr; - WORD i; - HREFTYPE href; - ITypeInfo *pRefTypeInfo; - VALUE methods = rb_ary_new(); - hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr); - if (FAILED(hr)) { - ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr"); - } - - ole_methods_sub(0, pTypeInfo, methods, mask); - for(i=0; i < pTypeAttr->cImplTypes; i++){ - hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href); - if(FAILED(hr)) - continue; - hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo); - if (FAILED(hr)) - continue; - ole_methods_sub(pTypeInfo, pRefTypeInfo, methods, mask); - OLE_RELEASE(pRefTypeInfo); - } - OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr); - return methods; -} - static HRESULT typeinfo_from_ole(struct oledata *pole, ITypeInfo **ppti) { @@ -3907,29 +3877,6 @@ fole_func_methods(VALUE self) return ole_methods( self, INVOKE_FUNC); } -VALUE -ole_type_from_itypeinfo(ITypeInfo *pTypeInfo) -{ - ITypeLib *pTypeLib; - VALUE type = Qnil; - HRESULT hr; - unsigned int index; - BSTR bstr; - - hr = pTypeInfo->lpVtbl->GetContainingTypeLib( pTypeInfo, &pTypeLib, &index ); - if(FAILED(hr)) { - return Qnil; - } - hr = pTypeLib->lpVtbl->GetDocumentation( pTypeLib, index, - &bstr, NULL, NULL, NULL); - OLE_RELEASE(pTypeLib); - if (FAILED(hr)) { - return Qnil; - } - type = create_win32ole_type(pTypeInfo, WC2VSTR(bstr)); - return type; -} - /* * call-seq: * WIN32OLE#ole_type @@ -4268,7 +4215,7 @@ fole_method_help(VALUE self, VALUE cmdname) ITypeInfo *pTypeInfo; HRESULT hr; struct oledata *pole; - VALUE method, obj; + VALUE obj; SafeStringValue(cmdname); OLEData_Get_Struct(self, pole); @@ -4276,8 +4223,7 @@ fole_method_help(VALUE self, VALUE cmdname) if(FAILED(hr)) ole_raise(hr, rb_eRuntimeError, "failed to get ITypeInfo"); - method = folemethod_s_allocate(cWIN32OLE_METHOD); - obj = olemethod_from_typeinfo(method, pTypeInfo, cmdname); + obj = create_win32ole_method(pTypeInfo, cmdname); OLE_RELEASE(pTypeInfo); if (obj == Qnil) diff --git a/ext/win32ole/win32ole.h b/ext/win32ole/win32ole.h index 1ba6c6cf6e..15c849293c 100644 --- a/ext/win32ole/win32ole.h +++ b/ext/win32ole/win32ole.h @@ -115,11 +115,10 @@ VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree); BOOL ole_initialized(); HRESULT ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile); VALUE ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails); -VALUE ole_type_from_itypeinfo(ITypeInfo *pTypeInfo); VALUE make_inspect(const char *class_name, VALUE detail); VALUE ole_variant2val(VARIANT *pvar); -VALUE ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask); VALUE create_win32ole_param(ITypeInfo *pTypeInfo, UINT method_index, UINT index, VALUE name); + #include "win32ole_variant_m.h" #include "win32ole_typelib.h" #include "win32ole_type.h" diff --git a/ext/win32ole/win32ole_method.c b/ext/win32ole/win32ole_method.c index 9da7021d96..dbfc8688c7 100644 --- a/ext/win32ole/win32ole_method.c +++ b/ext/win32ole/win32ole_method.c @@ -1,6 +1,8 @@ #include "win32ole.h" static VALUE ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name); +static VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name); +static VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask); static void olemethod_free(struct olemethoddata *polemethod); static VALUE olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name); static VALUE folemethod_initialize(VALUE self, VALUE oletype, VALUE method); @@ -85,6 +87,35 @@ ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALU } VALUE +ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask) +{ + HRESULT hr; + TYPEATTR *pTypeAttr; + WORD i; + HREFTYPE href; + ITypeInfo *pRefTypeInfo; + VALUE methods = rb_ary_new(); + hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr); + if (FAILED(hr)) { + ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr"); + } + + ole_methods_sub(0, pTypeInfo, methods, mask); + for(i=0; i < pTypeAttr->cImplTypes; i++){ + hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href); + if(FAILED(hr)) + continue; + hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo); + if (FAILED(hr)) + continue; + ole_methods_sub(pTypeInfo, pRefTypeInfo, methods, mask); + OLE_RELEASE(pRefTypeInfo); + } + OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr); + return methods; +} + +static VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name) { HRESULT hr; @@ -115,7 +146,7 @@ olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name) return method; } -VALUE +static VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask) { HRESULT hr; @@ -153,6 +184,15 @@ ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, return methods; } +VALUE +create_win32ole_method(ITypeInfo *pTypeInfo, VALUE name) +{ + + VALUE method = folemethod_s_allocate(cWIN32OLE_METHOD); + VALUE obj = olemethod_from_typeinfo(method, pTypeInfo, name); + return obj; +} + /* * Document-class: WIN32OLE_METHOD * diff --git a/ext/win32ole/win32ole_method.h b/ext/win32ole/win32ole_method.h index 962a59c0d2..58005dd73f 100644 --- a/ext/win32ole/win32ole_method.h +++ b/ext/win32ole/win32ole_method.h @@ -9,7 +9,7 @@ struct olemethoddata { VALUE cWIN32OLE_METHOD; VALUE folemethod_s_allocate(VALUE klass); -VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name); -VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask); +VALUE ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask); +VALUE create_win32ole_method(ITypeInfo *pTypeInfo, VALUE name); void Init_win32ole_method(); #endif diff --git a/ext/win32ole/win32ole_type.c b/ext/win32ole/win32ole_type.c index f358536707..00db09e191 100644 --- a/ext/win32ole/win32ole_type.c +++ b/ext/win32ole/win32ole_type.c @@ -66,6 +66,30 @@ ITypeInfo *itypeinfo(VALUE self) return ptype->pTypeInfo; } +VALUE +ole_type_from_itypeinfo(ITypeInfo *pTypeInfo) +{ + ITypeLib *pTypeLib; + VALUE type = Qnil; + HRESULT hr; + unsigned int index; + BSTR bstr; + + hr = pTypeInfo->lpVtbl->GetContainingTypeLib( pTypeInfo, &pTypeLib, &index ); + if(FAILED(hr)) { + return Qnil; + } + hr = pTypeLib->lpVtbl->GetDocumentation( pTypeLib, index, + &bstr, NULL, NULL, NULL); + OLE_RELEASE(pTypeLib); + if (FAILED(hr)) { + return Qnil; + } + type = create_win32ole_type(pTypeInfo, WC2VSTR(bstr)); + return type; +} + + /* * call-seq: * WIN32OLE_TYPE.ole_classes(typelib) diff --git a/ext/win32ole/win32ole_type.h b/ext/win32ole/win32ole_type.h index c6b6f2726e..086d36a241 100644 --- a/ext/win32ole/win32ole_type.h +++ b/ext/win32ole/win32ole_type.h @@ -3,5 +3,6 @@ VALUE cWIN32OLE_TYPE; VALUE create_win32ole_type(ITypeInfo *pTypeInfo, VALUE name); ITypeInfo *itypeinfo(VALUE self); +VALUE ole_type_from_itypeinfo(ITypeInfo *pTypeInfo); void Init_win32ole_type(); #endif -- cgit v1.2.3