1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* ext/win32ole/win32ole.c (ole_val2olevariantdata): bug fix.

WIN32OLE_VARIANT.new check that 1st argument should T_ARRAY
  when variant type is VT_ARRAY.

* test/win32ole/test_win32ole_variant.rb: add some test. 


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11581 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
suke 2007-01-27 09:46:34 +00:00
parent c91a817032
commit 68daaab409
3 changed files with 102 additions and 81 deletions

View file

@ -1,3 +1,11 @@
Sat Jan 27 18:36:33 2007 Masaki Suketa <masaki.suketa@nifty.ne.jp>
* ext/win32ole/win32ole.c (ole_val2olevariantdata): bug fix.
WIN32OLE_VARIANT.new check that 1st argument should T_ARRAY
when variant type is VT_ARRAY.
* test/win32ole/test_win32ole_variant.rb: add some test.
Fri Jan 26 23:55:56 2007 Masaki Suketa <masaki.suketa@nifty.ne.jp> Fri Jan 26 23:55:56 2007 Masaki Suketa <masaki.suketa@nifty.ne.jp>
* ext/win32ole/win32ole.c: bug fix of WIN32OLE_VARIANT when variant * ext/win32ole/win32ole.c: bug fix of WIN32OLE_VARIANT when variant

View file

@ -80,7 +80,7 @@
#define WC2VSTR(x) ole_wc2vstr((x), TRUE) #define WC2VSTR(x) ole_wc2vstr((x), TRUE)
#define WIN32OLE_VERSION "0.8.8" #define WIN32OLE_VERSION "0.8.9"
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
@ -1008,65 +1008,62 @@ ole_val2ptr_variant(VALUE val, VARIANT *var)
} }
static void static void
ole_var2ptr_var(VARIANT *var, VARIANT *pvar) ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vtype)
{ {
VARTYPE vt = V_VT(var); V_VT(var) = vtype;
V_VT(pvar) = V_VT(var) | VT_BYREF; if (vtype == (VT_VARIANT|VT_BYREF)) {
switch(vt) { V_VARIANTREF(var) = realvar;
case VT_UI1: } else {
V_UI1REF(pvar) = &V_UI1(var); if (V_VT(realvar) != (vtype & ~VT_BYREF)) {
break; rb_raise(eWIN32OLE_RUNTIME_ERROR, "type mismatch");
case VT_I2: }
V_I2REF(pvar) = &V_I2(var); switch(vtype & ~VT_BYREF) {
break; case VT_UI1:
case VT_I4: V_UI1REF(var) = &V_UI1(realvar);
V_I4REF(pvar) = &V_I4(var); break;
break; case VT_I2:
case VT_UI4: V_I2REF(var) = &V_I2(realvar);
V_UI4REF(pvar) = &V_UI4(var); break;
break; case VT_I4:
/* V_I4REF(var) = &V_I4(realvar);
case VT_I8: break;
V_I8REF(pvar) = &V_I8(var); case VT_UI4:
break; V_UI4REF(var) = &V_UI4(realvar);
*/ break;
case VT_R4: case VT_R4:
V_R4REF(pvar) = &V_R4(var); V_R4REF(var) = &V_R4(realvar);
break; break;
case VT_R8: case VT_R8:
V_R8REF(pvar) = &V_R8(var); V_R8REF(var) = &V_R8(realvar);
break; break;
case VT_CY: case VT_CY:
V_CYREF(pvar) = &V_CY(var); V_CYREF(var) = &V_CY(realvar);
break; break;
case VT_DATE: case VT_DATE:
V_DATEREF(pvar) = &V_DATE(var); V_DATEREF(var) = &V_DATE(realvar);
break; break;
case VT_BSTR: case VT_BSTR:
V_BSTRREF(pvar) = &V_BSTR(var); V_BSTRREF(var) = &V_BSTR(realvar);
break; break;
case VT_DISPATCH: case VT_DISPATCH:
V_DISPATCHREF(pvar) = &V_DISPATCH(var); V_DISPATCHREF(var) = &V_DISPATCH(realvar);
break; break;
case VT_ERROR: case VT_ERROR:
V_ERRORREF(pvar) = &V_ERROR(var); V_ERRORREF(var) = &V_ERROR(realvar);
break; break;
case VT_BOOL: case VT_BOOL:
V_BOOLREF(pvar) = &V_BOOL(var); V_BOOLREF(var) = &V_BOOL(realvar);
break; break;
/* case VT_UNKNOWN:
case VT_VARIANT: V_UNKNOWNREF(var) = &V_UNKNOWN(realvar);
V_VARIANTREF(pvar) = &V_VARIANT(var); break;
break; case VT_ARRAY:
*/ V_ARRAYREF(var) = &V_ARRAY(realvar);
case VT_UNKNOWN: break;
V_UNKNOWNREF(pvar) = &V_UNKNOWN(var); default:
break; rb_raise(eWIN32OLE_RUNTIME_ERROR, "unknown type specified:%d", vtype);
case VT_ARRAY: break;
V_ARRAYREF(pvar) = &V_ARRAY(var); }
break;
default:
break;
} }
} }
@ -1103,6 +1100,8 @@ ole_val2olevariantdata(VALUE val, VARTYPE vtype, struct olevariantdata *pvar)
SAFEARRAY *psa = NULL; SAFEARRAY *psa = NULL;
long *pub, *pid; long *pub, *pid;
Check_Type(val, T_ARRAY);
val1 = val; val1 = val;
while(TYPE(val1) == T_ARRAY) { while(TYPE(val1) == T_ARRAY) {
val1 = rb_ary_entry(val1, 0); val1 = rb_ary_entry(val1, 0);
@ -1153,24 +1152,22 @@ ole_val2olevariantdata(VALUE val, VARTYPE vtype, struct olevariantdata *pvar)
} }
} else { } else {
if (val == Qnil) { if (val == Qnil) {
V_VT(&(pvar->var)) = vtype;
if (vtype == (VT_BYREF | VT_VARIANT)) { if (vtype == (VT_BYREF | VT_VARIANT)) {
V_VARIANTREF(&(pvar->var)) = &(pvar->realvar); ole_set_byref(&(pvar->realvar), &(pvar->var), vtype);
V_VT(&(pvar->var)) = vtype;
} else { } else {
V_VT(&(pvar->realvar)) = vtype & ~VT_BYREF; V_VT(&(pvar->realvar)) = vtype & ~VT_BYREF;
V_VT(&(pvar->var)) = vtype;
if (vtype & VT_BYREF) { if (vtype & VT_BYREF) {
ole_var2ptr_var(&(pvar->realvar), &(pvar->var)); ole_set_byref(&(pvar->realvar), &(pvar->var), vtype);
} }
} }
} else { } else {
ole_val2variant(val, &(pvar->realvar)); ole_val2variant(val, &(pvar->realvar));
if (vtype == (VT_BYREF | VT_VARIANT)) { if (vtype == (VT_BYREF | VT_VARIANT)) {
V_VARIANTREF(&(pvar->var)) = &(pvar->realvar); ole_set_byref(&(pvar->realvar), &(pvar->var), vtype);
V_VT(&(pvar->var)) = vtype;
} else if (vtype & VT_BYREF) { } else if (vtype & VT_BYREF) {
if ( (vtype & ~VT_BYREF) == V_VT(&(pvar->realvar))) { if ( (vtype & ~VT_BYREF) == V_VT(&(pvar->realvar))) {
ole_var2ptr_var(&(pvar->realvar), &(pvar->var)); ole_set_byref(&(pvar->realvar), &(pvar->var), vtype);
} else { } else {
VariantInit(&var); VariantInit(&var);
hr = VariantChangeTypeEx(&(var), &(pvar->realvar), hr = VariantChangeTypeEx(&(var), &(pvar->realvar),
@ -1179,7 +1176,7 @@ ole_val2olevariantdata(VALUE val, VARTYPE vtype, struct olevariantdata *pvar)
VariantClear(&(pvar->realvar)); VariantClear(&(pvar->realvar));
hr = VariantCopy(&(pvar->realvar), &var); hr = VariantCopy(&(pvar->realvar), &var);
VariantClear(&var); VariantClear(&var);
ole_var2ptr_var(&(pvar->realvar), &(pvar->var)); ole_set_byref(&(pvar->realvar), &(pvar->var), vtype);
} }
} }
} else { } else {

View file

@ -39,24 +39,12 @@ if defined?(WIN32OLE_VARIANT)
end end
def test_new_2_argument def test_new_2_argument
ex = nil obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
obj = nil
begin
obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR|WIN32OLE::VARIANT::VT_BYREF)
rescue
ex = $!
end
assert_equal('foo', obj.value); assert_equal('foo', obj.value);
end end
def test_new_2_argument2 def test_new_2_argument2
ex = nil obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR)
obj = nil
begin
obj = WIN32OLE_VARIANT.new('foo', WIN32OLE::VARIANT::VT_BSTR)
rescue
ex = $!
end
assert_equal('foo', obj.value); assert_equal('foo', obj.value);
end end
@ -65,6 +53,22 @@ if defined?(WIN32OLE_VARIANT)
assert_equal("124", obj.value); assert_equal("124", obj.value);
end end
def test_conversion_float2int
obj = WIN32OLE_VARIANT.new(12.345, WIN32OLE::VARIANT::VT_I4)
assert_equal(12, obj.value)
end
def test_conversion_str2num
obj = WIN32OLE_VARIANT.new("12.345", WIN32OLE::VARIANT::VT_R8)
assert_equal(12.345, obj.value)
end
def test_conversion_ole_variant2ole_variant
obj = WIN32OLE_VARIANT.new("12.345", WIN32OLE::VARIANT::VT_R4)
obj = WIN32OLE_VARIANT.new(obj, WIN32OLE::VARIANT::VT_I4)
assert_equal(12, obj.value)
end
def test_conversion_str2date def test_conversion_str2date
obj = WIN32OLE_VARIANT.new("2004-12-24 12:24:45", WIN32OLE::VARIANT::VT_DATE) obj = WIN32OLE_VARIANT.new("2004-12-24 12:24:45", WIN32OLE::VARIANT::VT_DATE)
assert_equal("2004/12/24 12:24:45", obj.value) assert_equal("2004/12/24 12:24:45", obj.value)
@ -86,6 +90,13 @@ if defined?(WIN32OLE_VARIANT)
assert_equal([1.2, 2.3], obj.value) assert_equal([1.2, 2.3], obj.value)
end end
def test_create_vt_array_exc
exc = assert_raise(TypeError) {
obj = WIN32OLE_VARIANT.new(1, WIN32OLE::VARIANT::VT_ARRAY);
}
assert_match(/wrong argument type Fixnum \(expected Array\)/, exc.message)
end
def test_create_vt_array_str2ui1array def test_create_vt_array_str2ui1array
obj = WIN32OLE_VARIANT.new("ABC", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1) obj = WIN32OLE_VARIANT.new("ABC", WIN32OLE::VARIANT::VT_ARRAY|WIN32OLE::VARIANT::VT_UI1)
assert_equal("ABC", obj.value) assert_equal("ABC", obj.value)
@ -110,6 +121,11 @@ if defined?(WIN32OLE_VARIANT)
assert_nil(var.value) assert_nil(var.value)
end end
def test_create_variant_byref
obj = WIN32OLE_VARIANT.new("Str", WIN32OLE::VARIANT::VT_VARIANT|WIN32OLE::VARIANT::VT_BYREF);
assert_equal("Str", obj.value);
end
def test_c_nothing def test_c_nothing
assert_nil(WIN32OLE_VARIANT::Nothing.value) assert_nil(WIN32OLE_VARIANT::Nothing.value)
end end