Author: dchapyshev Date: Mon Apr 6 19:43:12 2009 New Revision: 40399
URL: http://svn.reactos.org/svn/reactos?rev=40399&view=rev Log: - Sync mscms, mscoree, msctf with Wine - Remove unneeded mscoree_ros.diff
Removed: trunk/reactos/dll/win32/mscoree/mscoree_ros.diff Modified: trunk/reactos/dll/win32/mscms/mscms_main.c trunk/reactos/dll/win32/mscoree/mscoree.rbuild trunk/reactos/dll/win32/mscoree/mscoree.spec trunk/reactos/dll/win32/mscoree/mscoree_main.c trunk/reactos/dll/win32/msctf/documentmgr.c trunk/reactos/dll/win32/msctf/msctf_internal.h trunk/reactos/dll/win32/msctf/threadmgr.c
Modified: trunk/reactos/dll/win32/mscms/mscms_main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscms/mscms_main.... ============================================================================== --- trunk/reactos/dll/win32/mscms/mscms_main.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mscms/mscms_main.c [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -36,6 +36,23 @@
WINE_DEFAULT_DEBUG_CHANNEL(mscms);
+#ifdef HAVE_LCMS +static int lcms_error_handler( int error, const char *text ) +{ + switch (error) + { + case LCMS_ERRC_WARNING: + case LCMS_ERRC_RECOVERABLE: + case LCMS_ERRC_ABORTED: + WARN("%d %s\n", error, debugstr_a(text)); + return 1; + default: + ERR("unknown error %d %s\n", error, debugstr_a(text)); + return 0; + } +} +#endif + BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) { TRACE( "(%p, %d, %p)\n", hinst, reason, reserved ); @@ -44,6 +61,9 @@ { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls( hinst ); +#ifdef HAVE_LCMS + cmsSetErrorHandler( lcms_error_handler ); +#endif break; case DLL_PROCESS_DETACH: #ifdef HAVE_LCMS
Modified: trunk/reactos/dll/win32/mscoree/mscoree.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree.r... ============================================================================== --- trunk/reactos/dll/win32/mscoree/mscoree.rbuild [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mscoree/mscoree.rbuild [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -1,6 +1,8 @@ <module name="mscoree" type="win32dll" baseaddress="${BASEADDRESS_MSCOREE}" installbase="system32" installname="mscoree.dll"> <importlibrary definition="mscoree.spec" /> <include base="mscoree">.</include> + <include base="ReactOS">include/reactos/wine</include> + <define name="__WINESRC__" /> <library>wine</library> <library>kernel32</library> <library>advapi32</library>
Modified: trunk/reactos/dll/win32/mscoree/mscoree.spec URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree.s... ============================================================================== --- trunk/reactos/dll/win32/mscoree/mscoree.spec [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mscoree/mscoree.spec [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -70,7 +70,7 @@ @ stdcall LoadLibraryShim(ptr ptr ptr ptr) @ stub LoadLibraryWithPolicyShim @ stdcall LoadStringRCEx(long long ptr long long ptr) -@ stub LockClrVersion +@ stdcall LockClrVersion(ptr ptr ptr) @ stub MetaDataGetDispenser @ stdcall ND_CopyObjDst(ptr ptr long long) @ stdcall ND_CopyObjSrc(ptr long ptr long)
Modified: trunk/reactos/dll/win32/mscoree/mscoree_main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree_m... ============================================================================== --- trunk/reactos/dll/win32/mscoree/mscoree_main.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mscoree/mscoree_main.c [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -112,6 +112,8 @@
switch (fdwReason) { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinstDLL); break; @@ -252,6 +254,12 @@ FIXME("(%p %s, %p, %p, %p): semi-stub\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll);
if (phModDll) *phModDll = LoadLibraryW(szDllName); + return S_OK; +} + +HRESULT WINAPI LockClrVersion(FLockClrVersionCallback hostCallback, FLockClrVersionCallback *pBeginHostSetup, FLockClrVersionCallback *pEndHostSetup) +{ + FIXME("(%p %p %p): stub\n", hostCallback, pBeginHostSetup, pEndHostSetup); return S_OK; }
Removed: trunk/reactos/dll/win32/mscoree/mscoree_ros.diff URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree_r... ============================================================================== --- trunk/reactos/dll/win32/mscoree/mscoree_ros.diff [iso-8859-1] (original) +++ trunk/reactos/dll/win32/mscoree/mscoree_ros.diff (removed) @@ -1,11 +1,0 @@ ---- mscoree_main.c Tue Jun 10 13:29:52 2008 -+++ mscoree_main.c Sun Sep 07 16:53:09 2008 -@@ -112,8 +112,6 @@ - - switch (fdwReason) - { -- case DLL_WINE_PREATTACH: -- return FALSE; /* prefer native version */ - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break;
Modified: trunk/reactos/dll/win32/msctf/documentmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/documentmgr... ============================================================================== --- trunk/reactos/dll/win32/msctf/documentmgr.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msctf/documentmgr.c [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -46,6 +46,7 @@ LONG refCount;
ITfContext* contextStack[2]; /* limit of 2 contexts */ + ITfThreadMgrEventSink* ThreadMgrSink; } DocumentMgr;
static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface) @@ -130,9 +131,14 @@ if (!pic || FAILED(IUnknown_QueryInterface(pic,&IID_ITfContext,(LPVOID*) &check))) return E_INVALIDARG;
+ if (This->contextStack[0] == NULL) + ITfThreadMgrEventSink_OnInitDocumentMgr(This->ThreadMgrSink,iface); + This->contextStack[1] = This->contextStack[0]; This->contextStack[0] = check;
+ ITfThreadMgrEventSink_OnPushContext(This->ThreadMgrSink,check); + return S_OK; }
@@ -144,10 +150,17 @@ if (dwFlags == TF_POPF_ALL) { if (This->contextStack[0]) + { + ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]); ITfContext_Release(This->contextStack[0]); + } if (This->contextStack[1]) + { + ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[1]); ITfContext_Release(This->contextStack[1]); + } This->contextStack[0] = This->contextStack[1] = NULL; + ITfThreadMgrEventSink_OnUninitDocumentMgr(This->ThreadMgrSink, iface); return S_OK; }
@@ -157,9 +170,13 @@ if (This->contextStack[0] == NULL) /* Cannot pop last context */ return E_FAIL;
+ ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]); ITfContext_Release(This->contextStack[0]); This->contextStack[0] = This->contextStack[1]; This->contextStack[1] = NULL; + + if (This->contextStack[0] == NULL) + ITfThreadMgrEventSink_OnUninitDocumentMgr(This->ThreadMgrSink, iface);
return S_OK; } @@ -262,7 +279,7 @@ DocumentMgrSource_UnadviseSink, };
-HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut) +HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *ThreadMgrSink, ITfDocumentMgr **ppOut) { DocumentMgr *This;
@@ -273,6 +290,7 @@ This->DocumentMgrVtbl= &DocumentMgr_DocumentMgrVtbl; This->SourceVtbl = &DocumentMgr_SourceVtbl; This->refCount = 1; + This->ThreadMgrSink = ThreadMgrSink;
TRACE("returning %p\n", This); *ppOut = (ITfDocumentMgr*)This;
Modified: trunk/reactos/dll/win32/msctf/msctf_internal.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/msctf_inter... ============================================================================== --- trunk/reactos/dll/win32/msctf/msctf_internal.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msctf/msctf_internal.h [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -23,7 +23,7 @@ extern DWORD tlsIndex;
extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); -extern HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut); +extern HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink*, ITfDocumentMgr **ppOut); extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore); extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
Modified: trunk/reactos/dll/win32/msctf/threadmgr.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/threadmgr.c... ============================================================================== --- trunk/reactos/dll/win32/msctf/threadmgr.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/msctf/threadmgr.c [iso-8859-1] Mon Apr 6 19:43:12 2009 @@ -32,20 +32,46 @@ #include "shlwapi.h" #include "winerror.h" #include "objbase.h" +#include "olectl.h"
#include "wine/unicode.h" +#include "wine/list.h"
#include "msctf.h" #include "msctf_internal.h"
WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagThreadMgrSink { + struct list entry; + union { + /* ThreadMgr Sinks */ + IUnknown *pIUnknown; + /* ITfActiveLanguageProfileNotifySink *pITfActiveLanguageProfileNotifySink; */ + /* ITfDisplayAttributeNotifySink *pITfDisplayAttributeNotifySink; */ + /* ITfKeyTraceEventSink *pITfKeyTraceEventSink; */ + /* ITfPreservedKeyNotifySink *pITfPreservedKeyNotifySink; */ + /* ITfThreadFocusSink *pITfThreadFocusSink; */ + ITfThreadMgrEventSink *pITfThreadMgrEventSink; + } interfaces; +} ThreadMgrSink;
typedef struct tagACLMulti { const ITfThreadMgrVtbl *ThreadMgrVtbl; const ITfSourceVtbl *SourceVtbl; LONG refCount;
+ const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; /* internal */ + ITfDocumentMgr *focus; + + /* kept as separate lists to reduce unnecessary iterations */ + struct list ActiveLanguageProfileNotifySink; + struct list DisplayAttributeNotifySink; + struct list KeyTraceEventSink; + struct list PreservedKeyNotifySink; + struct list ThreadFocusSink; + struct list ThreadMgrEventSink; } ThreadMgr;
static inline ThreadMgr *impl_from_ITfSourceVtbl(ITfSource *iface) @@ -53,12 +79,64 @@ return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,SourceVtbl)); }
+static inline ThreadMgr *impl_from_ITfThreadMgrEventSink(ITfThreadMgrEventSink *iface) +{ + return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,ThreadMgrEventSinkVtbl)); +} + +static void free_sink(ThreadMgrSink *sink) +{ + IUnknown_Release(sink->interfaces.pIUnknown); + HeapFree(GetProcessHeap(),0,sink); +} + static void ThreadMgr_Destructor(ThreadMgr *This) { + struct list *cursor, *cursor2; + TlsSetValue(tlsIndex,NULL); TRACE("destroying %p\n", This); if (This->focus) ITfDocumentMgr_Release(This->focus); + + /* free sinks */ + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ActiveLanguageProfileNotifySink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->DisplayAttributeNotifySink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->KeyTraceEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->PreservedKeyNotifySink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ThreadFocusSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + list_remove(cursor); + free_sink(sink); + } + HeapFree(GetProcessHeap(),0,This); }
@@ -124,8 +202,9 @@ static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocumentMgr **ppdim) { + ThreadMgr *This = (ThreadMgr *)iface; TRACE("(%p)\n",iface); - return DocumentMgr_Constructor(ppdim); + return DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, ppdim); }
static HRESULT WINAPI ThreadMgr_EnumDocumentMgrs( ITfThreadMgr* iface, IEnumTfDocumentMgrs @@ -166,6 +245,8 @@
if (!pdimFocus || FAILED(IUnknown_QueryInterface(pdimFocus,&IID_ITfDocumentMgr,(LPVOID*) &check))) return E_INVALIDARG; + + ITfThreadMgrEventSink_OnSetFocus((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, This->focus, check);
if (This->focus) ITfDocumentMgr_Release(This->focus); @@ -257,16 +338,48 @@ static WINAPI HRESULT ThreadMgrSource_AdviseSink(ITfSource *iface, REFIID riid, IUnknown *punk, DWORD *pdwCookie) { + ThreadMgrSink *tms; ThreadMgr *This = impl_from_ITfSourceVtbl(iface); - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + + TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie); + + if (!riid || !punk || !pdwCookie) + return E_INVALIDARG; + + if (IsEqualIID(riid, &IID_ITfThreadMgrEventSink)) + { + tms = HeapAlloc(GetProcessHeap(),0,sizeof(ThreadMgrSink)); + if (!tms) + return E_OUTOFMEMORY; + if (!SUCCEEDED(IUnknown_QueryInterface(punk, riid, (LPVOID*)&tms->interfaces.pITfThreadMgrEventSink))) + { + HeapFree(GetProcessHeap(),0,tms); + return CONNECT_E_CANNOTCONNECT; + } + list_add_head(&This->ThreadMgrEventSink,&tms->entry); + *pdwCookie = (DWORD)tms; + } + else + { + FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid)); + return E_NOTIMPL; + } + + TRACE("cookie %x\n",*pdwCookie); + + return S_OK; }
static WINAPI HRESULT ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) { + ThreadMgrSink *sink = (ThreadMgrSink*)pdwCookie; ThreadMgr *This = impl_from_ITfSourceVtbl(iface); - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + TRACE("(%p) %x\n",This,pdwCookie); + + list_remove(&sink->entry); + free_sink(sink); + + return S_OK; }
static const ITfSourceVtbl ThreadMgr_SourceVtbl = @@ -279,6 +392,127 @@ ThreadMgrSource_UnadviseSink, };
+/***************************************************** + * ITfThreadMgrEventSink functions (internal) + *****************************************************/ +static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface, REFIID iid, LPVOID *ppvOut) +{ + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + return ThreadMgr_QueryInterface((ITfThreadMgr *)This, iid, *ppvOut); +} + +static ULONG WINAPI ThreadMgrEventSink_AddRef(ITfThreadMgrEventSink *iface) +{ + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + return ThreadMgr_AddRef((ITfThreadMgr*)This); +} + +static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) +{ + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + return ThreadMgr_Release((ITfThreadMgr *)This); +} + + +static WINAPI HRESULT ThreadMgrEventSink_OnInitDocumentMgr( + ITfThreadMgrEventSink *iface,ITfDocumentMgr *pdim) +{ + struct list *cursor; + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + + TRACE("(%p) %p\n",This,pdim); + + LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + ITfThreadMgrEventSink_OnInitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim); + } + + return S_OK; +} + +static WINAPI HRESULT ThreadMgrEventSink_OnUninitDocumentMgr( + ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdim) +{ + struct list *cursor; + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + + TRACE("(%p) %p\n",This,pdim); + + LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + ITfThreadMgrEventSink_OnUninitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim); + } + + return S_OK; +} + +static WINAPI HRESULT ThreadMgrEventSink_OnSetFocus( + ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdimFocus, + ITfDocumentMgr *pdimPrevFocus) +{ + struct list *cursor; + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + + TRACE("(%p) %p %p\n",This,pdimFocus, pdimPrevFocus); + + LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + ITfThreadMgrEventSink_OnSetFocus(sink->interfaces.pITfThreadMgrEventSink, pdimFocus, pdimPrevFocus); + } + + return S_OK; +} + +static WINAPI HRESULT ThreadMgrEventSink_OnPushContext( + ITfThreadMgrEventSink *iface, ITfContext *pic) +{ + struct list *cursor; + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + + TRACE("(%p) %p\n",This,pic); + + LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + ITfThreadMgrEventSink_OnPushContext(sink->interfaces.pITfThreadMgrEventSink,pic); + } + + return S_OK; +} + +static WINAPI HRESULT ThreadMgrEventSink_OnPopContext( + ITfThreadMgrEventSink *iface, ITfContext *pic) +{ + struct list *cursor; + ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface); + + TRACE("(%p) %p\n",This,pic); + + LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink) + { + ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry); + ITfThreadMgrEventSink_OnPopContext(sink->interfaces.pITfThreadMgrEventSink,pic); + } + + return S_OK; +} + +static const ITfThreadMgrEventSinkVtbl ThreadMgr_ThreadMgrEventSinkVtbl = +{ + ThreadMgrEventSink_QueryInterface, + ThreadMgrEventSink_AddRef, + ThreadMgrEventSink_Release, + + ThreadMgrEventSink_OnInitDocumentMgr, + ThreadMgrEventSink_OnUninitDocumentMgr, + ThreadMgrEventSink_OnSetFocus, + ThreadMgrEventSink_OnPushContext, + ThreadMgrEventSink_OnPopContext +}; + HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) { ThreadMgr *This; @@ -300,9 +534,17 @@
This->ThreadMgrVtbl= &ThreadMgr_ThreadMgrVtbl; This->SourceVtbl = &ThreadMgr_SourceVtbl; + This->ThreadMgrEventSinkVtbl = &ThreadMgr_ThreadMgrEventSinkVtbl; This->refCount = 1; TlsSetValue(tlsIndex,This);
+ list_init(&This->ActiveLanguageProfileNotifySink); + list_init(&This->DisplayAttributeNotifySink); + list_init(&This->KeyTraceEventSink); + list_init(&This->PreservedKeyNotifySink); + list_init(&This->ThreadFocusSink); + list_init(&This->ThreadMgrEventSink); + TRACE("returning %p\n", This); *ppOut = (IUnknown *)This; return S_OK;