summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorsuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-11 09:53:10 +0000
committersuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-11 09:53:10 +0000
commit70db47aadb2b353a46d7040e048534ad405bfb5b (patch)
tree5fe0af3ff8fb66253e896a5e1b8d0693d4032093 /ext
parent8833abd5564896d0d49f1715c069f6753747ae4a (diff)
* ext/win32ole/win32ole.c (ole_val2olevariantdata):
WIN32OLE_VARIANT#new accepts nil when variant type is VT_ARRAY. * test/win32ole/test_win32ole_variant.rb: ditto. * ext/win32ole/win32ole.c: small refactoring. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/win32ole/win32ole.c182
1 files changed, 85 insertions, 97 deletions
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c
index c613a85dae..72630a1e0f 100644
--- a/ext/win32ole/win32ole.c
+++ b/ext/win32ole/win32ole.c
@@ -80,7 +80,7 @@
#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
-#define WIN32OLE_VERSION "0.9.3"
+#define WIN32OLE_VERSION "0.9.4"
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
@@ -323,7 +323,6 @@ static VALUE fole_typelib(VALUE self);
static VALUE fole_query_interface(VALUE self, VALUE str_iid);
static HRESULT ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
static VALUE ole_usertype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
-static VALUE ole_typedesc2val();
static VALUE ole_ptrtype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
static VALUE ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
static VALUE fole_method_help(VALUE self, VALUE cmdname);
@@ -432,9 +431,9 @@ static VALUE folemethod_params(VALUE self);
static VALUE folemethod_inspect(VALUE self);
static VALUE foleparam_name(VALUE self);
static VALUE ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
-static VALUE foleparam_ole_type(VALUE self);
+static VALUE foleparam_ole_type(VALUE self);
static VALUE ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
-static VALUE foleparam_ole_type_detail(VALUE self);
+static VALUE foleparam_ole_type_detail(VALUE self);
static VALUE ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask);
static VALUE foleparam_input(VALUE self);
static VALUE foleparam_output(VALUE self);
@@ -1373,13 +1372,20 @@ ole_val2olevariantdata(VALUE val, VARTYPE vtype, struct olevariantdata *pvar)
SafeArrayDestroy(psa);
}
} else if (vtype & VT_ARRAY) {
- hr = ole_val_ary2variant_ary(val, &(pvar->realvar), (vtype & ~VT_BYREF));
- if (SUCCEEDED(hr)) {
+ if (val == Qnil) {
+ V_VT(&(pvar->var)) = vtype;
if (vtype & VT_BYREF) {
- V_VT(&(pvar->var)) = V_VT(&(pvar->realvar)) | VT_BYREF;
V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
- } else {
- hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ }
+ } else {
+ hr = ole_val_ary2variant_ary(val, &(pvar->realvar), (vtype & ~VT_BYREF));
+ if (SUCCEEDED(hr)) {
+ if (vtype & VT_BYREF) {
+ V_VT(&(pvar->var)) = V_VT(&(pvar->realvar)) | VT_BYREF;
+ V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
+ } else {
+ hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ }
}
}
} else {
@@ -2457,7 +2463,7 @@ static BOOL
lcid_installed(LCID lcid)
{
g_lcid_installed = FALSE;
- snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%0.8x", lcid);
+ snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%08x", lcid);
EnumSystemLocales(installed_lcid_proc, LCID_INSTALLED);
return g_lcid_installed;
}
@@ -3916,7 +3922,6 @@ ole_usertype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
return type;
}
-static VALUE ole_typedesc2val();
static VALUE
ole_ptrtype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
{
@@ -3938,131 +3943,113 @@ static VALUE
ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
{
VALUE str;
+ VALUE typestr = Qnil;
switch(pTypeDesc->vt) {
case VT_I2:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("I2"));
- return rb_str_new2("I2");
+ typestr = rb_str_new2("I2");
+ break;
case VT_I4:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("I4"));
- return rb_str_new2("I4");
+ typestr = rb_str_new2("I4");
+ break;
case VT_R4:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("R4"));
- return rb_str_new2("R4");
+ typestr = rb_str_new2("R4");
+ break;
case VT_R8:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("R8"));
- return rb_str_new2("R8");
+ typestr = rb_str_new2("R8");
+ break;
case VT_CY:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("CY"));
- return rb_str_new2("CY");
+ typestr = rb_str_new2("CY");
+ break;
case VT_DATE:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("DATE"));
- return rb_str_new2("DATE");
+ typestr = rb_str_new2("DATE");
+ break;
case VT_BSTR:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("BSTR"));
- return rb_str_new2("BSTR");
+ typestr = rb_str_new2("BSTR");
+ break;
case VT_BOOL:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("BOOL"));
- return rb_str_new2("BOOL");
+ typestr = rb_str_new2("BOOL");
+ break;
case VT_VARIANT:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("VARIANT"));
- return rb_str_new2("VARIANT");
+ typestr = rb_str_new2("VARIANT");
+ break;
case VT_DECIMAL:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("DECIMAL"));
- return rb_str_new2("DECIMAL");
+ typestr = rb_str_new2("DECIMAL");
+ break;
case VT_I1:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("I1"));
- return rb_str_new2("I1");
+ typestr = rb_str_new2("I1");
+ break;
case VT_UI1:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("UI1"));
- return rb_str_new2("UI1");
+ typestr = rb_str_new2("UI1");
+ break;
case VT_UI2:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("UI2"));
- return rb_str_new2("UI2");
+ typestr = rb_str_new2("UI2");
+ break;
case VT_UI4:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("UI4"));
- return rb_str_new2("UI4");
+ typestr = rb_str_new2("UI4");
+ break;
case VT_I8:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("I8"));
- return rb_str_new2("I8");
+ typestr = rb_str_new2("I8");
+ break;
case VT_UI8:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("UI8"));
- return rb_str_new2("UI8");
+ typestr = rb_str_new2("UI8");
+ break;
case VT_INT:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("INT"));
- return rb_str_new2("INT");
+ typestr = rb_str_new2("INT");
+ break;
case VT_UINT:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("UINT"));
- return rb_str_new2("UINT");
+ typestr = rb_str_new2("UINT");
+ break;
case VT_VOID:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("VOID"));
- return rb_str_new2("VOID");
+ typestr = rb_str_new2("VOID");
+ break;
case VT_HRESULT:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("HRESULT"));
- return rb_str_new2("HRESULT");
+ typestr = rb_str_new2("HRESULT");
+ break;
case VT_PTR:
+ typestr = rb_str_new2("PTR");
if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("PTR"));
+ rb_ary_push(typedetails, typestr);
return ole_ptrtype2val(pTypeInfo, pTypeDesc, typedetails);
case VT_SAFEARRAY:
+ typestr = rb_str_new2("SAFEARRAY");
if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("SAFEARRAY"));
+ rb_ary_push(typedetails, typestr);
return ole_ptrtype2val(pTypeInfo, pTypeDesc, typedetails);
case VT_CARRAY:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("CARRAY"));
- return rb_str_new2("CARRAY");
+ typestr = rb_str_new2("CARRAY");
+ break;
case VT_USERDEFINED:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("USERDEFINED"));
+ typestr = rb_str_new2("USERDEFINED");
+ if (typedetails != Qnil)
+ rb_ary_push(typedetails, typestr);
str = ole_usertype2val(pTypeInfo, pTypeDesc, typedetails);
if (str != Qnil) {
return str;
}
- return rb_str_new2("USERDEFINED");
+ return typestr;
case VT_UNKNOWN:
- return rb_str_new2("UNKNOWN");
+ typestr = rb_str_new2("UNKNOWN");
+ break;
case VT_DISPATCH:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("DISPATCH"));
- return rb_str_new2("DISPATCH");
+ typestr = rb_str_new2("DISPATCH");
+ break;
case VT_ERROR:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("ERROR"));
- return rb_str_new2("ERROR");
-
+ typestr = rb_str_new2("ERROR");
+ break;
case VT_LPWSTR:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("LPWSTR"));
- return rb_str_new2("LPWSTR");
+ typestr = rb_str_new2("LPWSTR");
+ break;
case VT_LPSTR:
- if(typedetails != Qnil)
- rb_ary_push(typedetails, rb_str_new2("LPSTR"));
- return rb_str_new2("LPSTR");
+ typestr = rb_str_new2("LPSTR");
+ break;
default:
- str = rb_str_new2("Unknown Type ");
- rb_str_concat(str, rb_fix2str(INT2FIX(pTypeDesc->vt), 10));
- return str;
+ typestr = rb_str_new2("Unknown Type ");
+ rb_str_concat(typestr, rb_fix2str(INT2FIX(pTypeDesc->vt), 10));
+ break;
}
+ if (typedetails != Qnil)
+ rb_ary_push(typedetails, typestr);
+ return typestr;
}
/*
@@ -6848,6 +6835,7 @@ void EVENTSINK_Destructor(
if(pEVObj != NULL) {
*(pEVObj->ptr_freed) = 1;
free(pEVObj);
+ pEVObj = NULL;
}
}
@@ -7064,7 +7052,7 @@ ole_event_free(struct oleeventdata *poleev)
/*
* this return create memory leak.
* but poleev->pEvent->pConnectionPoint shoul'd not be freed
- * until poleev-> freed == 0.
+ * until poleev->freed == 0.
*/
return;
}