* ext/win32ole/win32ole.c (load_conv_function51932): fixed for the
case IMultiLanguage is not available. [ruby-dev:37950] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
7ad3567934
commit
a9a17a5a44
@ -1,3 +1,8 @@
|
|||||||
|
Mon Feb 9 20:11:55 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/win32ole/win32ole.c (load_conv_function51932): fixed for the
|
||||||
|
case IMultiLanguage is not available. [ruby-dev:37950]
|
||||||
|
|
||||||
Mon Feb 9 20:04:35 2009 Tanaka Akira <akr@fsij.org>
|
Mon Feb 9 20:04:35 2009 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* ext/socket/option.c (inspect_int): return 1/0 on success/failure.
|
* ext/socket/option.c (inspect_int): return 1/0 on success/failure.
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
#include <ocidl.h>
|
#include <ocidl.h>
|
||||||
#include <olectl.h>
|
#include <olectl.h>
|
||||||
#include <ole2.h>
|
#include <ole2.h>
|
||||||
|
#if defined(HAVE_TYPE_IMULTILANGUAGE2) || defined(HAVE_TYPE_IMULTILANGUAGE)
|
||||||
#include <mlang.h>
|
#include <mlang.h>
|
||||||
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#ifdef HAVE_STDARG_PROTOTYPES
|
#ifdef HAVE_STDARG_PROTOTYPES
|
||||||
@ -223,7 +225,7 @@ static IMultiLanguage2 *pIMultiLanguage = NULL;
|
|||||||
#elif defined(HAVE_TYPE_IMULTILANGUAGE)
|
#elif defined(HAVE_TYPE_IMULTILANGUAGE)
|
||||||
static IMultiLanguage *pIMultiLanguage = NULL;
|
static IMultiLanguage *pIMultiLanguage = NULL;
|
||||||
#else
|
#else
|
||||||
static void *pIMultiLanguage = NULL; /* dummy */
|
#define pIMultiLanguage NULL /* dummy */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct oledata {
|
struct oledata {
|
||||||
@ -285,8 +287,11 @@ static double time_object2date(VALUE tmobj);
|
|||||||
static VALUE date2time_str(double date);
|
static VALUE date2time_str(double date);
|
||||||
static rb_encoding *ole_cp2encoding(UINT cp);
|
static rb_encoding *ole_cp2encoding(UINT cp);
|
||||||
static UINT ole_encoding2cp(rb_encoding *enc);
|
static UINT ole_encoding2cp(rb_encoding *enc);
|
||||||
static void load_conv_function51932();
|
NORETURN(static void failed_load_conv51932(void));
|
||||||
static UINT ole_init_cp();
|
#ifndef pIMultiLanguage
|
||||||
|
static void load_conv_function51932(void);
|
||||||
|
#endif
|
||||||
|
static UINT ole_init_cp(void);
|
||||||
static char *ole_wc2mb(LPWSTR pw);
|
static char *ole_wc2mb(LPWSTR pw);
|
||||||
static VALUE ole_hresult2msg(HRESULT hr);
|
static VALUE ole_hresult2msg(HRESULT hr);
|
||||||
static void ole_freeexceptinfo(EXCEPINFO *pExInfo);
|
static void ole_freeexceptinfo(EXCEPINFO *pExInfo);
|
||||||
@ -976,7 +981,14 @@ static UINT ole_encoding2cp(rb_encoding *enc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_conv_function51932()
|
failed_load_conv51932(void)
|
||||||
|
{
|
||||||
|
rb_raise(eWIN32OLERuntimeError, "fail to load convert function for CP51932");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef pIMultiLanguage
|
||||||
|
static void
|
||||||
|
load_conv_function51932(void)
|
||||||
{
|
{
|
||||||
HRESULT hr = E_NOINTERFACE;
|
HRESULT hr = E_NOINTERFACE;
|
||||||
void *p;
|
void *p;
|
||||||
@ -987,16 +999,18 @@ load_conv_function51932()
|
|||||||
#elif defined(HAVE_TYPE_IMULTILANGUAGE)
|
#elif defined(HAVE_TYPE_IMULTILANGUAGE)
|
||||||
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
hr = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
|
||||||
&IID_IMultiLanguage, &p);
|
&IID_IMultiLanguage, &p);
|
||||||
#else
|
|
||||||
hr = E_NOINTERFACE;
|
|
||||||
p = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
rb_raise(eWIN32OLERuntimeError, "fail to load convert function for CP51932");
|
failed_load_conv51932();
|
||||||
}
|
}
|
||||||
pIMultiLanguage = p;
|
pIMultiLanguage = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
#define load_conv_function51932() failed_load_conv51932()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define conv_51932(cp) ((cp) == 51932 && (load_conv_function51932(), 1))
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_ole_codepage(UINT cp)
|
set_ole_codepage(UINT cp)
|
||||||
@ -1012,11 +1026,11 @@ set_ole_codepage(UINT cp)
|
|||||||
case CP_SYMBOL:
|
case CP_SYMBOL:
|
||||||
case CP_UTF7:
|
case CP_UTF7:
|
||||||
case CP_UTF8:
|
case CP_UTF8:
|
||||||
|
cWIN32OLE_cp = cp;
|
||||||
|
break;
|
||||||
case 51932:
|
case 51932:
|
||||||
cWIN32OLE_cp = cp;
|
cWIN32OLE_cp = cp;
|
||||||
if (cp == 51932) {
|
|
||||||
load_conv_function51932();
|
load_conv_function51932();
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
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.");
|
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.");
|
||||||
@ -1028,7 +1042,7 @@ set_ole_codepage(UINT cp)
|
|||||||
|
|
||||||
|
|
||||||
static UINT
|
static UINT
|
||||||
ole_init_cp()
|
ole_init_cp(void)
|
||||||
{
|
{
|
||||||
UINT cp;
|
UINT cp;
|
||||||
rb_encoding *encdef;
|
rb_encoding *encdef;
|
||||||
@ -1108,12 +1122,11 @@ static char *
|
|||||||
ole_wc2mb(LPWSTR pw)
|
ole_wc2mb(LPWSTR pw)
|
||||||
{
|
{
|
||||||
LPSTR pm;
|
LPSTR pm;
|
||||||
HRESULT hr;
|
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
if (conv_51932(cWIN32OLE_cp)) {
|
||||||
|
#ifndef pIMultiLanguage
|
||||||
DWORD dw = 0;
|
DWORD dw = 0;
|
||||||
if (cWIN32OLE_cp == 51932) {
|
HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
|
||||||
load_conv_function51932();
|
|
||||||
hr = pIMultiLanguage->lpVtbl->ConvertStringFromUnicode(pIMultiLanguage,
|
|
||||||
&dw, cWIN32OLE_cp, pw, NULL, NULL, &size);
|
&dw, cWIN32OLE_cp, pw, NULL, NULL, &size);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
|
||||||
@ -1125,6 +1138,7 @@ ole_wc2mb(LPWSTR pw)
|
|||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert Unicode to CP%d", cWIN32OLE_cp);
|
||||||
}
|
}
|
||||||
pm[size] = '\0';
|
pm[size] = '\0';
|
||||||
|
#endif
|
||||||
return pm;
|
return pm;
|
||||||
}
|
}
|
||||||
size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL);
|
size = WideCharToMultiByte(cWIN32OLE_cp, 0, pw, -1, NULL, 0, NULL, NULL);
|
||||||
@ -1327,9 +1341,6 @@ ole_vstr2wc(VALUE vstr)
|
|||||||
int cp;
|
int cp;
|
||||||
int size = 0;
|
int size = 0;
|
||||||
LPWSTR pw;
|
LPWSTR pw;
|
||||||
int len = 0;
|
|
||||||
DWORD dw = 0;
|
|
||||||
HRESULT hr;
|
|
||||||
st_data_t data;
|
st_data_t data;
|
||||||
enc = rb_enc_get(vstr);
|
enc = rb_enc_get(vstr);
|
||||||
|
|
||||||
@ -1351,11 +1362,11 @@ ole_vstr2wc(VALUE vstr)
|
|||||||
rb_raise(eWIN32OLERuntimeError, "not installed Windows codepage(%d) according to `%s'", cp, rb_enc_name(enc));
|
rb_raise(eWIN32OLERuntimeError, "not installed Windows codepage(%d) according to `%s'", cp, rb_enc_name(enc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cp == 51932) {
|
if (conv_51932(cp)) {
|
||||||
load_conv_function51932();
|
#ifndef pIMultiLanguage
|
||||||
len = RSTRING_LEN(vstr);
|
DWORD dw = 0;
|
||||||
size = 0;
|
int len = RSTRING_LEN(vstr);
|
||||||
hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||||
&dw, cp, RSTRING_PTR(vstr), &len, NULL, &size);
|
&dw, cp, RSTRING_PTR(vstr), &len, NULL, &size);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
||||||
@ -1367,6 +1378,7 @@ ole_vstr2wc(VALUE vstr)
|
|||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return pw;
|
return pw;
|
||||||
}
|
}
|
||||||
size = MultiByteToWideChar(cp, 0, RSTRING_PTR(vstr), RSTRING_LEN(vstr), NULL, 0);
|
size = MultiByteToWideChar(cp, 0, RSTRING_PTR(vstr), RSTRING_LEN(vstr), NULL, 0);
|
||||||
@ -1380,14 +1392,12 @@ ole_mb2wc(char *pm, int len)
|
|||||||
{
|
{
|
||||||
int size = 0;
|
int size = 0;
|
||||||
LPWSTR pw;
|
LPWSTR pw;
|
||||||
HRESULT hr;
|
|
||||||
|
if (conv_51932(cWIN32OLE_cp)) {
|
||||||
|
#ifndef pIMultiLanguage
|
||||||
DWORD dw = 0;
|
DWORD dw = 0;
|
||||||
int n = len;
|
int n = len;
|
||||||
|
HRESULT hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
||||||
if (cWIN32OLE_cp == 51932) {
|
|
||||||
load_conv_function51932();
|
|
||||||
size = 0;
|
|
||||||
hr = pIMultiLanguage->lpVtbl->ConvertStringToUnicode(pIMultiLanguage,
|
|
||||||
&dw, cWIN32OLE_cp, pm, &n, NULL, &size);
|
&dw, cWIN32OLE_cp, pm, &n, NULL, &size);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
|
||||||
@ -1398,6 +1408,7 @@ ole_mb2wc(char *pm, int len)
|
|||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
|
ole_raise(hr, eWIN32OLERuntimeError, "fail to convert CP%d to Unicode", cWIN32OLE_cp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return pw;
|
return pw;
|
||||||
}
|
}
|
||||||
size = MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, NULL, 0);
|
size = MultiByteToWideChar(cWIN32OLE_cp, 0, pm, len, NULL, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user