mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/win32ole/win32ole.c (ole_cp2encoding): new function.
* ext/win32ole/win32ole.c (ole_wc2vstr, ole_variant2val, fole_missing): set encoding to result. * ext/win32ole/win32ole.c (fole_s_set_code_page, Init_win32ole): set default encoding. [ruby-dev:33433] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15294 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
de3538b051
commit
1e8e70a311
2 changed files with 83 additions and 12 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
Mon Jan 28 19:37:08 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/win32ole/win32ole.c (ole_cp2encoding): new function.
|
||||||
|
|
||||||
|
* ext/win32ole/win32ole.c (ole_wc2vstr, ole_variant2val, fole_missing):
|
||||||
|
set encoding to result.
|
||||||
|
|
||||||
|
* ext/win32ole/win32ole.c (fole_s_set_code_page, Init_win32ole): set
|
||||||
|
default encoding.
|
||||||
|
[ruby-dev:33433]
|
||||||
|
|
||||||
Mon Jan 28 11:17:28 2008 NARUSE, Yui <naruse@ruby-lang.org>
|
Mon Jan 28 11:17:28 2008 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* string.c, parse.y, re.c: use rb_ascii8bit_encoding.
|
* string.c, parse.y, re.c: use rb_ascii8bit_encoding.
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "ruby/ruby.h"
|
#include "ruby/ruby.h"
|
||||||
#include "ruby/st.h"
|
#include "ruby/st.h"
|
||||||
|
#include "ruby/encoding.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ocidl.h>
|
#include <ocidl.h>
|
||||||
|
@ -195,7 +196,8 @@ static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL;
|
||||||
static VALUE com_hash;
|
static VALUE com_hash;
|
||||||
static IDispatchVtbl com_vtbl;
|
static IDispatchVtbl com_vtbl;
|
||||||
static UINT cWIN32OLE_cp = CP_ACP;
|
static UINT cWIN32OLE_cp = CP_ACP;
|
||||||
static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
|
static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
|
||||||
|
static rb_encoding *cWIN32OLE_enc;
|
||||||
static UINT g_cp_to_check = CP_ACP;
|
static UINT g_cp_to_check = CP_ACP;
|
||||||
static char g_lcid_to_check[8 + 1];
|
static char g_lcid_to_check[8 + 1];
|
||||||
static VARTYPE g_nil_to = VT_ERROR;
|
static VARTYPE g_nil_to = VT_ERROR;
|
||||||
|
@ -766,6 +768,67 @@ date2time_str(double date)
|
||||||
return rb_str_new2(szTime);
|
return rb_str_new2(szTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct myCPINFOEX {
|
||||||
|
UINT MaxCharSize;
|
||||||
|
BYTE DefaultChar[2];
|
||||||
|
BYTE LeadByte[12];
|
||||||
|
WCHAR UnicodeDefaultChar;
|
||||||
|
UINT CodePage;
|
||||||
|
char CodePageName[MAX_PATH];
|
||||||
|
};
|
||||||
|
|
||||||
|
static rb_encoding *
|
||||||
|
ole_cp2encoding(UINT cp)
|
||||||
|
{
|
||||||
|
static BOOL (*pGetCPInfoEx)(UINT, DWORD, struct myCPINFOEX *) = NULL;
|
||||||
|
struct myCPINFOEX* buf;
|
||||||
|
VALUE enc_name;
|
||||||
|
char *enc_cstr;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
if (!code_page_installed(cp)) {
|
||||||
|
switch(cp) {
|
||||||
|
case CP_ACP:
|
||||||
|
cp = GetACP();
|
||||||
|
break;
|
||||||
|
case CP_OEMCP:
|
||||||
|
cp = GetOEMCP();
|
||||||
|
break;
|
||||||
|
case CP_MACCP:
|
||||||
|
case CP_THREAD_ACP:
|
||||||
|
if (!pGetCPInfoEx) {
|
||||||
|
pGetCPInfoEx = (BOOL (*)(UINT, DWORD, LPVOID))
|
||||||
|
GetProcAddress(GetModuleHandle("kernel32"), "GetCPInfoEx");
|
||||||
|
if (!pGetCPInfoEx) {
|
||||||
|
pGetCPInfoEx = (void*)-1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf = ALLOCA_N(struct myCPINFOEX, 1);
|
||||||
|
ZeroMemory(buf, sizeof(struct myCPINFOEX));
|
||||||
|
if (pGetCPInfoEx == (void*)-1 || !pGetCPInfoEx(cp, 0, buf)) {
|
||||||
|
rb_raise(eWIN32OLERuntimeError, "cannot map codepage to encoding.");
|
||||||
|
break; /* never reach here */
|
||||||
|
}
|
||||||
|
cp = buf->CodePage;
|
||||||
|
break;
|
||||||
|
case CP_SYMBOL:
|
||||||
|
case CP_UTF7:
|
||||||
|
case CP_UTF8:
|
||||||
|
// nothing ToDo
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rb_raise(eWIN32OLERuntimeError, "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, or installed codepage.");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enc_name = rb_sprintf("CP%d", cp);
|
||||||
|
idx = rb_enc_find_index(enc_cstr = StringValueCStr(enc_name));
|
||||||
|
if (idx < 0)
|
||||||
|
idx = rb_define_dummy_encoding(enc_cstr);
|
||||||
|
return rb_enc_from_index(idx);
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
ole_wc2mb(LPWSTR pw)
|
ole_wc2mb(LPWSTR pw)
|
||||||
{
|
{
|
||||||
|
@ -967,7 +1030,7 @@ static VALUE
|
||||||
ole_wc2vstr(LPWSTR pw, BOOL isfree)
|
ole_wc2vstr(LPWSTR pw, BOOL isfree)
|
||||||
{
|
{
|
||||||
char *p = ole_wc2mb(pw);
|
char *p = ole_wc2mb(pw);
|
||||||
VALUE vstr = rb_str_new2(p);
|
VALUE vstr = rb_enc_str_new(p, strlen(p), cWIN32OLE_enc);
|
||||||
if(isfree)
|
if(isfree)
|
||||||
SysFreeString(pw);
|
SysFreeString(pw);
|
||||||
free(p);
|
free(p);
|
||||||
|
@ -1809,13 +1872,10 @@ ole_variant2val(VARIANT *pvar)
|
||||||
|
|
||||||
case VT_BSTR:
|
case VT_BSTR:
|
||||||
{
|
{
|
||||||
char *p;
|
|
||||||
if(V_ISBYREF(pvar))
|
if(V_ISBYREF(pvar))
|
||||||
p = ole_wc2mb(*V_BSTRREF(pvar));
|
obj = ole_wc2vstr(*V_BSTRREF(pvar), FALSE);
|
||||||
else
|
else
|
||||||
p = ole_wc2mb(V_BSTR(pvar));
|
obj = ole_wc2vstr(V_BSTR(pvar), FALSE);
|
||||||
obj = rb_str_new2(p);
|
|
||||||
if(p) free(p);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1892,9 +1952,7 @@ ole_variant2val(VARIANT *pvar)
|
||||||
hr = VariantChangeTypeEx(&variant, pvar,
|
hr = VariantChangeTypeEx(&variant, pvar,
|
||||||
cWIN32OLE_lcid, 0, VT_BSTR);
|
cWIN32OLE_lcid, 0, VT_BSTR);
|
||||||
if (SUCCEEDED(hr) && V_VT(&variant) == VT_BSTR) {
|
if (SUCCEEDED(hr) && V_VT(&variant) == VT_BSTR) {
|
||||||
char *p = ole_wc2mb(V_BSTR(&variant));
|
obj = ole_wc2vstr(V_BSTR(&variant), FALSE);
|
||||||
obj = rb_str_new2(p);
|
|
||||||
if(p) free(p);
|
|
||||||
}
|
}
|
||||||
VariantClear(&variant);
|
VariantClear(&variant);
|
||||||
break;
|
break;
|
||||||
|
@ -2630,6 +2688,7 @@ fole_s_set_code_page(VALUE self, VALUE vcp)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp);
|
||||||
/*
|
/*
|
||||||
* Should this method return old codepage?
|
* Should this method return old codepage?
|
||||||
*/
|
*/
|
||||||
|
@ -3613,12 +3672,12 @@ fole_missing(int argc, VALUE *argv, VALUE self)
|
||||||
}
|
}
|
||||||
n = strlen(mname);
|
n = strlen(mname);
|
||||||
if(mname[n-1] == '=') {
|
if(mname[n-1] == '=') {
|
||||||
argv[0] = rb_str_new(mname, n-1);
|
argv[0] = rb_enc_str_new(mname, n-1, cWIN32OLE_enc);
|
||||||
|
|
||||||
return ole_propertyput(self, argv[0], argv[1]);
|
return ole_propertyput(self, argv[0], argv[1]);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
argv[0] = rb_str_new2(mname);
|
argv[0] = rb_enc_str_new(mname, n, cWIN32OLE_enc);
|
||||||
return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE);
|
return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8167,4 +8226,5 @@ Init_win32ole()
|
||||||
|
|
||||||
eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
|
eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
|
||||||
|
|
||||||
|
cWIN32OLE_enc = ole_cp2encoding(cWIN32OLE_cp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue