Author: dchapyshev Date: Thu Feb 26 13:34:15 2009 New Revision: 39766
URL: http://svn.reactos.org/svn/reactos?rev=39766&view=rev Log: - Sync itss, mlang with Wine head
Modified: trunk/reactos/dll/win32/itss/chm_lib.c trunk/reactos/dll/win32/itss/chm_lib.h trunk/reactos/dll/win32/itss/itss.c trunk/reactos/dll/win32/itss/lzx.c trunk/reactos/dll/win32/itss/moniker.c trunk/reactos/dll/win32/itss/protocol.c trunk/reactos/dll/win32/mlang/mlang.c trunk/reactos/dll/win32/mlang/mlang.spec trunk/reactos/include/psdk/mlang.idl
Modified: trunk/reactos/dll/win32/itss/chm_lib.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/chm_lib.c?re... ============================================================================== --- trunk/reactos/dll/win32/itss/chm_lib.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/chm_lib.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -759,6 +759,10 @@ if (newHandle->index_root == -1) newHandle->index_root = newHandle->index_head;
+ /* initialize cache */ + chm_set_param(newHandle, CHM_PARAM_MAX_BLOCKS_CACHED, + CHM_MAX_BLOCKS_CACHED); + /* By default, compression is enabled. */ newHandle->compression_enabled = 1;
@@ -821,10 +825,6 @@ ctlData.windowsPerReset; #endif } - - /* initialize cache */ - chm_set_param(newHandle, CHM_PARAM_MAX_BLOCKS_CACHED, - CHM_MAX_BLOCKS_CACHED);
return newHandle; } @@ -1373,12 +1373,16 @@ } }
-/* enumerate the objects in the .chm archive */ -int chm_enumerate(struct chmFile *h, - int what, - CHM_ENUMERATOR e, - void *context) -{ +int chm_enumerate_dir(struct chmFile *h, + const WCHAR *prefix, + int what, + CHM_ENUMERATOR e, + void *context) +{ + /* + * XXX: do this efficiently (i.e. using the tree index) + */ + Int32 curPage;
/* buffer to hold whatever page we're looking at */ @@ -1387,14 +1391,38 @@ UChar *end; UChar *cur; unsigned int lenRemain; - UInt64 ui_path_len; + + /* set to 1 once we've started */ + int it_has_begun=0;
/* the current ui */ struct chmUnitInfo ui; int flag; + UInt64 ui_path_len; + + /* the length of the prefix */ + WCHAR prefixRectified[CHM_MAX_PATHLEN+1]; + int prefixLen; + WCHAR lastPath[CHM_MAX_PATHLEN]; + int lastPathLen;
/* starting page */ curPage = h->index_head; + + /* initialize pathname state */ + lstrcpynW(prefixRectified, prefix, CHM_MAX_PATHLEN); + prefixLen = strlenW(prefixRectified); + if (prefixLen != 0) + { + if (prefixRectified[prefixLen-1] != '/') + { + prefixRectified[prefixLen] = '/'; + prefixRectified[prefixLen+1] = '\0'; + ++prefixLen; + } + } + lastPath[0] = '\0'; + lastPathLen = -1;
/* until we have either returned or given up */ while (curPage != -1) @@ -1428,6 +1456,37 @@ HeapFree(GetProcessHeap(), 0, page_buf); return 0; } + + /* check if we should start */ + if (! it_has_begun) + { + if (ui.length == 0 && strncmpiW(ui.path, prefixRectified, prefixLen) == 0) + it_has_begun = 1; + else + continue; + + if (ui.path[prefixLen] == '\0') + continue; + } + + /* check if we should stop */ + else + { + if (strncmpiW(ui.path, prefixRectified, prefixLen) != 0) + { + HeapFree(GetProcessHeap(), 0, page_buf); + return 1; + } + } + + /* check if we should include this path */ + if (lastPathLen != -1) + { + if (strncmpiW(ui.path, lastPath, lastPathLen) == 0) + continue; + } + strcpyW(lastPath, ui.path); + lastPathLen = strlenW(lastPath);
/* get the length of the path */ ui_path_len = strlenW(ui.path)-1; @@ -1481,171 +1540,3 @@ HeapFree(GetProcessHeap(), 0, page_buf); return 1; } - -int chm_enumerate_dir(struct chmFile *h, - const WCHAR *prefix, - int what, - CHM_ENUMERATOR e, - void *context) -{ - /* - * XXX: do this efficiently (i.e. using the tree index) - */ - - Int32 curPage; - - /* buffer to hold whatever page we're looking at */ - UChar *page_buf = HeapAlloc(GetProcessHeap(), 0, h->block_len); - struct chmPmglHeader header; - UChar *end; - UChar *cur; - unsigned int lenRemain; - - /* set to 1 once we've started */ - int it_has_begun=0; - - /* the current ui */ - struct chmUnitInfo ui; - int flag; - UInt64 ui_path_len; - - /* the length of the prefix */ - WCHAR prefixRectified[CHM_MAX_PATHLEN+1]; - int prefixLen; - WCHAR lastPath[CHM_MAX_PATHLEN]; - int lastPathLen; - - /* starting page */ - curPage = h->index_head; - - /* initialize pathname state */ - lstrcpynW(prefixRectified, prefix, CHM_MAX_PATHLEN); - prefixLen = strlenW(prefixRectified); - if (prefixLen != 0) - { - if (prefixRectified[prefixLen-1] != '/') - { - prefixRectified[prefixLen] = '/'; - prefixRectified[prefixLen+1] = '\0'; - ++prefixLen; - } - } - lastPath[0] = '\0'; - lastPathLen = -1; - - /* until we have either returned or given up */ - while (curPage != -1) - { - - /* try to fetch the index page */ - if (_chm_fetch_bytes(h, - page_buf, - h->dir_offset + (UInt64)curPage*h->block_len, - h->block_len) != h->block_len) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - - /* figure out start and end for this page */ - cur = page_buf; - lenRemain = _CHM_PMGL_LEN; - if (! _unmarshal_pmgl_header(&cur, &lenRemain, &header)) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - end = page_buf + h->block_len - (header.free_space); - - /* loop over this page */ - while (cur < end) - { - if (! _chm_parse_PMGL_entry(&cur, &ui)) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - } - - /* check if we should start */ - if (! it_has_begun) - { - if (ui.length == 0 && strncmpiW(ui.path, prefixRectified, prefixLen) == 0) - it_has_begun = 1; - else - continue; - - if (ui.path[prefixLen] == '\0') - continue; - } - - /* check if we should stop */ - else - { - if (strncmpiW(ui.path, prefixRectified, prefixLen) != 0) - { - HeapFree(GetProcessHeap(), 0, page_buf); - return 1; - } - } - - /* check if we should include this path */ - if (lastPathLen != -1) - { - if (strncmpiW(ui.path, lastPath, lastPathLen) == 0) - continue; - } - strcpyW(lastPath, ui.path); - lastPathLen = strlenW(lastPath); - - /* get the length of the path */ - ui_path_len = strlenW(ui.path)-1; - - /* check for DIRS */ - if (ui.path[ui_path_len] == '/' && !(what & CHM_ENUMERATE_DIRS)) - continue; - - /* check for FILES */ - if (ui.path[ui_path_len] != '/' && !(what & CHM_ENUMERATE_FILES)) - continue; - - /* check for NORMAL vs. META */ - if (ui.path[0] == '/') - { - - /* check for NORMAL vs. SPECIAL */ - if (ui.path[1] == '#' || ui.path[1] == '$') - flag = CHM_ENUMERATE_SPECIAL; - else - flag = CHM_ENUMERATE_NORMAL; - } - else - flag = CHM_ENUMERATE_META; - if (! (what & flag)) - continue; - - /* call the enumerator */ - { - int status = (*e)(h, &ui, context); - switch (status) - { - case CHM_ENUMERATOR_FAILURE: - HeapFree(GetProcessHeap(), 0, page_buf); - return 0; - case CHM_ENUMERATOR_CONTINUE: - break; - case CHM_ENUMERATOR_SUCCESS: - HeapFree(GetProcessHeap(), 0, page_buf); - return 1; - default: - break; - } - } - } - - /* advance to next page */ - curPage = header.block_next; - } - - HeapFree(GetProcessHeap(), 0, page_buf); - return 1; -}
Modified: trunk/reactos/dll/win32/itss/chm_lib.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/chm_lib.h?re... ============================================================================== --- trunk/reactos/dll/win32/itss/chm_lib.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/chm_lib.h [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -104,11 +104,6 @@ #define CHM_ENUMERATOR_FAILURE (0) #define CHM_ENUMERATOR_CONTINUE (1) #define CHM_ENUMERATOR_SUCCESS (2) -int chm_enumerate(struct chmFile *h, - int what, - CHM_ENUMERATOR e, - void *context); - int chm_enumerate_dir(struct chmFile *h, const WCHAR *prefix, int what,
Modified: trunk/reactos/dll/win32/itss/itss.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/itss.c?rev=3... ============================================================================== --- trunk/reactos/dll/win32/itss/itss.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/itss.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -363,7 +363,7 @@ its->ref = 1;
TRACE("-> %p\n", its); - *ppObj = (LPVOID) its; + *ppObj = its;
ITSS_LockModule(); return S_OK;
Modified: trunk/reactos/dll/win32/itss/lzx.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/lzx.c?rev=39... ============================================================================== --- trunk/reactos/dll/win32/itss/lzx.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/lzx.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -36,15 +36,17 @@ ***************************************************************************/
#include "lzx.h" +#include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h>
+#include "windef.h" +#include "winbase.h" + /* sized types */ typedef unsigned char UBYTE; /* 8 bits exactly */ typedef unsigned short UWORD; /* 16 bits (or more) */ -typedef unsigned int ULONG; /* 32 bits (or more) */ -typedef signed int LONG; /* 32 bits (or more) */
/* some constants defined by the LZX specification */ #define LZX_MIN_MATCH (2) @@ -178,10 +180,10 @@ if (window < 15 || window > 21) return NULL;
/* allocate state and associated window */ - pState = malloc(sizeof(struct LZXstate)); - if (!(pState->window = malloc(wndsize))) + pState = HeapAlloc(GetProcessHeap(), 0, sizeof(struct LZXstate)); + if (!(pState->window = HeapAlloc(GetProcessHeap(), 0, wndsize))) { - free(pState); + HeapFree(GetProcessHeap(), 0, pState); return NULL; } pState->actual_size = wndsize; @@ -217,8 +219,8 @@ { if (pState) { - free(pState->window); - free(pState); + HeapFree(GetProcessHeap(), 0, pState->window); + HeapFree(GetProcessHeap(), 0, pState); } }
Modified: trunk/reactos/dll/win32/itss/moniker.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/moniker.c?re... ============================================================================== --- trunk/reactos/dll/win32/itss/moniker.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/moniker.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -473,7 +473,7 @@ its->ref = 1;
TRACE("-> %p\n", its); - *ppObj = (LPVOID) its; + *ppObj = its;
ITSS_LockModule(); return S_OK;
Modified: trunk/reactos/dll/win32/itss/protocol.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/itss/protocol.c?r... ============================================================================== --- trunk/reactos/dll/win32/itss/protocol.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/itss/protocol.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -47,7 +47,7 @@ } ITSProtocol;
#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) -#define PROTINFO(x) ((IInternetProtocolInfo*) &(x)->lpInternetProtocolInfoVtbl) +#define PROTINFO(x) (&(x)->lpInternetProtocolInfoVtbl)
static void release_chm(ITSProtocol *This) {
Modified: trunk/reactos/dll/win32/mlang/mlang.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mlang/mlang.c?rev... ============================================================================== --- trunk/reactos/dll/win32/mlang/mlang.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mlang/mlang.c [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -42,8 +42,6 @@ #include "initguid.h"
#define CP_UNICODE 1200 - -#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj); static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum); @@ -450,10 +448,11 @@ const MIME_CP_INFO *mime_cp_info; const char *fixed_font; const char *proportional_font; + SCRIPT_ID sid; } mlang_data[] = { { "Arabic",1256,sizeof(arabic_cp)/sizeof(arabic_cp[0]),arabic_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidArabic }, /* FIXME */ { "Baltic",1257,sizeof(baltic_cp)/sizeof(baltic_cp[0]),baltic_cp, "Courier","Arial" }, /* FIXME */ { "Chinese Simplified",936,sizeof(chinese_simplified_cp)/sizeof(chinese_simplified_cp[0]),chinese_simplified_cp, @@ -463,23 +462,23 @@ { "Central European",1250,sizeof(central_european_cp)/sizeof(central_european_cp[0]),central_european_cp, "Courier","Arial" }, /* FIXME */ { "Cyrillic",1251,sizeof(cyrillic_cp)/sizeof(cyrillic_cp[0]),cyrillic_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidCyrillic }, /* FIXME */ { "Greek",1253,sizeof(greek_cp)/sizeof(greek_cp[0]),greek_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidGreek }, /* FIXME */ { "Hebrew",1255,sizeof(hebrew_cp)/sizeof(hebrew_cp[0]),hebrew_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidHebrew }, /* FIXME */ { "Japanese",932,sizeof(japanese_cp)/sizeof(japanese_cp[0]),japanese_cp, "MS Gothic","MS PGothic" }, { "Korean",949,sizeof(korean_cp)/sizeof(korean_cp[0]),korean_cp, "Courier","Arial" }, /* FIXME */ { "Thai",874,sizeof(thai_cp)/sizeof(thai_cp[0]),thai_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidThai }, /* FIXME */ { "Turkish",1254,sizeof(turkish_cp)/sizeof(turkish_cp[0]),turkish_cp, "Courier","Arial" }, /* FIXME */ { "Vietnamese",1258,sizeof(vietnamese_cp)/sizeof(vietnamese_cp[0]),vietnamese_cp, "Courier","Arial" }, /* FIXME */ { "Western European",1252,sizeof(western_cp)/sizeof(western_cp[0]),western_cp, - "Courier","Arial" }, /* FIXME */ + "Courier","Arial", sidLatin }, /* FIXME */ { "Unicode",CP_UNICODE,sizeof(unicode_cp)/sizeof(unicode_cp[0]),unicode_cp, "Courier","Arial" } /* FIXME */ }; @@ -800,22 +799,30 @@ int code = DetectJapaneseCode(input,count); TRACE("Japanese code %i\n",code);
- if (code == 932) - { + switch (code) + { + case 0: + if (output) + rc = MultiByteToWideChar(CP_ACP,0,input,count,output,out_count); + else + rc = MultiByteToWideChar(CP_ACP,0,input,count,0,0); + break; + + case 932: if (output) rc = MultiByteToWideChar(932,0,input,count,output,out_count); else rc = MultiByteToWideChar(932,0,input,count,0,0); - } - else if (code == 51932) - { + break; + + case 51932: if (output) rc = MultiByteToWideChar(20932,0,input,count,output,out_count); else rc = MultiByteToWideChar(20932,0,input,count,0,0); - } - else if (code == 50220) - { + break; + + case 50220: sjis_string = HeapAlloc(GetProcessHeap(),0,count); rc = ConvertJIS2SJIS(input,count,sjis_string); if (rc) @@ -827,6 +834,7 @@ rc = MultiByteToWideChar(932,0,sjis_string,rc,0,0); } HeapFree(GetProcessHeap(),0,sjis_string); + break; } return rc; } @@ -1485,12 +1493,17 @@ DWORD total, pos; } EnumCodePage_impl;
+static inline EnumCodePage_impl *impl_from_IEnumCodePage( IEnumCodePage *iface ) +{ + return (EnumCodePage_impl *)CONTAINING_RECORD( iface, EnumCodePage_impl, vtbl_IEnumCodePage ); +} + static HRESULT WINAPI fnIEnumCodePage_QueryInterface( IEnumCodePage* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface );
TRACE("%p -> %s\n", This, debugstr_guid(riid) );
@@ -1510,14 +1523,14 @@ static ULONG WINAPI fnIEnumCodePage_AddRef( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); return InterlockedIncrement(&This->ref); }
static ULONG WINAPI fnIEnumCodePage_Release( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p ref = %d\n", This, ref); @@ -1535,7 +1548,7 @@ IEnumCodePage* iface, IEnumCodePage** ppEnum) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); FIXME("%p %p\n", This, ppEnum); return E_NOTIMPL; } @@ -1547,8 +1560,8 @@ ULONG* pceltFetched) { ULONG i; - - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); + TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched);
if (!pceltFetched) return S_FALSE; @@ -1584,7 +1597,8 @@ static HRESULT WINAPI fnIEnumCodePage_Reset( IEnumCodePage* iface) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); + TRACE("%p\n", This);
This->pos = 0; @@ -1595,7 +1609,8 @@ IEnumCodePage* iface, ULONG celt) { - ICOM_THIS_MULTI(EnumCodePage_impl, vtbl_IEnumCodePage, iface); + EnumCodePage_impl *This = impl_from_IEnumCodePage( iface ); + TRACE("%p %u\n", This, celt);
if (celt >= This->total) return S_FALSE; @@ -1671,12 +1686,17 @@ DWORD total, pos; } EnumScript_impl;
+static inline EnumScript_impl *impl_from_IEnumScript( IEnumScript *iface ) +{ + return (EnumScript_impl *)CONTAINING_RECORD( iface, EnumScript_impl, vtbl_IEnumScript ); +} + static HRESULT WINAPI fnIEnumScript_QueryInterface( IEnumScript* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface );
TRACE("%p -> %s\n", This, debugstr_guid(riid) );
@@ -1696,14 +1716,14 @@ static ULONG WINAPI fnIEnumScript_AddRef( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); return InterlockedIncrement(&This->ref); }
static ULONG WINAPI fnIEnumScript_Release( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p ref = %d\n", This, ref); @@ -1721,7 +1741,7 @@ IEnumScript* iface, IEnumScript** ppEnum) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); FIXME("%p %p: stub!\n", This, ppEnum); return E_NOTIMPL; } @@ -1732,7 +1752,8 @@ PSCRIPTINFO rgelt, ULONG* pceltFetched) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched);
if (!pceltFetched || !rgelt) return E_FAIL; @@ -1754,7 +1775,8 @@ static HRESULT WINAPI fnIEnumScript_Reset( IEnumScript* iface) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p\n", This);
This->pos = 0; @@ -1765,7 +1787,8 @@ IEnumScript* iface, ULONG celt) { - ICOM_THIS_MULTI(EnumScript_impl, vtbl_IEnumScript, iface); + EnumScript_impl *This = impl_from_IEnumScript( iface ); + TRACE("%p %u\n", This, celt);
if (celt >= This->total) return S_FALSE; @@ -1825,26 +1848,31 @@
/******************************************************************************/
+static inline MLang_impl *impl_from_IMLangFontLink( IMLangFontLink *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink ); +} + static HRESULT WINAPI fnIMLangFontLink_QueryInterface( IMLangFontLink* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_QueryInterface( This, riid, ppvObject ); }
static ULONG WINAPI fnIMLangFontLink_AddRef( IMLangFontLink* iface) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_AddRef( This ); }
static ULONG WINAPI fnIMLangFontLink_Release( IMLangFontLink* iface) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); return MLang_Release( This ); }
@@ -1895,7 +1923,7 @@ UINT uCodePage, DWORD* pdwCodePages) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); CHARSETINFO cs; BOOL rc;
@@ -1921,7 +1949,7 @@ UINT uDefaultCodePage, UINT* puCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface ); DWORD mask = 0x00000000; UINT i; CHARSETINFO cs; @@ -1951,7 +1979,7 @@ DWORD Csb[2]; Csb[0] = mask; Csb[1] = 0x0; - rc = TranslateCharsetInfo((DWORD*)Csb, &cs, TCI_SRCFONTSIG); + rc = TranslateCharsetInfo(Csb, &cs, TCI_SRCFONTSIG); if (!rc) continue;
@@ -1974,7 +2002,7 @@ { HFONT old_font; FONTSIGNATURE fontsig; - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface); + MLang_impl *This = impl_from_IMLangFontLink( iface );
TRACE("(%p)\n",This);
@@ -2032,24 +2060,29 @@
/******************************************************************************/
+static inline MLang_impl *impl_from_IMultiLanguage( IMultiLanguage *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage ); +} + static HRESULT WINAPI fnIMultiLanguage_QueryInterface( IMultiLanguage* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return MLang_QueryInterface( This, riid, ppvObject ); }
static ULONG WINAPI fnIMultiLanguage_AddRef( IMultiLanguage* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMLangFontLink_AddRef( ((IMLangFontLink*)This) ); }
static ULONG WINAPI fnIMultiLanguage_Release( IMultiLanguage* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMLangFontLink_Release( ((IMLangFontLink*)This) ); }
@@ -2067,8 +2100,8 @@ PMIMECPINFO pCodePageInfo) { UINT i, n; - - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); + TRACE("%p, %u, %p\n", This, uiCodePage, pCodePageInfo);
for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) @@ -2099,7 +2132,8 @@ DWORD grfFlags, IEnumCodePage** ppEnumCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); + TRACE("%p %08x %p\n", This, grfFlags, ppEnumCodePage);
return EnumCodePage_create( This, grfFlags, 0, ppEnumCodePage ); @@ -2110,7 +2144,7 @@ BSTR Charset, PMIMECSETINFO pCharsetInfo) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); return IMultiLanguage3_GetCharsetInfo((IMultiLanguage3*)&This->vtbl_IMultiLanguage3, Charset, pCharsetInfo); }
@@ -2219,12 +2253,17 @@ DWORD total, pos; } EnumRfc1766_impl;
+static inline EnumRfc1766_impl *impl_from_IEnumRfc1766( IEnumRfc1766 *iface ) +{ + return (EnumRfc1766_impl *)CONTAINING_RECORD( iface, EnumRfc1766_impl, vtbl_IEnumRfc1766 ); +} + static HRESULT WINAPI fnIEnumRfc1766_QueryInterface( IEnumRfc1766 *iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface );
TRACE("%p -> %s\n", This, debugstr_guid(riid) );
@@ -2244,14 +2283,14 @@ static ULONG WINAPI fnIEnumRfc1766_AddRef( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); return InterlockedIncrement(&This->ref); }
static ULONG WINAPI fnIEnumRfc1766_Release( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("%p ref = %d\n", This, ref); @@ -2268,7 +2307,8 @@ IEnumRfc1766 *iface, IEnumRfc1766 **ppEnum) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + FIXME("%p %p\n", This, ppEnum); return E_NOTIMPL; } @@ -2280,8 +2320,8 @@ ULONG *pceltFetched) { ULONG i; - - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + TRACE("%p %u %p %p\n", This, celt, rgelt, pceltFetched);
if (!pceltFetched) return S_FALSE; @@ -2311,7 +2351,8 @@ static HRESULT WINAPI fnIEnumRfc1766_Reset( IEnumRfc1766 *iface) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + TRACE("%p\n", This);
This->pos = 0; @@ -2322,7 +2363,8 @@ IEnumRfc1766 *iface, ULONG celt) { - ICOM_THIS_MULTI(EnumRfc1766_impl, vtbl_IEnumRfc1766, iface); + EnumRfc1766_impl *This = impl_from_IEnumRfc1766( iface ); + TRACE("%p %u\n", This, celt);
if (celt >= This->total) return S_FALSE; @@ -2427,7 +2469,8 @@ IMultiLanguage *iface, IEnumRfc1766 **ppEnumRfc1766) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage( iface ); + TRACE("%p %p\n", This, ppEnumRfc1766);
return EnumRfc1766_create(0, ppEnumRfc1766); @@ -2480,24 +2523,29 @@
/******************************************************************************/
+static inline MLang_impl *impl_from_IMultiLanguage3( IMultiLanguage3 *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage3 ); +} + static HRESULT WINAPI fnIMultiLanguage2_QueryInterface( IMultiLanguage3* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_QueryInterface( This, riid, ppvObject ); }
static ULONG WINAPI fnIMultiLanguage2_AddRef( IMultiLanguage3* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_AddRef( This ); }
static ULONG WINAPI fnIMultiLanguage2_Release( IMultiLanguage3* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); return MLang_Release( This ); }
@@ -2505,7 +2553,8 @@ IMultiLanguage3* iface, UINT* pcCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p, %p\n", This, pcCodePage);
if (!pcCodePage) return S_FALSE; @@ -2559,8 +2608,8 @@ PMIMECPINFO pCodePageInfo) { UINT i, n; - - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p, %u, %04x, %p\n", This, uiCodePage, LangId, pCodePageInfo);
for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) @@ -2592,7 +2641,8 @@ LANGID LangId, IEnumCodePage** ppEnumCodePage) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %08x %04x %p\n", This, grfFlags, LangId, ppEnumCodePage);
return EnumCodePage_create( This, grfFlags, LangId, ppEnumCodePage ); @@ -2604,8 +2654,8 @@ PMIMECSETINFO pCharsetInfo) { UINT i, n; - - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %s %p\n", This, debugstr_w(Charset), pCharsetInfo);
if (!pCharsetInfo) return E_FAIL; @@ -2752,7 +2802,8 @@ LANGID LangId, IEnumRfc1766** ppEnumRfc1766) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %p\n", This, ppEnumRfc1766);
return EnumRfc1766_create(LangId, ppEnumRfc1766); @@ -2910,8 +2961,7 @@ UINT uiCodePage, HWND hwnd) { - FIXME("%u, %p\n", uiCodePage, hwnd); - return E_NOTIMPL; + return IMultiLanguage2_ValidateCodePageEx(iface,uiCodePage,hwnd,0); }
static HRESULT WINAPI fnIMultiLanguage2_GetCodePageDescription( @@ -2962,7 +3012,8 @@ IMultiLanguage3* iface, UINT* pnScripts) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %p\n", This, pnScripts);
if (!pnScripts) return S_FALSE; @@ -2977,7 +3028,8 @@ LANGID LangId, IEnumScript** ppEnumScript) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + TRACE("%p %08x %04x %p\n", This, dwFlags, LangId, ppEnumScript);
return EnumScript_create( This, dwFlags, LangId, ppEnumScript ); @@ -2989,8 +3041,28 @@ HWND hwnd, DWORD dwfIODControl) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); - FIXME("%p %u %p %08x: stub!\n", This, uiCodePage, hwnd, dwfIODControl); + int i; + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + + TRACE("%p %u %p %08x\n", This, uiCodePage, hwnd, dwfIODControl); + + /* quick check for kernel32 supported code pages */ + if (IsValidCodePage(uiCodePage)) + return S_OK; + + /* check for mlang supported code pages */ + for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) + { + int n; + for (n = 0; n < mlang_data[i].number_of_cp; n++) + { + if (mlang_data[i].mime_cp_info[n].cp == uiCodePage) + return S_OK; + } + } + + if (dwfIODControl != CPIOD_PEEK) + FIXME("Request to install codepage language pack not handled\n");
return S_FALSE; } @@ -3006,7 +3078,8 @@ UINT *pnDetectedCodePages, WCHAR *lpSpecialChar) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + FIXME("(%p)->(%08x %s %u %p %u %p %p %p)\n", This, dwFlags, debugstr_w(lpWideCharStr), cchWideChar, puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages, pnDetectedCodePages, lpSpecialChar); @@ -3023,7 +3096,8 @@ UINT *pnDetectedCodePages, WCHAR *lpSpecialChar) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMultiLanguage3, iface); + MLang_impl *This = impl_from_IMultiLanguage3( iface ); + FIXME("(%p)->(%08x %p %p %u %p %p %p)\n", This, dwFlags, pStrIn, puiPreferredCodePages, nPreferredCodePages, puiDetectedCodePages, pnDetectedCodePages, lpSpecialChar); @@ -3067,24 +3141,30 @@ };
/******************************************************************************/ + +static inline MLang_impl *impl_from_IMLangFontLink2( IMLangFontLink2 *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink2 ); +} + static HRESULT WINAPI fnIMLangFontLink2_QueryInterface( IMLangFontLink2 * iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_QueryInterface( This, riid, ppvObject ); }
static ULONG WINAPI fnIMLangFontLink2_AddRef( IMLangFontLink2* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_AddRef( This ); }
static ULONG WINAPI fnIMLangFontLink2_Release( IMLangFontLink2* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink2, iface); + MLang_impl *This = impl_from_IMLangFontLink2( iface ); return MLang_Release( This ); }
@@ -3158,8 +3238,37 @@ SCRIPT_ID sid, DWORD dwFlags, UINT *puiFonts, SCRIPTFONTINFO *pScriptFont) { - FIXME("(%p)->%i %i %p %p\n",This, sid, dwFlags, puiFonts, pScriptFont); - return E_NOTIMPL; + UINT i, j; + + TRACE("(%p)->%u %x %p %p\n", This, sid, dwFlags, puiFonts, pScriptFont); + + if (!dwFlags) dwFlags = SCRIPTCONTF_PROPORTIONAL_FONT; + + for (i = 0, j = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) + { + if (sid == mlang_data[i].sid) + { + if (pScriptFont) + { + if (j >= *puiFonts) break; + + pScriptFont[j].scripts = 1 << mlang_data[i].sid; + if (dwFlags == SCRIPTCONTF_FIXED_FONT) + { + MultiByteToWideChar(CP_ACP, 0, mlang_data[i].fixed_font, -1, + pScriptFont[j].wszFont, MAX_MIMEFACE_NAME); + } + else if (dwFlags == SCRIPTCONTF_PROPORTIONAL_FONT) + { + MultiByteToWideChar(CP_ACP, 0, mlang_data[i].proportional_font, -1, + pScriptFont[j].wszFont, MAX_MIMEFACE_NAME); + } + } + j++; + } + } + *puiFonts = j; + return S_OK; }
static HRESULT WINAPI fnIMLangFontLink2_CodePageToScriptID(IMLangFontLink2* This, @@ -3189,26 +3298,31 @@
/******************************************************************************/
+static inline MLang_impl *impl_from_IMLangLineBreakConsole( IMLangLineBreakConsole *iface ) +{ + return (MLang_impl *)CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangLineBreakConsole ); +} + static HRESULT WINAPI fnIMLangLineBreakConsole_QueryInterface( IMLangLineBreakConsole* iface, REFIID riid, void** ppvObject) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_QueryInterface( This, riid, ppvObject ); }
static ULONG WINAPI fnIMLangLineBreakConsole_AddRef( IMLangLineBreakConsole* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_AddRef( This ); }
static ULONG WINAPI fnIMLangLineBreakConsole_Release( IMLangLineBreakConsole* iface ) { - ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangLineBreakConsole, iface); + MLang_impl *This = impl_from_IMLangLineBreakConsole( iface ); return MLang_Release( This ); }
@@ -3294,7 +3408,7 @@ mlang->total_scripts = sizeof(mlang_data)/sizeof(mlang_data[0]) - 1;
mlang->ref = 1; - *ppObj = (LPVOID) mlang; + *ppObj = mlang; TRACE("returning %p\n", mlang);
LockModule();
Modified: trunk/reactos/dll/win32/mlang/mlang.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mlang/mlang.spec?... ============================================================================== --- trunk/reactos/dll/win32/mlang/mlang.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mlang/mlang.spec [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -1,14 +1,15 @@ -@ stdcall ConvertINetMultiByteToUnicode(ptr long ptr ptr ptr ptr) -@ stub ConvertINetReset -@ stdcall ConvertINetString(ptr long long ptr ptr ptr ptr) -@ stdcall ConvertINetUnicodeToMultiByte(ptr long ptr ptr ptr ptr) +110 stdcall IsConvertINetStringAvailable(long long) +111 stdcall ConvertINetString(ptr long long ptr ptr ptr ptr) +112 stdcall ConvertINetUnicodeToMultiByte(ptr long ptr ptr ptr ptr) +113 stdcall ConvertINetMultiByteToUnicode(ptr long ptr ptr ptr ptr) +114 stub ConvertINetReset +120 stdcall LcidToRfc1766A(long ptr long) +121 stdcall LcidToRfc1766W(long ptr long) +122 stdcall Rfc1766ToLcidA(ptr str) +123 stdcall Rfc1766ToLcidW(ptr wstr) + @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() @ stdcall GetGlobalFontLinkObject() -@ stdcall IsConvertINetStringAvailable(long long) -@ stdcall LcidToRfc1766A(long ptr long) -@ stdcall LcidToRfc1766W(long ptr long) -@ stdcall Rfc1766ToLcidA(ptr str) -@ stdcall Rfc1766ToLcidW(ptr wstr)
Modified: trunk/reactos/include/psdk/mlang.idl URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/psdk/mlang.idl?rev=... ============================================================================== --- trunk/reactos/include/psdk/mlang.idl [iso-8859-1] (original) +++ trunk/reactos/include/psdk/mlang.idl [iso-8859-1] Thu Feb 26 13:34:15 2009 @@ -21,6 +21,9 @@ #endif
interface IStream; + +cpp_quote("#define CPIOD_PEEK 0x40000000") +cpp_quote("#define CPIOD_FORCE_PROMPT 0x80000000")
/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */ cpp_quote("#ifndef _WINNT_H")