diff options
author | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-18 00:11:51 +0000 |
---|---|---|
committer | suke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-18 00:11:51 +0000 |
commit | 8fe01e0f368f2c83014502fcf905d7a76345133f (patch) | |
tree | cc0c0e11aa351bed99de64be78a624038a475678 | |
parent | 0972be78a5832588f3bf8a8185891571cb1138a6 (diff) |
add WIN32OLE.codepage, WIN32OLE.codepage= methods.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8343 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ext/win32ole/tests/testWIN32OLE.rb | 54 | ||||
-rw-r--r-- | ext/win32ole/win32ole.c | 56 |
2 files changed, 104 insertions, 6 deletions
diff --git a/ext/win32ole/tests/testWIN32OLE.rb b/ext/win32ole/tests/testWIN32OLE.rb index 3603475d22..c51247de68 100644 --- a/ext/win32ole/tests/testWIN32OLE.rb +++ b/ext/win32ole/tests/testWIN32OLE.rb @@ -57,6 +57,60 @@ class TestWin32OLE < RUNIT::TestCase assert_equal(-4160, CONST1::XlTop) end + def test_s_codepage + assert_equal(WIN32OLE::CP_ACP, WIN32OLE.codepage) + end + + def test_s_codepage_set + WIN32OLE.codepage = WIN32OLE::CP_UTF8 + assert_equal(WIN32OLE::CP_UTF8, WIN32OLE.codepage) + WIN32OLE.codepage = WIN32OLE::CP_ACP + end + + def test_const_CP_ACP + assert_equal(0, WIN32OLE::CP_ACP) + end + + def test_const_CP_OEMCP + assert_equal(1, WIN32OLE::CP_OEMCP) + end + + def test_const_CP_MACCP + assert_equal(2, WIN32OLE::CP_MACCP) + end + + def test_const_CP_THREAD_ACP + assert_equal(3, WIN32OLE::CP_THREAD_ACP) + end + + def test_const_CP_SYMBOL + assert_equal(42, WIN32OLE::CP_SYMBOL) + end + + def test_const_CP_UTF7 + assert_equal(65000, WIN32OLE::CP_UTF7) + end + + def test_const_CP_UTF8 + assert_equal(65001, WIN32OLE::CP_UTF8) + end + + def test_s_codepage_changed + book = @excel.workbooks.add + sheet = book.worksheets(1) + begin + WIN32OLE.codepage = WIN32OLE::CP_UTF8 + sheet.range("A1").value = [0x3042].pack("U*") + val = sheet.range("A1").value + assert_equal("\343\201\202", val) + WIN32OLE.codepage = WIN32OLE::CP_ACP + val = sheet.range("A1").value + assert_equal("\202\240", val) + ensure + book.saved = true + end + end + def test_get_win32ole_object workbooks = @excel.Workbooks; assert_instance_of(WIN32OLE, workbooks) diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index a652c54915..21f5e1e149 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -78,7 +78,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "0.6.0" +#define WIN32OLE_VERSION "0.6.1" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -153,7 +153,7 @@ static HINSTANCE gole32 = NULL; static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL; static VALUE com_hash; static IDispatchVtbl com_vtbl; - +static UINT cWIN32OLE_cp = CP_ACP; static VARTYPE g_nil_to = VT_ERROR; struct oledata { @@ -472,10 +472,10 @@ ole_wc2mb(pw) { int size; LPSTR pm; - size = WideCharToMultiByte(CP_ACP, 0, pw, -1, NULL, 0, NULL, NULL); + size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL); if (size) { pm = ALLOC_N(char, size); - WideCharToMultiByte(CP_ACP, 0, pw, -1, pm, size, NULL, NULL); + WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, pm, size, NULL, NULL); } else { pm = ALLOC_N(char, 1); @@ -669,9 +669,9 @@ ole_mb2wc(pm, len) { int size; LPWSTR pw; - size = MultiByteToWideChar(CP_ACP, 0, pm, len, NULL, 0); + size = MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, NULL, 0); pw = SysAllocStringLen(NULL, size - 1); - MultiByteToWideChar(CP_ACP, 0, pm, len, pw, size); + MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, pw, size); return pw; } @@ -1748,6 +1748,41 @@ fole_s_show_help(argc, argv, self) } static VALUE +fole_s_get_code_page(self) + VALUE self; +{ + return INT2FIX(cWIN32OLE_cp); +} + +static VALUE +fole_s_set_code_page(self, vcp) + VALUE self; + VALUE vcp; +{ + UINT cp = FIX2INT(vcp); + + switch(cp) { + case CP_ACP: + case CP_OEMCP: + case CP_MACCP: + case CP_THREAD_ACP: + case CP_SYMBOL: + case CP_UTF7: + case CP_UTF8: + cWIN32OLE_cp = cp; + break; + default: + rb_raise(eWIN32OLE_RUNTIME_ERROR, "codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, WIN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UTF7, WIN32OLE::CP_UTF8"); + break; + } + + /* + * Should this method return old codepage? + */ + return Qnil; +} + +static VALUE fole_initialize(argc, argv, self) int argc; VALUE *argv; @@ -5469,6 +5504,8 @@ Init_win32ole() rb_define_singleton_method(cWIN32OLE, "ole_free", fole_s_free, 1); rb_define_singleton_method(cWIN32OLE, "ole_reference_count", fole_s_reference_count, 1); rb_define_singleton_method(cWIN32OLE, "ole_show_help", fole_s_show_help, -1); + rb_define_singleton_method(cWIN32OLE, "codepage", fole_s_get_code_page, 0); + rb_define_singleton_method(cWIN32OLE, "codepage=", fole_s_set_code_page, 1); rb_define_method(cWIN32OLE, "invoke", fole_invoke, -1); @@ -5499,6 +5536,13 @@ Init_win32ole() rb_define_const(cWIN32OLE, "VERSION", rb_str_new2(WIN32OLE_VERSION)); rb_define_const(cWIN32OLE, "ARGV", rb_ary_new()); + rb_define_const(cWIN32OLE, "CP_ACP" ,INT2FIX(CP_ACP)); + rb_define_const(cWIN32OLE, "CP_OEMCP" ,INT2FIX(CP_OEMCP)); + rb_define_const(cWIN32OLE, "CP_MACCP" ,INT2FIX(CP_MACCP)); + rb_define_const(cWIN32OLE, "CP_THREAD_ACP",INT2FIX(CP_THREAD_ACP)); + rb_define_const(cWIN32OLE, "CP_SYMBOL" ,INT2FIX(CP_SYMBOL)); + rb_define_const(cWIN32OLE, "CP_UTF7" ,INT2FIX(CP_UTF7)); + rb_define_const(cWIN32OLE, "CP_UTF8" ,INT2FIX(CP_UTF8)); mWIN32OLE_VARIANT = rb_define_module_under(cWIN32OLE, "VARIANT"); rb_define_const(mWIN32OLE_VARIANT, "VT_I2", INT2FIX(VT_I2)); |