From f380de49baba3e9f6e16fcfcc57175d3ea30c52d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 6 Apr 2013 19:13:01 +0000 Subject: [PATCH 01/37] [CRT] - Add definition and GCC implementation of _mm_setcsr and _mm_getcsr svn path=/trunk/; revision=58691 --- reactos/include/crt/xmmintrin.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reactos/include/crt/xmmintrin.h b/reactos/include/crt/xmmintrin.h index a96ace98e48..19eff237023 100644 --- a/reactos/include/crt/xmmintrin.h +++ b/reactos/include/crt/xmmintrin.h @@ -28,6 +28,29 @@ typedef union _DECLSPEC_INTRIN_TYPE _CRT_ALIGN(16) __m128 extern __m128 _mm_load_ss(float const*); extern int _mm_cvt_ss2si(__m128); +#ifdef _MSC_VER +unsigned int _mm_getcsr(void); +#pragma intrinsic(_mm_getcsr) +void _mm_setcsr(unsigned int); +#pragma intrinsic(_mm_setcsr) +#else +/* + * We can't use __builtin_ia32_* functions, + * are they are only available with the -msse2 compiler switch + */ +__INTRIN_INLINE unsigned int _mm_getcsr(void) +{ + unsigned int retval; + __asm__ __volatile__("stmxcsr %0" : "=m"(retval)); + return retval; +} + +__INTRIN_INLINE void _mm_setcsr(unsigned int val) +{ + __asm__ __volatile__("ldmxcsr %0" : : "m"(val)); +} +#endif + /* Alternate names */ #define _mm_cvtss_si32 _mm_cvt_ss2si From 000b53fe3eb92f64cddb74599ac3b3f2af0ec5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 6 Apr 2013 19:15:11 +0000 Subject: [PATCH 02/37] [KERNEL32_APITEST] - Add a test verifying that the filter set with SetUnhandledExceptionFilter is called. Take this as an occasion to demonstrate a bug with SSE exceptions in ReactOS svn path=/trunk/; revision=58692 --- .../kernel32/SetUnhandledExceptionFilter.c | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c index 97f09b2fafd..4a98e685c30 100644 --- a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c +++ b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c @@ -9,6 +9,7 @@ #include #include #include +#include /* * Keep these returning different values, to prevent compiler folding @@ -33,9 +34,144 @@ TestSetUnhandledExceptionFilter(VOID) ok(p2 != Filter2, "SetUnhandledExceptionFilter returned what was set, not prev\n"); ok(p2 == Filter1, "SetUnhandledExceptionFilter didn't return previous filter\n"); ok(p1 != p2, "SetUnhandledExceptionFilter seems to return random stuff\n"); + + p1 = SetUnhandledExceptionFilter(NULL); + ok(p1 == Filter2, "SetUnhandledExceptionFilter didn't return previous filter\n"); +} + +static LONG WINAPI ExceptionFilterSSESupport(LPEXCEPTION_POINTERS exp) +{ + PEXCEPTION_RECORD rec = exp->ExceptionRecord; + PCONTEXT ctx = exp->ContextRecord; + + trace("Exception raised while using SSE instructions.\n"); + + ok(rec->ExceptionCode == EXCEPTION_ILLEGAL_INSTRUCTION, "Exception code is 0x%08x.\n", (unsigned int)rec->ExceptionCode); + + if(rec->ExceptionCode != EXCEPTION_ILLEGAL_INSTRUCTION) + { + trace("Unexpected exception code, terminating!\n"); + return EXCEPTION_EXECUTE_HANDLER; + } + + ok((ctx->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL, "Context does not contain control register.\n"); + + ctx->Eip += 3; + + return EXCEPTION_CONTINUE_EXECUTION; +} + +static BOOL ExceptionCaught = FALSE; + +static LONG WINAPI ExceptionFilterSSEException(LPEXCEPTION_POINTERS exp) +{ + PEXCEPTION_RECORD rec = exp->ExceptionRecord; + PCONTEXT ctx = exp->ContextRecord; + + trace("Exception raised while dividing by 0.\n"); + + ok(rec->ExceptionCode == STATUS_FLOAT_MULTIPLE_TRAPS, "Exception code is 0x%08x.\n", (unsigned int)rec->ExceptionCode); + + if(rec->ExceptionCode != STATUS_FLOAT_MULTIPLE_TRAPS) + { + trace("Unexpected exception code, terminating!\n"); + return EXCEPTION_EXECUTE_HANDLER; + } + + ok((ctx->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL, "Context does not contain control register.\n"); + + ExceptionCaught = TRUE; + + ctx->Eip += 3; + + return EXCEPTION_CONTINUE_EXECUTION; +} + +static +VOID TestSSEExceptions(VOID) +{ + LPTOP_LEVEL_EXCEPTION_FILTER p; + BOOL supportsSSE = FALSE; + unsigned int csr; + + /* Test SSE support for the CPU */ + p = SetUnhandledExceptionFilter(ExceptionFilterSSESupport); + ok(p == NULL, "Previous filter should be NULL\n"); +#ifdef _MSC_VER + __asm + { + xorps xmm0, xmm0 + mov supportsSSE, 0x1 + } +#else + __asm__( + "xorps %%xmm0, %%xmm0\n" + "movl $1, %0\n" + : "=r"(supportsSSE) + : + : + ); +#endif /* _MSC_VER */ + if(!supportsSSE) + { + skip("CPU doesn't support SSE instructions.\n"); + SetUnhandledExceptionFilter(NULL); + return; + } + /* Deliberately throw a divide by 0 exception */ + p = SetUnhandledExceptionFilter(ExceptionFilterSSEException); + ok(p == ExceptionFilterSSESupport, "Unexpected old filter : 0x%p", p); + + /* Unmask divide by 0 exception */ + csr = _mm_getcsr(); + _mm_setcsr(csr & 0xFFFFFDFF); + + /* We can't use _mm_div_ps, as it masks the exception before performing anything*/ +#if defined(_MSC_VER) + __asm + { + xorps xmm0, xmm0 + push 0x3f800000 + push 0x3f800000 + push 0x3f800000 + push 0x3f800000 + + movups xmm1, [esp] + + /* Divide by 0 */ + divps xmm1, xmm0 + + /* Clean up */ + add esp, 16 + } +#else + __asm__ ( + "xorps %%xmm0, %%xmm0\n" + "pushl $0x3f800000\n" + "pushl $0x3f800000\n" + "pushl $0x3f800000\n" + "pushl $0x3f800000\n" + "movups (%%esp), %%xmm1\n" + + /* Divide by 0 */ + "divps %%xmm0, %%xmm1\n" + + /* Clean up */ + "addl $16, %%esp\n" + : : :); +#endif /* _MSC_VER */ + + /* Restore mxcsr */ + _mm_setcsr(csr); + + ok(ExceptionCaught, "The exception was not caught.\n"); + + p = SetUnhandledExceptionFilter(NULL); + ok(p == ExceptionFilterSSEException, "Unexpected old filter : 0x%p", p); } START_TEST(SetUnhandledExceptionFilter) { TestSetUnhandledExceptionFilter(); + TestSSEExceptions(); } From 583947dac6f82e5c60c9d6340ddfc9657e397a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 6 Apr 2013 19:26:35 +0000 Subject: [PATCH 03/37] [KERNEL32_APITEST] - Try to fix linux builder svn path=/trunk/; revision=58693 --- rostests/apitests/kernel32/SetUnhandledExceptionFilter.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c index 4a98e685c30..84d3ec4bb1f 100644 --- a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c +++ b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c @@ -108,8 +108,6 @@ VOID TestSSEExceptions(VOID) "xorps %%xmm0, %%xmm0\n" "movl $1, %0\n" : "=r"(supportsSSE) - : - : ); #endif /* _MSC_VER */ if(!supportsSSE) @@ -158,7 +156,7 @@ VOID TestSSEExceptions(VOID) /* Clean up */ "addl $16, %%esp\n" - : : :); + ); #endif /* _MSC_VER */ /* Restore mxcsr */ From bffc9025eb03e4c2c44e64b2a2f63780cc569e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 6 Apr 2013 19:34:54 +0000 Subject: [PATCH 04/37] [KERNEL32_APITEST] - Invoke some black voodoo for fixing linux builder svn path=/trunk/; revision=58694 --- rostests/apitests/kernel32/SetUnhandledExceptionFilter.c | 1 + 1 file changed, 1 insertion(+) diff --git a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c index 84d3ec4bb1f..0105575c62f 100644 --- a/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c +++ b/rostests/apitests/kernel32/SetUnhandledExceptionFilter.c @@ -156,6 +156,7 @@ VOID TestSSEExceptions(VOID) /* Clean up */ "addl $16, %%esp\n" + : ); #endif /* _MSC_VER */ From ca42a3e9f5ca67635500de70f86c95da4bf10d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 6 Apr 2013 22:38:00 +0000 Subject: [PATCH 05/37] [PSDK] * Don't be so complicated for defining the DEFINE_GUIDSTRUCT and DEFINE_GUIDNAMED macros on GCC CORE-7052 #comment fixed in 58697, thanks. #resolve svn path=/trunk/; revision=58697 --- reactos/include/psdk/ks.h | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index 55d6c33b730..7653fa3fac2 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -85,21 +85,9 @@ typedef PVOID PKSWORKER; #define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name #define DEFINE_GUIDNAMED(name) __uuidof(struct name) #else - extern "C++" { - template const GUID &__mingw_uuidof(); - } - #define DEFINE_GUIDSTRUCT(guid, name) \ - struct __guid ## name; \ - extern "C++" { \ - template<> inline const GUID &__mingw_uuidof<__guid ## name>() { \ - static const IID iid = {STATICGUIDOF(name)}; \ - return iid; \ - } \ - template<> inline const GUID &__mingw_uuidof<__guid ## name *>() { \ - return __mingw_uuidof<__guid ## name>(); \ - } \ - } - #define DEFINE_GUIDNAMED(name) __mingw_uuidof<__guid ## name>() + #define DEFINE_GUIDSTRUCT(guid, name) \ + extern const DECLSPEC_SELECTANY GUID __uuid__##name={STATIC_##name}; + #define DEFINE_GUIDNAMED(name) __uuid__##name #endif #else #define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name) From 9b998f38df332cd5482a9bcc0571a9bcb7cf25ed Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 6 Apr 2013 23:10:55 +0000 Subject: [PATCH 06/37] [CRT] Fix format according to var svn path=/trunk/; revision=58698 --- reactos/lib/sdk/crt/misc/assert.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/misc/assert.c b/reactos/lib/sdk/crt/misc/assert.c index f25a59353c9..3488d131554 100644 --- a/reactos/lib/sdk/crt/misc/assert.c +++ b/reactos/lib/sdk/crt/misc/assert.c @@ -35,7 +35,7 @@ _assert ( (msvcrt_error_mode == _OUT_TO_STDERR)) { /* Print 'Assertion failed: x Date: Sat, 6 Apr 2013 23:12:45 +0000 Subject: [PATCH 07/37] [CRT] Apply r58698 here as well svn path=/trunk/; revision=58699 --- reactos/lib/sdk/crt/startup/crtexe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/startup/crtexe.c b/reactos/lib/sdk/crt/startup/crtexe.c index 59b1b914ecc..39904bf2c2f 100644 --- a/reactos/lib/sdk/crt/startup/crtexe.c +++ b/reactos/lib/sdk/crt/startup/crtexe.c @@ -418,7 +418,7 @@ __mingw_invalidParameterHandler (const wchar_t * __UNUSED_PARAM_1(expression), uintptr_t __UNUSED_PARAM(pReserved)) { #ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION - wprintf(L"Invalid parameter detected in function %s. File: %s Line: %d\n", function, file, line); + wprintf(L"Invalid parameter detected in function %s. File: %s Line: %u\n", function, file, line); wprintf(L"Expression: %s\n", expression); #endif } From 33a4bc0181b56b47bb5f160007e363701e6efc7a Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 6 Apr 2013 23:14:29 +0000 Subject: [PATCH 08/37] [CRT] Apply r58698 here as well svn path=/trunk/; revision=58700 --- reactos/lib/sdk/crt/locale/locale.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/locale/locale.c b/reactos/lib/sdk/crt/locale/locale.c index 02b8c6ccded..53843604127 100644 --- a/reactos/lib/sdk/crt/locale/locale.c +++ b/reactos/lib/sdk/crt/locale/locale.c @@ -322,7 +322,7 @@ static BOOL update_threadlocinfo_category(LCID lcid, unsigned short cp, len += GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY |LOCALE_NOUSEROVERRIDE, &buf[len], 256-len); buf[len-1] = '.'; - sprintf(buf+len, "%d", cp); + sprintf(buf+len, "%u", cp); len += strlen(buf+len)+1; loc->locinfo->lc_category[category].locale = MSVCRT_malloc(len); From 5576d2158898bb6d4749eccf6d455049a42fe798 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 6 Apr 2013 23:27:56 +0000 Subject: [PATCH 09/37] [TELNET] Don't attempt to close undefined handles. Also properly set them on failure as "the contents of the output parameters are indeterminate" on failure. svn path=/trunk/; revision=58701 --- .../network/telnet/src/tnmisc.cpp | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/reactos/base/applications/network/telnet/src/tnmisc.cpp b/reactos/base/applications/network/telnet/src/tnmisc.cpp index 0698b19fccd..abd30607e5a 100644 --- a/reactos/base/applications/network/telnet/src/tnmisc.cpp +++ b/reactos/base/applications/network/telnet/src/tnmisc.cpp @@ -8,9 +8,9 @@ BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi, BOOL fCreated; STARTUPINFO si; SECURITY_ATTRIBUTES sa; - HANDLE hInRead; - HANDLE hOutWrite; - HANDLE hErrWrite; + HANDLE hInRead = INVALID_HANDLE_VALUE; + HANDLE hOutWrite = INVALID_HANDLE_VALUE; + HANDLE hErrWrite = INVALID_HANDLE_VALUE; // Create pipes // initialize security attributes for handle inheritance (for WinNT) @@ -19,16 +19,22 @@ BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi, sa.lpSecurityDescriptor = NULL; // create STDIN pipe - if( !CreatePipe( &hInRead, phInWrite, &sa, 0 )) + if( !CreatePipe( &hInRead, phInWrite, &sa, 0 )) { + hInRead = INVALID_HANDLE_VALUE; goto error; + } // create STDOUT pipe - if( !CreatePipe( phOutRead, &hOutWrite, &sa, 0 )) + if( !CreatePipe( phOutRead, &hOutWrite, &sa, 0 )) { + hOutWrite = INVALID_HANDLE_VALUE; goto error; + } // create STDERR pipe - if( !CreatePipe( phErrRead, &hErrWrite, &sa, 0 )) + if( !CreatePipe( phErrRead, &hErrWrite, &sa, 0 )) { + hErrWrite = INVALID_HANDLE_VALUE; goto error; + } // process startup information memset( &si, 0, sizeof( si )); @@ -63,9 +69,9 @@ BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi, return TRUE; error: - CloseHandle( hInRead ); - CloseHandle( hOutWrite ); - CloseHandle( hErrWrite ); + if (hInRead != INVALID_HANDLE_VALUE) CloseHandle( hInRead ); + if (hOutWrite != INVALID_HANDLE_VALUE) CloseHandle( hOutWrite ); + if (hErrWrite != INVALID_HANDLE_VALUE) CloseHandle( hErrWrite ); CloseHandle( ppi->hProcess ); CloseHandle( ppi->hThread ); From 6662f375d15a7c144ab1d4c3113bd75f05efc31c Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 08:51:20 +0000 Subject: [PATCH 10/37] [CMD] Fix two memory leaks svn path=/trunk/; revision=58702 --- reactos/base/shell/cmd/for.c | 4 ++++ reactos/base/shell/cmd/path.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/base/shell/cmd/for.c b/reactos/base/shell/cmd/for.c index f5919db1366..62802121119 100644 --- a/reactos/base/shell/cmd/for.c +++ b/reactos/base/shell/cmd/for.c @@ -105,9 +105,13 @@ static LPTSTR ReadFileContents(FILE *InputFile, TCHAR *Buffer) ULONG_PTR CharsRead = _tcslen(Buffer); while (Len + CharsRead >= AllocLen) { + LPTSTR OldContents = Contents; Contents = cmd_realloc(Contents, (AllocLen *= 2) * sizeof(TCHAR)); if (!Contents) + { + cmd_free(OldContents); return NULL; + } } _tcscpy(&Contents[Len], Buffer); Len += CharsRead; diff --git a/reactos/base/shell/cmd/path.c b/reactos/base/shell/cmd/path.c index 5885df5d834..eb419a75cfb 100644 --- a/reactos/base/shell/cmd/path.c +++ b/reactos/base/shell/cmd/path.c @@ -54,7 +54,8 @@ INT cmd_path (LPTSTR param) dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); if (dwBuffer == 0) { - ConOutResPrintf(STRING_VOL_HELP2, _T("PATH")); + cmd_free(pszBuffer); + ConOutResPrintf(STRING_VOL_HELP2, _T("PATH")); return 0; } else if (dwBuffer > ENV_BUFFER_SIZE) From 06b3d2634d2ba27a86ed5d29ac44a4a25c036c4e Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 08:53:37 +0000 Subject: [PATCH 11/37] [CMD] Fix a bug in path command where PATH variable could never be read if it was bigger than ENV_BUFFER_SIZE svn path=/trunk/; revision=58703 --- reactos/base/shell/cmd/path.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/shell/cmd/path.c b/reactos/base/shell/cmd/path.c index eb419a75cfb..6d765eeb49a 100644 --- a/reactos/base/shell/cmd/path.c +++ b/reactos/base/shell/cmd/path.c @@ -61,7 +61,7 @@ INT cmd_path (LPTSTR param) else if (dwBuffer > ENV_BUFFER_SIZE) { pszBuffer = (LPTSTR)cmd_realloc (pszBuffer, dwBuffer * sizeof (TCHAR)); - GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE); + GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer); } ConOutPrintf (_T("PATH=%s\n"), pszBuffer); From 149e272b30dde996469808bd607ded9910e2f490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 7 Apr 2013 09:58:05 +0000 Subject: [PATCH 12/37] [PORTCLS] * Fix copy-pasta CORE-7053 #comment Fixed in r58704, thanks for deciphering PVS studio report ;-) #resolve svn path=/trunk/; revision=58704 --- reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp index 7089f064aee..8342f338f4a 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp @@ -559,7 +559,7 @@ CPortPinWavePci::HandleKsStream( if (m_Capture) m_Position.WriteOffset += Data; else - m_Position.WriteOffset += Data; + m_Position.PlayOffset += Data; if (bFailed) { From 54dce4f7add5c55c53759561a06afd779e4929d1 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 10:02:06 +0000 Subject: [PATCH 13/37] [CMD] Fix yet another memory leak svn path=/trunk/; revision=58705 --- reactos/base/shell/cmd/start.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/base/shell/cmd/start.c b/reactos/base/shell/cmd/start.c index 8935a78a8fa..e5d52dae685 100644 --- a/reactos/base/shell/cmd/start.c +++ b/reactos/base/shell/cmd/start.c @@ -193,9 +193,11 @@ INT cmd_start (LPTSTR Rest) { if (size > MAX_PATH) { + LPTSTR Oldcomspec = comspec; comspec = cmd_realloc(comspec,size * sizeof(TCHAR) ); if (comspec==NULL) { + cmd_free(Oldcomspec); return 1; } size = GetEnvironmentVariable (_T("COMSPEC"), comspec, size); From fdbe59546d1626a437d6de67e905723c6549ab51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 7 Apr 2013 10:17:44 +0000 Subject: [PATCH 14/37] [NTOS/KE] * Reset the state of the right thread when switching NPX threads svn path=/trunk/; revision=58706 --- reactos/ntoskrnl/ke/i386/traphdlr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index e54deab2613..9bd96704ec7 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -756,7 +756,7 @@ KiTrap07Handler(IN PKTRAP_FRAME TrapFrame) //Ke386SaveFpuState(NpxSaveArea); /* Update NPX state */ - Thread->NpxState = NPX_STATE_NOT_LOADED; + NpxThread->NpxState = NPX_STATE_NOT_LOADED; } /* Load FPU state */ From 52848627a1d314463663f49da5df2d01c68cd6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 7 Apr 2013 10:18:28 +0000 Subject: [PATCH 15/37] [MESA32] * Use SSE optimizations again svn path=/trunk/; revision=58707 --- reactos/dll/opengl/mesa/src/mesa/CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/dll/opengl/mesa/src/mesa/CMakeLists.txt b/reactos/dll/opengl/mesa/src/mesa/CMakeLists.txt index d92939170ee..95171831c66 100644 --- a/reactos/dll/opengl/mesa/src/mesa/CMakeLists.txt +++ b/reactos/dll/opengl/mesa/src/mesa/CMakeLists.txt @@ -21,7 +21,7 @@ if((ARCH STREQUAL "i386") AND (NOT MSVC)) x86/common_x86.c # x86/x86_xform.c # x86/3dnow.c - # x86/sse.c + x86/sse.c x86/common_x86_asm.S x86/x86_xform2.S x86/x86_xform3.S @@ -33,17 +33,17 @@ if((ARCH STREQUAL "i386") AND (NOT MSVC)) x86/3dnow_xform3.S x86/3dnow_xform4.S x86/3dnow_normal.S - # x86/sse_xform1.S - # x86/sse_xform2.S - # x86/sse_xform3.S - # x86/sse_xform4.S - # x86/sse_normal.S + x86/sse_xform1.S + x86/sse_xform2.S + x86/sse_xform3.S + x86/sse_xform4.S + x86/sse_normal.S x86/read_rgba_span_x86.S) add_definitions( -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM - # -DUSE_SSE_ASM + -DUSE_SSE_ASM ) endif() From 174082601893e9b1ec5627f4596ab3414b234421 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 7 Apr 2013 10:47:10 +0000 Subject: [PATCH 16/37] [NTDLL_APITEST] CORE-7065 #comment Temporarily disable the crashing test to get meaningful testbot results again. svn path=/trunk/; revision=58708 --- rostests/apitests/ntdll/NtMapViewOfSection.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rostests/apitests/ntdll/NtMapViewOfSection.c b/rostests/apitests/ntdll/NtMapViewOfSection.c index 3cee1577775..8727164ebdf 100644 --- a/rostests/apitests/ntdll/NtMapViewOfSection.c +++ b/rostests/apitests/ntdll/NtMapViewOfSection.c @@ -103,7 +103,9 @@ Test_PageFileSection(void) MEM_COMMIT, PAGE_READWRITE); ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n", Status); - +#ifndef CORE_7065_FIXED + ok(0, "Committing a range larger than the section crashes. See CORE-7065\n"); +#else /* Try to commit a range larger than the section */ BaseAddress = (PVOID)0x30000000; ViewSize = 0x3000; @@ -115,7 +117,7 @@ Test_PageFileSection(void) PAGE_READWRITE); ok(Status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory failed with wrong Status %lx\n", Status); - +#endif /* Try to commit a page after the section */ BaseAddress = (PVOID)0x30002000; ViewSize = 0x1000; From 98c1071a78b2fa8b7c09353718999d77faf27c85 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 7 Apr 2013 11:02:28 +0000 Subject: [PATCH 17/37] =?UTF-8?q?[PORTCLS]=20-=20Remove=20a=20duplicate=20?= =?UTF-8?q?assignment.=20Patch=20by=20V=C3=ADctor=20Mart=C3=ADnez=20Calvo.?= =?UTF-8?q?=20CORE-7057=20#resolve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=58709 --- reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp index 8342f338f4a..6d088d4d462 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp @@ -501,8 +501,6 @@ CPortPinWavePci::HandleKsProperty( //UNICODE_STRING GuidString; PIO_STACK_LOCATION IoStack; - IoStack = IoGetCurrentIrpStackLocation(Irp); - //DPRINT("IPortPinWave_HandleKsProperty entered\n"); IoStack = IoGetCurrentIrpStackLocation(Irp); From 3a1a8fa07129c21857289b9bbc07ede69bb778e5 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 11:06:00 +0000 Subject: [PATCH 18/37] [DEVMGMT] Don't use uninitialized memory address when calling InsertIntoTreeView() svn path=/trunk/; revision=58710 --- reactos/base/applications/mscutils/devmgmt/enumdevices.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/mscutils/devmgmt/enumdevices.c b/reactos/base/applications/mscutils/devmgmt/enumdevices.c index a0339670f21..bf9e34fc2c8 100644 --- a/reactos/base/applications/mscutils/devmgmt/enumdevices.c +++ b/reactos/base/applications/mscutils/devmgmt/enumdevices.c @@ -472,7 +472,7 @@ AddDeviceToTree(HWND hTreeView, TCHAR ClassGuidString[MAX_GUID_STRING_LEN]; GUID ClassGuid; ULONG ulLength; - LPTSTR DeviceID; + LPTSTR DeviceID = NULL; INT ClassImage = 24; CONFIGRET cr; From 84dd592090dad1f54d9e4fed8a8e731f78ebec78 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 11:35:50 +0000 Subject: [PATCH 19/37] [KS] Check parameters before using them and not after svn path=/trunk/; revision=58711 --- reactos/drivers/ksfilter/ks/event.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/event.c b/reactos/drivers/ksfilter/ks/event.c index aa3b5ef4e9a..460f995f6c3 100644 --- a/reactos/drivers/ksfilter/ks/event.c +++ b/reactos/drivers/ksfilter/ks/event.c @@ -421,18 +421,18 @@ KspDisableEvent( PKSEVENT_ENTRY EventEntry; PLIST_ENTRY Entry; - /* get current irp stack location */ - IoStack = IoGetCurrentIrpStackLocation(Ctx->Irp); - - /* get event data */ - EventData = (PKSEVENTDATA)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - if (!Ctx || !Ctx->List || !Ctx->FileObject || !Ctx->Irp) { /* invalid parameter */ return FALSE; } + /* get current irp stack location */ + IoStack = IoGetCurrentIrpStackLocation(Ctx->Irp); + + /* get event data */ + EventData = (PKSEVENTDATA)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; + /* point to first entry */ Entry = Ctx->List->Flink; From bf92cdd6d489415e2ebef0e7eafe953417b561d3 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 7 Apr 2013 11:36:33 +0000 Subject: [PATCH 20/37] [KS] Fix copy/paste error svn path=/trunk/; revision=58712 --- reactos/drivers/ksfilter/ks/irp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index d2ca995a699..0c493eead7e 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -1177,7 +1177,8 @@ KsDefaultDeviceIoCompletion( if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY && IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_METHOD && - IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) + IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_ENABLE_EVENT && + IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_DISABLE_EVENT) { if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_RESET_STATE) { From 3a238b59363f8804011c46c0d7dcf5242ad15c13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 7 Apr 2013 14:11:21 +0000 Subject: [PATCH 21/37] [PORTCLS] * include initguid.h as suggested here : http://msdn.microsoft.com/en-us/library/windows/hardware/ff547786%28v=vs.85%29.aspx * Remove the guids.c file svn path=/trunk/; revision=58713 --- .../wdm/audio/backpln/portcls/CMakeLists.txt | 1 - .../wdm/audio/backpln/portcls/guids.cpp | 91 ------------------- .../wdm/audio/backpln/portcls/port.cpp | 1 + 3 files changed, 1 insertion(+), 92 deletions(-) delete mode 100644 reactos/drivers/wdm/audio/backpln/portcls/guids.cpp diff --git a/reactos/drivers/wdm/audio/backpln/portcls/CMakeLists.txt b/reactos/drivers/wdm/audio/backpln/portcls/CMakeLists.txt index f9c18d4fc03..168dc75a869 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/CMakeLists.txt +++ b/reactos/drivers/wdm/audio/backpln/portcls/CMakeLists.txt @@ -20,7 +20,6 @@ list(APPEND SOURCE filter_wavecyclic.cpp filter_wavepci.cpp filter_wavert.cpp - guids.cpp interrupt.cpp irp.cpp irpstream.cpp diff --git a/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp b/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp deleted file mode 100644 index 3d66321463a..00000000000 --- a/reactos/drivers/wdm/audio/backpln/portcls/guids.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel Streaming - * FILE: drivers/wdm/audio/backpln/portcls/guids.cpp - * PURPOSE: portcls guid mess - * PROGRAMMER: Johannes Anderwald - */ - -#ifdef _MSC_VER -#define PUT_GUIDS_HERE -#endif -#include "private.hpp" - -#ifndef _MSC_VER -const GUID CLSID_PortTopology = {0xb4c90a32L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID CLSID_PortMidi = {0xb4c90a43L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID CLSID_PortWaveCyclic = {0xb4c90a2aL, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID CLSID_PortWavePci = {0xb4c90a54L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID CLSID_PortDMus = {0xb7902fe9L, 0xfb0a, 0x11d1, {0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; -const GUID CLSID_PortWaveRT = {0xcc9be57a, 0xeb9e, 0x42b4, {0x94, 0xfc, 0xc, 0xad, 0x3d, 0xbc, 0xe7, 0xfa}}; - -const GUID IID_IMiniportDMus = {0xc096df9dL, 0xfb09, 0x11d1, {0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; -const GUID IID_IMiniportTopology = {0xb4c90a31L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IMiniportMidi = {0xb4c90a41L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IMiniportWavePci = {0xb4c90a52L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; - -const GUID IID_IPortTopology = {0xb4c90a30L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; - -const GUID CLSID_MiniportDriverDMusUART = {0xd3f0ce1c, 0xfffc, 0x11d1, {0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; -const GUID CLSID_MiniportDriverDMusUARTCapture = {0xd3f0ce1d, 0xfffc, 0x11d1, {0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; -const GUID CLSID_MiniportDriverUart = {0xb4c90ae1L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; - -const GUID CLSID_MiniportDriverFmSynth = {0xb4c90ae0L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID CLSID_MiniportDriverFmSynthWithVol = {0xe5a3c139L, 0xf0f2, 0x11d1, {0x81, 0xaf, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; - -const GUID IID_IPort = {0xb4c90a25L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IDrmPort = {0x286D3DF8L, 0xCA22, 0x4E2E, {0xB9, 0xBC, 0x20, 0xB4, 0xF0, 0xE2, 0x01, 0xCE}}; -const GUID IID_IDrmPort2 = {0x1ACCE59CL, 0x7311, 0x4B6B, {0x9F, 0xBA, 0xCC, 0x3B, 0xA5, 0x9A, 0xCD, 0xCE}}; -const GUID IID_IInterruptSync = {0x22C6AC63L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IPortWavePci = {0xb4c90a50L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IPortWavePciStream = {0xb4c90a51L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IPortMidi = {0xb4c90a40L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IPortDMus = {0xc096df9cL, 0xfb09, 0x11d1, {0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1}}; -const GUID IID_IAdapterPowerManagement = {0x793417D0L, 0x35FE, 0x11D1, {0xAD, 0x08, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0xB0}}; - -const GUID IID_IMiniport = {0xb4c90a24, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IMiniportWaveCyclic = {0xb4c90a27L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IPortWaveCyclic = {0xb4c90a26L, 0x5791, 0x11d0, {0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44}}; -const GUID IID_IResourceList = {0x22C6AC60L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IServiceGroup = {0x22C6AC65L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IPinCount = {0x5dadb7dcL, 0xa2cb, 0x4540, {0xa4, 0xa8, 0x42, 0x5e, 0xe4, 0xae, 0x90, 0x51}}; -const GUID IID_IPowerNotify = {0x3DD648B8L, 0x969F, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}}; -const GUID IID_IDmaChannelSlave = {0x22C6AC62L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IDmaChannel = {0x22C6AC61L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IRegistryKey = {0xE8DA4302l, 0xF304, 0x11D0, {0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}}; -const GUID IID_IServiceSink = {0x22C6AC64L, 0x851B, 0x11D0, {0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE}}; -const GUID IID_IPortClsVersion = {0x7D89A7BBL, 0x869B, 0x4567, {0x8D, 0xBE, 0x1E, 0x16, 0x8C, 0xC8, 0x53, 0xDE}}; -const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46}}; -const GUID IID_IPortEvents = {0xA80F29C4L, 0x5498, 0x11D2, {0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}}; -const GUID IID_IMusicTechnology = {0x80396C3C, 0xCBCB, 0x409B, {0x9F, 0x65, 0x4F, 0x1E, 0x74, 0x67, 0xCD, 0xAF}}; - -const GUID KSNAME_PIN = {0x146F1A80, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID IID_IDrmAudioStream = {0x1915c967, 0x3299, 0x48cb, {0xa3, 0xe4, 0x69, 0xfd, 0x1d, 0x1b, 0x30, 0x6e}}; - -//FIXME -// -const GUID KS_CATEGORY_AUDIO = {0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; -const GUID KS_CATEGORY_RENDER = {0x65E8773E, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; -const GUID KS_CATEGORY_CAPTURE = {0x65E8773D, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; -const GUID KS_CATEGORY_TOPOLOGY = {0xDDA54A40, 0x1E4C, 0x11D1, {0xA0, 0x50, 0x40, 0x57, 0x05, 0xC1, 0x00, 0x00}}; - -/// -/// undocumented guids - -const GUID IID_ISubdevice = {0xB4C90A61, 0x5791, 0x11D0, {0x86, 0xF9, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}}; -const GUID IID_IIrpTarget = {0xB4C90A60, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}}; -const GUID IID_IIrpTargetFactory = {0xB4C90A62, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}}; - - -/// -/// >= Vista GUIDs -/// -const GUID IID_IPortWaveRT = {0x339ff909, 0x68a9, 0x4310, {0xb0, 0x9b, 0x27, 0x4e, 0x96, 0xee, 0x4c, 0xbd}}; -const GUID IID_IPortWaveRTStream = {0x1809ce5a, 0x64bc, 0x4e62, {0xbd, 0x7d, 0x95, 0xbc, 0xe4, 0x3d, 0xe3, 0x93}}; -const GUID IID_IMiniportWaveRT = {0x0f9fc4d6, 0x6061, 0x4f3c, {0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa}}; -const GUID IID_IMiniportWaveRTStream = {0x000ac9ab, 0xfaab, 0x4f3d, {0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0}}; -const GUID IID_IMiniportWaveRTStreamNotification = {0x23759128, 0x96f1, 0x423b, {0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1}}; -const GUID IID_IUnregisterSubdevice = {0x16738177, 0xe199, 0x41f9, {0x9a, 0x87, 0xab, 0xb2, 0xa5, 0x43, 0x2f, 0x21}}; -const GUID IID_IUnregisterPhysicalConnection = {0x6c38e231, 0x2a0d, 0x428d, {0x81, 0xf8, 0x07, 0xcc, 0x42, 0x8b, 0xb9, 0xa4}}; - -#endif diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port.cpp b/reactos/drivers/wdm/audio/backpln/portcls/port.cpp index de99e4e4385..307c4f977e5 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/port.cpp @@ -7,6 +7,7 @@ * Andrew Greenwood */ +#include #include "private.hpp" From 30f64b59ea3b6ee1850f1983bc15a4d7fb576baf Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 7 Apr 2013 15:22:20 +0000 Subject: [PATCH 22/37] [win32k] - Fix IntGetScrollBarRect when WS_EX_LEFTSCROLLBAR style is used - Spotted by vicmarcal svn path=/trunk/; revision=58714 --- reactos/win32ss/user/ntuser/scrollbar.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/win32ss/user/ntuser/scrollbar.c b/reactos/win32ss/user/ntuser/scrollbar.c index 202caa820dc..6cfecb46bae 100644 --- a/reactos/win32ss/user/ntuser/scrollbar.c +++ b/reactos/win32ss/user/ntuser/scrollbar.c @@ -103,7 +103,7 @@ IntGetScrollBarRect (PWND Wnd, INT nBar, RECTL *lprect) case SB_VERT: if(Wnd->ExStyle & WS_EX_LEFTSCROLLBAR) { - lprect->right = lprect->right;; + lprect->right = lprect->left; lprect->left -= UserGetSystemMetrics(SM_CXVSCROLL); } else From d8217043cdc9b7f82ec5a0c78ba49759bd964861 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 7 Apr 2013 17:58:11 +0000 Subject: [PATCH 23/37] [SAMSRV] Implement the set LogonHours attribute code for all user set functions. svn path=/trunk/; revision=58715 --- reactos/dll/win32/samsrv/samrpc.c | 32 +++++++++++++++++----- reactos/dll/win32/samsrv/samsrv.h | 4 +++ reactos/dll/win32/samsrv/user.c | 45 ++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index f239a09411f..c08fdc02516 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -2349,7 +2349,18 @@ SamrCreateUserInDomain(IN SAMPR_HANDLE DomainHandle, return Status; } - /* FIXME: Set LogonHours attribute*/ + /* Set LogonHours attribute*/ + Status = SampSetObjectAttribute(UserObject, + L"LogonHours", + REG_BINARY, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + TRACE("failed with status 0x%08lx\n", Status); + return Status; + } + /* FIXME: Set Groups attribute*/ /* Set LMPwd attribute*/ @@ -7098,6 +7109,16 @@ SampSetUserAll(PSAM_DB_OBJECT UserObject, REG_SZ, Buffer->All.Parameters.Buffer, Buffer->All.Parameters.MaximumLength); + if (!NT_SUCCESS(Status)) + goto done; + } + + if (WhichFields & USER_ALL_LOGONHOURS) + { + Status = SampSetLogonHoursAttrbute(UserObject, + &Buffer->All.LogonHours); + if (!NT_SUCCESS(Status)) + goto done; } if (WhichFields & (USER_ALL_PRIMARYGROUPID | @@ -7144,7 +7165,6 @@ SampSetUserAll(PSAM_DB_OBJECT UserObject, /* FIXME: - USER_ALL_LOGONHOURS USER_ALL_NTPASSWORDPRESENT USER_ALL_LMPASSWORDPRESENT USER_ALL_PASSWORDEXPIRED @@ -7232,12 +7252,12 @@ SamrSetInformationUser(IN SAMPR_HANDLE UserHandle, Status = SampSetUserPreferences(UserObject, Buffer); break; -/* + case UserLogonHoursInformation: - Status = SampSetUserLogonHours(UserObject, - Buffer); + Status = SampSetLogonHoursAttrbute(UserObject, + &Buffer->LogonHours.LogonHours); break; -*/ + case UserNameInformation: Status = SampSetObjectAttribute(UserObject, L"Name", diff --git a/reactos/dll/win32/samsrv/samsrv.h b/reactos/dll/win32/samsrv/samsrv.h index 3c72e692825..8a5255859bb 100644 --- a/reactos/dll/win32/samsrv/samsrv.h +++ b/reactos/dll/win32/samsrv/samsrv.h @@ -328,6 +328,10 @@ SampSetUserPassword(IN PSAM_DB_OBJECT UserObject, NTSTATUS SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject, + IN OUT PSAMPR_LOGON_HOURS LogonHours); + +NTSTATUS +SampSetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject, IN PSAMPR_LOGON_HOURS LogonHours); /* EOF */ diff --git a/reactos/dll/win32/samsrv/user.c b/reactos/dll/win32/samsrv/user.c index eeb2cf30720..dd26861e144 100644 --- a/reactos/dll/win32/samsrv/user.c +++ b/reactos/dll/win32/samsrv/user.c @@ -584,7 +584,7 @@ done: NTSTATUS SampGetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject, - IN PSAMPR_LOGON_HOURS LogonHours) + IN OUT PSAMPR_LOGON_HOURS LogonHours) { PUCHAR RawBuffer = NULL; ULONG Length = 0; @@ -651,4 +651,47 @@ done: return Status; } + +NTSTATUS +SampSetLogonHoursAttrbute(IN PSAM_DB_OBJECT UserObject, + IN PSAMPR_LOGON_HOURS LogonHours) +{ + PUCHAR RawBuffer = NULL; + ULONG BufferLength; + ULONG Length = 0; + NTSTATUS Status; + + if (LogonHours->UnitsPerWeek > 0) + { + BufferLength = (((ULONG)LogonHours->UnitsPerWeek) + 7) / 8; + + Length = BufferLength + sizeof(USHORT); + + RawBuffer = midl_user_allocate(Length); + if (RawBuffer == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + *((PUSHORT)RawBuffer) = LogonHours->UnitsPerWeek; + + memcpy(&(RawBuffer[2]), + LogonHours->LogonHours, + BufferLength); + } + + Status = SampSetObjectAttribute(UserObject, + L"LogonHours", + REG_BINARY, + RawBuffer, + Length); + +done: + if (RawBuffer != NULL) + midl_user_free(RawBuffer); + + return Status; +} + /* EOF */ From 7865d05379da9047d36d8e6422348615b9d421a9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 8 Apr 2013 16:22:12 +0000 Subject: [PATCH 24/37] [CRYPTNET] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58719 --- reactos/dll/win32/cryptnet/cryptnet_main.c | 144 +++++++++------------ reactos/media/doc/README.WINE | 2 +- 2 files changed, 60 insertions(+), 86 deletions(-) diff --git a/reactos/dll/win32/cryptnet/cryptnet_main.c b/reactos/dll/win32/cryptnet/cryptnet_main.c index 04284914896..2144a632d2a 100644 --- a/reactos/dll/win32/cryptnet/cryptnet_main.c +++ b/reactos/dll/win32/cryptnet/cryptnet_main.c @@ -44,22 +44,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(cryptnet); #define IS_INTOID(x) (((ULONG_PTR)(x) >> 16) == 0) -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); - - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break; - case DLL_PROCESS_DETACH: - /* Do uninitialisation here */ - break; - default: break; - } - return TRUE; -} - static const WCHAR cryptNet[] = { 'c','r','y','p','t','n','e','t','.', 'd','l','l',0 }; @@ -521,24 +505,26 @@ static BOOL CRYPT_GetObjectFromCache(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, TRACE("(%s, %p, %p)\n", debugstr_w(pszURL), pObject, pAuxInfo); - ret = GetUrlCacheEntryInfoW(pszURL, NULL, &size); - if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + RetrieveUrlCacheEntryFileW(pszURL, NULL, &size, 0); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + return FALSE; + + pCacheInfo = CryptMemAlloc(size); + if (!pCacheInfo) { - pCacheInfo = CryptMemAlloc(size); - if (pCacheInfo) - ret = TRUE; - else - SetLastError(ERROR_OUTOFMEMORY); + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; } - if (ret && (ret = GetUrlCacheEntryInfoW(pszURL, pCacheInfo, &size))) + + if ((ret = RetrieveUrlCacheEntryFileW(pszURL, pCacheInfo, &size, 0))) { FILETIME ft; GetSystemTimeAsFileTime(&ft); if (CompareFileTime(&pCacheInfo->ExpireTime, &ft) >= 0) { - HANDLE hFile = CreateFileW(pCacheInfo->lpszLocalFileName, - GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE hFile = CreateFileW(pCacheInfo->lpszLocalFileName, GENERIC_READ, + FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { @@ -565,6 +551,7 @@ static BOOL CRYPT_GetObjectFromCache(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, DeleteUrlCacheEntryW(pszURL); ret = FALSE; } + UnlockUrlCacheEntryFileW(pszURL, 0); } CryptMemFree(pCacheInfo); TRACE("returning %d\n", ret); @@ -733,21 +720,24 @@ static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, DWORD dwRetrievalFlags, FILETIME expires) { WCHAR cacheFileName[MAX_PATH]; - DWORD size = 0; - BOOL ret, create = FALSE; + HANDLE hCacheFile; + DWORD size = 0, entryType; + FILETIME ft; GetUrlCacheEntryInfoW(pszURL, NULL, &size); if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { INTERNET_CACHE_ENTRY_INFOW *info = CryptMemAlloc(size); - if (info) + if (!info) { - FILETIME ft; + ERR("out of memory\n"); + return; + } - ret = GetUrlCacheEntryInfoW(pszURL, info, &size); - if (ret) - lstrcpyW(cacheFileName, info->lpszLocalFileName); + if (GetUrlCacheEntryInfoW(pszURL, info, &size)) + { + lstrcpyW(cacheFileName, info->lpszLocalFileName); /* Check if the existing cache entry is up to date. If it isn't, * remove the existing cache entry, and create a new one with the * new value. @@ -755,51 +745,38 @@ static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, GetSystemTimeAsFileTime(&ft); if (CompareFileTime(&info->ExpireTime, &ft) < 0) { - create = TRUE; DeleteUrlCacheEntryW(pszURL); } - CryptMemFree(info); - } - else - ret = FALSE; - } - else - { - ret = CreateUrlCacheEntryW(pszURL, pObject->rgBlob[0].cbData, NULL, - cacheFileName, 0); - create = TRUE; - } - if (ret) - { - DWORD entryType; - FILETIME ft = { 0 }; - - if (create) - { - HANDLE hCacheFile = CreateFileW(cacheFileName, GENERIC_WRITE, 0, - NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - if (hCacheFile != INVALID_HANDLE_VALUE) + else { - DWORD bytesWritten; - - WriteFile(hCacheFile, pObject->rgBlob[0].pbData, - pObject->rgBlob[0].cbData, &bytesWritten, NULL); - CloseHandle(hCacheFile); + info->ExpireTime = expires; + SetUrlCacheEntryInfoW(pszURL, info, CACHE_ENTRY_EXPTIME_FC); + CryptMemFree(info); + return; } - else - ret = FALSE; - } - if (ret) - { - if (!(dwRetrievalFlags & CRYPT_STICKY_CACHE_RETRIEVAL)) - entryType = NORMAL_CACHE_ENTRY; - else - entryType = STICKY_CACHE_ENTRY; - CommitUrlCacheEntryW(pszURL, cacheFileName, expires, ft, entryType, - NULL, 0, NULL, NULL); } + CryptMemFree(info); } + + if (!CreateUrlCacheEntryW(pszURL, pObject->rgBlob[0].cbData, NULL, cacheFileName, 0)) + return; + + hCacheFile = CreateFileW(cacheFileName, GENERIC_WRITE, 0, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(hCacheFile == INVALID_HANDLE_VALUE) + return; + + WriteFile(hCacheFile, pObject->rgBlob[0].pbData, + pObject->rgBlob[0].cbData, &size, NULL); + CloseHandle(hCacheFile); + + if (!(dwRetrievalFlags & CRYPT_STICKY_CACHE_RETRIEVAL)) + entryType = NORMAL_CACHE_ENTRY; + else + entryType = STICKY_CACHE_ENTRY; + memset(&ft, 0, sizeof(ft)); + CommitUrlCacheEntryW(pszURL, cacheFileName, expires, ft, entryType, + NULL, 0, NULL, NULL); } static void CALLBACK CRYPT_InetStatusCallback(HINTERNET hInt, @@ -966,18 +943,15 @@ static BOOL WINAPI HTTP_RetrieveEncodedObjectW(LPCWSTR pszURL, else ret = TRUE; } - /* We don't set ret to TRUE in this block to avoid masking - * an error from HttpSendRequestExW. - */ - if (!HttpEndRequestW(hHttp, NULL, 0, (DWORD_PTR)context) && + if (ret && + !(ret = HttpEndRequestW(hHttp, NULL, 0, (DWORD_PTR)context)) && GetLastError() == ERROR_IO_PENDING) { if (WaitForSingleObject(context->event, context->timeout) == WAIT_TIMEOUT) - { SetLastError(ERROR_TIMEOUT); - ret = FALSE; - } + else + ret = TRUE; } if (ret) ret = CRYPT_DownloadObject(dwRetrievalFlags, hHttp, @@ -1056,8 +1030,8 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, /* Try to create the file directly - Wine handles / in pathnames */ lstrcpynW(path, components.lpszUrlPath, components.dwUrlPathLength + 1); - hFile = CreateFileW(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); + hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { /* Try again on the current drive */ @@ -1066,8 +1040,8 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, { lstrcpynW(path + 2, components.lpszUrlPath, components.dwUrlPathLength + 1); - hFile = CreateFileW(path, GENERIC_READ, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } if (hFile == INVALID_HANDLE_VALUE) { @@ -1077,8 +1051,8 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, { lstrcpynW(path + 2, components.lpszUrlPath, components.dwUrlPathLength + 1); - hFile = CreateFileW(path, GENERIC_READ, 0, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + hFile = CreateFileW(path, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } } } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index ce5fd1e8a4d..609e668574a 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -55,7 +55,7 @@ reactos/dll/win32/credui # Synced to Wine-1.5.4 reactos/dll/win32/crypt32 # Synced to Wine-1.5.26 reactos/dll/win32/cryptdlg # Synced to Wine-1.5.4 reactos/dll/win32/cryptdll # Synced to Wine-1.5.4 -reactos/dll/win32/cryptnet # Synced to Wine-1.3.37 +reactos/dll/win32/cryptnet # Synced to Wine-1.5.26 reactos/dll/win32/cryptui # Synced to Wine-1.5.4 reactos/dll/win32/dbghelp # Synced to Wine-1.3.37 reactos/dll/win32/dciman32 # Synced to Wine-1.5.19 From 71e8bf218c5f4e8446ecf1a8597ffb87a1369fab Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 8 Apr 2013 16:22:36 +0000 Subject: [PATCH 25/37] [CRYPTNET_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58720 --- rostests/winetests/cryptnet/cryptnet.c | 18 +++++++++++++----- rostests/winetests/cryptnet/testlist.c | 5 +---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/rostests/winetests/cryptnet/cryptnet.c b/rostests/winetests/cryptnet/cryptnet.c index 683c6b676c7..a8ead636fa6 100644 --- a/rostests/winetests/cryptnet/cryptnet.c +++ b/rostests/winetests/cryptnet/cryptnet.c @@ -17,14 +17,14 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include +//#include #include #define NONAMELESSUNION #include #include -#include +//#include #include -#include "wine/test.h" +#include static const BYTE bigCert[] = { 0x30,0x78,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x14,0x31,0x12,0x30,0x10, @@ -365,9 +365,12 @@ static void test_retrieveObjectByUrl(void) SetLastError(0xdeadbeef); ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CRL, 0, 0, (void **)&crl, NULL, NULL, NULL, NULL); - /* w2k3,XP, newer w2k: CRYPT_E_NO_MATCH, older w2k: CRYPT_E_ASN1_BADTAG */ + /* w2k3,XP, newer w2k: CRYPT_E_NO_MATCH, older w2k: CRYPT_E_ASN1_BADTAG + * or OSS_DATA_ERROR. + */ ok(!ret && (GetLastError() == CRYPT_E_NO_MATCH || - broken(GetLastError() == CRYPT_E_ASN1_BADTAG)), + broken(GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR)), "got 0x%x/%u (expected CRYPT_E_NO_MATCH)\n", GetLastError(), GetLastError()); /* only newer versions of cryptnet do the cleanup */ @@ -698,6 +701,11 @@ static void test_verifyRevocation(void) * bad authority key ID extension and can't be matched with the issuer * cert, hence the revocation status should be unknown. */ + if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) + { + win_skip("CERT_CONTEXT_REVOCATION_TYPE unsupported, skipping\n"); + return; + } ok(!ret && (GetLastError() == CRYPT_E_NO_REVOCATION_CHECK || broken(GetLastError() == CRYPT_E_REVOKED /* Win2k */)), "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", GetLastError()); diff --git a/rostests/winetests/cryptnet/testlist.c b/rostests/winetests/cryptnet/testlist.c index 5321c62f438..78adf768dff 100644 --- a/rostests/winetests/cryptnet/testlist.c +++ b/rostests/winetests/cryptnet/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_cryptnet(void); From 63b83508303a7a48e0a131eed4e8b2c2c51c3793 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 8 Apr 2013 16:31:05 +0000 Subject: [PATCH 26/37] [CRYPTDLG] [CRYPTDLL] [CRYPTUI] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58721 --- reactos/dll/win32/cryptdlg/main.c | 2 +- reactos/dll/win32/cryptdll/cryptdll.c | 3 --- reactos/dll/win32/cryptui/main.c | 14 +++++--------- reactos/media/doc/README.WINE | 6 +++--- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/cryptdlg/main.c b/reactos/dll/win32/cryptdlg/main.c index 2c92013bd2e..f7e4db96a92 100644 --- a/reactos/dll/win32/cryptdlg/main.c +++ b/reactos/dll/win32/cryptdlg/main.c @@ -278,7 +278,7 @@ static HCERTCHAINENGINE CRYPTDLG_MakeEngine(CERT_VERIFY_CERTIFICATE_TRUST *cert) { trust = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); - if (root) + if (trust) { for (i = 0; i < cert->cTrustStores; i++) CertAddStoreToCollection(trust, cert->rghstoreTrust[i], 0, 0); diff --git a/reactos/dll/win32/cryptdll/cryptdll.c b/reactos/dll/win32/cryptdll/cryptdll.c index ed892a6919f..9ed5f9cc80f 100644 --- a/reactos/dll/win32/cryptdll/cryptdll.c +++ b/reactos/dll/win32/cryptdll/cryptdll.c @@ -27,8 +27,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(cryptdll); -static HMODULE CRYPTDLL_hModule; - BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("%p,%x,%p\n", hinstDLL, fdwReason, lpvReserved); @@ -39,7 +37,6 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hinstDLL); - CRYPTDLL_hModule = hinstDLL; break; } case DLL_PROCESS_DETACH: diff --git a/reactos/dll/win32/cryptui/main.c b/reactos/dll/win32/cryptui/main.c index 70eac91935e..143b466b918 100644 --- a/reactos/dll/win32/cryptui/main.c +++ b/reactos/dll/win32/cryptui/main.c @@ -299,7 +299,7 @@ static CERT_ENHKEY_USAGE *convert_usages_str_to_usage(LPSTR usageStr) { if (comma) *comma = 0; - add_oid_to_usage(usage, ptr); + usage = add_oid_to_usage(usage, ptr); } } return usage; @@ -327,7 +327,7 @@ static CERT_ENHKEY_USAGE *create_advanced_filter(void) { PCCRYPT_OID_INFO *ptr; - for (ptr = usages; *ptr; ptr++) + for (ptr = usages; advancedUsage && *ptr; ptr++) { DWORD i; BOOL disabled = FALSE; @@ -338,7 +338,7 @@ static CERT_ENHKEY_USAGE *create_advanced_filter(void) (*ptr)->pszOID)) disabled = TRUE; if (!disabled) - add_oid_to_usage(advancedUsage, + advancedUsage = add_oid_to_usage(advancedUsage, (LPSTR)(*ptr)->pszOID); } /* The individual strings are pointers to disabledUsagesStr, @@ -1808,7 +1808,6 @@ static void add_icon_to_control(HWND hwnd, int id) DWORD conn; LPDATAOBJECT dataObject = NULL; HBITMAP bitmap = NULL; - RECT rect; STGMEDIUM stgm; LPOLECLIENTSITE clientSite = NULL; REOBJECT reObject; @@ -1847,9 +1846,6 @@ static void add_icon_to_control(HWND hwnd, int id) LR_DEFAULTSIZE | LR_LOADTRANSPARENT); if (!bitmap) goto end; - rect.left = rect.top = 0; - rect.right = GetSystemMetrics(SM_CXICON); - rect.bottom = GetSystemMetrics(SM_CYICON); stgm.tymed = TYMED_GDI; stgm.u.hBitmap = bitmap; stgm.pUnkForRelease = NULL; @@ -2844,7 +2840,7 @@ static const struct v1_field v1_fields[] = { static void add_v1_fields(HWND hwnd, struct detail_data *data) { - int i; + unsigned int i; PCCERT_CONTEXT cert = data->pCertViewInfo->pCertContext; /* The last item in v1_fields is the public key, which is not in the loop @@ -3776,7 +3772,7 @@ static void show_edit_cert_properties_dialog(HWND parent, static void free_detail_fields(struct detail_data *data) { - DWORD i; + int i; for (i = 0; i < data->cFields; i++) HeapFree(GetProcessHeap(), 0, data->fields[i].detailed_value); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 609e668574a..3037cf85283 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -53,10 +53,10 @@ reactos/dll/win32/comdlg32 # Synced to Wine 1.3.37 reactos/dll/win32/compstui # Synced to Wine-1.5.19 reactos/dll/win32/credui # Synced to Wine-1.5.4 reactos/dll/win32/crypt32 # Synced to Wine-1.5.26 -reactos/dll/win32/cryptdlg # Synced to Wine-1.5.4 -reactos/dll/win32/cryptdll # Synced to Wine-1.5.4 +reactos/dll/win32/cryptdlg # Synced to Wine-1.5.26 +reactos/dll/win32/cryptdll # Synced to Wine-1.5.26 reactos/dll/win32/cryptnet # Synced to Wine-1.5.26 -reactos/dll/win32/cryptui # Synced to Wine-1.5.4 +reactos/dll/win32/cryptui # Synced to Wine-1.5.26 reactos/dll/win32/dbghelp # Synced to Wine-1.3.37 reactos/dll/win32/dciman32 # Synced to Wine-1.5.19 reactos/dll/win32/dwmapi # Synced to Wine-1.5.19 From f7bf1643bf4cf7618bc9258ecd33b1b3a54ba4d9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 8 Apr 2013 16:31:12 +0000 Subject: [PATCH 27/37] [CRYPTUI_WINETEST] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58722 --- rostests/winetests/cryptui/cryptui.c | 8 ++++---- rostests/winetests/cryptui/testlist.c | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/rostests/winetests/cryptui/cryptui.c b/rostests/winetests/cryptui/cryptui.c index bb1db929ba5..fd16a6b8b07 100644 --- a/rostests/winetests/cryptui/cryptui.c +++ b/rostests/winetests/cryptui/cryptui.c @@ -18,16 +18,16 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include -#include +//#include #define NONAMELESSUNION #include #include -#include +//#include #include -#include +//#include #include -#include "wine/test.h" +#include static BYTE v1CertWithValidPubKey[] = { 0x30,0x81,0xcf,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x15,0x31,0x13,0x30, diff --git a/rostests/winetests/cryptui/testlist.c b/rostests/winetests/cryptui/testlist.c index 315bb4fe129..26caa7ec5ea 100644 --- a/rostests/winetests/cryptui/testlist.c +++ b/rostests/winetests/cryptui/testlist.c @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */ -#define WIN32_LEAN_AND_MEAN -#include - #define STANDALONE -#include "wine/test.h" +#include extern void func_cryptui(void); From b257ae4d5d1c0af4b808c163b865ab0f131b9835 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 8 Apr 2013 16:35:35 +0000 Subject: [PATCH 28/37] [HHCTRL.OCX] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58723 --- reactos/dll/win32/hhctrl.ocx/CMakeLists.txt | 19 +- reactos/dll/win32/hhctrl.ocx/chm.c | 295 ++++++-- reactos/dll/win32/hhctrl.ocx/content.c | 46 +- reactos/dll/win32/hhctrl.ocx/help.c | 737 +++++++++++++++++--- reactos/dll/win32/hhctrl.ocx/hhctrl.c | 323 +++++++-- reactos/dll/win32/hhctrl.ocx/hhctrl.h | 122 +++- reactos/dll/win32/hhctrl.ocx/hhctrl.rc | 23 +- reactos/dll/win32/hhctrl.ocx/hhctrl_tlb.idl | 98 +++ reactos/dll/win32/hhctrl.ocx/hhtoolbar.bmp | Bin 0 -> 13946 bytes reactos/dll/win32/hhctrl.ocx/hhtreeview.bmp | Bin 0 -> 3194 bytes reactos/dll/win32/hhctrl.ocx/index.c | 55 +- reactos/dll/win32/hhctrl.ocx/resource.h | 21 + reactos/dll/win32/hhctrl.ocx/search.c | 1 + reactos/dll/win32/hhctrl.ocx/stream.c | 4 +- reactos/dll/win32/hhctrl.ocx/stream.h | 22 +- reactos/dll/win32/hhctrl.ocx/version.rc | 29 - reactos/dll/win32/hhctrl.ocx/webbrowser.c | 116 +-- reactos/media/doc/README.WINE | 2 +- 18 files changed, 1534 insertions(+), 379 deletions(-) create mode 100644 reactos/dll/win32/hhctrl.ocx/hhctrl_tlb.idl create mode 100644 reactos/dll/win32/hhctrl.ocx/hhtoolbar.bmp create mode 100644 reactos/dll/win32/hhctrl.ocx/hhtreeview.bmp delete mode 100644 reactos/dll/win32/hhctrl.ocx/version.rc diff --git a/reactos/dll/win32/hhctrl.ocx/CMakeLists.txt b/reactos/dll/win32/hhctrl.ocx/CMakeLists.txt index cdf7499088b..d5e74853e44 100644 --- a/reactos/dll/win32/hhctrl.ocx/CMakeLists.txt +++ b/reactos/dll/win32/hhctrl.ocx/CMakeLists.txt @@ -12,28 +12,17 @@ add_library(hhctrl SHARED help.c hhctrl.c index.c - regsvr.c search.c stream.c webbrowser.c - hhctrl.rc + hhctrl.rc ${CMAKE_CURRENT_BINARY_DIR}/hhctrl.def) +add_typelib(hhctrl_tlb.idl) +set_source_files_properties(hhctrl.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/hhctrl_tlb.tlb) set_module_type(hhctrl win32ocx) target_link_libraries(hhctrl uuid wine itss_guid) - -add_importlibs(hhctrl - advapi32 - comctl32 - shlwapi - ole32 - oleaut32 - user32 - gdi32 - msvcrt - kernel32 - ntdll) - +add_importlibs(hhctrl advapi32 comctl32 shlwapi ole32 oleaut32 user32 gdi32 msvcrt kernel32 ntdll) add_dependencies(hhctrl wineheaders) add_pch(hhctrl hhctrl.h) add_cd_file(TARGET hhctrl DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/hhctrl.ocx/chm.c b/reactos/dll/win32/hhctrl.ocx/chm.c index 1d1838c4993..10c76a0501f 100644 --- a/reactos/dll/win32/hhctrl.ocx/chm.c +++ b/reactos/dll/win32/hhctrl.ocx/chm.c @@ -20,6 +20,7 @@ */ #include "hhctrl.h" +#include "stream.h" #include #include @@ -27,10 +28,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp); -#define BLOCK_BITS 12 -#define BLOCK_SIZE (1 << BLOCK_BITS) -#define BLOCK_MASK (BLOCK_SIZE-1) - /* Reads a string from the #STRINGS section in the CHM file */ static LPCSTR GetChmString(CHMInfo *chm, DWORD offset) { @@ -133,11 +130,21 @@ static BOOL ReadChmSystem(CHMInfo *chm) heap_free(chm->defTitle); chm->defTitle = strdupnAtoW(buf, entry.len); break; + case 0x4: + /* TODO: Currently only the Locale ID is loaded from this field */ + TRACE("Locale is: %d\n", *(LCID*)&buf[0]); + if(!GetLocaleInfoW(*(LCID*)&buf[0], LOCALE_IDEFAULTANSICODEPAGE|LOCALE_RETURN_NUMBER, + (WCHAR *)&chm->codePage, sizeof(chm->codePage)/sizeof(WCHAR))) + chm->codePage = CP_ACP; + break; case 0x5: - TRACE("Default window is %s\n", debugstr_an(buf, entry.len)); + TRACE("Window name is %s\n", debugstr_an(buf, entry.len)); + chm->defWindow = strdupnAtoW(buf, entry.len); break; case 0x6: TRACE("Compiled file is %s\n", debugstr_an(buf, entry.len)); + heap_free(chm->compiledFile); + chm->compiledFile = strdupnAtoW(buf, entry.len); break; case 0x9: TRACE("Version is %s\n", debugstr_an(buf, entry.len)); @@ -209,6 +216,107 @@ LPWSTR FindContextAlias(CHMInfo *chm, DWORD index) return strdupAtoW(ret); } +/* + * Tests if the file . exists, used for loading Indices, Table of Contents, etc. + * when these files are not available from the HH_WINTYPE structure. + */ +static WCHAR *FindHTMLHelpSetting(HHInfo *info, const WCHAR *extW) +{ + static const WCHAR periodW[] = {'.',0}; + IStorage *pStorage = info->pCHMInfo->pStorage; + IStream *pStream; + WCHAR *filename; + HRESULT hr; + + filename = heap_alloc( (strlenW(info->pCHMInfo->compiledFile) + + strlenW(periodW) + strlenW(extW) + 1) * sizeof(WCHAR) ); + strcpyW(filename, info->pCHMInfo->compiledFile); + strcatW(filename, periodW); + strcatW(filename, extW); + hr = IStorage_OpenStream(pStorage, filename, NULL, STGM_READ, 0, &pStream); + if (FAILED(hr)) + { + heap_free(filename); + return strdupAtoW(""); + } + IStream_Release(pStream); + return filename; +} + +static inline WCHAR *MergeChmString(LPCWSTR src, WCHAR **dst) +{ + if(*dst == NULL) + *dst = strdupW(src); + return *dst; +} + +void MergeChmProperties(HH_WINTYPEW *src, HHInfo *info, BOOL override) +{ + DWORD unhandled_params = src->fsValidMembers & ~(HHWIN_PARAM_PROPERTIES|HHWIN_PARAM_STYLES + |HHWIN_PARAM_EXSTYLES|HHWIN_PARAM_RECT|HHWIN_PARAM_NAV_WIDTH + |HHWIN_PARAM_SHOWSTATE|HHWIN_PARAM_INFOTYPES|HHWIN_PARAM_TB_FLAGS + |HHWIN_PARAM_EXPANSION|HHWIN_PARAM_TABPOS|HHWIN_PARAM_TABORDER + |HHWIN_PARAM_HISTORY_COUNT|HHWIN_PARAM_CUR_TAB); + HH_WINTYPEW *dst = &info->WinType; + DWORD merge = override ? src->fsValidMembers : src->fsValidMembers & ~dst->fsValidMembers; + + if (unhandled_params) + FIXME("Unsupported fsValidMembers fields: 0x%x\n", unhandled_params); + + dst->fsValidMembers |= merge; + if (dst->cbStruct == 0) + { + /* If the structure has not been filled in yet then use all of the values */ + dst->cbStruct = sizeof(HH_WINTYPEW); + merge = ~0; + } + if (merge & HHWIN_PARAM_PROPERTIES) dst->fsWinProperties = src->fsWinProperties; + if (merge & HHWIN_PARAM_STYLES) dst->dwStyles = src->dwStyles; + if (merge & HHWIN_PARAM_EXSTYLES) dst->dwExStyles = src->dwExStyles; + if (merge & HHWIN_PARAM_RECT) dst->rcWindowPos = src->rcWindowPos; + if (merge & HHWIN_PARAM_NAV_WIDTH) dst->iNavWidth = src->iNavWidth; + if (merge & HHWIN_PARAM_SHOWSTATE) dst->nShowState = src->nShowState; + if (merge & HHWIN_PARAM_INFOTYPES) dst->paInfoTypes = src->paInfoTypes; + if (merge & HHWIN_PARAM_TB_FLAGS) dst->fsToolBarFlags = src->fsToolBarFlags; + if (merge & HHWIN_PARAM_EXPANSION) dst->fNotExpanded = src->fNotExpanded; + if (merge & HHWIN_PARAM_TABPOS) dst->tabpos = src->tabpos; + if (merge & HHWIN_PARAM_TABORDER) memcpy(dst->tabOrder, src->tabOrder, sizeof(src->tabOrder)); + if (merge & HHWIN_PARAM_HISTORY_COUNT) dst->cHistory = src->cHistory; + if (merge & HHWIN_PARAM_CUR_TAB) dst->curNavType = src->curNavType; + + /* + * Note: We assume that hwndHelp, hwndCaller, hwndToolBar, hwndNavigation, and hwndHTML cannot be + * modified by the user. rcHTML and rcMinSize are not currently supported, so don't bother to copy them. + */ + + dst->pszType = MergeChmString(src->pszType, &info->stringsW.pszType); + dst->pszFile = MergeChmString(src->pszFile, &info->stringsW.pszFile); + dst->pszToc = MergeChmString(src->pszToc, &info->stringsW.pszToc); + dst->pszIndex = MergeChmString(src->pszIndex, &info->stringsW.pszIndex); + dst->pszCaption = MergeChmString(src->pszCaption, &info->stringsW.pszCaption); + dst->pszHome = MergeChmString(src->pszHome, &info->stringsW.pszHome); + dst->pszJump1 = MergeChmString(src->pszJump1, &info->stringsW.pszJump1); + dst->pszJump2 = MergeChmString(src->pszJump2, &info->stringsW.pszJump2); + dst->pszUrlJump1 = MergeChmString(src->pszUrlJump1, &info->stringsW.pszUrlJump1); + dst->pszUrlJump2 = MergeChmString(src->pszUrlJump2, &info->stringsW.pszUrlJump2); + + /* FIXME: pszCustomTabs is a list of multiple zero-terminated strings so ReadString won't + * work in this case + */ +#if 0 + dst->pszCustomTabs = MergeChmString(src->pszCustomTabs, &info->pszCustomTabs); +#endif +} + +static inline WCHAR *ConvertChmString(HHInfo *info, const WCHAR **str) +{ + WCHAR *ret = NULL; + + if(*str) + *str = ret = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)*str)); + return ret; +} + /* Loads the HH_WINTYPE data from the CHM file * * FIXME: There may be more than one window type in the file, so @@ -217,72 +325,94 @@ LPWSTR FindContextAlias(CHMInfo *chm, DWORD index) BOOL LoadWinTypeFromCHM(HHInfo *info) { LARGE_INTEGER liOffset; + WCHAR *pszType = NULL, *pszFile = NULL, *pszToc = NULL, *pszIndex = NULL, *pszCaption = NULL; + WCHAR *pszHome = NULL, *pszJump1 = NULL, *pszJump2 = NULL, *pszUrlJump1 = NULL, *pszUrlJump2 = NULL; IStorage *pStorage = info->pCHMInfo->pStorage; - IStream *pStream; + IStream *pStream = NULL; + HH_WINTYPEW wintype; HRESULT hr; DWORD cbRead; + BOOL ret = FALSE; + static const WCHAR null[] = {0}; + static const WCHAR toc_extW[] = {'h','h','c',0}; + static const WCHAR index_extW[] = {'h','h','k',0}; static const WCHAR windowsW[] = {'#','W','I','N','D','O','W','S',0}; hr = IStorage_OpenStream(pStorage, windowsW, NULL, STGM_READ, 0, &pStream); - if (FAILED(hr)) + if (SUCCEEDED(hr)) + { + /* jump past the #WINDOWS header */ + liOffset.QuadPart = sizeof(DWORD) * 2; + + hr = IStream_Seek(pStream, liOffset, STREAM_SEEK_SET, NULL); + if (FAILED(hr)) goto done; + + /* read the HH_WINTYPE struct data */ + hr = IStream_Read(pStream, &wintype, sizeof(wintype), &cbRead); + if (FAILED(hr)) goto done; + + /* convert the #STRINGS offsets to actual strings */ + pszType = ConvertChmString(info, &wintype.pszType); + pszFile = ConvertChmString(info, &wintype.pszFile); + pszToc = ConvertChmString(info, &wintype.pszToc); + pszIndex = ConvertChmString(info, &wintype.pszIndex); + pszCaption = ConvertChmString(info, &wintype.pszCaption); + pszHome = ConvertChmString(info, &wintype.pszHome); + pszJump1 = ConvertChmString(info, &wintype.pszJump1); + pszJump2 = ConvertChmString(info, &wintype.pszJump2); + pszUrlJump1 = ConvertChmString(info, &wintype.pszUrlJump1); + pszUrlJump2 = ConvertChmString(info, &wintype.pszUrlJump2); + } + else { /* no defined window types so use (hopefully) sane defaults */ static const WCHAR defaultwinW[] = {'d','e','f','a','u','l','t','w','i','n','\0'}; - static const WCHAR null[] = {0}; - memset((void*)&(info->WinType), 0, sizeof(info->WinType)); - info->WinType.cbStruct=sizeof(info->WinType); - info->WinType.fUniCodeStrings=TRUE; - info->WinType.pszType=strdupW(defaultwinW); - info->WinType.pszToc = strdupW(info->pCHMInfo->defToc ? info->pCHMInfo->defToc : null); - info->WinType.pszIndex = strdupW(null); - info->WinType.fsValidMembers=0; - info->WinType.fsWinProperties=HHWIN_PROP_TRI_PANE; - info->WinType.pszCaption=strdupW(info->pCHMInfo->defTitle ? info->pCHMInfo->defTitle : null); - info->WinType.dwStyles=WS_POPUP; - info->WinType.dwExStyles=0; - info->WinType.nShowState=SW_SHOW; - info->WinType.pszFile=strdupW(info->pCHMInfo->defTopic ? info->pCHMInfo->defTopic : null); - info->WinType.curNavType=HHWIN_NAVTYPE_TOC; - return TRUE; + memset(&wintype, 0, sizeof(wintype)); + wintype.cbStruct = sizeof(wintype); + wintype.fUniCodeStrings = TRUE; + wintype.pszType = pszType = strdupW(info->pCHMInfo->defWindow ? info->pCHMInfo->defWindow : defaultwinW); + wintype.pszToc = pszToc = strdupW(info->pCHMInfo->defToc ? info->pCHMInfo->defToc : null); + wintype.pszIndex = pszIndex = strdupW(null); + wintype.fsValidMembers = 0; + wintype.fsWinProperties = HHWIN_PROP_TRI_PANE; + wintype.dwStyles = WS_POPUP; + wintype.dwExStyles = 0; + wintype.nShowState = SW_SHOW; + wintype.curNavType = HHWIN_NAVTYPE_TOC; } - /* jump past the #WINDOWS header */ - liOffset.QuadPart = sizeof(DWORD) * 2; + /* merge the new data with any pre-existing HH_WINTYPE structure */ + MergeChmProperties(&wintype, info, FALSE); + if (!info->WinType.pszCaption) + info->WinType.pszCaption = info->stringsW.pszCaption = strdupW(info->pCHMInfo->defTitle ? info->pCHMInfo->defTitle : null); + if (!info->WinType.pszFile) + info->WinType.pszFile = info->stringsW.pszFile = strdupW(info->pCHMInfo->defTopic ? info->pCHMInfo->defTopic : null); + if (!info->WinType.pszToc) + info->WinType.pszToc = info->stringsW.pszToc = FindHTMLHelpSetting(info, toc_extW); + if (!info->WinType.pszIndex) + info->WinType.pszIndex = info->stringsW.pszIndex = FindHTMLHelpSetting(info, index_extW); - hr = IStream_Seek(pStream, liOffset, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) goto done; - - /* read the HH_WINTYPE struct data */ - hr = IStream_Read(pStream, &info->WinType, sizeof(info->WinType), &cbRead); - if (FAILED(hr)) goto done; - - /* convert the #STRINGS offsets to actual strings */ - info->WinType.pszType = info->pszType = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszType)); - info->WinType.pszCaption = info->pszCaption = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszCaption)); - info->WinType.pszToc = info->pszToc = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszToc)); - info->WinType.pszIndex = info->pszIndex = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszIndex)); - info->WinType.pszFile = info->pszFile = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszFile)); - info->WinType.pszHome = info->pszHome = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszHome)); - info->WinType.pszJump1 = info->pszJump1 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump1)); - info->WinType.pszJump2 = info->pszJump2 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszJump2)); - info->WinType.pszUrlJump1 = info->pszUrlJump1 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump1)); - info->WinType.pszUrlJump2 = info->pszUrlJump2 = strdupAtoW(GetChmString(info->pCHMInfo, (DWORD_PTR)info->WinType.pszUrlJump2)); - - /* FIXME: pszCustomTabs is a list of multiple zero-terminated strings so ReadString won't - * work in this case - */ -#if 0 - info->WinType.pszCustomTabs = info->pszCustomTabs = CHM_ReadString(pChmInfo, (DWORD_PTR)info->WinType.pszCustomTabs); -#endif + heap_free(pszType); + heap_free(pszFile); + heap_free(pszToc); + heap_free(pszIndex); + heap_free(pszCaption); + heap_free(pszHome); + heap_free(pszJump1); + heap_free(pszJump2); + heap_free(pszUrlJump1); + heap_free(pszUrlJump2); + ret = TRUE; done: - IStream_Release(pStream); + if (pStream) + IStream_Release(pStream); - return SUCCEEDED(hr); + return ret; } -static LPCWSTR skip_schema(LPCWSTR url) +LPCWSTR skip_schema(LPCWSTR url) { static const WCHAR its_schema[] = {'i','t','s',':'}; static const WCHAR msits_schema[] = {'m','s','-','i','t','s',':'}; @@ -364,6 +494,62 @@ IStream *GetChmStream(CHMInfo *info, LPCWSTR parent_chm, ChmPath *chm_file) return stream; } +/* + * Retrieve a CHM document and parse the data from the element to get the document's title. + */ +WCHAR *GetDocumentTitle(CHMInfo *info, LPCWSTR document) +{ + strbuf_t node, node_name, content; + WCHAR *document_title = NULL; + IStream *str = NULL; + IStorage *storage; + stream_t stream; + HRESULT hres; + + TRACE("%s\n", debugstr_w(document)); + + storage = info->pStorage; + if(!storage) { + WARN("Could not open storage to obtain the title for a document.\n"); + return NULL; + } + IStorage_AddRef(storage); + + hres = IStorage_OpenStream(storage, document, NULL, STGM_READ, 0, &str); + IStorage_Release(storage); + if(FAILED(hres)) + WARN("Could not open stream: %08x\n", hres); + + stream_init(&stream, str); + strbuf_init(&node); + strbuf_init(&content); + strbuf_init(&node_name); + + while(next_node(&stream, &node)) { + get_node_name(&node, &node_name); + + TRACE("%s\n", node.buf); + + if(!strcasecmp(node_name.buf, "title")) { + if(next_content(&stream, &content) && content.len > 1) + { + document_title = strdupnAtoW(&content.buf[1], content.len-1); + FIXME("magic: %s\n", debugstr_w(document_title)); + break; + } + } + + strbuf_zero(&node); + } + + strbuf_free(&node); + strbuf_free(&content); + strbuf_free(&node_name); + IStream_Release(str); + + return document_title; +} + /* Opens the CHM file for reading */ CHMInfo *OpenCHM(LPCWSTR szFile) { @@ -374,6 +560,7 @@ CHMInfo *OpenCHM(LPCWSTR szFile) if (!(ret = heap_alloc_zero(sizeof(CHMInfo)))) return NULL; + ret->codePage = CP_ACP; if (!(ret->szFile = strdupW(szFile))) { heap_free(ret); @@ -427,10 +614,12 @@ CHMInfo *CloseCHM(CHMInfo *chm) } heap_free(chm->strings); + heap_free(chm->defWindow); heap_free(chm->defTitle); heap_free(chm->defTopic); heap_free(chm->defToc); heap_free(chm->szFile); + heap_free(chm->compiledFile); heap_free(chm); return NULL; diff --git a/reactos/dll/win32/hhctrl.ocx/content.c b/reactos/dll/win32/hhctrl.ocx/content.c index 5a042c8cea3..d34aac738c6 100644 --- a/reactos/dll/win32/hhctrl.ocx/content.c +++ b/reactos/dll/win32/hhctrl.ocx/content.c @@ -1,5 +1,6 @@ /* * Copyright 2007 Jacek Caban for CodeWeavers + * Copyright 2011 Owen Rudge for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,6 +22,7 @@ #include "hhctrl.h" #include "stream.h" +#include "resource.h" #include <wine/debug.h> @@ -49,11 +51,11 @@ static void free_content_item(ContentItem *item) } } -static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text) +static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const char *text, UINT code_page) { const char *ptr; LPWSTR *param, merge; - int len, wlen; + int len; ptr = get_attr(text, "name", &len); if(!ptr) { @@ -78,10 +80,21 @@ static void parse_obj_node_param(ContentItem *item, ContentItem *hhc_root, const return; } - wlen = MultiByteToWideChar(CP_ACP, 0, ptr, len, NULL, 0); - *param = heap_alloc((wlen+1)*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ptr, len, *param, wlen); - (*param)[wlen] = 0; + /* + * "merge" parameter data (referencing another CHM file) can be incorporated into the "local" parameter + * by specifying the filename in the format: + * MS-ITS:file.chm::/local_path.htm + */ + if(param == &item->local && strstr(ptr, "::")) + { + const char *local = strstr(ptr, "::")+2; + int local_len = len-(local-ptr); + + item->local = decode_html(local, local_len, code_page); + param = &merge; + } + + *param = decode_html(ptr, len, code_page); if(param == &merge) { SetChmPath(&item->merge, hhc_root->merge.chm_file, merge); @@ -139,7 +152,7 @@ static ContentItem *parse_sitemap_object(HHInfo *info, stream_t *stream, Content if(!strcasecmp(node_name.buf, "/object")) break; if(!strcasecmp(node_name.buf, "param")) - parse_obj_node_param(item, hhc_root, node.buf); + parse_obj_node_param(item, hhc_root, node.buf, info->pCHMInfo->codePage); strbuf_zero(&node); } @@ -255,10 +268,12 @@ static void insert_content_item(HWND hwnd, ContentItem *parent, ContentItem *ite TVINSERTSTRUCTW tvis; memset(&tvis, 0, sizeof(tvis)); - tvis.u.item.mask = TVIF_TEXT|TVIF_PARAM; + tvis.u.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE; tvis.u.item.cchTextMax = strlenW(item->name)+1; tvis.u.item.pszText = item->name; tvis.u.item.lParam = (LPARAM)item; + tvis.u.item.iImage = item->child ? HHTV_FOLDER : HHTV_DOCUMENT; + tvis.u.item.iSelectedImage = item->child ? HHTV_FOLDER : HHTV_DOCUMENT; tvis.hParent = parent ? parent->id : 0; tvis.hInsertAfter = TVI_LAST; @@ -312,3 +327,18 @@ void ReleaseContent(HHInfo *info) { free_content_item(info->content); } + +void ActivateContentTopic(HWND hWnd, LPCWSTR filename, ContentItem *item) +{ + if (lstrcmpiW(item->local, filename) == 0) + { + SendMessageW(hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) item->id); + return; + } + + if (item->next) + ActivateContentTopic(hWnd, filename, item->next); + + if (item->child) + ActivateContentTopic(hWnd, filename, item->child); +} diff --git a/reactos/dll/win32/hhctrl.ocx/help.c b/reactos/dll/win32/hhctrl.ocx/help.c index 8f8f545a483..a4669cd2c07 100644 --- a/reactos/dll/win32/hhctrl.ocx/help.c +++ b/reactos/dll/win32/hhctrl.ocx/help.c @@ -3,6 +3,7 @@ * * Copyright 2005 James Hawkins * Copyright 2007 Jacek Caban for CodeWeavers + * Copyright 2011 Owen Rudge for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp); static LRESULT Help_OnSize(HWND hWnd); +static void ExpandContract(HHInfo *pHHInfo); /* Window type defaults */ @@ -46,8 +48,128 @@ static LRESULT Help_OnSize(HWND hWnd); #define TAB_MARGIN 8 #define EDIT_HEIGHT 20 +struct list window_list = LIST_INIT(window_list); + static const WCHAR szEmpty[] = {0}; +struct html_encoded_symbol { + const char *html_code; + char ansi_symbol; +}; + +/* + * Table mapping the conversion between HTML encoded symbols and their ANSI code page equivalent. + * Note: Add additional entries in proper alphabetical order (a binary search is used on this table). + */ +struct html_encoded_symbol html_encoded_symbols[] = +{ + {"AElig", 0xC6}, + {"Aacute", 0xC1}, + {"Acirc", 0xC2}, + {"Agrave", 0xC0}, + {"Aring", 0xC5}, + {"Atilde", 0xC3}, + {"Auml", 0xC4}, + {"Ccedil", 0xC7}, + {"ETH", 0xD0}, + {"Eacute", 0xC9}, + {"Ecirc", 0xCA}, + {"Egrave", 0xC8}, + {"Euml", 0xCB}, + {"Iacute", 0xCD}, + {"Icirc", 0xCE}, + {"Igrave", 0xCC}, + {"Iuml", 0xCF}, + {"Ntilde", 0xD1}, + {"Oacute", 0xD3}, + {"Ocirc", 0xD4}, + {"Ograve", 0xD2}, + {"Oslash", 0xD8}, + {"Otilde", 0xD5}, + {"Ouml", 0xD6}, + {"THORN", 0xDE}, + {"Uacute", 0xDA}, + {"Ucirc", 0xDB}, + {"Ugrave", 0xD9}, + {"Uuml", 0xDC}, + {"Yacute", 0xDD}, + {"aacute", 0xE1}, + {"acirc", 0xE2}, + {"acute", 0xB4}, + {"aelig", 0xE6}, + {"agrave", 0xE0}, + {"amp", '&'}, + {"aring", 0xE5}, + {"atilde", 0xE3}, + {"auml", 0xE4}, + {"brvbar", 0xA6}, + {"ccedil", 0xE7}, + {"cedil", 0xB8}, + {"cent", 0xA2}, + {"copy", 0xA9}, + {"curren", 0xA4}, + {"deg", 0xB0}, + {"divide", 0xF7}, + {"eacute", 0xE9}, + {"ecirc", 0xEA}, + {"egrave", 0xE8}, + {"eth", 0xF0}, + {"euml", 0xEB}, + {"frac12", 0xBD}, + {"frac14", 0xBC}, + {"frac34", 0xBE}, + {"gt", '>'}, + {"iacute", 0xED}, + {"icirc", 0xEE}, + {"iexcl", 0xA1}, + {"igrave", 0xEC}, + {"iquest", 0xBF}, + {"iuml", 0xEF}, + {"laquo", 0xAB}, + {"lt", '<'}, + {"macr", 0xAF}, + {"micro", 0xB5}, + {"middot", 0xB7}, + {"nbsp", ' '}, + {"not", 0xAC}, + {"ntilde", 0xF1}, + {"oacute", 0xF3}, + {"ocirc", 0xF4}, + {"ograve", 0xF2}, + {"ordf", 0xAA}, + {"ordm", 0xBA}, + {"oslash", 0xF8}, + {"otilde", 0xF5}, + {"ouml", 0xF6}, + {"para", 0xB6}, + {"plusmn", 0xB1}, + {"pound", 0xA3}, + {"quot", '"'}, + {"raquo", 0xBB}, + {"reg", 0xAE}, + {"sect", 0xA7}, + {"shy", 0xAD}, + {"sup1", 0xB9}, + {"sup2", 0xB2}, + {"sup3", 0xB3}, + {"szlig", 0xDF}, + {"thorn", 0xFE}, + {"times", 0xD7}, + {"uacute", 0xFA}, + {"ucirc", 0xFB}, + {"ugrave", 0xF9}, + {"uml", 0xA8}, + {"uuml", 0xFC}, + {"yacute", 0xFD}, + {"yen", 0xA5}, + {"yuml", 0xFF} +}; + +static inline BOOL navigation_visible(HHInfo *info) +{ + return ((info->WinType.fsWinProperties & HHWIN_PROP_TRI_PANE) && !info->WinType.fNotExpanded); +} + /* Loads a string from the resource file */ static LPWSTR HH_LoadString(DWORD dwID) { @@ -109,21 +231,15 @@ BOOL NavigateToUrl(HHInfo *info, LPCWSTR surl) return ret; } -BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) +static BOOL AppendFullPathURL(LPCWSTR file, LPWSTR buf, LPCWSTR index) { - WCHAR buf[INTERNET_MAX_URL_LENGTH]; - WCHAR full_path[MAX_PATH]; - LPWSTR ptr; - static const WCHAR url_format[] = {'m','k',':','@','M','S','I','T','S','t','o','r','e',':','%','s',':',':','%','s','%','s',0}; static const WCHAR slash[] = {'/',0}; static const WCHAR empty[] = {0}; + WCHAR full_path[MAX_PATH]; - TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index)); - - if (!info->web_browser) - return FALSE; + TRACE("%s %p %s\n", debugstr_w(file), buf, debugstr_w(index)); if(!GetFullPathNameW(file, sizeof(full_path)/sizeof(full_path[0]), full_path, NULL)) { WARN("GetFullPathName failed: %u\n", GetLastError()); @@ -131,14 +247,56 @@ BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) } wsprintfW(buf, url_format, full_path, (!index || index[0] == '/') ? empty : slash, index); + return TRUE; +} - /* FIXME: HACK */ - if((ptr = strchrW(buf, '#'))) - *ptr = 0; +BOOL NavigateToChm(HHInfo *info, LPCWSTR file, LPCWSTR index) +{ + WCHAR buf[INTERNET_MAX_URL_LENGTH]; + + TRACE("%p %s %s\n", info, debugstr_w(file), debugstr_w(index)); + + if ((!info->web_browser) || !AppendFullPathURL(file, buf, index)) + return FALSE; return SUCCEEDED(navigate_url(info, buf)); } +static void DoSync(HHInfo *info) +{ + WCHAR buf[INTERNET_MAX_URL_LENGTH]; + HRESULT hres; + BSTR url; + + hres = IWebBrowser2_get_LocationURL(info->web_browser, &url); + + if (FAILED(hres)) + { + WARN("get_LocationURL failed: %08x\n", hres); + return; + } + + /* If we're not currently viewing a page in the active .chm file, abort */ + if ((!AppendFullPathURL(info->WinType.pszFile, buf, NULL)) || (lstrlenW(buf) > lstrlenW(url))) + { + SysFreeString(url); + return; + } + + if (lstrcmpiW(buf, url) > 0) + { + static const WCHAR delimW[] = {':',':','/',0}; + const WCHAR *index; + + index = strstrW(url, delimW); + + if (index) + ActivateContentTopic(info->tabs[TAB_CONTENTS].hwnd, index + 3, info->content); /* skip over ::/ */ + } + + SysFreeString(url); +} + /* Size Bar */ #define SIZEBAR_WIDTH 4 @@ -183,7 +341,7 @@ static void SB_OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) static void SB_OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam) { - HHInfo *pHHInfo = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *pHHInfo = (HHInfo *)GetWindowLongPtrW(hWnd, 0); POINT pt; pt.x = (short)LOWORD(lParam); @@ -234,7 +392,7 @@ static void HH_RegisterSizeBarClass(HHInfo *pHHInfo) wcex.style = 0; wcex.lpfnWndProc = SizeBar_WndProc; wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; + wcex.cbWndExtra = sizeof(LONG_PTR); wcex.hInstance = hhctrl_hinstance; wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION); wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_SIZEWE); @@ -264,10 +422,13 @@ static BOOL HH_AddSizeBar(HHInfo *pHHInfo) { HWND hWnd; HWND hwndParent = pHHInfo->WinType.hwndHelp; - DWORD dwStyles = WS_CHILDWINDOW | WS_VISIBLE | WS_OVERLAPPED; + DWORD dwStyles = WS_CHILDWINDOW | WS_OVERLAPPED; DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR; RECT rc; + if (navigation_visible(pHHInfo)) + dwStyles |= WS_VISIBLE; + SB_GetSizeBarRect(pHHInfo, &rc); hWnd = CreateWindowExW(dwExStyles, szSizeBarClass, szEmpty, dwStyles, @@ -277,7 +438,7 @@ static BOOL HH_AddSizeBar(HHInfo *pHHInfo) return FALSE; /* store the pointer to the HH info struct */ - SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)pHHInfo); + SetWindowLongPtrW(hWnd, 0, (LONG_PTR)pHHInfo); pHHInfo->hwndSizeBar = hWnd; return TRUE; @@ -381,7 +542,7 @@ static void ResizeTabChild(HHInfo *info, int tab) static LRESULT Child_OnSize(HWND hwnd) { - HHInfo *info = (HHInfo*)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + HHInfo *info = (HHInfo*)GetWindowLongPtrW(hwnd, 0); RECT rect; if(!info || hwnd != info->WinType.hwndNavigation) @@ -394,12 +555,14 @@ static LRESULT Child_OnSize(HWND hwnd) ResizeTabChild(info, TAB_CONTENTS); ResizeTabChild(info, TAB_INDEX); + ResizeTabChild(info, TAB_SEARCH); return 0; } static LRESULT OnTabChange(HWND hwnd) { - HHInfo *info = (HHInfo*)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + HHInfo *info = (HHInfo*)GetWindowLongPtrW(hwnd, 0); + int tab_id, tab_index, i; TRACE("%p\n", hwnd); @@ -409,7 +572,23 @@ static LRESULT OnTabChange(HWND hwnd) if(info->tabs[info->current_tab].hwnd) ShowWindow(info->tabs[info->current_tab].hwnd, SW_HIDE); - info->current_tab = SendMessageW(info->hwndTabCtrl, TCM_GETCURSEL, 0, 0); + tab_id = (int) SendMessageW(info->hwndTabCtrl, TCM_GETCURSEL, 0, 0); + /* convert the ID of the tab to an index in our tab list */ + tab_index = -1; + for (i=0; i<TAB_NUMTABS; i++) + { + if (info->tabs[i].id == tab_id) + { + tab_index = i; + break; + } + } + if (tab_index == -1) + { + FIXME("Tab ID %d does not correspond to a valid index in the tab list.\n", tab_id); + return 0; + } + info->current_tab = tab_index; if(info->tabs[info->current_tab].hwnd) ShowWindow(info->tabs[info->current_tab].hwnd, SW_SHOW); @@ -456,6 +635,8 @@ static LRESULT OnTopicChange(HHInfo *info, void *user_data) IndexSubItem *item = &iiter->items[i]; WCHAR *name = iiter->keyword; + if(!item->name) + item->name = GetDocumentTitle(info->pCHMInfo, item->local); if(item->name) name = item->name; memset(&lvi, 0, sizeof(lvi)); @@ -521,7 +702,7 @@ static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LP case WM_SIZE: return Child_OnSize(hWnd); case WM_NOTIFY: { - HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, 0); NMHDR *nmhdr = (NMHDR*)lParam; switch(nmhdr->code) { @@ -529,6 +710,24 @@ static LRESULT CALLBACK Child_WndProc(HWND hWnd, UINT message, WPARAM wParam, LP return OnTabChange(hWnd); case TVN_SELCHANGEDW: return OnTopicChange(info, (void*)((NMTREEVIEWW *)lParam)->itemNew.lParam); + case TVN_ITEMEXPANDINGW: { + TVITEMW *item = &((NMTREEVIEWW *)lParam)->itemNew; + HWND hwndTreeView = info->tabs[TAB_CONTENTS].hwnd; + + item->mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; + if (item->state & TVIS_EXPANDED) + { + item->iImage = HHTV_FOLDER; + item->iSelectedImage = HHTV_FOLDER; + } + else + { + item->iImage = HHTV_OPENFOLDER; + item->iSelectedImage = HHTV_OPENFOLDER; + } + SendMessageW(hwndTreeView, TVM_SETITEMW, 0, (LPARAM)item); + return 0; + } case NM_DBLCLK: if(!info) return 0; @@ -604,7 +803,7 @@ static void HH_RegisterChildWndClass(HHInfo *pHHInfo) wcex.style = 0; wcex.lpfnWndProc = Child_WndProc; wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; + wcex.cbWndExtra = sizeof(LONG_PTR); wcex.hInstance = hhctrl_hinstance; wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION); wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); @@ -620,9 +819,57 @@ static void HH_RegisterChildWndClass(HHInfo *pHHInfo) #define ICON_SIZE 20 +static void DisplayPopupMenu(HHInfo *info) +{ + HMENU menu, submenu; + TBBUTTONINFOW button; + MENUITEMINFOW item; + POINT coords; + RECT rect; + DWORD index; + + menu = LoadMenuW(hhctrl_hinstance, MAKEINTRESOURCEW(MENU_POPUP)); + + if (!menu) + return; + + submenu = GetSubMenu(menu, 0); + + /* Update the Show/Hide menu item */ + item.cbSize = sizeof(MENUITEMINFOW); + item.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_STRING; + item.fType = MFT_STRING; + item.fState = MF_ENABLED; + + if (info->WinType.fNotExpanded) + item.dwTypeData = HH_LoadString(IDS_SHOWTABS); + else + item.dwTypeData = HH_LoadString(IDS_HIDETABS); + + SetMenuItemInfoW(submenu, IDTB_EXPAND, FALSE, &item); + heap_free(item.dwTypeData); + + /* Find the index toolbar button */ + button.cbSize = sizeof(TBBUTTONINFOW); + button.dwMask = TBIF_COMMAND; + index = SendMessageW(info->WinType.hwndToolBar, TB_GETBUTTONINFOW, IDTB_OPTIONS, (LPARAM) &button); + + if (index == -1) + return; + + /* Get position */ + SendMessageW(info->WinType.hwndToolBar, TB_GETITEMRECT, index, (LPARAM) &rect); + + coords.x = rect.left; + coords.y = rect.bottom; + + ClientToScreen(info->WinType.hwndToolBar, &coords); + TrackPopupMenu(submenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | TPM_NOANIMATION, coords.x, coords.y, 0, info->WinType.hwndHelp, NULL); +} + static void TB_OnClick(HWND hWnd, DWORD dwID) { - HHInfo *info = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *info = (HHInfo *)GetWindowLongPtrW(hWnd, 0); switch (dwID) { @@ -641,11 +888,27 @@ static void TB_OnClick(HWND hWnd, DWORD dwID) case IDTB_FORWARD: DoPageAction(info, WB_GOFORWARD); break; + case IDTB_PRINT: + DoPageAction(info, WB_PRINT); + break; case IDTB_EXPAND: case IDTB_CONTRACT: + ExpandContract(info); + break; case IDTB_SYNC: - case IDTB_PRINT: + DoSync(info); + break; case IDTB_OPTIONS: + DisplayPopupMenu(info); + break; + case IDTB_NOTES: + case IDTB_CONTENTS: + case IDTB_INDEX: + case IDTB_SEARCH: + case IDTB_HISTORY: + case IDTB_FAVORITES: + /* These are officially unimplemented as of the Windows 7 SDK */ + break; case IDTB_BROWSE_FWD: case IDTB_BROWSE_BACK: case IDTB_JUMP1: @@ -658,10 +921,9 @@ static void TB_OnClick(HWND hWnd, DWORD dwID) } } -static void TB_AddButton(TBBUTTON *pButtons, DWORD dwIndex, DWORD dwID) +static void TB_AddButton(TBBUTTON *pButtons, DWORD dwIndex, DWORD dwID, DWORD dwBitmap) { - /* FIXME: Load the correct button bitmaps */ - pButtons[dwIndex].iBitmap = STD_PRINT; + pButtons[dwIndex].iBitmap = dwBitmap; pButtons[dwIndex].idCommand = dwID; pButtons[dwIndex].fsState = TBSTATE_ENABLED; pButtons[dwIndex].fsStyle = BTNS_BUTTON; @@ -669,51 +931,68 @@ static void TB_AddButton(TBBUTTON *pButtons, DWORD dwIndex, DWORD dwID) pButtons[dwIndex].iString = 0; } -static void TB_AddButtonsFromFlags(TBBUTTON *pButtons, DWORD dwButtonFlags, LPDWORD pdwNumButtons) +static void TB_AddButtonsFromFlags(HHInfo *pHHInfo, TBBUTTON *pButtons, DWORD dwButtonFlags, LPDWORD pdwNumButtons) { + int nHistBitmaps = 0, nStdBitmaps = 0, nHHBitmaps = 0; + HWND hToolbar = pHHInfo->WinType.hwndToolBar; + TBADDBITMAP tbAB; + DWORD unsupported; + + /* Common bitmaps */ + tbAB.hInst = HINST_COMMCTRL; + tbAB.nID = IDB_HIST_LARGE_COLOR; + nHistBitmaps = SendMessageW(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tbAB); + tbAB.nID = IDB_STD_LARGE_COLOR; + nStdBitmaps = SendMessageW(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tbAB); + /* hhctrl.ocx bitmaps */ + tbAB.hInst = hhctrl_hinstance; + tbAB.nID = IDB_HHTOOLBAR; + nHHBitmaps = SendMessageW(hToolbar, TB_ADDBITMAP, HHTB_NUMBITMAPS, (LPARAM)&tbAB); + *pdwNumButtons = 0; + unsupported = dwButtonFlags & (HHWIN_BUTTON_BROWSE_FWD | + HHWIN_BUTTON_BROWSE_BCK | HHWIN_BUTTON_NOTES | HHWIN_BUTTON_CONTENTS | + HHWIN_BUTTON_INDEX | HHWIN_BUTTON_SEARCH | HHWIN_BUTTON_HISTORY | + HHWIN_BUTTON_FAVORITES | HHWIN_BUTTON_JUMP1 | HHWIN_BUTTON_JUMP2 | + HHWIN_BUTTON_ZOOM | HHWIN_BUTTON_TOC_NEXT | HHWIN_BUTTON_TOC_PREV); + if (unsupported) + FIXME("got asked for unsupported buttons: %06x\n", unsupported); + if (dwButtonFlags & HHWIN_BUTTON_EXPAND) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_EXPAND); + { + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_EXPAND, nHHBitmaps + HHTB_EXPAND); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_CONTRACT, nHHBitmaps + HHTB_CONTRACT); + + if (pHHInfo->WinType.fNotExpanded) + pButtons[1].fsState |= TBSTATE_HIDDEN; + else + pButtons[0].fsState |= TBSTATE_HIDDEN; + } if (dwButtonFlags & HHWIN_BUTTON_BACK) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_BACK); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_BACK, nHistBitmaps + HIST_BACK); if (dwButtonFlags & HHWIN_BUTTON_FORWARD) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_FORWARD); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_FORWARD, nHistBitmaps + HIST_FORWARD); if (dwButtonFlags & HHWIN_BUTTON_STOP) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_STOP); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_STOP, nHHBitmaps + HHTB_STOP); if (dwButtonFlags & HHWIN_BUTTON_REFRESH) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_REFRESH); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_REFRESH, nHHBitmaps + HHTB_REFRESH); if (dwButtonFlags & HHWIN_BUTTON_HOME) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_HOME); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_HOME, nHHBitmaps + HHTB_HOME); if (dwButtonFlags & HHWIN_BUTTON_SYNC) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_SYNC); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_SYNC, nHHBitmaps + HHTB_SYNC); if (dwButtonFlags & HHWIN_BUTTON_OPTIONS) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_OPTIONS); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_OPTIONS, nStdBitmaps + STD_PROPERTIES); if (dwButtonFlags & HHWIN_BUTTON_PRINT) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_PRINT); - - if (dwButtonFlags & HHWIN_BUTTON_JUMP1) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_JUMP1); - - if (dwButtonFlags & HHWIN_BUTTON_JUMP2) - TB_AddButton(pButtons,(*pdwNumButtons)++, IDTB_JUMP2); - - if (dwButtonFlags & HHWIN_BUTTON_ZOOM) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_ZOOM); - - if (dwButtonFlags & HHWIN_BUTTON_TOC_NEXT) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_TOC_NEXT); - - if (dwButtonFlags & HHWIN_BUTTON_TOC_PREV) - TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_TOC_PREV); + TB_AddButton(pButtons, (*pdwNumButtons)++, IDTB_PRINT, nStdBitmaps + STD_PRINT); } static BOOL HH_AddToolbar(HHInfo *pHHInfo) @@ -722,7 +1001,6 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo) HWND hwndParent = pHHInfo->WinType.hwndHelp; DWORD toolbarFlags; TBBUTTON buttons[IDTB_TOC_PREV - IDTB_EXPAND]; - TBADDBITMAP tbAB; DWORD dwStyles, dwExStyles; DWORD dwNumButtons, dwIndex; @@ -731,10 +1009,7 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo) else toolbarFlags = HHWIN_DEF_BUTTONS; - TB_AddButtonsFromFlags(buttons, toolbarFlags, &dwNumButtons); - - dwStyles = WS_CHILDWINDOW | WS_VISIBLE | TBSTYLE_FLAT | - TBSTYLE_WRAPABLE | TBSTYLE_TOOLTIPS | CCS_NODIVIDER; + dwStyles = WS_CHILDWINDOW | TBSTYLE_FLAT | TBSTYLE_WRAPABLE | TBSTYLE_TOOLTIPS | CCS_NODIVIDER; dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR; hToolbar = CreateWindowExW(dwExStyles, TOOLBARCLASSNAMEW, NULL, dwStyles, @@ -742,15 +1017,13 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo) hhctrl_hinstance, NULL); if (!hToolbar) return FALSE; + pHHInfo->WinType.hwndToolBar = hToolbar; SendMessageW(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(ICON_SIZE, ICON_SIZE)); SendMessageW(hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); SendMessageW(hToolbar, WM_SETFONT, (WPARAM)pHHInfo->hFont, TRUE); - /* FIXME: Load correct icons for all buttons */ - tbAB.hInst = HINST_COMMCTRL; - tbAB.nID = IDB_STD_LARGE_COLOR; - SendMessageW(hToolbar, TB_ADDBITMAP, 0, (LPARAM)&tbAB); + TB_AddButtonsFromFlags(pHHInfo, buttons, toolbarFlags, &dwNumButtons); for (dwIndex = 0; dwIndex < dwNumButtons; dwIndex++) { @@ -764,9 +1037,9 @@ static BOOL HH_AddToolbar(HHInfo *pHHInfo) SendMessageW(hToolbar, TB_ADDBUTTONSW, dwNumButtons, (LPARAM)buttons); SendMessageW(hToolbar, TB_AUTOSIZE, 0, 0); - ShowWindow(hToolbar, SW_SHOW); + if (pHHInfo->WinType.fsWinProperties & HHWIN_PROP_TRI_PANE) + ShowWindow(hToolbar, SW_SHOW); - pHHInfo->WinType.hwndToolBar = hToolbar; return TRUE; } @@ -813,10 +1086,13 @@ static BOOL HH_AddNavigationPane(HHInfo *info) { HWND hWnd, hwndTabCtrl; HWND hwndParent = info->WinType.hwndHelp; - DWORD dwStyles = WS_CHILDWINDOW | WS_VISIBLE; + DWORD dwStyles = WS_CHILDWINDOW; DWORD dwExStyles = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR; RECT rc; + if (navigation_visible(info)) + dwStyles |= WS_VISIBLE; + NP_GetNavigationRect(info, &rc); hWnd = CreateWindowExW(dwExStyles, szChildClass, szEmpty, dwStyles, @@ -825,9 +1101,9 @@ static BOOL HH_AddNavigationPane(HHInfo *info) if (!hWnd) return FALSE; - SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)info); + SetWindowLongPtrW(hWnd, 0, (LONG_PTR)info); - hwndTabCtrl = CreateWindowExW(dwExStyles, WC_TABCONTROLW, szEmpty, dwStyles, + hwndTabCtrl = CreateWindowExW(dwExStyles, WC_TABCONTROLW, szEmpty, dwStyles | WS_VISIBLE, 0, TAB_TOP_PADDING, rc.right - TAB_RIGHT_PADDING, rc.bottom - TAB_TOP_PADDING, @@ -861,14 +1137,22 @@ static void HP_GetHTMLRect(HHInfo *info, RECT *rc) RECT rectTB, rectWND, rectNP, rectSB; GetClientRect(info->WinType.hwndHelp, &rectWND); - GetClientRect(info->WinType.hwndToolBar, &rectTB); - GetClientRect(info->WinType.hwndNavigation, &rectNP); GetClientRect(info->hwndSizeBar, &rectSB); - rc->left = rectNP.right + rectSB.right; - rc->top = rectTB.bottom; + rc->left = 0; + rc->top = 0; + if (navigation_visible(info)) + { + GetClientRect(info->WinType.hwndNavigation, &rectNP); + rc->left += rectNP.right + rectSB.right; + } + if (info->WinType.fsWinProperties & HHWIN_PROP_TRI_PANE) + { + GetClientRect(info->WinType.hwndToolBar, &rectTB); + rc->top += rectTB.bottom; + } rc->right = rectWND.right - rc->left; - rc->bottom = rectWND.bottom - rectTB.bottom; + rc->bottom = rectWND.bottom - rc->top; } static BOOL HH_AddHTMLPane(HHInfo *pHHInfo) @@ -891,7 +1175,7 @@ static BOOL HH_AddHTMLPane(HHInfo *pHHInfo) return FALSE; /* store the pointer to the HH info struct */ - SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)pHHInfo); + SetWindowLongPtrW(hWnd, 0, (LONG_PTR)pHHInfo); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); @@ -902,18 +1186,29 @@ static BOOL HH_AddHTMLPane(HHInfo *pHHInfo) static BOOL AddContentTab(HHInfo *info) { + HIMAGELIST hImageList; + HBITMAP hBitmap; + HWND hWnd; + if(info->tabs[TAB_CONTENTS].id == -1) return TRUE; /* No "Contents" tab */ - info->tabs[TAB_CONTENTS].hwnd = CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEWW, - szEmpty, WS_CHILD | WS_BORDER | 0x25, 50, 50, 100, 100, - info->WinType.hwndNavigation, NULL, hhctrl_hinstance, NULL); - if(!info->tabs[TAB_CONTENTS].hwnd) { + hWnd = CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEWW, szEmpty, WS_CHILD | WS_BORDER | TVS_LINESATROOT + | TVS_SHOWSELALWAYS | TVS_HASBUTTONS, 50, 50, 100, 100, + info->WinType.hwndNavigation, NULL, hhctrl_hinstance, NULL); + if(!hWnd) { ERR("Could not create treeview control\n"); return FALSE; } + hImageList = ImageList_Create(16, 16, ILC_COLOR32, 0, HHTV_NUMBITMAPS); + hBitmap = LoadBitmapW(hhctrl_hinstance, MAKEINTRESOURCEW(IDB_HHTREEVIEW)); + ImageList_Add(hImageList, hBitmap, NULL); + SendMessageW(hWnd, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImageList); + + info->contents.hImageList = hImageList; + info->tabs[TAB_CONTENTS].hwnd = hWnd; ResizeTabChild(info, TAB_CONTENTS); - ShowWindow(info->tabs[TAB_CONTENTS].hwnd, SW_SHOW); + ShowWindow(hWnd, SW_SHOW); return TRUE; } @@ -1003,7 +1298,7 @@ static BOOL AddSearchTab(HHInfo *info) info->search.hwndContainer = hwndContainer; info->tabs[TAB_SEARCH].hwnd = hwndContainer; - SetWindowLongPtrW(hwndContainer, GWLP_USERDATA, (LONG_PTR)info); + SetWindowLongPtrW(hwndContainer, 0, (LONG_PTR)info); ResizeTabChild(info, TAB_SEARCH); @@ -1043,7 +1338,7 @@ static void ResizePopupChild(HHInfo *info) static LRESULT CALLBACK HelpPopup_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - HHInfo *info = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *info = (HHInfo *)GetWindowLongPtrW(hWnd, 0); switch (message) { @@ -1073,7 +1368,7 @@ static LRESULT CALLBACK PopupChild_WndProc(HWND hWnd, UINT message, WPARAM wPara switch(nmhdr->code) { case NM_DBLCLK: { - HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, 0); IndexSubItem *iter; if(info == 0 || lParam == 0) @@ -1086,7 +1381,7 @@ static LRESULT CALLBACK PopupChild_WndProc(HWND hWnd, UINT message, WPARAM wPara return 0; } case NM_RETURN: { - HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *info = (HHInfo*)GetWindowLongPtrW(hWnd, 0); IndexSubItem *iter; LVITEMW lvItem; @@ -1128,7 +1423,7 @@ static BOOL AddIndexPopup(HHInfo *info) wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = HelpPopup_WndProc; wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; + wcex.cbWndExtra = sizeof(LONG_PTR); wcex.hInstance = hhctrl_hinstance; wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION); wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); @@ -1142,7 +1437,7 @@ static BOOL AddIndexPopup(HHInfo *info) wcex.style = 0; wcex.lpfnWndProc = PopupChild_WndProc; wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; + wcex.cbWndExtra = sizeof(LONG_PTR); wcex.hInstance = hhctrl_hinstance; wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION); wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); @@ -1190,8 +1485,8 @@ static BOOL AddIndexPopup(HHInfo *info) info->popup.hwndCallback = hwndCallback; info->popup.hwndPopup = hwndPopup; info->popup.hwndList = hwndList; - SetWindowLongPtrW(hwndPopup, GWLP_USERDATA, (LONG_PTR)info); - SetWindowLongPtrW(hwndCallback, GWLP_USERDATA, (LONG_PTR)info); + SetWindowLongPtrW(hwndPopup, 0, (LONG_PTR)info); + SetWindowLongPtrW(hwndCallback, 0, (LONG_PTR)info); ResizePopupChild(info); ShowWindow(hwndList, SW_SHOW); @@ -1201,22 +1496,57 @@ static BOOL AddIndexPopup(HHInfo *info) /* Viewer Window */ +static void ExpandContract(HHInfo *pHHInfo) +{ + RECT r, nav; + + pHHInfo->WinType.fNotExpanded = !pHHInfo->WinType.fNotExpanded; + GetWindowRect(pHHInfo->WinType.hwndHelp, &r); + NP_GetNavigationRect(pHHInfo, &nav); + + /* hide/show both the nav bar and the size bar */ + if (pHHInfo->WinType.fNotExpanded) + { + ShowWindow(pHHInfo->WinType.hwndNavigation, SW_HIDE); + ShowWindow(pHHInfo->hwndSizeBar, SW_HIDE); + r.left = r.left + nav.right; + + SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_EXPAND, MAKELPARAM(FALSE, 0)); + SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_CONTRACT, MAKELPARAM(TRUE, 0)); + } + else + { + ShowWindow(pHHInfo->WinType.hwndNavigation, SW_SHOW); + ShowWindow(pHHInfo->hwndSizeBar, SW_SHOW); + r.left = r.left - nav.right; + + SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_EXPAND, MAKELPARAM(TRUE, 0)); + SendMessageW(pHHInfo->WinType.hwndToolBar, TB_HIDEBUTTON, IDTB_CONTRACT, MAKELPARAM(FALSE, 0)); + } + + MoveWindow(pHHInfo->WinType.hwndHelp, r.left, r.top, r.right-r.left, r.bottom-r.top, TRUE); +} + static LRESULT Help_OnSize(HWND hWnd) { - HHInfo *pHHInfo = (HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + HHInfo *pHHInfo = (HHInfo *)GetWindowLongPtrW(hWnd, 0); DWORD dwSize; RECT rc; if (!pHHInfo) return 0; - NP_GetNavigationRect(pHHInfo, &rc); - SetWindowPos(pHHInfo->WinType.hwndNavigation, HWND_TOP, 0, 0, - rc.right, rc.bottom, SWP_NOMOVE); + if (navigation_visible(pHHInfo)) + { + NP_GetNavigationRect(pHHInfo, &rc); + SetWindowPos(pHHInfo->WinType.hwndNavigation, HWND_TOP, 0, 0, + rc.right, rc.bottom, SWP_NOMOVE); - SB_GetSizeBarRect(pHHInfo, &rc); - SetWindowPos(pHHInfo->hwndSizeBar, HWND_TOP, rc.left, rc.top, - rc.right, rc.bottom, SWP_SHOWWINDOW); + SB_GetSizeBarRect(pHHInfo, &rc); + SetWindowPos(pHHInfo->hwndSizeBar, HWND_TOP, rc.left, rc.top, + rc.right, rc.bottom, SWP_SHOWWINDOW); + + } HP_GetHTMLRect(pHHInfo, &rc); SetWindowPos(pHHInfo->WinType.hwndHTML, HWND_TOP, rc.left, rc.top, @@ -1229,6 +1559,26 @@ static LRESULT Help_OnSize(HWND hWnd) return 0; } +void UpdateHelpWindow(HHInfo *info) +{ + if (!info->WinType.hwndHelp) + return; + + WARN("Only the size of the window is currently updated.\n"); + if (info->WinType.fsValidMembers & HHWIN_PARAM_RECT) + { + RECT *rect = &info->WinType.rcWindowPos; + INT x, y, width, height; + + x = rect->left; + y = rect->top; + width = rect->right - x; + height = rect->bottom - y; + SetWindowPos(info->WinType.hwndHelp, NULL, rect->left, rect->top, width, height, + SWP_NOZORDER | SWP_NOACTIVATE); + } +} + static LRESULT CALLBACK Help_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) @@ -1240,7 +1590,7 @@ static LRESULT CALLBACK Help_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA case WM_SIZE: return Help_OnSize(hWnd); case WM_CLOSE: - ReleaseHelpViewer((HHInfo *)GetWindowLongPtrW(hWnd, GWLP_USERDATA)); + ReleaseHelpViewer((HHInfo *)GetWindowLongPtrW(hWnd, 0)); return 0; case WM_DESTROY: if(hh_process) @@ -1256,7 +1606,7 @@ static LRESULT CALLBACK Help_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPA static BOOL HH_CreateHelpWindow(HHInfo *info) { - HWND hWnd; + HWND hWnd, parent = 0; RECT winPos = info->WinType.rcWindowPos; WNDCLASSEXW wcex; DWORD dwStyles, dwExStyles; @@ -1271,7 +1621,7 @@ static BOOL HH_CreateHelpWindow(HHInfo *info) wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = Help_WndProc; wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; + wcex.cbWndExtra = sizeof(LONG_PTR); wcex.hInstance = hhctrl_hinstance; wcex.hIcon = LoadIconW(NULL, (LPCWSTR)IDI_APPLICATION); wcex.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW); @@ -1284,7 +1634,11 @@ static BOOL HH_CreateHelpWindow(HHInfo *info) /* Read in window parameters if available */ if (info->WinType.fsValidMembers & HHWIN_PARAM_STYLES) - dwStyles = info->WinType.dwStyles | WS_OVERLAPPEDWINDOW; + { + dwStyles = info->WinType.dwStyles; + if (!(info->WinType.dwStyles & WS_CHILD)) + dwStyles |= WS_OVERLAPPEDWINDOW; + } else dwStyles = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; @@ -1310,11 +1664,27 @@ static BOOL HH_CreateHelpWindow(HHInfo *info) height = WINTYPE_DEFAULT_HEIGHT; } + if (!(info->WinType.fsWinProperties & HHWIN_PROP_TRI_PANE) && info->WinType.fNotExpanded) + { + if (!(info->WinType.fsValidMembers & HHWIN_PARAM_NAV_WIDTH) && + info->WinType.iNavWidth == 0) + { + info->WinType.iNavWidth = WINTYPE_DEFAULT_NAVWIDTH; + } + + x += info->WinType.iNavWidth; + width -= info->WinType.iNavWidth; + } + + caption = info->WinType.pszCaption; if (!*caption) caption = info->pCHMInfo->defTitle; + if (info->WinType.dwStyles & WS_CHILD) + parent = info->WinType.hwndCaller; + hWnd = CreateWindowExW(dwExStyles, windowClassW, caption, - dwStyles, x, y, width, height, NULL, NULL, hhctrl_hinstance, NULL); + dwStyles, x, y, width, height, parent, NULL, hhctrl_hinstance, NULL); if (!hWnd) return FALSE; @@ -1322,7 +1692,7 @@ static BOOL HH_CreateHelpWindow(HHInfo *info) UpdateWindow(hWnd); /* store the pointer to the HH info struct */ - SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LONG_PTR)info); + SetWindowLongPtrW(hWnd, 0, (LONG_PTR)info); info->WinType.hwndHelp = hWnd; return TRUE; @@ -1332,7 +1702,7 @@ static void HH_CreateFont(HHInfo *pHHInfo) { LOGFONTW lf; - GetObjectW(GetStockObject(ANSI_VAR_FONT), sizeof(LOGFONTW), &lf); + GetObjectW(GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONTW), &lf); lf.lfWeight = FW_NORMAL; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; @@ -1390,9 +1760,39 @@ static BOOL CreateViewer(HHInfo *pHHInfo) InitContent(pHHInfo); InitIndex(pHHInfo); + pHHInfo->viewer_initialized = TRUE; return TRUE; } +void wintype_stringsW_free(struct wintype_stringsW *stringsW) +{ + heap_free(stringsW->pszType); + heap_free(stringsW->pszCaption); + heap_free(stringsW->pszToc); + heap_free(stringsW->pszIndex); + heap_free(stringsW->pszFile); + heap_free(stringsW->pszHome); + heap_free(stringsW->pszJump1); + heap_free(stringsW->pszJump2); + heap_free(stringsW->pszUrlJump1); + heap_free(stringsW->pszUrlJump2); +} + +void wintype_stringsA_free(struct wintype_stringsA *stringsA) +{ + heap_free(stringsA->pszType); + heap_free(stringsA->pszCaption); + heap_free(stringsA->pszToc); + heap_free(stringsA->pszIndex); + heap_free(stringsA->pszFile); + heap_free(stringsA->pszHome); + heap_free(stringsA->pszJump1); + heap_free(stringsA->pszJump2); + heap_free(stringsA->pszUrlJump1); + heap_free(stringsA->pszUrlJump2); + heap_free(stringsA->pszCustomTabs); +} + void ReleaseHelpViewer(HHInfo *info) { TRACE("(%p)\n", info); @@ -1400,17 +1800,10 @@ void ReleaseHelpViewer(HHInfo *info) if (!info) return; - /* Free allocated strings */ - heap_free(info->pszType); - heap_free(info->pszCaption); - heap_free(info->pszToc); - heap_free(info->pszIndex); - heap_free(info->pszFile); - heap_free(info->pszHome); - heap_free(info->pszJump1); - heap_free(info->pszJump2); - heap_free(info->pszUrlJump1); - heap_free(info->pszUrlJump2); + list_remove(&info->entry); + + wintype_stringsA_free(&info->stringsA); + wintype_stringsW_free(&info->stringsW); if (info->pCHMInfo) CloseCHM(info->pCHMInfo); @@ -1420,6 +1813,8 @@ void ReleaseHelpViewer(HHInfo *info) ReleaseIndex(info); ReleaseSearch(info); + if(info->contents.hImageList) + ImageList_Destroy(info->contents.hImageList); if(info->WinType.hwndHelp) DestroyWindow(info->WinType.hwndHelp); @@ -1427,10 +1822,16 @@ void ReleaseHelpViewer(HHInfo *info) OleUninitialize(); } -HHInfo *CreateHelpViewer(LPCWSTR filename) +HHInfo *CreateHelpViewer(HHInfo *info, LPCWSTR filename, HWND caller) { - HHInfo *info = heap_alloc_zero(sizeof(HHInfo)); - int i; + HHInfo *tmp_info; + unsigned int i; + + if(!info) + { + info = heap_alloc_zero(sizeof(HHInfo)); + list_add_tail(&window_list, &info->entry); + } /* Set the invalid tab ID (-1) as the default value for all * of the tabs, this matches a failed TCM_INSERTITEM call. @@ -1450,11 +1851,121 @@ HHInfo *CreateHelpViewer(LPCWSTR filename) ReleaseHelpViewer(info); return NULL; } + info->WinType.hwndCaller = caller; - if(!CreateViewer(info)) { + /* If the window is already open then load the file in that existing window */ + if ((tmp_info = find_window(info->WinType.pszType)) && tmp_info != info) + { + ReleaseHelpViewer(info); + return CreateHelpViewer(tmp_info, filename, caller); + } + + if(!info->viewer_initialized && !CreateViewer(info)) { ReleaseHelpViewer(info); return NULL; } return info; } + +/* + * Search the table of HTML entities and return the corresponding ANSI symbol. + */ +static char find_html_symbol(const char *entity, int entity_len) +{ + int max = sizeof(html_encoded_symbols)/sizeof(html_encoded_symbols[0])-1; + int min = 0, dir; + + while(min <= max) + { + int pos = (min+max)/2; + const char *encoded_symbol = html_encoded_symbols[pos].html_code; + dir = strncmp(encoded_symbol, entity, entity_len); + if(dir == 0 && !encoded_symbol[entity_len]) return html_encoded_symbols[pos].ansi_symbol; + if(dir < 0) + min = pos+1; + else + max = pos-1; + } + return 0; +} + +/* + * Decode a string containing HTML encoded characters into a unicode string. + */ +WCHAR *decode_html(const char *html_fragment, int html_fragment_len, UINT code_page) +{ + const char *h = html_fragment, *amp, *sem; + char symbol, *tmp; + int len, tmp_len = 0; + WCHAR *unicode_text; + + tmp = heap_alloc(html_fragment_len+1); + while(1) + { + symbol = 0; + amp = strchr(h, '&'); + if(!amp) break; + len = amp-h; + /* Copy the characters prior to the HTML encoded character */ + memcpy(&tmp[tmp_len], h, len); + tmp_len += len; + amp++; /* skip ampersand */ + sem = strchr(amp, ';'); + /* Require a semicolon after the ampersand */ + if(!sem) + { + h = amp; + tmp[tmp_len++] = '&'; + continue; + } + /* Find the symbol either by using the ANSI character number (prefixed by the pound symbol) + * or by searching the HTML entity table */ + len = sem-amp; + if(amp[0] == '#') + { + char *endnum = NULL; + int tmp; + + tmp = (char) strtol(amp, &endnum, 10); + if(endnum == sem) + symbol = tmp; + } + else + symbol = find_html_symbol(amp, len); + if(!symbol) + { + FIXME("Failed to translate HTML encoded character '&%.*s;'.\n", len, amp); + h = amp; + tmp[tmp_len++] = '&'; + continue; + } + /* Insert the new symbol */ + h = sem+1; + tmp[tmp_len++] = symbol; + } + /* Convert any remaining characters */ + len = html_fragment_len-(h-html_fragment); + memcpy(&tmp[tmp_len], h, len); + tmp_len += len; + tmp[tmp_len++] = 0; /* NULL-terminate the string */ + + len = MultiByteToWideChar(code_page, 0, tmp, tmp_len, NULL, 0); + unicode_text = heap_alloc(len*sizeof(WCHAR)); + MultiByteToWideChar(code_page, 0, tmp, tmp_len, unicode_text, len); + heap_free(tmp); + return unicode_text; +} + +/* Find the HTMLHelp structure for an existing window title */ +HHInfo *find_window(const WCHAR *window) +{ + HHInfo *info; + + LIST_FOR_EACH_ENTRY(info, &window_list, HHInfo, entry) + { + if (strcmpW(info->WinType.pszType, window) == 0) + return info; + } + return NULL; +} diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.c b/reactos/dll/win32/hhctrl.ocx/hhctrl.c index 5aa5e720760..303d8602584 100644 --- a/reactos/dll/win32/hhctrl.ocx/hhctrl.c +++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.c @@ -21,6 +21,18 @@ #include <wine/debug.h> +#include <stdarg.h> + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "htmlhelp.h" +#include "ole2.h" +#include "rpcproxy.h" + #define INIT_GUID #include "hhctrl.h" @@ -29,6 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp); HINSTANCE hhctrl_hinstance; BOOL hh_process = FALSE; +extern struct list window_list; + BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(%p,%d,%p)\n", hInstance, fdwReason, lpvReserved); @@ -86,9 +100,41 @@ static const char *command_to_string(UINT command) #undef X } -static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen) +static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen, WCHAR **index, WCHAR **window) { + const WCHAR *extra; + WCHAR chm_file[MAX_PATH]; + static const WCHAR helpW[] = {'\\','h','e','l','p','\\',0}; + static const WCHAR delimW[] = {':',':',0}; + static const WCHAR delim2W[] = {'>',0}; + + filename = skip_schema(filename); + + /* the format is "helpFile[::/index][>window]" */ + if (index) *index = NULL; + if (window) *window = NULL; + + extra = strstrW(filename, delim2W); + if (extra) + { + memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR)); + chm_file[extra-filename] = 0; + filename = chm_file; + if (window) + *window = strdupW(extra+1); + } + + extra = strstrW(filename, delimW); + if (extra) + { + if (filename != chm_file) + memcpy(chm_file, filename, (extra-filename)*sizeof(WCHAR)); + chm_file[extra-filename] = 0; + filename = chm_file; + if (index) + *index = strdupW(extra+2); + } GetFullPathNameW(filename, buflen, fullname, NULL); if (GetFileAttributesW(fullname) == INVALID_FILE_ATTRIBUTES) @@ -115,64 +161,116 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat { case HH_DISPLAY_TOPIC: case HH_DISPLAY_TOC: + case HH_DISPLAY_INDEX: case HH_DISPLAY_SEARCH:{ - static const WCHAR delimW[] = {':',':',0}; - HHInfo *info; BOOL res; - WCHAR chm_file[MAX_PATH]; - const WCHAR *index; - - FIXME("Not all HH cases handled correctly\n"); + NMHDR nmhdr; + HHInfo *info = NULL; + WCHAR *window = NULL; + const WCHAR *index = NULL; + WCHAR *default_index = NULL; + int tab_index = TAB_CONTENTS; if (!filename) return NULL; - index = strstrW(filename, delimW); - if (index) - { - memcpy(chm_file, filename, (index-filename)*sizeof(WCHAR)); - chm_file[index-filename] = 0; - filename = chm_file; - index += 2; /* advance beyond "::" for calling NavigateToChm() later */ - } - - if (!resolve_filename(filename, fullname, MAX_PATH)) + if (!resolve_filename(filename, fullname, MAX_PATH, &default_index, &window)) { WARN("can't find %s\n", debugstr_w(filename)); return 0; } + index = default_index; - info = CreateHelpViewer(fullname); + if (window) + info = find_window(window); + + info = CreateHelpViewer(info, fullname, caller); if(!info) + { + heap_free(default_index); + heap_free(window); return NULL; + } if(!index) index = info->WinType.pszFile; + if(!info->WinType.pszType) + info->WinType.pszType = info->stringsW.pszType = window; + else + heap_free(window); + + /* called to load a specified topic */ + switch(command) + { + case HH_DISPLAY_TOPIC: + case HH_DISPLAY_TOC: + if (data) + index = (const WCHAR *)data; + break; + } res = NavigateToChm(info, info->pCHMInfo->szFile, index); + heap_free(default_index); + if(!res) { ReleaseHelpViewer(info); return NULL; } + + switch(command) + { + case HH_DISPLAY_TOPIC: + case HH_DISPLAY_TOC: + tab_index = TAB_CONTENTS; + break; + case HH_DISPLAY_INDEX: + tab_index = TAB_INDEX; + if (data) + FIXME("Should select keyword '%s'.\n", debugstr_w((WCHAR *)data)); + break; + case HH_DISPLAY_SEARCH: + tab_index = TAB_SEARCH; + if (data) + FIXME("Should display search specified by HH_FTS_QUERY structure.\n"); + break; + } + /* open the requested tab */ + memset(&nmhdr, 0, sizeof(nmhdr)); + nmhdr.code = TCN_SELCHANGE; + SendMessageW(info->hwndTabCtrl, TCM_SETCURSEL, (WPARAM)info->tabs[tab_index].id, 0); + SendMessageW(info->WinType.hwndNavigation, WM_NOTIFY, 0, (LPARAM)&nmhdr); + return info->WinType.hwndHelp; } case HH_HELP_CONTEXT: { - HHInfo *info; + WCHAR *window = NULL; + HHInfo *info = NULL; LPWSTR url; if (!filename) return NULL; - if (!resolve_filename(filename, fullname, MAX_PATH)) + if (!resolve_filename(filename, fullname, MAX_PATH, NULL, &window)) { WARN("can't find %s\n", debugstr_w(filename)); return 0; } - info = CreateHelpViewer(fullname); + if (window) + info = find_window(window); + + info = CreateHelpViewer(info, fullname, caller); if(!info) + { + heap_free(window); return NULL; + } + + if(!info->WinType.pszType) + info->WinType.pszType = info->stringsW.pszType = window; + else + heap_free(window); url = FindContextAlias(info->pCHMInfo, data); if(!url) @@ -195,6 +293,67 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat } return 0; } + case HH_CLOSE_ALL: { + HHInfo *info, *next; + + LIST_FOR_EACH_ENTRY_SAFE(info, next, &window_list, HHInfo, entry) + { + TRACE("Destroying window %s.\n", debugstr_w(info->WinType.pszType)); + ReleaseHelpViewer(info); + } + return 0; + } + case HH_SET_WIN_TYPE: { + HH_WINTYPEW *wintype = (HH_WINTYPEW *)data; + WCHAR *window = NULL; + HHInfo *info = NULL; + + if (!filename && wintype->pszType) + window = strdupW(wintype->pszType); + else if (!filename || !resolve_filename(filename, fullname, MAX_PATH, NULL, &window) || !window) + { + WARN("can't find window name: %s\n", debugstr_w(filename)); + return 0; + } + info = find_window(window); + if (!info) + { + info = heap_alloc_zero(sizeof(HHInfo)); + info->WinType.pszType = info->stringsW.pszType = window; + list_add_tail(&window_list, &info->entry); + } + else + heap_free(window); + + TRACE("Changing WINTYPE, fsValidMembers=0x%x\n", wintype->fsValidMembers); + + MergeChmProperties(wintype, info, TRUE); + UpdateHelpWindow(info); + return 0; + } + case HH_GET_WIN_TYPE: { + HH_WINTYPEW *wintype = (HH_WINTYPEW *)data; + WCHAR *window = NULL; + HHInfo *info = NULL; + + if (!filename || !resolve_filename(filename, fullname, MAX_PATH, NULL, &window) || !window) + { + WARN("can't find window name: %s\n", debugstr_w(filename)); + return 0; + } + info = find_window(window); + if (!info) + { + WARN("Could not find window named %s.\n", debugstr_w(window)); + heap_free(window); + return (HWND)~0; + } + + TRACE("Retrieving WINTYPE for %s.\n", debugstr_w(window)); + *wintype = info->WinType; + heap_free(window); + return 0; + } default: FIXME("HH case %s not handled.\n", command_to_string( command )); } @@ -202,21 +361,47 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat return 0; } +static void wintypeAtoW(const HH_WINTYPEA *data, HH_WINTYPEW *wdata, struct wintype_stringsW *stringsW) +{ + memcpy(wdata, data, sizeof(*data)); + /* convert all of the ANSI strings to Unicode */ + wdata->pszType = stringsW->pszType = strdupAtoW(data->pszType); + wdata->pszCaption = stringsW->pszCaption = strdupAtoW(data->pszCaption); + wdata->pszToc = stringsW->pszToc = strdupAtoW(data->pszToc); + wdata->pszIndex = stringsW->pszIndex = strdupAtoW(data->pszIndex); + wdata->pszFile = stringsW->pszFile = strdupAtoW(data->pszFile); + wdata->pszHome = stringsW->pszHome = strdupAtoW(data->pszHome); + wdata->pszJump1 = stringsW->pszJump1 = strdupAtoW(data->pszJump1); + wdata->pszJump2 = stringsW->pszJump2 = strdupAtoW(data->pszJump2); + wdata->pszUrlJump1 = stringsW->pszUrlJump1 = strdupAtoW(data->pszUrlJump1); + wdata->pszUrlJump2 = stringsW->pszUrlJump2 = strdupAtoW(data->pszUrlJump2); + wdata->pszCustomTabs = stringsW->pszCustomTabs = strdupAtoW(data->pszCustomTabs); +} + +static void wintypeWtoA(const HH_WINTYPEW *wdata, HH_WINTYPEA *data, struct wintype_stringsA *stringsA) +{ + memcpy(data, wdata, sizeof(*wdata)); + /* convert all of the Unicode strings to ANSI */ + data->pszType = stringsA->pszType = strdupWtoA(wdata->pszType); + data->pszCaption = stringsA->pszCaption = strdupWtoA(wdata->pszCaption); + data->pszToc = stringsA->pszToc = strdupWtoA(wdata->pszToc); + data->pszIndex = stringsA->pszFile = strdupWtoA(wdata->pszIndex); + data->pszFile = stringsA->pszFile = strdupWtoA(wdata->pszFile); + data->pszHome = stringsA->pszHome = strdupWtoA(wdata->pszHome); + data->pszJump1 = stringsA->pszJump1 = strdupWtoA(wdata->pszJump1); + data->pszJump2 = stringsA->pszJump2 = strdupWtoA(wdata->pszJump2); + data->pszUrlJump1 = stringsA->pszUrlJump1 = strdupWtoA(wdata->pszUrlJump1); + data->pszUrlJump2 = stringsA->pszUrlJump2 = strdupWtoA(wdata->pszUrlJump2); + data->pszCustomTabs = stringsA->pszCustomTabs = strdupWtoA(wdata->pszCustomTabs); +} + /****************************************************************** * HtmlHelpA (HHCTRL.OCX.14) */ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data) { - WCHAR *wfile = NULL, *wdata = NULL; - DWORD len; - HWND result; - - if (filename) - { - len = MultiByteToWideChar( CP_ACP, 0, filename, -1, NULL, 0 ); - wfile = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, filename, -1, wfile, len ); - } + WCHAR *wfile = strdupAtoW( filename ); + HWND result = 0; if (data) { @@ -226,22 +411,46 @@ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data case HH_DISPLAY_SEARCH: case HH_DISPLAY_TEXT_POPUP: case HH_GET_LAST_ERROR: - case HH_GET_WIN_TYPE: case HH_KEYWORD_LOOKUP: - case HH_SET_WIN_TYPE: case HH_SYNC: FIXME("structures not handled yet\n"); break; + case HH_SET_WIN_TYPE: + { + struct wintype_stringsW stringsW; + HH_WINTYPEW wdata; + + wintypeAtoW((HH_WINTYPEA *)data, &wdata, &stringsW); + result = HtmlHelpW( caller, wfile, command, (DWORD_PTR)&wdata ); + wintype_stringsW_free(&stringsW); + goto done; + } + case HH_GET_WIN_TYPE: + { + HH_WINTYPEW wdata; + HHInfo *info; + + result = HtmlHelpW( caller, wfile, command, (DWORD_PTR)&wdata ); + if (!wdata.pszType) break; + info = find_window(wdata.pszType); + if (!info) break; + wintype_stringsA_free(&info->stringsA); + wintypeWtoA(&wdata, (HH_WINTYPEA *)data, &info->stringsA); + goto done; + } + case HH_DISPLAY_INDEX: case HH_DISPLAY_TOPIC: case HH_DISPLAY_TOC: case HH_GET_WIN_HANDLE: case HH_SAFE_DISPLAY_TOPIC: - len = MultiByteToWideChar( CP_ACP, 0, (const char*)data, -1, NULL, 0 ); - wdata = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar( CP_ACP, 0, (const char*)data, -1, wdata, len ); - break; + { + WCHAR *wdata = strdupAtoW( (const char *)data ); + result = HtmlHelpW( caller, wfile, command, (DWORD_PTR)wdata ); + heap_free(wdata); + goto done; + } case HH_CLOSE_ALL: case HH_HELP_CONTEXT: @@ -259,10 +468,9 @@ HWND WINAPI HtmlHelpA(HWND caller, LPCSTR filename, UINT command, DWORD_PTR data } } - result = HtmlHelpW( caller, wfile, command, wdata ? (DWORD_PTR)wdata : data ); - + result = HtmlHelpW( caller, wfile, command, data ); +done: heap_free(wfile); - heap_free(wdata); return result; } @@ -275,6 +483,7 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine) int len, buflen, mapid = -1; WCHAR *filename; char *endq = NULL; + HWND hwnd; hh_process = TRUE; @@ -295,6 +504,9 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine) ptr += strlen("mapid")+1; space = strchr(ptr, ' '); + /* command line ends without number */ + if (!space) + return 0; memcpy(idtxt, ptr, space-ptr); idtxt[space-ptr] = '\0'; mapid = atoi(idtxt); @@ -315,6 +527,11 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine) len = endq - szCmdLine; else len = strlen(szCmdLine); + + /* no filename given */ + if (!len) + return 0; + buflen = MultiByteToWideChar(CP_ACP, 0, szCmdLine, len, NULL, 0) + 1; filename = heap_alloc(buflen * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, szCmdLine, len, filename, buflen); @@ -322,12 +539,18 @@ int WINAPI doWinMain(HINSTANCE hInstance, LPSTR szCmdLine) /* Open a specific help topic */ if(mapid != -1) - HtmlHelpW(GetDesktopWindow(), filename, HH_HELP_CONTEXT, mapid); + hwnd = HtmlHelpW(GetDesktopWindow(), filename, HH_HELP_CONTEXT, mapid); else - HtmlHelpW(GetDesktopWindow(), filename, HH_DISPLAY_TOPIC, 0); + hwnd = HtmlHelpW(GetDesktopWindow(), filename, HH_DISPLAY_TOPIC, 0); heap_free(filename); + if (!hwnd) + { + ERR("Failed to open HTML Help file '%s'.\n", szCmdLine); + return 0; + } + while (GetMessageW(&msg, 0, 0, 0)) { TranslateMessage(&msg); @@ -345,3 +568,19 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) FIXME("(%s %s %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); return CLASS_E_CLASSNOTAVAILABLE; } + +/*********************************************************************** + * DllRegisterServer (HHCTRL.OCX.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( hhctrl_hinstance ); +} + +/*********************************************************************** + * DllUnregisterServer (HHCTRL.OCX.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( hhctrl_hinstance ); +} diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.h b/reactos/dll/win32/hhctrl.ocx/hhctrl.h index 4027ab59190..29ce8adc7ef 100644 --- a/reactos/dll/win32/hhctrl.ocx/hhctrl.h +++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.h @@ -44,6 +44,7 @@ #include <wine/itss.h> #include <wine/unicode.h> +#include <wine/list.h> #define WB_GOBACK 0 #define WB_GOFORWARD 1 @@ -51,6 +52,7 @@ #define WB_SEARCH 3 #define WB_REFRESH 4 #define WB_STOP 5 +#define WB_PRINT 6 typedef struct { LPWSTR chm_file; @@ -105,15 +107,20 @@ typedef struct CHMInfo char **strings; DWORD strings_size; + WCHAR *compiledFile; + WCHAR *defWindow; WCHAR *defTopic; WCHAR *defTitle; WCHAR *defToc; + + UINT codePage; } CHMInfo; #define TAB_CONTENTS 0 #define TAB_INDEX 1 #define TAB_SEARCH 2 #define TAB_FAVORITES 3 +#define TAB_NUMTABS TAB_FAVORITES typedef struct { HWND hwnd; @@ -133,6 +140,38 @@ typedef struct { HWND hwndContainer; } SearchTab; +typedef struct { + HIMAGELIST hImageList; +} ContentsTab; + +struct wintype_stringsW { + WCHAR *pszType; + WCHAR *pszCaption; + WCHAR *pszToc; + WCHAR *pszIndex; + WCHAR *pszFile; + WCHAR *pszHome; + WCHAR *pszJump1; + WCHAR *pszJump2; + WCHAR *pszUrlJump1; + WCHAR *pszUrlJump2; + WCHAR *pszCustomTabs; +}; + +struct wintype_stringsA { + char *pszType; + char *pszCaption; + char *pszToc; + char *pszIndex; + char *pszFile; + char *pszHome; + char *pszJump1; + char *pszJump2; + char *pszUrlJump1; + char *pszUrlJump2; + char *pszCustomTabs; +}; + typedef struct { IOleClientSite *client_site; IWebBrowser2 *web_browser; @@ -140,56 +179,60 @@ typedef struct { HH_WINTYPEW WinType; - LPWSTR pszType; - LPWSTR pszCaption; - LPWSTR pszToc; - LPWSTR pszIndex; - LPWSTR pszFile; - LPWSTR pszHome; - LPWSTR pszJump1; - LPWSTR pszJump2; - LPWSTR pszUrlJump1; - LPWSTR pszUrlJump2; - LPWSTR pszCustomTabs; + struct wintype_stringsA stringsA; + struct wintype_stringsW stringsW; + struct list entry; CHMInfo *pCHMInfo; ContentItem *content; IndexItem *index; IndexPopup popup; SearchTab search; + ContentsTab contents; HWND hwndTabCtrl; HWND hwndSizeBar; HFONT hFont; HHTab tabs[TAB_FAVORITES+1]; + int viewer_initialized; DWORD current_tab; } HHInfo; -BOOL InitWebBrowser(HHInfo*,HWND); -void ReleaseWebBrowser(HHInfo*); -void ResizeWebBrowser(HHInfo*,DWORD,DWORD); -void DoPageAction(HHInfo*,DWORD); +BOOL InitWebBrowser(HHInfo*,HWND) DECLSPEC_HIDDEN; +void ReleaseWebBrowser(HHInfo*) DECLSPEC_HIDDEN; +void ResizeWebBrowser(HHInfo*,DWORD,DWORD) DECLSPEC_HIDDEN; +void DoPageAction(HHInfo*,DWORD) DECLSPEC_HIDDEN; -void InitContent(HHInfo*); -void ReleaseContent(HHInfo*); +void InitContent(HHInfo*) DECLSPEC_HIDDEN; +void ReleaseContent(HHInfo*) DECLSPEC_HIDDEN; +void ActivateContentTopic(HWND,LPCWSTR,ContentItem *) DECLSPEC_HIDDEN; -void InitIndex(HHInfo*); -void ReleaseIndex(HHInfo*); +void InitIndex(HHInfo*) DECLSPEC_HIDDEN; +void ReleaseIndex(HHInfo*) DECLSPEC_HIDDEN; -CHMInfo *OpenCHM(LPCWSTR szFile); -BOOL LoadWinTypeFromCHM(HHInfo *info); -CHMInfo *CloseCHM(CHMInfo *pCHMInfo); -void SetChmPath(ChmPath*,LPCWSTR,LPCWSTR); -IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*); -LPWSTR FindContextAlias(CHMInfo*,DWORD); +CHMInfo *OpenCHM(LPCWSTR szFile) DECLSPEC_HIDDEN; +BOOL LoadWinTypeFromCHM(HHInfo *info) DECLSPEC_HIDDEN; +CHMInfo *CloseCHM(CHMInfo *pCHMInfo) DECLSPEC_HIDDEN; +void SetChmPath(ChmPath*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN; +IStream *GetChmStream(CHMInfo*,LPCWSTR,ChmPath*) DECLSPEC_HIDDEN; +LPWSTR FindContextAlias(CHMInfo*,DWORD) DECLSPEC_HIDDEN; +WCHAR *GetDocumentTitle(CHMInfo*,LPCWSTR) DECLSPEC_HIDDEN; -HHInfo *CreateHelpViewer(LPCWSTR); -void ReleaseHelpViewer(HHInfo*); -BOOL NavigateToUrl(HHInfo*,LPCWSTR); -BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR); +HHInfo *CreateHelpViewer(HHInfo*,LPCWSTR,HWND) DECLSPEC_HIDDEN; +void ReleaseHelpViewer(HHInfo*) DECLSPEC_HIDDEN; +BOOL NavigateToUrl(HHInfo*,LPCWSTR) DECLSPEC_HIDDEN; +BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR) DECLSPEC_HIDDEN; +void MergeChmProperties(HH_WINTYPEW*,HHInfo*,BOOL) DECLSPEC_HIDDEN; +void UpdateHelpWindow(HHInfo *info) DECLSPEC_HIDDEN; -void InitSearch(HHInfo *info, const char *needle); -void ReleaseSearch(HHInfo *info); +void InitSearch(HHInfo *info, const char *needle) DECLSPEC_HIDDEN; +void ReleaseSearch(HHInfo *info) DECLSPEC_HIDDEN; + +LPCWSTR skip_schema(LPCWSTR url) DECLSPEC_HIDDEN; +void wintype_stringsA_free(struct wintype_stringsA *stringsA) DECLSPEC_HIDDEN; +void wintype_stringsW_free(struct wintype_stringsW *stringsW) DECLSPEC_HIDDEN; +WCHAR *decode_html(const char *html_fragment, int html_fragment_len, UINT code_page) DECLSPEC_HIDDEN; +HHInfo *find_window(const WCHAR *window) DECLSPEC_HIDDEN; /* memory allocation functions */ @@ -261,9 +304,22 @@ static inline LPWSTR strdupAtoW(LPCSTR str) return strdupnAtoW(str, -1); } +static inline LPSTR strdupWtoA(LPCWSTR str) +{ + LPSTR ret; + DWORD len; + + if(!str) + return NULL; + + len = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); + ret = heap_alloc(len); + WideCharToMultiByte(CP_ACP, 0, str, -1, ret, len, NULL, NULL); + return ret; +} -extern HINSTANCE hhctrl_hinstance; -extern BOOL hh_process; +extern HINSTANCE hhctrl_hinstance DECLSPEC_HIDDEN; +extern BOOL hh_process DECLSPEC_HIDDEN; #endif diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc index 4c7ab5b75ab..751fbdc91de 100644 --- a/reactos/dll/win32/hhctrl.ocx/hhctrl.rc +++ b/reactos/dll/win32/hhctrl.ocx/hhctrl.rc @@ -2,6 +2,7 @@ * HTML Help resources * * Copyright 2005 James Hawkins + * Copyright 2011 Owen Rudge for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,10 +27,6 @@ //#include "htmlhelp.h" //#include "resource.h" -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL - -#include "version.rc" - #ifdef LANGUAGE_CS_CZ #include "Cs.rc" #endif @@ -108,3 +105,21 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Zh.rc" #endif +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +/* @makedep: hhtoolbar.bmp */ +IDB_HHTOOLBAR BITMAP hhtoolbar.bmp + +/* @makedep: hhtreeview.bmp */ +IDB_HHTREEVIEW BITMAP hhtreeview.bmp + +1 TYPELIB hhctrl_tlb.tlb + +#define WINE_FILEDESCRIPTION_STR "Wine htmlhelp OCX" +#define WINE_FILENAME_STR "hhctrl.ocx" +#define WINE_FILEVERSION 5,2,3790,2744 +#define WINE_FILEVERSION_STR "5.2.3790.2744" +#define WINE_PRODUCTVERSION 5,2,3790,2744 +#define WINE_PRODUCTVERSION_STR "5.2.3790.2744" + +#include <wine/wine_common_ver.rc> diff --git a/reactos/dll/win32/hhctrl.ocx/hhctrl_tlb.idl b/reactos/dll/win32/hhctrl.ocx/hhctrl_tlb.idl new file mode 100644 index 00000000000..c2f8a242b6b --- /dev/null +++ b/reactos/dll/win32/hhctrl.ocx/hhctrl_tlb.idl @@ -0,0 +1,98 @@ +/* + * Typelib for hhctrl + * + * Copyright 2010 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "unknwn.idl"; +import "objidl.idl"; +import "oaidl.idl"; + +[ + helpstring("HHCtrl 4.0 Type Library"), + version(4.0), + uuid(adb880a2-d8ff-11cf-9377-00aa003b7a11) +] +library HHCTRLLib +{ + importlib("stdole2.tlb"); + + [ + helpstring("IHHCtrl Interface"), + odl, + dual, + oleautomation, + uuid(adb880a1-d8ff-11cf-9377-00aa003b7a11) + ] + interface IHHCtrl : IDispatch + { + /* FIXME */ + } + + [ + helpstring("Event interface for HHCtrl"), + uuid(adb880a3-d8ff-11cf-9377-00aa003b7a11) + ] + dispinterface _HHCtrlEvents + { + properties: + methods: + [id(0)] void Click(BSTR ParamString); + } + + [ + helpstring("HHCtrl Object"), + progid("Internet.HHCtrl.1"), + vi_progid("Internet.HHCtrl"), + threading(apartment), + version(1.0), + uuid(adb880a6-d8ff-11cf-9377-00aa003b7a11) + ] + coclass OldHHCtrl1 + { + [default] interface IHHCtrl; + [default, source] dispinterface _HHCtrlEvents; + } + + [ + helpstring("HHCtrl Object"), + progid("Internet.HHCtrl.1"), + vi_progid("Internet.HHCtrl"), + threading(apartment), + version(1.0), + uuid(41b23c28-488e-4e5c-ace2-bb0bbabe99e8) + ] + coclass OldHHCtrl2 + { + [default] interface IHHCtrl; + [default, source] dispinterface _HHCtrlEvents; + } + + [ + helpstring("HHCtrl Object"), + progid("Internet.HHCtrl.1"), + vi_progid("Internet.HHCtrl"), + threading(apartment), + version(1.0), + uuid(52a2aaae-085d-4187-97ea-8c30db990436) + ] + coclass HHCtrl + { + [default] interface IHHCtrl; + [default, source] dispinterface _HHCtrlEvents; + } +} diff --git a/reactos/dll/win32/hhctrl.ocx/hhtoolbar.bmp b/reactos/dll/win32/hhctrl.ocx/hhtoolbar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c5c574f2ed1472bb60b3aca38092bf6078d930c4 GIT binary patch literal 13946 zcmeI32Ut|sw#O&2B~j$Y81=<Ou|*>>7NmDYPz**?!nH*KDHcRDXdsG!3fN0Dh_TWc zx&kU)L8>SMQl)o6I-}kj^M7j(4$KHB*Q@Wl?|pB7{@Lf8IcJ?UXaCOHYwtbI)3K4^ z@QV%o-9kD+8bkVkBf%L!HHSVQF|<=`x3hr5>HNob@xjZZtm@CU(CK|_+I`32?9$<I zwk_juHvh=sn5^P(j8}6wrYp%yJq~BbQu<usmD}}U>wn}h``RCo#NSfvTH!}WyZ>MQ z#V7DFoj;a1u^2JJt##6*m}e6v#5|Lbh<ZMLe8lr{<077a`DMiOv122jeeuQ3XP<rM z-$5Lmp=&0PMvy)v^{24&29xNm;0!1Ijr6II7z1LYPe_AEZ)#U@9UYxj#>U1MjEsyf zkuLv>x@2f*=qfEOJ)iEy?)|3n&ir>?JfYP|TLSM=%%<QAyl?x0`%pcE^aY1wv}x2R zpH_MKGK?H~7oUBWiV-7HNXhv0(<D+N#KrHB5-@)J12B#_ob9LS+DRnFKwpJDbH)Q> zWfX}x<w%g&bzhUF35o5q<Ks!>6X$ahYgfj1Z!C><aByf$NJv0YQ4xFt{CX%O^8wiB zeJL(34%XJzS!AExueb7E{Ab*F7|(sDVm1X|;C<T{+^4g))f+j|t64>*0)q!9kq@^> zaimyMG%1P{LApu0LAp*1Wn#>jn>-H3;Uw7@AZo93PfzMo@!wa^+D3b$N#jXVNZ*p? zh<!Xz(R{%Ko8Q;ZiMwnnTkdJ5Q14+TSMP2nUwP4ZZn}f6r0uv7gQwHEUy&GhEMBqL z)m2819zFE<@#78o`T3}-uEzdDPB?JLxl@O!CMBn(;=zLl$j;8@D=RAt0%c}qA}=ow zc6N3pWR&$|B4woFNU=F*W?It09{vv$8>l$he1eV4?{nf5FUyuIdn(i`dC1i(y31F} zU7VXf!$Hz^*tov^7qsvF+${7a_B|RJ8~ZKBVsHHPW}6-RckOpSsKYv=NBcC+n^#5b zBoiA6q<GSs7z)Q%Uu94niXny${qagF#>@|r`a*1^hsoR*2bN2k(Ee1?%t@n%%{#Vo zw!gQz>f;E<)w~p!O}O`mInrEAk#gD)DW`tIox}PFwbp#<VJcf^wQ$OMx{fi#V$m?t zKoY-DyMK7%#EH7X!op5|4mx4Ku!yJRv=lsi_z*sxZt!ux3~#qfU5bg0L~(I39334W z32X}0gT$tZeJ1NM_r;6@-Tn`oG;H3SW3&C$y;UEtiCE3snz9KN_sp>|%@oEdhA>F^ z39IkuV_~S~Q+W^Bx@lIu`~QD~pTj?l8ROfisacI7L(+&D7JCvQCYI7CL!W#Sg8>6r zEMjpe9AAE!K^!GK<#3L0IUG9{>jh<y%viC{LhbdNuG+3>+M+&jxr6QuTi>nf4N0z+ ze`a~@LHc=fq@FfH%5UqDOx&cL{0Ye?*COfoN+cfBNBluu_-<BcwAY<Z`8#JMiSZ*G z>po!ou)eFZstWs@9lNyn;Bja=5I?CYh>wrQ!Jm!bvT;GTHfiDTemj(vmBGo$sYu|o zP(5h4<nR%zL-m{Vujw^S*)nnYOoth^8oufcKPOrKX_vJJ7U||NNi~8|%6b?i|HNl! zeeznYNm_|jiTcos*M*X=LgRG%p8mgyA9F`*><ho}UgFR38y;BYu(jW|SsZ*dzHvAQ z*GfuWZQQV-9+HyT{8%C`o`$7M%W(euQ!H5Us0Tx1#w5YTr44)cHeleu$S#Jy_~IU2 zpZJ^@iXw)(`WQ9I&xb`i8#Gj=g&}CCc6;*qU)l@9&*0t#3#6SjrI=%kbc#J0mv`Xq zA6pTBY#m~q^%3j10&&iINIb$AS_ZF;a#c&d9mV>PF57~3rv9t0w6qizm6dRCI?yF6 zCnqqm_``Ca-*y?mXNxjCO=S4b!rfRJhY#4HqM`x^4<0NL*b}ZtYmOdj6lu^9UKs|R zAnkUW<X_rd3eRBsJqv82cw?4k%x7q4#tvBC-3p`lbyyXv5B=B`(2vu5$<Q(=c*#|b zTEh3AjS2YWb^IK^;f@hD3ozlp@_x7RtL^(b`#+r90r6kvV`uPhsDJXLU-uBTf8g71 zz6oyLy7dWUWO5-Tl|y=n&712G9o>$$wl;9NJgBM`y=3S%MvY3r@#F1iYHFvPp#?TJ zq741lf8E9C(GfH*b5s>PqgXq&fl-Hy>Z|UCqB{LL$`X7~5Plk2-g}YZwiB6D#~n3% z%H5`3eaToZ+0#rmGGv=_;dM*-7va`g|L`|g`t$nkh0m`4s`=E@RN6vdSGZ>JhcQr2 zvUl9yLoEIzCMM#t^UsJovjcIbx8sJB0YY{!Cw}ZvMRDu!;lpLZHU-;iv1$X2qm1gq zszPz2`Z|2eeDHh0Y1n7&g>}YG*k|s=hB(8g8eH{i#Y=L@@}9Dh>LJR7%Gc#zEDhEA zhpNBQpV~JTK3#Zy!BbgJQUCjD-)%mJG0|~3wk5b?ti28b@5OYfy1uT@wiaz)4oBGj zy_`&(i}r(SG?y>M6UH!zI0_jT6Z~-A3RSPME6Bk_?K`S||9u8;(V}9^otpz`>0G{S zZCj9&(~kD`c07Ih6#o9tpsZX(?4-llnTO_P9$H&lQCr)L{rg)nbSTS_I&*3<vD+9s zHkNWBQGOy18Z}fV2cjtQ913r^;8BDt%I<KHdfA%iy+yIqW!>zJv&Rf$xed#Y+1Pz( z#4jqEnddFD>#|}z!fmvRLUzo5=Ce^QLC~(kHH$xtfm^q4W4HZYzV<lS!FHcL_U?B; zKu{o(laq1f&`#XBV2i|ycDUtYg~+3uaKzCbH8nMip9*1{f^9vn-T;$G!-n9>K%6f+ z2iHOu{PD;Yeq~(jPPOK#c`KGmxy;@;Y__QXI^imsj>(qU6}d4UE3Rr6X@tysrsyN; zzi|7qd^YvreQ3K_V8)5H*p=aqeFcG-d%+CS=S(4e)&vurmf?7m=Uef^O}LIxdlzAj z%LYiDHHOqVV{FT~2-_TAsJmHW#^Ke-ttjr(cF+FHQFY0Z2Rv=<5`O%VmCXf{f<hj} zl{R9i13Vs&&rm?Xb2vCWqqxK4b5&Q@%0GvV<vYh^tRK6H;lmRs7ZT-%tEV?0(%G<~ zG9?&~Zk|PP^aWJi4Z~I2<!#;@<#x09BxtKw>zpe)&ot!S*;tbmtLAT^Qtq=+w!Hfs z*Fi&ugj}0GJu>*@$y2pdC~ii>-P1!vZXWIk3JL<tuTLCu#4#ra5rqVB>0PMB(WA#I zCr`c+{PD*j!5j{^E58!(6H*zBbC1sAQt<^`uL{G8tIOMzyybSY_|)x_=+=d}ZvQoW zRmv58g#8zd4+)uRkUM4w1y?idx_cQjqISSA`y5OjU4co#C0OKKfqw8lIN!Y7XB&&g z2T}Xp@nKMP-GrSvo-oP32$P~KFwVVzS+P4|k#-(G_}F0lzNJWel+{oBj;c$SKH%x- zltNA}7xMC*V*Ds6<<opf8$I(5baZrb#8_h64Gpc>v7?RVfLMOb#`ZB?3^AU@jk_fh ze;7a1e>GI4hVc1e3{@lrAl-8x&u5eT3DGAmx>p!>`iI94@64jX(_rpaRTFPB*~;!S zJZDXuc)xkvxB}kXx!3+#Qc}b3hbk!tVzEddwl9$2m~hQLD=DeMtXY9HPg=nH{PW~` z4#$hlM|BoE&W9#ZMh(}hLiqeJhJq^sa3FmjPsQi;{wLq=_Fv0e)mYJ6*#GYKz5O5+ zV{Emd;jtat@BD#DzD5xDTLrPJ>oEMf0fvVgKt9F>tAh5wH9wxWu3_G}Em)p-7-C`T zG5m%B#6s6W+<y&5d98)<ty5SP>WEK&)j)K1O0Nuw^699mtNVbrbZIF+<|r!Wfk{cJ zQ_9Nu*uK3TrKO#@5X*;JTia-y!lP%+=6#YW-o#T5&E|+Y84?#yqB$W^e(dP^GkzZD z+(ym48<YcuqndJ|+RPXvxcuDWV<yj*ZF()uW$|5elAgxWv%E}YqPtJ@o~@~w*Sd0L z8@~R!jACaj?%yv(d3iaX9Trnqza*?`njaDtV<#)CguZt)CQmN;>+7$JY0fmdfx~h8 zrt3a0`H6pg8#ili;Cgj9!mC3OR~rMXgr8d!efsCWjJwQCc~4>gyZK3bm;r_3Mvy+U z0ee#1ARn{?(|k=aE5rgbuUTN$wQX2+>j*Z59eZnj+~cl7=aLn+C!fb0vd6c3)dJu6 zZNv;N#igW+(DAm0#C~05mp|$kKg*V7@^p1e`OGLQ=TV-M2Njh(%9-<N>{X22yLqUu zZ$V2-r<$9aap6KcmM^cMn3X|ocAs*lbjrK$V#bUV+RvcvL>k9;=RXA32R@sXa)Nd) z%nP*A>ekO%c>y~#3cO5Za~T_~y*v%2Cwgv}Bh{OHO{CPlOr+LzwJWESpS^oKU}Dma zZ@;a_^y#ti^ULFp$5}pIS67F}j~{o5?F+<WP)tldzWXkU_^ZK`DS4PQiOspc!Vfqf zsQ4)5d>^zhPdiYnON(e*D?p<_!Amw*+Vjo+yKa_}-QzGzy4(M5epv34n30C>T`VDW z$^g#kT<G5159^f6*qi1K`@5bv`XCUNH%`AbKW;I>(7o~tPG^UbJukBBfnQUuU>V)V zDcu)8cv@rTku}J#EbWz@-tr&D&$4Bud~O&sOloTR(9|r(u3a7Ut~R2P#{E@QP1J?7 z@VB4PSnu4qHt6bhG9)9@&5)W}HZhdcgC9>bIW~X$#^P=&ZQ{LA{-1Ft%o^iPZfuM@ zwVA2u)@k#mxYJvjy*Dc)b{lb@sj8aYVq?=mxmX9bY-y)Fu8BBE!XDdnikqeU^$Zq= zn9ocN4Gr`@)bnGMn_DKG8;7Y=A5)!A?A(KdMCyx=J_<_Xa9r713%@Y_`|H1#iOdGC ze)})VPtv_KFj;d?V#blxIC(z^m-8aA==^ppzQD8tvyc9SQ?b7NY+q6PzHy<LK>3X} z*;{np5)1#>h7<P!;hG(eg%>Qb#={PE^n3(kt={Ta`!B}NiWOyD+^DPPLqnq&Teo&l z&QSmISwDfLB@c#%ZAeOL?s}I`o@~bV-&gQs4r6HU+<U}cHuZ%mBK%z3B>j~q%^^qa zU%4*zw1rC4o)yZ0n`J%|w9l)x&t_%&+ov|Smc+RsC(s!=0gfaml*W65yG7}4_xaob zAAcO=rK3~WW@XjE?`zG>+9@tJ<C|}?@S}b_^79{&^7*{5_kgj(=9>5KPsg-riF95) zpPk8*GbwLNA$EfA2(!cP#r&rjSu5;6#X&ZY*=zCMqGZ=U|3%w3;chYnIvMJQ>4*Lf zm-G-!+^36sMLC@+&V6kgi?(l1`+@N{;1?Ihm*(j$aE$ka##wXNhyU?fZUiie+ILiC z{QUT189(OCo0pII^YiiJj~(>P>-b}m;^KPh8#?$*sjC-Y<;qsX#XaHY6fBQ0Gvg62 zIrQFVP(OAb^XBDJE+NW~m$9^@yNNV>H_1iZI%4P=vP+BWVIno7*N6Y|pwA}7D@o_9 zc==(caG&NC?_b)E;+V_u-J+EK>UDz$2RPEb>sb8Ryt$p<m#L|>P&|1AMddhJ_sU0Z zZZ4lAw$5d~EsZ`)C4L0#JS28f|1o4pU<{4B*cz=!5%}-@(*J8#THGre=Fsn3`YzrZ z6)*SjKlVxw|Aoizw^I`#tl*?bOtja<!~-k()wVtR7g2tMZL{qkTzBA0np^Trx$&0v zohDD1;N7riPZJg`dc<c(L!$s%T4gXd@1SR13sch$>dQ)qp8{edAB>@8%i3`3)?*ww z(n#ml(EFZ6F({L`$;8^V)ih7!M){|cgy89Vo5@K8?OObdYoQ)Z>kt)JcWIY-7|96b zF@iIx^=Pc-yGhY9#Cl0h&b8nE%BA>|am9+yPf^rGa5pR7?>@VGYrp_sZ3&6kQUil# zY}n9-_3PWn=N5`B6__$D3O6Izx@j&JEV_+}6CV;gb@W*QDUaqGQl1VOa+SvHvAvGN z1^)Y4s7DF>r+jUF_uad<Uh98!PydDaiAzd=uvkv?tFr@q(<0xpeMR{Zw#~M^6T+~~ z@z;La?u}0l$9d7zss2s2woTC1endHQ0r65mJe5LUpNEADOZfYY9~PTf|Hg8pB}-c9 zcn!s#hr~}dvGWiH2DP+);nzfKBJ;bSD6M4B_$6r9_q8dPY+JeJs&_n1Wm-K=q?_DL zq~-|D^VlH!rLVb?bHLA<<;fSVc||u}@sPU@4?Jv;?Q4f@A3K_RJkQ?W48b)$Ywxc{ zj0nBIbZPCMYu2<;tZXB`Td0p}z*iEtATcG9;!Y`_ov*(x;`1|l^qr<5LxS0F2l_0c z{;MSj{AW47;G(znUznemJGUXMcd<VHzU_B@e`hVmkeyu<7B4R1^P;6yK<uzs)XCGU z{IGEv8|N!1<WikWea2(TJ^hItCk??f6|Vg()B+1*JWvpE=|#lB^^N}9=kt8cRsQ5| zRpVXzRk!^1Z(Hi}!dzdldBw6jel$OQ4mrVxkbmt2)yH1sg`WQFW&f2aY`5n&_v4{M zuim6J7oMJ8E9LmD^nF@rY}Q11ay_wAOJl7PQW5>W=~m-MA6>KSX`|;6VgDl!89aF# z|4TaiUlIR>+n4e3s{Y;ISG;fg-B0S^f~iye8U+loI3$pO9oB!bu^Ed$j2|{vq@t2f zIY&Lso%lCXEYs??C%WZrIQxqbn<cf?H2+hZ8I9TpQK-#`L`_Bne@>_>Jq#7eK`5s+ z4Yod3k?4=Aw5v$Dyr<2_T=@=-^Gox>ey6ohMfMx7Hx#=M2Mr2vm6UwYprg}D??fxV zFO!t4BZkU}ol;`w_G6m6wt9o1u8-e^|M}rP{b%j#w^ikxirEx6{=V%C?$cR2X)uQD z?K}H2)?YDo<~`l)u=ybtdl)-x?RDzZ5Mt-xQc+ty_h<~WAY`|0U1?$<pP!nHo2a6> z#HzGws7$>|3PBas6|~Ng;dkhHfYqW(np-qw<7aoHIg<l-XjW7HlikyD??(m=^80D* z*jwcb7BtcKXrbR1)RM0i^c%|Pnn8nt*7tr@-$&nv|Ezs)IxK&udX=B|X}{;wIyisg zL?3=%wrW*5<v?Y8u`!ySUK!X}pUpSw>Xy(N#uMrff{7ic<vs26euT!o)BG*xB}5)H zsLc#I@w_n74MnjY$iI0W_q?5+M>wym_q9+h^fZ;Xa9jHw`+am*@!B}&J1;ZYu&x9B z+VGJU7Z1x<P<Z^8q+|`PxkOYB7!a_eUzhfBQcwS{{9FDzFP8W-{)7>d&X~Rv#h)|+ zvng=>ecKn@N3?d5l92FvymDm@kLmA!@0PxP4$T)mq&dfjylK+{8abT9i$$;P-yX|1 zX*|51a-fsG7HVf{UdPG9SVs5KCTaFxPx>regV}72{$DJY{zhw}ai4q=S~z&H|7*wH z{Wbiq{6D&M@^8+IC;pSgjCUbs>&Vh6Cj{T)ecKn@r)RxyLT4__^5MSZEZOtA|I{OF PJ)JB5pX%NJM!)_W2n&K} literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/hhctrl.ocx/hhtreeview.bmp b/reactos/dll/win32/hhctrl.ocx/hhtreeview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b8e262c0e5e576ebc57d1420c5ecaa0ad3561654 GIT binary patch literal 3194 zcmc(h-A|ik7{<GJvP2Jze}R912OiMEj0b8mg@k321(F2~BnGI3g7T5HJ=iERbg>M_ zsHPMs&@W1%VYF+Z*bTDssg5{4#-MYEP^6SkGp7T+z3-<y%`3DWc;Xv=eLwnMyw`o* z&-3(s=bY*#5!+PwS%kcfyo{U@y()SE_aglMl@}w>X=DSDDDp?AaO&VH?T&LSxcxsL zUO4w|t0^xDPE5Xd%~Bva^Wpik))Q+Z&-<nQqomigTCGd1R>Mg^O$RSHH8pkdn;Hd} zKYjzepS^!<dKG8EoG%$nL%r^@49wCqaJMcO{MSB!yPAv7#ie`?%mrct`9A4J8ty+W zEp1V!)3N7ISuVkSqvE+tnUwIOS%v<^Pq^MtDFt7h6dwDU;bG60Fw<EDGd6WhX6@B5 zZLa~VH05XRe`8|<h|SGS*xK4+Y;SJ^v9q%SySuv#s#WM8^Iy{I^<XMUff@T1xYtyS z$P+Tz@(JEsP5%GjdVND3IF#pMdCUO|w{F0Ks~+pnz--qQnC`d?)7DE-sJ6#<+A)90 zQ=$Knkr5aj9c7G-jRA-J^BNBOPft%@Zfk49{8M1bZ-bc*HB6aQ2_Y|!yiMf)Pp+p7 zI^=J``U5}wG@w61z}>+5GUxaL=5N-*>SQ0&bN}IRIGX?A9&rD(KkPpvBV)y6He(ja zuy+48`qIOrejNndTFkK?=AB=`!`^E!=eP<Fx<6;k;rLh?ze&%3#`R52SdZ*Y2+a&Z zz|#<yc_;m^8VLSyi}ZU!|CB!`Rv&0A9rmA<m9=WK*}#-9f$-c2`q#xJ;L*Z7)<Wa^ zAiq7XZ)s@(6VBnasoSvNuE*N1v-;UFokzI=fj%t+zjKoReW8Ee13nLgeV{oJ%YSxu z_L{@tps~n$pC~*2-Ms5M=I3V5=la&xRyGEM-@9P-o+rYj2ZDGUi{%OIUtZGR-2eLe zdNh091M*J<59W0&|2a81Yfh&V^B1$;FQ7LD%kLmV97i;kIDx*eF@FzglK$d)qtOWF zPt({sMr&yzjQPn}yX2`=nmjA?Pc={vgnd{+?{rRe#PXk)m$&ZmcqmH<VedoJcMhQA z2s9=R^DE6i%#Z6W77I`f)Q9HgW}x{%bGosyk?rZ6#u$M;d&bvqq5t9G;UhiZy`cFJ z%fCz}3;TRNu*l!0OpZW(`4@uUYKt^^k?Uy=@fv77qdE)*1A~s~8r4T&&yM&Hg+f62 z3wt2!L%jTpi;Fi0hlZf5s|z|iJHcwTf*IE%lgY%O>u$Fj`uqD~U|;~++uH#>+jxG7 z^i-4A>jlb{*7Avo2^bt41nk)!*Yo_zzu)g?_r~f&y!^|`%C_kKo}M1)?(PP=-OlPD z-?g>1Pmo=WMiZs7vhw$$qM~a4{CIlGLZwpuCYQ_i@&5h7!a@etzK=Ceay|D?SyK(d zJ_vh3Yf`N7qfjWe$H&LnZywb_84xa)3(CvOCrV38Q#j})rKF@poSB))UP;MAJbiC( zFH}@ie2ev-=H%w)o+eNheLdy=*}{Iz57O}ZF(ZRgsSL+p3B8H=eew2*^jLp#JRQG| T?_OQx=Ok2BRb_Gg|GobQdgPJi literal 0 HcmV?d00001 diff --git a/reactos/dll/win32/hhctrl.ocx/index.c b/reactos/dll/win32/hhctrl.ocx/index.c index b0496c17201..f80e5327256 100644 --- a/reactos/dll/win32/hhctrl.ocx/index.c +++ b/reactos/dll/win32/hhctrl.ocx/index.c @@ -54,6 +54,15 @@ static void fill_index_tree(HWND hwnd, IndexItem *item) } } +static void item_realloc(IndexItem *item, int num_items) +{ + item->nItems = num_items; + item->items = heap_realloc(item->items, sizeof(IndexSubItem)*item->nItems); + item->items[item->nItems-1].name = NULL; + item->items[item->nItems-1].local = NULL; + item->itemFlags = 0x00; +} + /* Parse the attributes correspond to a list item, including sub-topics. * * Each list item has, at minimum, a param of type "keyword" and two @@ -62,11 +71,11 @@ static void fill_index_tree(HWND hwnd, IndexItem *item) * sub-topic then there isn't really a sub-topic, the index will jump * directly to the requested item. */ -static void parse_index_obj_node_param(IndexItem *item, const char *text) +static void parse_index_obj_node_param(IndexItem *item, const char *text, UINT code_page) { const char *ptr; LPWSTR *param; - int len, wlen; + int len; ptr = get_attr(text, "name", &len); if(!ptr) { @@ -77,19 +86,14 @@ static void parse_index_obj_node_param(IndexItem *item, const char *text) /* Allocate a new sub-item, either on the first run or whenever a * sub-topic has filled out both the "name" and "local" params. */ - if(item->itemFlags == 0x11 && (!strncasecmp("name", ptr, len) || !strncasecmp("local", ptr, len))) { - item->nItems++; - item->items = heap_realloc(item->items, sizeof(IndexSubItem)*item->nItems); - item->items[item->nItems-1].name = NULL; - item->items[item->nItems-1].local = NULL; - item->itemFlags = 0x00; - } + if(item->itemFlags == 0x11 && (!strncasecmp("name", ptr, len) || !strncasecmp("local", ptr, len))) + item_realloc(item, item->nItems+1); if(!strncasecmp("keyword", ptr, len)) { param = &item->keyword; }else if(!item->keyword && !strncasecmp("name", ptr, len)) { /* Some HTML Help index files use an additional "name" parameter * rather than the "keyword" parameter. In this case, the first - * occurance of the "name" parameter is the keyword. + * occurrence of the "name" parameter is the keyword. */ param = &item->keyword; }else if(!strncasecmp("name", ptr, len)) { @@ -109,10 +113,7 @@ static void parse_index_obj_node_param(IndexItem *item, const char *text) return; } - wlen = MultiByteToWideChar(CP_ACP, 0, ptr, len, NULL, 0); - *param = heap_alloc((wlen+1)*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, ptr, len, *param, wlen); - (*param)[wlen] = 0; + *param = decode_html(ptr, len, code_page); } /* Parse the object tag corresponding to a list item. @@ -140,7 +141,7 @@ static IndexItem *parse_index_sitemap_object(HHInfo *info, stream_t *stream) TRACE("%s\n", node.buf); if(!strcasecmp(node_name.buf, "param")) { - parse_index_obj_node_param(item, node.buf); + parse_index_obj_node_param(item, node.buf, info->pCHMInfo->codePage); }else if(!strcasecmp(node_name.buf, "/object")) { break; }else { @@ -194,6 +195,8 @@ static IndexItem *parse_li(HHInfo *info, stream_t *stream) strbuf_zero(&node); } + if(!ret) + FIXME("Failed to parse <li> tag!\n"); strbuf_free(&node); strbuf_free(&node_name); @@ -229,10 +232,23 @@ static void parse_hhindex(HHInfo *info, IStream *str, IndexItem *item) TRACE("%s\n", node.buf); if(!strcasecmp(node_name.buf, "li")) { - item->next = parse_li(info, &stream); - item->next->merge = item->merge; - item = item->next; - item->indentLevel = indent_level; + IndexItem *new_item; + + new_item = parse_li(info, &stream); + if(new_item && item->keyword && strcmpW(new_item->keyword, item->keyword) == 0) { + int num_items = item->nItems; + + item_realloc(item, num_items+1); + memcpy(&item->items[num_items], &new_item->items[0], sizeof(IndexSubItem)); + heap_free(new_item->keyword); + heap_free(new_item->items); + heap_free(new_item); + } else if(new_item) { + item->next = new_item; + item->next->merge = item->merge; + item = item->next; + item->indentLevel = indent_level; + } }else if(!strcasecmp(node_name.buf, "ul")) { indent_level++; }else if(!strcasecmp(node_name.buf, "/ul")) { @@ -277,6 +293,7 @@ void ReleaseIndex(HHInfo *info) IndexItem *item = info->index, *next; int i; + if(!item) return; /* Note: item->merge is identical for all items, only free once */ heap_free(item->merge.chm_file); heap_free(item->merge.chm_index); diff --git a/reactos/dll/win32/hhctrl.ocx/resource.h b/reactos/dll/win32/hhctrl.ocx/resource.h index 17521f98ae1..b8aac13fb24 100644 --- a/reactos/dll/win32/hhctrl.ocx/resource.h +++ b/reactos/dll/win32/hhctrl.ocx/resource.h @@ -27,3 +27,24 @@ #define IDS_INDEX 2 #define IDS_SEARCH 3 #define IDS_FAVORITES 4 +#define IDS_HIDETABS 5 +#define IDS_SHOWTABS 6 + +#define MENU_POPUP 1 + +#define IDB_HHTOOLBAR 1000 +/* IDB_HHTOOLBAR bitmaps: */ +#define HHTB_STOP 0 +#define HHTB_REFRESH 1 +#define HHTB_HOME 2 +#define HHTB_SYNC 3 +#define HHTB_CONTRACT 4 +#define HHTB_EXPAND 5 +#define HHTB_NUMBITMAPS HHTB_EXPAND + +#define IDB_HHTREEVIEW 1001 +/* IDB_HHTREEVIEW bitmaps: */ +#define HHTV_DOCUMENT 0 +#define HHTV_FOLDER 1 +#define HHTV_OPENFOLDER 2 +#define HHTV_NUMBITMAPS HHTV_OPENFOLDER diff --git a/reactos/dll/win32/hhctrl.ocx/search.c b/reactos/dll/win32/hhctrl.ocx/search.c index 29e03c9cc97..f1b44dd07fe 100644 --- a/reactos/dll/win32/hhctrl.ocx/search.c +++ b/reactos/dll/win32/hhctrl.ocx/search.c @@ -193,6 +193,7 @@ static SearchItem *SearchCHM_Storage(SearchItem *item, IStorage *pStorage, FIXME("Unhandled IStorage stream element.\n"); } } + IEnumSTATSTG_Release(elem); return item; } diff --git a/reactos/dll/win32/hhctrl.ocx/stream.c b/reactos/dll/win32/hhctrl.ocx/stream.c index 7b06b3a1dc6..339de8f3596 100644 --- a/reactos/dll/win32/hhctrl.ocx/stream.c +++ b/reactos/dll/win32/hhctrl.ocx/stream.c @@ -40,7 +40,7 @@ void strbuf_free(strbuf_t *buf) heap_free(buf->buf); } -void strbuf_append(strbuf_t *buf, const char *data, int len) +static void strbuf_append(strbuf_t *buf, const char *data, int len) { if(buf->len+len > buf->size) { buf->size = buf->len+len; @@ -57,7 +57,7 @@ void stream_init(stream_t *stream, IStream *str) stream->str = str; } -BOOL stream_chr(stream_t *stream, strbuf_t *buf, char c) +static BOOL stream_chr(stream_t *stream, strbuf_t *buf, char c) { BOOL b = TRUE; ULONG i; diff --git a/reactos/dll/win32/hhctrl.ocx/stream.h b/reactos/dll/win32/hhctrl.ocx/stream.h index a03fd46d473..8d61ad54d51 100644 --- a/reactos/dll/win32/hhctrl.ocx/stream.h +++ b/reactos/dll/win32/hhctrl.ocx/stream.h @@ -19,7 +19,9 @@ #ifndef HHCTRL_STREAM_H #define HHCTRL_STREAM_H -#define BLOCK_SIZE 0x1000 +#define BLOCK_BITS 12 +#define BLOCK_SIZE (1 << BLOCK_BITS) +#define BLOCK_MASK (BLOCK_SIZE-1) typedef struct { char *buf; @@ -34,15 +36,13 @@ typedef struct { ULONG p; } stream_t; -void strbuf_init(strbuf_t *buf); -void strbuf_zero(strbuf_t *buf); -void strbuf_free(strbuf_t *buf); -void strbuf_append(strbuf_t *buf, const char *data, int len); -void stream_init(stream_t *stream, IStream *str); -BOOL stream_chr(stream_t *stream, strbuf_t *buf, char c); -void get_node_name(strbuf_t *node, strbuf_t *name); -BOOL next_content(stream_t *stream, strbuf_t *buf); -BOOL next_node(stream_t *stream, strbuf_t *buf); -const char *get_attr(const char *node, const char *name, int *len); +void strbuf_init(strbuf_t *buf) DECLSPEC_HIDDEN; +void strbuf_zero(strbuf_t *buf) DECLSPEC_HIDDEN; +void strbuf_free(strbuf_t *buf) DECLSPEC_HIDDEN; +void stream_init(stream_t *stream, IStream *str) DECLSPEC_HIDDEN; +void get_node_name(strbuf_t *node, strbuf_t *name) DECLSPEC_HIDDEN; +BOOL next_content(stream_t *stream, strbuf_t *buf) DECLSPEC_HIDDEN; +BOOL next_node(stream_t *stream, strbuf_t *buf) DECLSPEC_HIDDEN; +const char *get_attr(const char *node, const char *name, int *len) DECLSPEC_HIDDEN; #endif diff --git a/reactos/dll/win32/hhctrl.ocx/version.rc b/reactos/dll/win32/hhctrl.ocx/version.rc deleted file mode 100644 index bbdfd89db5e..00000000000 --- a/reactos/dll/win32/hhctrl.ocx/version.rc +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Version information for hhctrl.ocx - * - * Copyright 2004 Hans Leidekker - * Copyright 2004 Tom Wickline - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#define WINE_FILEDESCRIPTION_STR "Wine htmlhelp OCX" -#define WINE_FILENAME_STR "hhctrl.ocx" -#define WINE_FILEVERSION 5,2,3790,2744 -#define WINE_FILEVERSION_STR "5.2.3790.2744" -#define WINE_PRODUCTVERSION 5,2,3790,2744 -#define WINE_PRODUCTVERSION_STR "5.2.3790.2744" - -#include <wine/wine_common_ver.rc> diff --git a/reactos/dll/win32/hhctrl.ocx/webbrowser.c b/reactos/dll/win32/hhctrl.ocx/webbrowser.c index abf86a280e4..ce9c779ac0e 100644 --- a/reactos/dll/win32/hhctrl.ocx/webbrowser.c +++ b/reactos/dll/win32/hhctrl.ocx/webbrowser.c @@ -24,14 +24,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp); -#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) - typedef struct IOleClientSiteImpl { - const IOleClientSiteVtbl *lpVtbl; - const IOleInPlaceSiteVtbl *lpvtblOleInPlaceSite; - const IOleInPlaceFrameVtbl *lpvtblOleInPlaceFrame; - const IDocHostUIHandlerVtbl *lpvtblDocHostUIHandler; + IOleClientSite IOleClientSite_iface; + IOleInPlaceSite IOleInPlaceSite_iface; + IOleInPlaceFrame IOleInPlaceFrame_iface; + IDocHostUIHandler IDocHostUIHandler_iface; /* IOleClientSiteImpl data */ IOleObject *pBrowserObject; @@ -41,32 +39,32 @@ typedef struct IOleClientSiteImpl HWND hwndWindow; } IOleClientSiteImpl; -#define CLIENTSITE(x) ((IOleClientSite*) &(x)->lpVtbl) -#define DOCHOSTUI(x) ((IDocHostUIHandler*) &(x)->lpvtblDocHostUIHandler) -#define INPLACESITE(x) ((IOleInPlaceSite*) &(x)->lpvtblOleInPlaceSite) -#define INPLACEFRAME(x) ((IOleInPlaceFrame*) &(x)->lpvtblOleInPlaceFrame) +static inline IOleClientSiteImpl *impl_from_IOleClientSite(IOleClientSite *iface) +{ + return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleClientSite_iface); +} static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFIID riid, void **ppvObj) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface); + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); *ppvObj = NULL; if (IsEqualIID(riid, &IID_IUnknown)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj); - *ppvObj = CLIENTSITE(This); + *ppvObj = &This->IOleClientSite_iface; }else if(IsEqualIID(riid, &IID_IOleClientSite)) { TRACE("(%p)->(IID_IOleClientSite %p)\n", This, ppvObj); - *ppvObj = CLIENTSITE(This); + *ppvObj = &This->IOleClientSite_iface; }else if (IsEqualIID(riid, &IID_IOleInPlaceSite)) { TRACE("(%p)->(IID_IOleInPlaceSite %p)\n", This, ppvObj); - *ppvObj = &(This->lpvtblOleInPlaceSite); + *ppvObj = &This->IOleInPlaceSite_iface; }else if (IsEqualIID(riid, &IID_IOleInPlaceFrame)) { TRACE("(%p)->(IID_IOleInPlaceFrame %p)\n", This, ppvObj); - *ppvObj = &(This->lpvtblOleInPlaceSite); + *ppvObj = &This->IOleInPlaceSite_iface; }else if (IsEqualIID(riid, &IID_IDocHostUIHandler)) { TRACE("(%p)->(IID_IDocHostUIHandler %p)\n", This, ppvObj); - *ppvObj = &(This->lpvtblDocHostUIHandler); + *ppvObj = &This->IDocHostUIHandler_iface; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObj); return E_NOINTERFACE; @@ -78,7 +76,7 @@ static HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite *iface, REFI static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface); + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -88,7 +86,7 @@ static ULONG STDMETHODCALLTYPE Site_AddRef(IOleClientSite *iface) static ULONG STDMETHODCALLTYPE Site_Release(IOleClientSite *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpVtbl, iface); + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -144,25 +142,30 @@ static const IOleClientSiteVtbl MyIOleClientSiteTable = Site_RequestNewObjectLayout }; +static inline IOleClientSiteImpl *impl_from_IDocHostUIHandler(IDocHostUIHandler *iface) +{ + return CONTAINING_RECORD(iface, IOleClientSiteImpl, IDocHostUIHandler_iface); +} + static HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler *iface, REFIID riid, LPVOID *ppvObj) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface); + IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface); - return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj); + return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj); } static ULONG STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface); + IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface); - return IOleClientSite_AddRef(CLIENTSITE(This)); + return IOleClientSite_AddRef(&This->IOleClientSite_iface); } static ULONG STDMETHODCALLTYPE UI_Release(IDocHostUIHandler * iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblDocHostUIHandler, iface); + IOleClientSiteImpl *This = impl_from_IDocHostUIHandler(iface); - return IOleClientSite_Release(CLIENTSITE(This)); + return IOleClientSite_Release(&This->IOleClientSite_iface); } static HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler *iface, DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved) @@ -269,30 +272,35 @@ static const IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable = UI_FilterDataObject }; +static inline IOleClientSiteImpl *impl_from_IOleInPlaceSite(IOleInPlaceSite *iface) +{ + return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceSite_iface); +} + static HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite *iface, REFIID riid, LPVOID *ppvObj) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); - return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj); + return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj); } static ULONG STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); - return IOleClientSite_AddRef(CLIENTSITE(This)); + return IOleClientSite_AddRef(&This->IOleClientSite_iface); } static ULONG STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); - return IOleClientSite_Release(CLIENTSITE(This)); + return IOleClientSite_Release(&This->IOleClientSite_iface); } static HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite *iface, HWND *lphwnd) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); *lphwnd = This->hwndWindow; return S_OK; @@ -320,10 +328,10 @@ static HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite *iface) static HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite *iface, LPOLEINPLACEFRAME *lplpFrame, LPOLEINPLACEUIWINDOW *lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); - *lplpFrame = INPLACEFRAME(This); - IOleInPlaceFrame_AddRef(INPLACEFRAME(This)); + *lplpFrame = &This->IOleInPlaceFrame_iface; + IOleInPlaceFrame_AddRef(&This->IOleInPlaceFrame_iface); *lplpDoc = NULL; @@ -362,7 +370,7 @@ static HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite *ifac static HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite *iface, LPCRECT lprcPosRect) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceSite, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceSite(iface); IOleInPlaceObject *inplace; if (IOleObject_QueryInterface(This->pBrowserObject, &IID_IOleInPlaceObject, @@ -394,30 +402,35 @@ static const IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable = InPlace_OnPosRectChange }; +static inline IOleClientSiteImpl *impl_from_IOleInPlaceFrame(IOleInPlaceFrame *iface) +{ + return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleInPlaceFrame_iface); +} + static HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, LPVOID *ppvObj) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface); - return IOleClientSite_QueryInterface(CLIENTSITE(This), riid, ppvObj); + return IOleClientSite_QueryInterface(&This->IOleClientSite_iface, riid, ppvObj); } static ULONG STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface); - return IOleClientSite_AddRef(CLIENTSITE(This)); + return IOleClientSite_AddRef(&This->IOleClientSite_iface); } static ULONG STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame *iface) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface); - return IOleClientSite_Release(CLIENTSITE(This)); + return IOleClientSite_Release(&This->IOleClientSite_iface); } static HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame *iface, HWND *lphwnd) { - ICOM_THIS_MULTI(IOleClientSiteImpl, lpvtblOleInPlaceFrame, iface); + IOleClientSiteImpl *This = impl_from_IOleInPlaceFrame(iface); *lphwnd = This->hwndWindow; return S_OK; @@ -625,17 +638,17 @@ BOOL InitWebBrowser(HHInfo *info, HWND hwndParent) return FALSE; iOleClientSiteImpl->ref = 1; - iOleClientSiteImpl->lpVtbl = &MyIOleClientSiteTable; - iOleClientSiteImpl->lpvtblOleInPlaceSite = &MyIOleInPlaceSiteTable; - iOleClientSiteImpl->lpvtblOleInPlaceFrame = &MyIOleInPlaceFrameTable; + iOleClientSiteImpl->IOleClientSite_iface.lpVtbl = &MyIOleClientSiteTable; + iOleClientSiteImpl->IOleInPlaceSite_iface.lpVtbl = &MyIOleInPlaceSiteTable; + iOleClientSiteImpl->IOleInPlaceFrame_iface.lpVtbl = &MyIOleInPlaceFrameTable; iOleClientSiteImpl->hwndWindow = hwndParent; - iOleClientSiteImpl->lpvtblDocHostUIHandler = &MyIDocHostUIHandlerTable; + iOleClientSiteImpl->IDocHostUIHandler_iface.lpVtbl = &MyIDocHostUIHandlerTable; hr = OleCreate(&CLSID_WebBrowser, &IID_IOleObject, OLERENDER_DRAW, 0, - (IOleClientSite *)iOleClientSiteImpl, &MyIStorage, + &iOleClientSiteImpl->IOleClientSite_iface, &MyIStorage, (void **)&browserObject); - info->client_site = (IOleClientSite *)iOleClientSiteImpl; + info->client_site = &iOleClientSiteImpl->IOleClientSite_iface; info->wb_object = browserObject; if (FAILED(hr)) goto error; @@ -649,7 +662,7 @@ BOOL InitWebBrowser(HHInfo *info, HWND hwndParent) if (FAILED(hr)) goto error; hr = IOleObject_DoVerb(browserObject, OLEIVERB_SHOW, NULL, - (IOleClientSite *)iOleClientSiteImpl, + &iOleClientSiteImpl->IOleClientSite_iface, -1, hwndParent, &rc); if (FAILED(hr)) goto error; @@ -738,7 +751,12 @@ void DoPageAction(HHInfo *info, DWORD dwAction) break; case WB_REFRESH: IWebBrowser2_Refresh(pWebBrowser2); + break; case WB_STOP: IWebBrowser2_Stop(pWebBrowser2); + break; + case WB_PRINT: + IWebBrowser2_ExecWB(pWebBrowser2, OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, 0, 0); + break; } } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 3037cf85283..62d51775a7d 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -63,7 +63,7 @@ reactos/dll/win32/dwmapi # Synced to Wine-1.5.19 reactos/dll/win32/faultrep # Synced to Wine-1.5.4 reactos/dll/win32/fusion # Synced to Wine-1.5.4 reactos/dll/win32/gdiplus # Synced to Wine-1.5.4 -reactos/dll/win32/hhctrl.ocx # Autosync +reactos/dll/win32/hhctrl.ocx # Synced to Wine-1.5.26 reactos/dll/win32/hlink # Synced to Wine-1.5.4 reactos/dll/win32/hnetcfg # Synced to Wine-1.5.4 reactos/dll/win32/httpapi # Synced to Wine-1.5.4 From abec02cd44decf004a9b79a8777ba086f0c1e438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= <jerome.gardou@reactos.org> Date: Tue, 9 Apr 2013 23:24:50 +0000 Subject: [PATCH 29/37] [NTOS/MM] - Fix check for address range fitting the VAD when commiting memory CORE-7065 #comment Should be fixed with r58627 #resolve svn path=/trunk/; revision=58727 --- reactos/ntoskrnl/mm/ARM3/virtual.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/virtual.c b/reactos/ntoskrnl/mm/ARM3/virtual.c index 724ce3849a3..33432daf9f8 100644 --- a/reactos/ntoskrnl/mm/ARM3/virtual.c +++ b/reactos/ntoskrnl/mm/ARM3/virtual.c @@ -4081,7 +4081,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, // // Make sure that this address range actually fits within the VAD for it // - if (((StartingAddress >> PAGE_SHIFT) < FoundVad->StartingVpn) && + if (((StartingAddress >> PAGE_SHIFT) < FoundVad->StartingVpn) || ((EndingAddress >> PAGE_SHIFT) > FoundVad->EndingVpn)) { DPRINT1("Address range does not fit into the VAD\n"); From 9ba5a55c52d8d5f547ad712d2c244c31d74efa62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= <jerome.gardou@reactos.org> Date: Tue, 9 Apr 2013 23:27:35 +0000 Subject: [PATCH 30/37] [NTDLL_APITEST] * Enable the test for committing regions larger than the section again * Test behaviour of NtFreeVirtualMemory(MEM_DECOMMIT) for section-backed virtual memory svn path=/trunk/; revision=58728 --- rostests/apitests/ntdll/NtMapViewOfSection.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rostests/apitests/ntdll/NtMapViewOfSection.c b/rostests/apitests/ntdll/NtMapViewOfSection.c index 8727164ebdf..dbf89094a6f 100644 --- a/rostests/apitests/ntdll/NtMapViewOfSection.c +++ b/rostests/apitests/ntdll/NtMapViewOfSection.c @@ -103,9 +103,11 @@ Test_PageFileSection(void) MEM_COMMIT, PAGE_READWRITE); ok(NT_SUCCESS(Status), "NtAllocateVirtualMemory failed with Status %lx\n", Status); -#ifndef CORE_7065_FIXED - ok(0, "Committing a range larger than the section crashes. See CORE-7065\n"); -#else + Status = NtFreeVirtualMemory(NtCurrentProcess(), + &BaseAddress, + &ViewSize, + MEM_DECOMMIT); + ok(Status == STATUS_UNABLE_TO_DELETE_SECTION, "NtFreeVirtualMemory returned wrong Status %lx\n", Status); /* Try to commit a range larger than the section */ BaseAddress = (PVOID)0x30000000; ViewSize = 0x3000; @@ -117,7 +119,7 @@ Test_PageFileSection(void) PAGE_READWRITE); ok(Status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory failed with wrong Status %lx\n", Status); -#endif + /* Try to commit a page after the section */ BaseAddress = (PVOID)0x30002000; ViewSize = 0x1000; From 79915a68350520ebc779b99f4eea31f4cf2f60f8 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer <pierre@reactos.org> Date: Wed, 10 Apr 2013 19:02:54 +0000 Subject: [PATCH 31/37] [RTL] Fix incorrect assignation. Patch by Victor Martinez Reviewed by Timo Kreuzer CORE-7067 #comment Committed in r58729 #resolve svn path=/trunk/; revision=58729 --- reactos/lib/rtl/actctx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index 8c696f893c2..8dfaa4cb895 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -787,7 +787,7 @@ static BOOL parse_expect_no_attr(xmlbuf_t* xmlbuf, BOOL* end) while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, end)) { attr_nameU = xmlstr2unicode(&attr_name); - attr_valueU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); DPRINT1( "unexpected attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } From e14ac0cd5a93095505be8961a1d2f2eca178a5a6 Mon Sep 17 00:00:00 2001 From: Ziliang Guo <drakekaizer666@gmail.com> Date: Fri, 12 Apr 2013 15:06:11 +0000 Subject: [PATCH 32/37] [RTL8139] Add header files for RTL8139 drivers holding function definitions and register addresses. Still incomplete/some holdovers from old ne2000 driver which will get pruned as more of the driver is rewritten. Not committing the actual driver code yet due to the need to massively clean it up. Not yet added to compilation. CORE-7081 svn path=/trunk/; revision=58733 --- .../drivers/network/dd/rtl8139/include/8139.h | 146 +++++++++++ .../network/dd/rtl8139/include/debug.h | 82 ++++++ .../drivers/network/dd/rtl8139/include/nic.h | 247 ++++++++++++++++++ 3 files changed, 475 insertions(+) create mode 100644 reactos/drivers/network/dd/rtl8139/include/8139.h create mode 100644 reactos/drivers/network/dd/rtl8139/include/debug.h create mode 100644 reactos/drivers/network/dd/rtl8139/include/nic.h diff --git a/reactos/drivers/network/dd/rtl8139/include/8139.h b/reactos/drivers/network/dd/rtl8139/include/8139.h new file mode 100644 index 00000000000..b6a4bcd6cf1 --- /dev/null +++ b/reactos/drivers/network/dd/rtl8139/include/8139.h @@ -0,0 +1,146 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS RTL8139 Driver + * FILE: include/8139.h + * PURPOSE: 8139 NIC definitions + */ + +#pragma once +//Register addresses +#define R_MAC 0x00 //MAC address uses bytes 0-5, 6 and 7 are reserved +#define R_MCAST0 0x08 //Multicast registers +#define R_MCAST1 0x09 //Multicast registers +#define R_MCAST2 0x0A +#define R_MCAST3 0x0B +#define R_MCAST4 0x0C +#define R_MCAST5 0x0D +#define R_MCAST6 0x0E +#define R_MCAST7 0x0F +#define R_TXSTS0 0x10 //TX status, 0x10-0x13, 4 bytes +#define R_TXSTS1 0x14 +#define R_TXSTS2 0x18 +#define R_TXSTS3 0x1C +#define R_TXSAD0 0x20 //TX start address of descriptor 0 +#define R_TXSAD1 0x24 +#define R_TXSAD2 0x28 +#define R_TXSAD3 0x2C +#define R_RXSA 0x30 //RX buffer start address +#define R_ERXBC 0x34 //Early RX byte count register +#define R_ERXSTS 0x36 //Early RX status register + +#define R_CMD 0x37 //Command register +#define B_CMD_TXE 0x04 //Enable TX +#define B_CMD_RXE 0x08 //Enable RX +#define B_CMD_RST 0x10 //Reset bit + +#define R_CAPR 0x38 //Current address of packet read +#define R_CBA 0x3A //Current buffer address +#define R_IM 0x3C //Interrupt mask register +#define R_IS 0x3E //Interrupt status register +#define R_TC 0x40 //Transmit configuration register + +#define R_RC 0x44 //Receive configuration register +#define B_RC_AAP 0x01 //Accept all packets +#define B_RC_APM 0x02 //Accept packets sent to device MAC +#define B_RC_AM 0x04 //Accept multicast packets +#define B_RC_AB 0x08 //Accept broadcast packets +#define B_RC_AR 0x10 //Accept runt (smaller than 64bytes) packets + +#define R_TCTR 0x48 //Timer counter register +#define R_MPC 0x4C //Missed packet counter +#define R_9346CR 0x50 //93C46 command register +#define R_CFG0 0x51 //Configuration register 0 +#define R_CFG1 0x52 +#define R_TINTR 0x54 //Timer interrupt register +#define R_MS 0x58 //Media status register +#define R_CFG3 0x59 //Configuration register 3 +#define R_CFG4 0x5A //Configuration register 4 +#define R_MINTS 0x5C //Multiple interrupt select +#define R_PCIID 0x5E //PCI Revision ID = 0x10 +#define R_DTSTS 0x60 //TX status of all descriptors +#define R_BMC 0x62 //Basic mode control register +#define R_BMSTS 0x64 //Basic mode status register +#define R_ANA 0x66 //Auto-negotiation advertisement +#define R_ANLP 0x68 //Auto-negotiation link partner +#define R_ANEX 0x6A //Auto-negotiation expansion +#define R_DCTR 0x6C //Disconnect counter +#define R_FCSCTR 0x6E //False carrier sense counter +#define R_NWT 0x70 //N-way test register +#define R_RXERRCTR 0x72 //RX error counter +#define R_CSCFG 0x74 //CS configuration register +#define R_PHYP1 0x78 //PHY parameter 1 +#define R_TWP 0x7C //Twister parameter +#define R_PHYP2 0x80 //PHY parameter 2 +#define R_PCRC0 0x84 //Power management CRC for wakeup frame 0 +#define R_PCRC1 0x85 +#define R_PCRC2 0x86 +#define R_PCRC3 0x87 +#define R_PCRC4 0x88 +#define R_PCRC5 0x89 +#define R_PCRC6 0x8A +#define R_PCRC7 0x8B +#define R_WAKE0 0x8C //Power management wakeup frame 0 +#define R_WAKE1 0x94 +#define R_WAKE2 0x9C +#define R_WAKE3 0xA4 +#define R_WAKE4 0xAC +#define R_WAKE5 0xB4 +#define R_WAKE6 0xBC +#define R_WAKE7 0xC4 +#define R_LSBCRC0 0xCC //LSB of the mask byte of wakeup frame 0 within offset 12 to 75 +#define R_LSBCRC0 0xCD +#define R_LSBCRC0 0xCE +#define R_LSBCRC0 0xCF +#define R_LSBCRC0 0xD0 +#define R_LSBCRC0 0xD1 +#define R_LSBCRC0 0xD2 +#define R_LSBCRC0 0xD3 +#define R_CFG5 0xD8 //Configuration register 5 + +//EEPROM Control Bytes +#define EE_DATA_READ 0x01 //Chip data out +#define EE_DATA_WRITE 0x02 //Chip data in +#define EE_SHIFT_CLK 0x04 //Chip shift clock +#define EE_CS 0x08 //Chip select +#define EE_ENB 0x88 //Chip enable + + +//EEPROM Commands +#define EE_READ_CMD 0x06 + + +/* NIC prepended structure to a received packet */ +typedef struct _PACKET_HEADER { + UCHAR Status; /* See RSR_* constants */ + UCHAR NextPacket; /* Pointer to next packet in chain */ + USHORT PacketLength; /* Length of packet including this header */ +} PACKET_HEADER, *PPACKET_HEADER; + +#define IEEE_802_ADDR_LENGTH 6 + +/* Ethernet frame header */ +typedef struct _ETH_HEADER { + UCHAR Destination[IEEE_802_ADDR_LENGTH]; + UCHAR Source[IEEE_802_ADDR_LENGTH]; + USHORT PayloadType; +} ETH_HEADER, *PETH_HEADER; + +typedef struct _DISCARD_HEADER { + PACKET_HEADER HWHeader; + ETH_HEADER EthernetHeader; +} DISCARD_HEADER, *PDISCARD_HEADER; + +#define NICDisableInterrupts(Adapter) { \ + NDIS_DbgPrint(MAX_TRACE, ("NICDisableInterrupts()\n")); \ + NdisRawWritePortUchar((Adapter)->IOBase + PG0_IMR, 0x00); \ +} + +#define NICEnableInterrupts(Adapter) { \ + NDIS_DbgPrint(MAX_TRACE, ("NICEnableInterrupts() Mask (0x%X)\n", (Adapter)->InterruptMask)); \ + NdisRawWritePortUchar((Adapter)->IOBase + PG0_IMR, (Adapter)->InterruptMask); \ +} + +VOID NTAPI MiniportHandleInterrupt( + IN NDIS_HANDLE MiniportAdapterContext); + +/* EOF */ diff --git a/reactos/drivers/network/dd/rtl8139/include/debug.h b/reactos/drivers/network/dd/rtl8139/include/debug.h new file mode 100644 index 00000000000..f495766a059 --- /dev/null +++ b/reactos/drivers/network/dd/rtl8139/include/debug.h @@ -0,0 +1,82 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Novell Eagle 2000 driver + * FILE: include/debug.h + * PURPOSE: Debugging support macros + * DEFINES: DBG - Enable debug output + * NASSERT - Disable assertions + */ + +#pragma once + +#define NORMAL_MASK 0x000000FF +#define SPECIAL_MASK 0xFFFFFF00 +#define MIN_TRACE 0x00000001 +#define MID_TRACE 0x00000002 +#define MAX_TRACE 0x00000003 + +#define DEBUG_MEMORY 0x00000100 +#define DEBUG_ULTRA 0xFFFFFFFF + +#if DBG + +extern ULONG DebugTraceLevel; + +#ifdef _MSC_VER + +#define NDIS_DbgPrint(_t_, _x_) \ + if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \ + ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \ + DbgPrint("(%s:%d) ", __FILE__, __LINE__); \ + DbgPrint _x_ ; \ + } + +#else /* _MSC_VER */ + +#define NDIS_DbgPrint(_t_, _x_) \ + if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \ + ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \ + DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \ + DbgPrint _x_ ; \ + } + +#endif /* _MSC_VER */ + + +#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) +#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql() == (x)) + +#else /* DBG */ + +#define NDIS_DbgPrint(_t_, _x_) + +#define ASSERT_IRQL(x) +#define ASSERT_IRQL_EQUAL(x) +/* #define ASSERT(x) */ /* ndis.h */ + +#endif /* DBG */ + + +#define assert(x) ASSERT(x) +#define assert_irql(x) ASSERT_IRQL(x) + + +#ifdef _MSC_VER + +#define UNIMPLEMENTED \ + NDIS_DbgPrint(MIN_TRACE, ("The function at %s:%d is unimplemented, \ + but come back another day.\n", __FILE__, __LINE__)); + +#else /* _MSC_VER */ + +#define UNIMPLEMENTED \ + NDIS_DbgPrint(MIN_TRACE, ("%s at %s:%d is unimplemented, \ + but come back another day.\n", __FUNCTION__, __FILE__, __LINE__)); + +#endif /* _MSC_VER */ + + +#define CHECKPOINT \ + do { NDIS_DbgPrint(MIN_TRACE, ("%s:%d\n", __FILE__, __LINE__)); } while(0); + +/* EOF */ diff --git a/reactos/drivers/network/dd/rtl8139/include/nic.h b/reactos/drivers/network/dd/rtl8139/include/nic.h new file mode 100644 index 00000000000..74671929e2d --- /dev/null +++ b/reactos/drivers/network/dd/rtl8139/include/nic.h @@ -0,0 +1,247 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Novell Eagle 2000 driver + * FILE: include/ne2000.h + * PURPOSE: NE2000 driver definitions + */ + +#define NDIS_MINIPORT_DRIVER 1 +#define NDIS_LEGACY_MINIPORT 1 +#define NDIS51_MINIPORT 1 +#include <ndis.h> +#include <8139.h> +#include <debug.h> + +/* Define NOCARD to test NDIS without a card */ +//#define NOCARD + +/* NE2000 sepcific constants */ +#define NIC_DATA 0x10 /* Data register */ +#define NIC_RESET 0x1F /* Reset register */ + + +/* Global constants */ + +#define DRIVER_NDIS_MAJOR_VERSION 0x05 +#define DRIVER_NDIS_MINOR_VERSION 0 + +#define DRIVER_DEFAULT_IO_BASE_ADDRESS 0x280 /* bochs default */ +#define DRIVER_DEFAULT_INTERRUPT_NUMBER 9 /* bochs default */ +#define DRIVER_DEFAULT_INTERRUPT_SHARED FALSE +#define DRIVER_DEFAULT_INTERRUPT_MODE NdisInterruptLatched + +#define DRIVER_MAX_MULTICAST_LIST_SIZE 8 + +#define DRIVER_VENDOR_DESCRIPTION "RTL 8139 Adapter." +#define DRIVER_VENDOR_DRIVER_VERSION 0x0100 /* 1.0 */ + +#define DRIVER_FRAME_SIZE 1514 /* Size of an ethernet frame */ +#define DRIVER_HEADER_SIZE 14 /* Size of an ethernet header */ +#define DRIVER_LENGTH_OF_ADDRESS 6 /* Size of an ethernet address */ + +/* Maximum lookahead buffer size */ +#define DRIVER_MAXIMUM_LOOKAHEAD (252 - DRIVER_HEADER_SIZE) + +/* Size of a block in a buffer ring */ +#define DRIVER_BLOCK_SIZE 256 + + +/* Default number of transmit buffers */ +#define DRIVER_DEFAULT_TX_BUFFER_COUNT 12 +#define BUFFERS_PER_TX_BUF 1 + +/* Interrupt Mask Register value */ +#define DRIVER_INTERRUPT_MASK IMR_ALLE - IMR_RDCE + +/* Maximum number of interrupts handled per call to MiniportHandleInterrupt */ +#define INTERRUPT_LIMIT 10 + +/* Global structures */ + +typedef struct _MINIPORT_RESERVED +{ + PNDIS_PACKET Next; +} MINIPORT_RESERVED, *PMINIPORT_RESERVED; + +#define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved)) + +typedef UCHAR DRIVER_HARDWARE_ADDRESS[DRIVER_LENGTH_OF_ADDRESS]; + +/* Information about an adapter */ +typedef struct _NIC_ADAPTER +{ + /* Entry on global adapter list */ + LIST_ENTRY ListEntry; + /* Adapter handle */ + NDIS_HANDLE MiniportAdapterHandle; + /* NDIS interrupt object */ + NDIS_MINIPORT_INTERRUPT Interrupt; + + /* I/O base address and interrupt number of adapter */ + ULONG_PTR IoBaseAddress; + ULONG InterruptLevel; + ULONG InterruptVector; + BOOLEAN InterruptShared; + KINTERRUPT_MODE InterruptMode; + + /* Mapped address of the I/O base port */ + PUCHAR IOBase; + + /* TRUE if the NIC can transfer in word mode */ + BOOLEAN WordMode; + + /* Base address and size of the onboard memory window */ + PUCHAR RamBase; + UINT RamSize; + + /* Station Address PROM (SAPROM) */ + UCHAR SAPROM[16]; + + /* Onboard ethernet address from the manufacturer */ + DRIVER_HARDWARE_ADDRESS PermanentAddress; + + /* Ethernet address currently in use */ + DRIVER_HARDWARE_ADDRESS StationAddress; + + /* Maximum number of multicast addresses this adapter supports */ + ULONG MaxMulticastListSize; + + /* List of multicast addresses in use */ + DRIVER_HARDWARE_ADDRESS Addresses[DRIVER_MAX_MULTICAST_LIST_SIZE]; + + /* Current multicast address mask */ + UCHAR MulticastAddressMask[8]; + + /* Masked interrupts (IMR value) */ + ULONG InterruptMask; + + /* Interrupts that have occurred */ + UCHAR InterruptStatus; + + /* Current packet filter */ + ULONG PacketFilter; + + /* Lookahead buffer */ + UINT LookaheadSize; + UCHAR Lookahead[DRIVER_MAXIMUM_LOOKAHEAD + DRIVER_HEADER_SIZE]; + + /* Receive buffer ring */ + UINT PageStart; + UINT PageStop; + UINT CurrentPage; + UINT NextPacket; + + /* TRUE if there was a buffer overflow */ + BOOLEAN BufferOverflow; + + /* TRUE if an error occurred during reception of a packet */ + BOOLEAN ReceiveError; + + /* TRUE if an error occurred during transmission of a packet */ + BOOLEAN TransmitError; + + /* TRUE if a transmit interrupt is pending */ + BOOLEAN TransmitPending; + + /* Received packet header */ + PACKET_HEADER PacketHeader; + + /* Offset in onboard RAM of received packet */ + ULONG PacketOffset; + + /* TRUE if receive indications are done and should be completed */ + BOOLEAN DoneIndicating; + + /* Transmit buffers */ + UINT TXStart; /* Start block of transmit buffer ring */ + UINT TXCount; /* Number of blocks in transmit buffer ring */ + UINT TXFree; /* Number of free transmit buffers */ + UINT TXNext; /* Next buffer to use */ + /* Length of packet. 0 means buffer is unused */ + UINT TXSize[DRIVER_DEFAULT_TX_BUFFER_COUNT]; + INT TXCurrent; /* Current buffer beeing transmitted. -1 means none */ + + /* Head of transmit queue */ + PNDIS_PACKET TXQueueHead; + /* Tail of transmit queue */ + PNDIS_PACKET TXQueueTail; + + /* Statistics */ + ULONG FrameAlignmentErrors; + ULONG CrcErrors; + ULONG MissedPackets; + + /* Flags used for driver cleanup */ + BOOLEAN IOPortRangeRegistered; + BOOLEAN InterruptRegistered; + BOOLEAN ShutdownHandlerRegistered; +} NIC_ADAPTER, *PNIC_ADAPTER; + +/* Global driver information */ +typedef struct _DRIVER_INFORMATION +{ + NDIS_HANDLE NdisWrapperHandle; /* Returned from NdisInitializeWrapper */ + NDIS_HANDLE NdisMacHandle; /* Returned from NdisRegisterMac */ + LIST_ENTRY AdapterListHead; /* Adapters this driver control */ +} DRIVER_INFORMATION, *PDRIVER_INFORMATION; + + + +/* Global variable */ + +extern DRIVER_INFORMATION DriverInfo; +extern NDIS_PHYSICAL_ADDRESS HighestAcceptableMax; + + + +/* Prototypes */ + +BOOLEAN NICCheck( + PNIC_ADAPTER Adapter); + +NDIS_STATUS NICInitialize( + PNIC_ADAPTER Adapter); + +NDIS_STATUS NICSetup( + PNIC_ADAPTER Adapter); + +NDIS_STATUS NICStart( + PNIC_ADAPTER Adapter); + +NDIS_STATUS NICStop( + PNIC_ADAPTER Adapter); + +NDIS_STATUS NICReset( + PNIC_ADAPTER Adapter); + +VOID NICUpdateCounters( + PNIC_ADAPTER Adapter); + +VOID NICReadDataAlign( + PNIC_ADAPTER Adapter, + PUSHORT Target, + ULONG_PTR Source, + USHORT Length); + +VOID NICWriteDataAlign( + PNIC_ADAPTER Adapter, + ULONG_PTR Target, + PUSHORT Source, + USHORT Length); + +VOID NICReadData( + PNIC_ADAPTER Adapter, + PUCHAR Target, + ULONG_PTR Source, + USHORT Length); + +VOID NICWriteData( + PNIC_ADAPTER Adapter, + ULONG_PTR Target, + PUCHAR Source, + USHORT Length); + +VOID NICTransmit( + PNIC_ADAPTER Adapter); + +/* EOF */ From 30d5c755b71ab93cb4e1837afaa3a579420f17ed Mon Sep 17 00:00:00 2001 From: Amine Khaldi <amine.khaldi@reactos.org> Date: Sat, 13 Apr 2013 10:37:24 +0000 Subject: [PATCH 33/37] [CMAKE] * Invoke the linker directly instead of through the compiler in MSVC builds. svn path=/trunk/; revision=58735 --- reactos/cmake/Platform/Windows-MSVC.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/cmake/Platform/Windows-MSVC.cmake b/reactos/cmake/Platform/Windows-MSVC.cmake index 002ce9e4a9f..7bb59fb6985 100644 --- a/reactos/cmake/Platform/Windows-MSVC.cmake +++ b/reactos/cmake/Platform/Windows-MSVC.cmake @@ -229,7 +229,8 @@ macro(__windows_compiler_msvc lang) set(CMAKE_${lang}_COMPILER_LINKER_OPTION_FLAG_EXECUTABLE "/link") set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1) - set(CMAKE_${lang}_LINK_EXECUTABLE "${_CMAKE_VS_LINK_EXE}<CMAKE_${lang}_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> /Fe<TARGET> <OBJECTS> /link /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}") + set(CMAKE_${lang}_LINK_EXECUTABLE + "${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_FLAGS_INIT "") set(CMAKE_${lang}_FLAGS_DEBUG_INIT "") From ffa7a81ee34288fee330d199303c6b03eceffdbc Mon Sep 17 00:00:00 2001 From: Amine Khaldi <amine.khaldi@reactos.org> Date: Sat, 13 Apr 2013 13:08:11 +0000 Subject: [PATCH 34/37] [DPLAY][DPLAYX] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58736 --- reactos/dll/directx/dplay/CMakeLists.txt | 20 +- reactos/dll/directx/dplay/version.rc | 6 +- reactos/dll/directx/dplayx/CMakeLists.txt | 25 +- reactos/dll/directx/dplayx/dpclassfactory.c | 32 +- reactos/dll/directx/dplayx/dpinit.h | 10 +- reactos/dll/directx/dplayx/dplay.c | 796 +++++++------- reactos/dll/directx/dplayx/dplay_global.h | 22 +- reactos/dll/directx/dplayx/dplaysp.c | 91 +- reactos/dll/directx/dplayx/dplayx.idl | 33 + reactos/dll/directx/dplayx/dplayx.rgs | 17 + reactos/dll/directx/dplayx/dplayx_global.c | 974 ++++++++---------- reactos/dll/directx/dplayx/dplayx_global.h | 43 +- reactos/dll/directx/dplayx/dplayx_main.c | 59 +- reactos/dll/directx/dplayx/dplayx_messages.c | 44 +- reactos/dll/directx/dplayx/dplayx_messages.h | 14 +- reactos/dll/directx/dplayx/dplayx_queue.h | 8 +- reactos/dll/directx/dplayx/dplobby.c | 172 ++-- reactos/dll/directx/dplayx/lobbysp.c | 20 +- reactos/dll/directx/dplayx/lobbysp.h | 14 +- reactos/dll/directx/dplayx/name_server.c | 90 +- reactos/dll/directx/dplayx/name_server.h | 32 +- reactos/dll/directx/dplayx/regsvr.c | 560 ---------- reactos/dll/directx/dplayx/version.rc | 16 +- reactos/include/psdk/dplay.h | 33 +- .../dplayx => include/reactos/wine}/dplaysp.h | 18 +- reactos/media/doc/README.WINE | 4 +- 26 files changed, 1250 insertions(+), 1903 deletions(-) create mode 100644 reactos/dll/directx/dplayx/dplayx.idl create mode 100644 reactos/dll/directx/dplayx/dplayx.rgs delete mode 100644 reactos/dll/directx/dplayx/regsvr.c rename reactos/{dll/directx/dplayx => include/reactos/wine}/dplaysp.h (97%) diff --git a/reactos/dll/directx/dplay/CMakeLists.txt b/reactos/dll/directx/dplay/CMakeLists.txt index 86dee460725..fd1e6e4bc59 100644 --- a/reactos/dll/directx/dplay/CMakeLists.txt +++ b/reactos/dll/directx/dplay/CMakeLists.txt @@ -1,5 +1,4 @@ - include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) spec2def(dplay.dll dplay.spec) @@ -10,23 +9,6 @@ add_library(dplay SHARED ${CMAKE_CURRENT_BINARY_DIR}/dplay.def) set_module_type(dplay win32dll UNICODE) - -target_link_libraries(dplay - uuid - wine) - -add_importlibs(dplay - msvcrt - user32 - advapi32 - ole32 - winmm - dinput - dplayx - kernel32 - ntdll) - +add_importlibs(dplay dplayx msvcrt kernel32 ntdll) add_dependencies(dplay psdk) - add_cd_file(TARGET dplay DESTINATION reactos/system32 FOR all) - diff --git a/reactos/dll/directx/dplay/version.rc b/reactos/dll/directx/dplay/version.rc index 6069c768af3..ed04c977ead 100644 --- a/reactos/dll/directx/dplay/version.rc +++ b/reactos/dll/directx/dplay/version.rc @@ -13,15 +13,15 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_OLESELFREGISTER #define WINE_FILEDESCRIPTION_STR "Wine DirectPlay" #define WINE_FILENAME_STR "dplay.dll" #define WINE_FILEVERSION 5,3,0,900 #define WINE_FILEVERSION_STR "5.3.0.900" #define WINE_PRODUCTVERSION 5,3,0,900 #define WINE_PRODUCTVERSION_STR "5.3" +#define WINE_EXTRAVALUES VALUE "OLESelfRegister","" -#include "wine/wine_common_ver.rc" +#include <wine/wine_common_ver.rc> diff --git a/reactos/dll/directx/dplayx/CMakeLists.txt b/reactos/dll/directx/dplayx/CMakeLists.txt index fbf7cea98f9..dfb38fdaf5d 100644 --- a/reactos/dll/directx/dplayx/CMakeLists.txt +++ b/reactos/dll/directx/dplayx/CMakeLists.txt @@ -1,4 +1,10 @@ +add_definitions( + -DCOM_NO_WINDOWS_H + -D__WINESRC__) + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) + spec2def(dplayx.dll dplayx.spec ADD_IMPORTLIB) list(APPEND SOURCE @@ -11,23 +17,10 @@ list(APPEND SOURCE dplobby.c lobbysp.c name_server.c - regsvr.c - version.rc ${CMAKE_CURRENT_BINARY_DIR}/dplayx.def) -include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) - -add_library(dplayx SHARED ${SOURCE}) +add_library(dplayx SHARED ${SOURCE} version.rc) set_module_type(dplayx win32dll) -target_link_libraries(dplayx wine uuid dxguid) - -add_importlibs(dplayx - advapi32 - ole32 - user32 - winmm - msvcrt - kernel32 - ntdll) - +target_link_libraries(dplayx dxguid uuid wine) +add_importlibs(dplayx winmm ole32 user32 advapi32 msvcrt kernel32 ntdll) add_cd_file(TARGET dplayx DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/directx/dplayx/dpclassfactory.c b/reactos/dll/directx/dplayx/dpclassfactory.c index 55181b7cb2e..0f80b627780 100644 --- a/reactos/dll/directx/dplayx/dpclassfactory.c +++ b/reactos/dll/directx/dplayx/dpclassfactory.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ //#include <stdarg.h> @@ -27,6 +27,9 @@ //#include "objbase.h" //#include "winerror.h" #include <wine/debug.h> +//#include "dplay.h" +//#include "dplobby.h" +//#include "initguid.h" #include "dpinit.h" WINE_DEFAULT_DEBUG_CHANNEL(dplay); @@ -39,13 +42,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(dplay); typedef struct { /* IUnknown fields */ - const IClassFactoryVtbl *lpVtbl; - LONG ref; + IClassFactory IClassFactory_iface; + LONG ref; } IClassFactoryImpl; +static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface); +} + static HRESULT WINAPI DP_and_DPL_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj); @@ -54,12 +62,12 @@ DP_and_DPL_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { static ULONG WINAPI DP_and_DPL_AddRef(LPCLASSFACTORY iface) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI DP_and_DPL_Release(LPCLASSFACTORY iface) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); /* static class (reference starts @ 1), won't ever be freed */ return InterlockedDecrement(&This->ref); } @@ -67,7 +75,7 @@ static ULONG WINAPI DP_and_DPL_Release(LPCLASSFACTORY iface) { static HRESULT WINAPI DP_and_DPL_CreateInstance( LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj ) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); @@ -84,7 +92,7 @@ static HRESULT WINAPI DP_and_DPL_CreateInstance( } static HRESULT WINAPI DP_and_DPL_LockServer(LPCLASSFACTORY iface,BOOL dolock) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); FIXME("(%p)->(%d),stub!\n",This,dolock); return S_OK; } @@ -97,7 +105,7 @@ static const IClassFactoryVtbl DP_and_DPL_Vtbl = { DP_and_DPL_LockServer }; -static IClassFactoryImpl DP_and_DPL_CF = {&DP_and_DPL_Vtbl, 1 }; +static IClassFactoryImpl DP_and_DPL_CF = {{&DP_and_DPL_Vtbl}, 1 }; /******************************************************************************* @@ -119,16 +127,16 @@ static IClassFactoryImpl DP_and_DPL_CF = {&DP_and_DPL_Vtbl, 1 }; */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - TRACE("(%p,%p,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); if ( IsEqualCLSID( riid, &IID_IClassFactory ) ) { - *ppv = (LPVOID)&DP_and_DPL_CF; + *ppv = &DP_and_DPL_CF; IClassFactory_AddRef( (IClassFactory*)*ppv ); return S_OK; } - ERR("(%p,%p,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + ERR("(%s,%s,%p): no interface found.\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/reactos/dll/directx/dplayx/dpinit.h b/reactos/dll/directx/dplayx/dpinit.h index 1fac19dd889..17da5936306 100644 --- a/reactos/dll/directx/dplayx/dpinit.h +++ b/reactos/dll/directx/dplayx/dpinit.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPINIT_H @@ -26,12 +26,12 @@ //#include "wtypes.h" #include "dplay_global.h" -extern HRESULT DP_CreateInterface( REFIID riid, LPVOID* ppvObj ); -extern HRESULT DPL_CreateInterface( REFIID riid, LPVOID* ppvObj ); +extern HRESULT DP_CreateInterface( REFIID riid, LPVOID* ppvObj ) DECLSPEC_HIDDEN; +extern HRESULT DPL_CreateInterface( REFIID riid, LPVOID* ppvObj ) DECLSPEC_HIDDEN; extern HRESULT DPSP_CreateInterface( REFIID riid, LPVOID* ppvObj, - IDirectPlay2Impl* dp ); + IDirectPlay2Impl* dp ) DECLSPEC_HIDDEN; extern HRESULT DPLSP_CreateInterface( REFIID riid, LPVOID* ppvObj, - IDirectPlay2Impl* dp ); + IDirectPlay2Impl* dp ) DECLSPEC_HIDDEN; #endif diff --git a/reactos/dll/directx/dplayx/dplay.c b/reactos/dll/directx/dplayx/dplay.c index 2d036622512..c22dc2d30ff 100644 --- a/reactos/dll/directx/dplayx/dplay.c +++ b/reactos/dll/directx/dplayx/dplay.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include <config.h> @@ -54,12 +54,12 @@ static lpPlayerList DP_FindPlayer( IDirectPlay2AImpl* This, DPID dpid ); static lpPlayerData DP_CreatePlayer( IDirectPlay2Impl* iface, LPDPID lpid, LPDPNAME lpName, DWORD dwFlags, HANDLE hEvent, BOOL bAnsi ); -static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, LPDPNAME lpSrc, BOOL bAnsi ); +static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi ); static void DP_SetPlayerData( lpPlayerData lpPData, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize ); -static lpGroupData DP_CreateGroup( IDirectPlay2AImpl* iface, LPDPID lpid, - LPDPNAME lpName, DWORD dwFlags, +static lpGroupData DP_CreateGroup( IDirectPlay2AImpl* iface, const DPID *lpid, + const DPNAME *lpName, DWORD dwFlags, DPID idParent, BOOL bAnsi ); static void DP_SetGroupData( lpGroupData lpGData, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize ); @@ -86,123 +86,123 @@ static const IDirectPlay3Vtbl directPlay3WVT; static const IDirectPlay4Vtbl directPlay4WVT; /* Helper methods for player/group interfaces */ -static HRESULT WINAPI DP_IF_DeletePlayerFromGroup +static HRESULT DP_IF_DeletePlayerFromGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, DPID idPlayer, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_CreatePlayer +static HRESULT DP_IF_CreatePlayer ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, LPDPID lpidPlayer, LPDPNAME lpPlayerName, HANDLE hEvent, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_DestroyGroup +static HRESULT DP_IF_DestroyGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_DestroyPlayer +static HRESULT DP_IF_DestroyPlayer ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idPlayer, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_EnumGroupPlayers +static HRESULT DP_IF_EnumGroupPlayers ( IDirectPlay2Impl* This, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_EnumGroups +static HRESULT DP_IF_EnumGroups ( IDirectPlay2Impl* This, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_EnumPlayers +static HRESULT DP_IF_EnumPlayers ( IDirectPlay2Impl* This, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetGroupData +static HRESULT DP_IF_GetGroupData ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetGroupName +static HRESULT DP_IF_GetGroupName ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetPlayerData +static HRESULT DP_IF_GetPlayerData ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetPlayerName +static HRESULT DP_IF_GetPlayerName ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_SetGroupName +static HRESULT DP_IF_SetGroupName ( IDirectPlay2Impl* This, DPID idGroup, LPDPNAME lpGroupName, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_SetPlayerData +static HRESULT DP_IF_SetPlayerData ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_SetPlayerName +static HRESULT DP_IF_SetPlayerName ( IDirectPlay2Impl* This, DPID idPlayer, LPDPNAME lpPlayerName, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_AddGroupToGroup +static HRESULT DP_IF_AddGroupToGroup ( IDirectPlay3Impl* This, DPID idParentGroup, DPID idGroup ); -static HRESULT WINAPI DP_IF_CreateGroup +static HRESULT DP_IF_CreateGroup ( IDirectPlay2AImpl* This, LPVOID lpMsgHdr, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_CreateGroupInGroup +static HRESULT DP_IF_CreateGroupInGroup ( IDirectPlay3Impl* This, LPVOID lpMsgHdr, DPID idParentGroup, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_AddPlayerToGroup +static HRESULT DP_IF_AddPlayerToGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, DPID idPlayer, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_DeleteGroupFromGroup +static HRESULT DP_IF_DeleteGroupFromGroup ( IDirectPlay3Impl* This, DPID idParentGroup, DPID idGroup ); -static HRESULT WINAPI DP_SetSessionDesc +static HRESULT DP_SetSessionDesc ( IDirectPlay2Impl* This, LPCDPSESSIONDESC2 lpSessDesc, DWORD dwFlags, BOOL bInitial, BOOL bAnsi ); -static HRESULT WINAPI DP_SecureOpen +static HRESULT DP_SecureOpen ( IDirectPlay2Impl* This, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials, BOOL bAnsi ); -static HRESULT WINAPI DP_SendEx +static HRESULT DP_SendEx ( IDirectPlay2Impl* This, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_Receive +static HRESULT DP_IF_Receive ( IDirectPlay2Impl* This, LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetMessageQueue +static HRESULT DP_IF_GetMessageQueue ( IDirectPlay4Impl* This, DPID idFrom, DPID idTo, DWORD dwFlags, LPDWORD lpdwNumMsgs, LPDWORD lpdwNumBytes, BOOL bAnsi ); -static HRESULT WINAPI DP_SP_SendEx +static HRESULT DP_SP_SendEx ( IDirectPlay2Impl* This, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID ); -static HRESULT WINAPI DP_IF_SetGroupData +static HRESULT DP_IF_SetGroupData ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetPlayerCaps +static HRESULT DP_IF_GetPlayerCaps ( IDirectPlay2Impl* This, DPID idPlayer, LPDPCAPS lpDPCaps, DWORD dwFlags ); -static HRESULT WINAPI DP_IF_Close( IDirectPlay2Impl* This, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_CancelMessage +static HRESULT DP_IF_Close( IDirectPlay2Impl* This, BOOL bAnsi ); +static HRESULT DP_IF_CancelMessage ( IDirectPlay4Impl* This, DWORD dwMsgID, DWORD dwFlags, DWORD dwMinPriority, DWORD dwMaxPriority, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_EnumGroupsInGroup +static HRESULT DP_IF_EnumGroupsInGroup ( IDirectPlay3AImpl* This, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetGroupParent +static HRESULT DP_IF_GetGroupParent ( IDirectPlay3AImpl* This, DPID idGroup, LPDPID lpidGroup, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_GetCaps +static HRESULT DP_IF_GetCaps ( IDirectPlay2Impl* This, LPDPCAPS lpDPCaps, DWORD dwFlags ); -static HRESULT WINAPI DP_IF_EnumSessions +static HRESULT DP_IF_EnumSessions ( IDirectPlay2Impl* This, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ); -static HRESULT WINAPI DP_IF_InitializeConnection +static HRESULT DP_IF_InitializeConnection ( IDirectPlay3Impl* This, LPVOID lpConnection, DWORD dwFlags, BOOL bAnsi ); static BOOL CALLBACK cbDPCreateEnumConnections( LPCGUID lpguidSP, LPVOID lpConnection, DWORD dwConnectionSize, LPCDPNAME lpName, DWORD dwFlags, LPVOID lpContext ); -static BOOL WINAPI DP_BuildSPCompoundAddr( LPGUID lpcSpGuid, LPVOID* lplpAddrBuf, - LPDWORD lpdwBufSize ); +static BOOL DP_BuildSPCompoundAddr( LPGUID lpcSpGuid, LPVOID* lplpAddrBuf, + LPDWORD lpdwBufSize ); static inline DPID DP_NextObjectId(void); static DPID DP_GetRemoteNextObjectId(void); - +static DWORD DP_CalcSessionDescSize( LPCDPSESSIONDESC2 lpSessDesc, BOOL bAnsi ); static void DP_CopySessionDesc( LPDPSESSIONDESC2 destSessionDesc, LPCDPSESSIONDESC2 srcSessDesc, BOOL bAnsi ); @@ -234,7 +234,7 @@ static LONG kludgePlayerGroupId = 1000; static BOOL DP_CreateIUnknown( LPVOID lpDP ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)lpDP; + IDirectPlay2AImpl *This = lpDP; This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) ); if ( This->unk == NULL ) @@ -243,14 +243,16 @@ static BOOL DP_CreateIUnknown( LPVOID lpDP ) } InitializeCriticalSection( &This->unk->DP_lock ); + This->unk->DP_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlay2AImpl*->DirectPlayIUnknownData*->DP_lock"); return TRUE; } static BOOL DP_DestroyIUnknown( LPVOID lpDP ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)lpDP; + IDirectPlay2AImpl *This = lpDP; + This->unk->DP_lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection( &This->unk->DP_lock ); HeapFree( GetProcessHeap(), 0, This->unk ); @@ -259,7 +261,7 @@ static BOOL DP_DestroyIUnknown( LPVOID lpDP ) static BOOL DP_CreateDirectPlay2( LPVOID lpDP ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)lpDP; + IDirectPlay2AImpl *This = lpDP; This->dp2 = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dp2) ) ); if ( This->dp2 == NULL ) @@ -270,12 +272,13 @@ static BOOL DP_CreateDirectPlay2( LPVOID lpDP ) This->dp2->bConnectionOpen = FALSE; This->dp2->hEnumSessionThread = INVALID_HANDLE_VALUE; + This->dp2->dwEnumSessionLock = 0; This->dp2->bHostInterface = FALSE; DPQ_INIT(This->dp2->receiveMsgs); DPQ_INIT(This->dp2->sendMsgs); - DPQ_INIT(This->dp2->replysExpected); + DPQ_INIT(This->dp2->repliesExpected); if( !NS_InitializeSessionCache( &This->dp2->lpNameServerData ) ) { @@ -335,36 +338,9 @@ DPQ_DECL_DELETECB( cbDeleteElemFromHeap, LPVOID ) HeapFree( GetProcessHeap(), 0, elem ); } -/* Function to delete the list of groups with this interface. Needs to - * delete the group and player lists associated with this group as well - * as the group data associated with this group. It should not delete - * player data as that is shared with the top player list and will be - * deleted with that. - */ -DPQ_DECL_DELETECB( cbDeleteGroupsElem, lpGroupList ); -DPQ_DECL_DELETECB( cbDeleteGroupsElem, lpGroupList ) -{ - DPQ_DELETEQ( elem->lpGData->groups, groups, - lpGroupList, cbDeleteElemFromHeap ); - DPQ_DELETEQ( elem->lpGData->players, players, - lpPlayerList, cbDeleteElemFromHeap ); - HeapFree( GetProcessHeap(), 0, elem->lpGData ); - HeapFree( GetProcessHeap(), 0, elem ); -} - -/* Function to delete the list of players with this interface. Needs to - * delete the player data for all players as well. - */ -DPQ_DECL_DELETECB( cbDeletePlayerElem, lpPlayerList ); -DPQ_DECL_DELETECB( cbDeletePlayerElem, lpPlayerList ) -{ - HeapFree( GetProcessHeap(), 0, elem->lpPData ); - HeapFree( GetProcessHeap(), 0, elem ); -} - static BOOL DP_DestroyDirectPlay2( LPVOID lpDP ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)lpDP; + IDirectPlay2AImpl *This = lpDP; if( This->dp2->hEnumSessionThread != INVALID_HANDLE_VALUE ) { @@ -401,11 +377,6 @@ static BOOL DP_DestroyDirectPlay2( LPVOID lpDP ) FreeLibrary( This->dp2->hDPLobbyProvider ); } -#if 0 - DPQ_DELETEQ( This->dp2->players, players, lpPlayerList, cbDeletePlayerElem ); - DPQ_DELETEQ( This->dp2->groups, groups, lpGroupList, cbDeleteGroupsElem ); -#endif - /* FIXME: Need to delete receive and send msgs queue contents */ NS_DeleteSessionCache( This->dp2->lpNameServerData ); @@ -422,7 +393,7 @@ static BOOL DP_DestroyDirectPlay2( LPVOID lpDP ) static BOOL DP_CreateDirectPlay3( LPVOID lpDP ) { - IDirectPlay3AImpl *This = (IDirectPlay3AImpl *)lpDP; + IDirectPlay3AImpl *This = lpDP; This->dp3 = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dp3) ) ); if ( This->dp3 == NULL ) @@ -435,7 +406,7 @@ static BOOL DP_CreateDirectPlay3( LPVOID lpDP ) static BOOL DP_DestroyDirectPlay3( LPVOID lpDP ) { - IDirectPlay3AImpl *This = (IDirectPlay3AImpl *)lpDP; + IDirectPlay3AImpl *This = lpDP; /* Delete the contents */ HeapFree( GetProcessHeap(), 0, This->dp3 ); @@ -445,7 +416,7 @@ static BOOL DP_DestroyDirectPlay3( LPVOID lpDP ) static BOOL DP_CreateDirectPlay4( LPVOID lpDP ) { - IDirectPlay4AImpl *This = (IDirectPlay4AImpl *)lpDP; + IDirectPlay4AImpl *This = lpDP; This->dp4 = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dp4) ) ); if ( This->dp4 == NULL ) @@ -458,7 +429,7 @@ static BOOL DP_CreateDirectPlay4( LPVOID lpDP ) static BOOL DP_DestroyDirectPlay4( LPVOID lpDP ) { - IDirectPlay3AImpl *This = (IDirectPlay3AImpl *)lpDP; + IDirectPlay3AImpl *This = lpDP; /* Delete the contents */ HeapFree( GetProcessHeap(), 0, This->dp4 ); @@ -468,7 +439,6 @@ static BOOL DP_DestroyDirectPlay4( LPVOID lpDP ) /* Create a new interface */ -extern HRESULT DP_CreateInterface ( REFIID riid, LPVOID* ppvObj ) { @@ -484,32 +454,32 @@ HRESULT DP_CreateInterface if( IsEqualGUID( &IID_IDirectPlay2, riid ) ) { - IDirectPlay2Impl *This = (IDirectPlay2Impl *)*ppvObj; + IDirectPlay2Impl *This = *ppvObj; This->lpVtbl = &directPlay2WVT; } else if( IsEqualGUID( &IID_IDirectPlay2A, riid ) ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)*ppvObj; + IDirectPlay2AImpl *This = *ppvObj; This->lpVtbl = &directPlay2AVT; } else if( IsEqualGUID( &IID_IDirectPlay3, riid ) ) { - IDirectPlay3Impl *This = (IDirectPlay3Impl *)*ppvObj; + IDirectPlay3Impl *This = *ppvObj; This->lpVtbl = &directPlay3WVT; } else if( IsEqualGUID( &IID_IDirectPlay3A, riid ) ) { - IDirectPlay3AImpl *This = (IDirectPlay3AImpl *)*ppvObj; + IDirectPlay3AImpl *This = *ppvObj; This->lpVtbl = &directPlay3AVT; } else if( IsEqualGUID( &IID_IDirectPlay4, riid ) ) { - IDirectPlay4Impl *This = (IDirectPlay4Impl *)*ppvObj; + IDirectPlay4Impl *This = *ppvObj; This->lpVtbl = &directPlay4WVT; } else if( IsEqualGUID( &IID_IDirectPlay4A, riid ) ) { - IDirectPlay4AImpl *This = (IDirectPlay4AImpl *)*ppvObj; + IDirectPlay4AImpl *This = *ppvObj; This->lpVtbl = &directPlay4AVT; } else @@ -568,32 +538,32 @@ static HRESULT WINAPI DP_QueryInterface if( IsEqualGUID( &IID_IDirectPlay2, riid ) ) { - IDirectPlay2Impl *This = (IDirectPlay2Impl *)*ppvObj; + IDirectPlay2Impl *This = *ppvObj; This->lpVtbl = &directPlay2WVT; } else if( IsEqualGUID( &IID_IDirectPlay2A, riid ) ) { - IDirectPlay2AImpl *This = (IDirectPlay2AImpl *)*ppvObj; + IDirectPlay2AImpl *This = *ppvObj; This->lpVtbl = &directPlay2AVT; } else if( IsEqualGUID( &IID_IDirectPlay3, riid ) ) { - IDirectPlay3Impl *This = (IDirectPlay3Impl *)*ppvObj; + IDirectPlay3Impl *This = *ppvObj; This->lpVtbl = &directPlay3WVT; } else if( IsEqualGUID( &IID_IDirectPlay3A, riid ) ) { - IDirectPlay3AImpl *This = (IDirectPlay3AImpl *)*ppvObj; + IDirectPlay3AImpl *This = *ppvObj; This->lpVtbl = &directPlay3AVT; } else if( IsEqualGUID( &IID_IDirectPlay4, riid ) ) { - IDirectPlay4Impl *This = (IDirectPlay4Impl *)*ppvObj; + IDirectPlay4Impl *This = *ppvObj; This->lpVtbl = &directPlay4WVT; } else if( IsEqualGUID( &IID_IDirectPlay4A, riid ) ) { - IDirectPlay4AImpl *This = (IDirectPlay4AImpl *)*ppvObj; + IDirectPlay4AImpl *This = *ppvObj; This->lpVtbl = &directPlay4AVT; } else @@ -620,7 +590,7 @@ static ULONG WINAPI DP_AddRef ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef ); - TRACE( "ref count incremented to %lu:%lu for %p\n", + TRACE( "ref count incremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); return ulObjRefCount; @@ -636,7 +606,7 @@ static ULONG WINAPI DP_Release ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef ); - TRACE( "ref count decremented to %lu:%lu for %p\n", + TRACE( "ref count decremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); /* Deallocate if this is the last reference to the object */ @@ -670,7 +640,7 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody, WORD wCommandId, WORD wVersion, LPVOID* lplpReply, LPDWORD lpdwMsgSize ) { - TRACE( "(%p)->(%p,0x%08lx,%p,%u,%u)\n", + TRACE( "(%p)->(%p,0x%08x,%p,%u,%u)\n", This, lpcMessageBody, dwMessageBodySize, lpcMessageHeader, wCommandId, wVersion ); @@ -678,28 +648,22 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody, { /* Name server needs to handle this request */ case DPMSGCMD_ENUMSESSIONSREQUEST: - { /* Reply expected */ NS_ReplyToEnumSessionsRequest( lpcMessageBody, lplpReply, lpdwMsgSize, This ); - break; - } /* Name server needs to handle this request */ case DPMSGCMD_ENUMSESSIONSREPLY: - { /* No reply expected */ NS_AddRemoteComputerAsNameServer( lpcMessageHeader, This->dp2->spData.dwSPHeaderSize, - (LPDPMSG_ENUMSESSIONSREPLY)lpcMessageBody, + lpcMessageBody, This->dp2->lpNameServerData ); break; - } case DPMSGCMD_REQUESTNEWPLAYERID: { - LPCDPMSG_REQUESTNEWPLAYERID lpcMsg = - (LPCDPMSG_REQUESTNEWPLAYERID)lpcMessageBody; + LPCDPMSG_REQUESTNEWPLAYERID lpcMsg = lpcMessageBody; LPDPMSG_NEWPLAYERIDREPLY lpReply; @@ -707,7 +671,7 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody, *lplpReply = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, *lpdwMsgSize ); - FIXME( "Ignoring dwFlags 0x%08lx in request msg\n", + FIXME( "Ignoring dwFlags 0x%08x in request msg\n", lpcMsg->dwFlags ); /* Setup the reply */ @@ -720,58 +684,45 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody, lpReply->dpidNewPlayerId = DP_NextObjectId(); - TRACE( "Allocating new playerid 0x%08lx from remote request\n", + TRACE( "Allocating new playerid 0x%08x from remote request\n", lpReply->dpidNewPlayerId ); - break; } case DPMSGCMD_GETNAMETABLEREPLY: case DPMSGCMD_NEWPLAYERIDREPLY: - { - #if 0 if( wCommandId == DPMSGCMD_NEWPLAYERIDREPLY ) DebugBreak(); #endif DP_MSG_ReplyReceived( This, wCommandId, lpcMessageBody, dwMessageBodySize ); - break; - } #if 1 case DPMSGCMD_JUSTENVELOPE: - { - TRACE( "GOT THE SELF MESSAGE: %p -> 0x%08lx\n", lpcMessageHeader, ((LPDWORD)lpcMessageHeader)[1] ); + TRACE( "GOT THE SELF MESSAGE: %p -> 0x%08x\n", lpcMessageHeader, ((const DWORD *)lpcMessageHeader)[1] ); NS_SetLocalAddr( This->dp2->lpNameServerData, lpcMessageHeader, 20 ); DP_MSG_ReplyReceived( This, wCommandId, lpcMessageBody, dwMessageBodySize ); - } #endif case DPMSGCMD_FORWARDADDPLAYER: - { #if 0 DebugBreak(); #endif #if 1 - TRACE( "Sending message to self to get my addr\n" ); - DP_MSG_ToSelf( This, 1 ); /* This is a hack right now */ + TRACE( "Sending message to self to get my addr\n" ); + DP_MSG_ToSelf( This, 1 ); /* This is a hack right now */ #endif break; - } case DPMSGCMD_FORWARDADDPLAYERNACK: - { DP_MSG_ErrorReceived( This, wCommandId, lpcMessageBody, dwMessageBodySize ); break; - } default: - { FIXME( "Unknown wCommandId %u. Ignoring message\n", wCommandId ); DebugBreak(); break; - } } /* FIXME: There is code in dplaysp.c to handle dplay commands. Move to here. */ @@ -780,7 +731,7 @@ HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpcMessageBody, } -static HRESULT WINAPI DP_IF_AddPlayerToGroup +static HRESULT DP_IF_AddPlayerToGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, DPID idPlayer, BOOL bAnsi ) { @@ -788,9 +739,14 @@ static HRESULT WINAPI DP_IF_AddPlayerToGroup lpPlayerList lpPList; lpPlayerList lpNewPList; - TRACE( "(%p)->(%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(%p,0x%08x,0x%08x,%u)\n", This, lpMsgHdr, idGroup, idPlayer, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + /* Find the group */ if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL ) { @@ -869,7 +825,7 @@ static HRESULT WINAPI DirectPlay2WImpl_AddPlayerToGroup return DP_IF_AddPlayerToGroup( This, NULL, idGroup, idPlayer, FALSE ); } -static HRESULT WINAPI DP_IF_Close( IDirectPlay2Impl* This, BOOL bAnsi ) +static HRESULT DP_IF_Close( IDirectPlay2Impl* This, BOOL bAnsi ) { HRESULT hr = DP_OK; @@ -916,8 +872,8 @@ static HRESULT WINAPI DirectPlay2WImpl_Close } static -lpGroupData DP_CreateGroup( IDirectPlay2AImpl* This, LPDPID lpid, - LPDPNAME lpName, DWORD dwFlags, +lpGroupData DP_CreateGroup( IDirectPlay2AImpl* This, const DPID *lpid, + const DPNAME *lpName, DWORD dwFlags, DPID idParent, BOOL bAnsi ) { lpGroupData lpGData; @@ -944,7 +900,7 @@ lpGroupData DP_CreateGroup( IDirectPlay2AImpl* This, LPDPID lpid, /* FIXME: Should we validate the dwFlags? */ lpGData->dwFlags = dwFlags; - TRACE( "Created group id 0x%08lx\n", *lpid ); + TRACE( "Created group id 0x%08x\n", *lpid ); return lpGData; } @@ -955,13 +911,13 @@ DP_DeleteGroup( IDirectPlay2Impl* This, DPID dpid ) { lpGroupList lpGList; - TRACE( "(%p)->(0x%08lx)\n", This, dpid ); + TRACE( "(%p)->(0x%08x)\n", This, dpid ); DPQ_REMOVE_ENTRY( This->dp2->lpSysGroup->groups, groups, lpGData->dpid, ==, dpid, lpGList ); if( lpGList == NULL ) { - ERR( "DPID 0x%08lx not found\n", dpid ); + ERR( "DPID 0x%08x not found\n", dpid ); return; } @@ -984,7 +940,7 @@ static lpGroupData DP_FindAnyGroup( IDirectPlay2AImpl* This, DPID dpid ) { lpGroupList lpGroups; - TRACE( "(%p)->(0x%08lx)\n", This, dpid ); + TRACE( "(%p)->(0x%08x)\n", This, dpid ); if( dpid == DPID_SYSTEM_GROUP ) { @@ -1003,17 +959,22 @@ static lpGroupData DP_FindAnyGroup( IDirectPlay2AImpl* This, DPID dpid ) return lpGroups->lpGData; } -static HRESULT WINAPI DP_IF_CreateGroup +static HRESULT DP_IF_CreateGroup ( IDirectPlay2AImpl* This, LPVOID lpMsgHdr, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ) { lpGroupData lpGData; - TRACE( "(%p)->(%p,%p,%p,%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n", This, lpMsgHdr, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + /* If the name is not specified, we must provide one */ if( DPID_UNKNOWN == *lpidGroup ) { @@ -1165,10 +1126,6 @@ DP_SetGroupData( lpGroupData lpGData, DWORD dwFlags, /* Reallocate for new data */ if( lpData != NULL ) { - LPVOID lpNewData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof( dwDataSize ) ); - CopyMemory( lpNewData, lpData, dwDataSize ); - if( dwFlags & DPSET_LOCAL ) { lpGData->lpLocalData = lpData; @@ -1176,7 +1133,8 @@ DP_SetGroupData( lpGroupData lpGData, DWORD dwFlags, } else { - lpGData->lpRemoteData = lpNewData; + lpGData->lpRemoteData = HeapAlloc( GetProcessHeap(), 0, dwDataSize ); + CopyMemory( lpGData->lpRemoteData, lpData, dwDataSize ); lpGData->dwRemoteDataSize = dwDataSize; } } @@ -1223,7 +1181,10 @@ lpPlayerData DP_CreatePlayer( IDirectPlay2Impl* This, LPDPID lpid, /* Initialize the SP data section */ lpPData->lpSPPlayerData = DPSP_CreateSPPlayerData(); - TRACE( "Created player id 0x%08lx\n", *lpid ); + TRACE( "Created player id 0x%08x\n", *lpid ); + + if( ~dwFlags & DPLAYI_PLAYER_SYSPLAYER ) + This->dp2->lpSessionDesc->dwCurrentPlayers++; return lpPData; } @@ -1232,8 +1193,8 @@ lpPlayerData DP_CreatePlayer( IDirectPlay2Impl* This, LPDPID lpid, static void DP_DeleteDPNameStruct( LPDPNAME lpDPName ) { - HeapFree( GetProcessHeap(), HEAP_ZERO_MEMORY, lpDPName->lpszShortNameA ); - HeapFree( GetProcessHeap(), HEAP_ZERO_MEMORY, lpDPName->lpszLongNameA ); + HeapFree( GetProcessHeap(), HEAP_ZERO_MEMORY, lpDPName->u1.lpszShortNameA ); + HeapFree( GetProcessHeap(), HEAP_ZERO_MEMORY, lpDPName->u2.lpszLongNameA ); } /* This method assumes that all links to it are already deleted */ @@ -1242,13 +1203,13 @@ DP_DeletePlayer( IDirectPlay2Impl* This, DPID dpid ) { lpPlayerList lpPList; - TRACE( "(%p)->(0x%08lx)\n", This, dpid ); + TRACE( "(%p)->(0x%08x)\n", This, dpid ); DPQ_REMOVE_ENTRY( This->dp2->lpSysGroup->players, players, lpPData->dpid, ==, dpid, lpPList ); if( lpPList == NULL ) { - ERR( "DPID 0x%08lx not found\n", dpid ); + ERR( "DPID 0x%08x not found\n", dpid ); return; } @@ -1273,7 +1234,10 @@ static lpPlayerList DP_FindPlayer( IDirectPlay2AImpl* This, DPID dpid ) { lpPlayerList lpPlayers; - TRACE( "(%p)->(0x%08lx)\n", This, dpid ); + TRACE( "(%p)->(0x%08x)\n", This, dpid ); + + if(This->dp2->lpSysGroup == NULL) + return NULL; DPQ_FIND_ENTRY( This->dp2->lpSysGroup->players, players, lpPData->dpid, ==, dpid, lpPlayers ); @@ -1281,7 +1245,7 @@ static lpPlayerList DP_FindPlayer( IDirectPlay2AImpl* This, DPID dpid ) } /* Basic area for Dst must already be allocated */ -static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, LPDPNAME lpSrc, BOOL bAnsi ) +static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, const DPNAME *lpSrc, BOOL bAnsi ) { if( lpSrc == NULL ) { @@ -1296,40 +1260,40 @@ static BOOL DP_CopyDPNAMEStruct( LPDPNAME lpDst, LPDPNAME lpSrc, BOOL bAnsi ) } /* Delete any existing pointers */ - HeapFree( GetProcessHeap(), 0, lpDst->lpszShortNameA ); - HeapFree( GetProcessHeap(), 0, lpDst->lpszLongNameA ); + HeapFree( GetProcessHeap(), 0, lpDst->u1.lpszShortNameA ); + HeapFree( GetProcessHeap(), 0, lpDst->u2.lpszLongNameA ); /* Copy as required */ CopyMemory( lpDst, lpSrc, lpSrc->dwSize ); if( bAnsi ) { - if( lpSrc->lpszShortNameA ) + if( lpSrc->u1.lpszShortNameA ) { - lpDst->lpszShortNameA = HeapAlloc( GetProcessHeap(), 0, - strlen(lpSrc->lpszShortNameA)+1 ); - strcpy( lpDst->lpszShortNameA, lpSrc->lpszShortNameA ); + lpDst->u1.lpszShortNameA = HeapAlloc( GetProcessHeap(), 0, + strlen(lpSrc->u1.lpszShortNameA)+1 ); + strcpy( lpDst->u1.lpszShortNameA, lpSrc->u1.lpszShortNameA ); } - if( lpSrc->lpszLongNameA ) + if( lpSrc->u2.lpszLongNameA ) { - lpDst->lpszLongNameA = HeapAlloc( GetProcessHeap(), 0, - strlen(lpSrc->lpszLongNameA)+1 ); - strcpy( lpDst->lpszLongNameA, lpSrc->lpszLongNameA ); + lpDst->u2.lpszLongNameA = HeapAlloc( GetProcessHeap(), 0, + strlen(lpSrc->u2.lpszLongNameA)+1 ); + strcpy( lpDst->u2.lpszLongNameA, lpSrc->u2.lpszLongNameA ); } } else { - if( lpSrc->lpszShortNameA ) + if( lpSrc->u1.lpszShortNameA ) { - lpDst->lpszShortName = HeapAlloc( GetProcessHeap(), 0, - (strlenW(lpSrc->lpszShortName)+1)*sizeof(WCHAR) ); - strcpyW( lpDst->lpszShortName, lpSrc->lpszShortName ); + lpDst->u1.lpszShortName = HeapAlloc( GetProcessHeap(), 0, + (strlenW(lpSrc->u1.lpszShortName)+1)*sizeof(WCHAR) ); + strcpyW( lpDst->u1.lpszShortName, lpSrc->u1.lpszShortName ); } - if( lpSrc->lpszLongNameA ) + if( lpSrc->u2.lpszLongNameA ) { - lpDst->lpszLongName = HeapAlloc( GetProcessHeap(), 0, - (strlenW(lpSrc->lpszLongName)+1)*sizeof(WCHAR) ); - strcpyW( lpDst->lpszLongName, lpSrc->lpszLongName ); + lpDst->u2.lpszLongName = HeapAlloc( GetProcessHeap(), 0, + (strlenW(lpSrc->u2.lpszLongName)+1)*sizeof(WCHAR) ); + strcpyW( lpDst->u2.lpszLongName, lpSrc->u2.lpszLongName ); } } @@ -1363,9 +1327,6 @@ DP_SetPlayerData( lpPlayerData lpPData, DWORD dwFlags, /* Reallocate for new data */ if( lpData != NULL ) { - LPVOID lpNewData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof( dwDataSize ) ); - CopyMemory( lpNewData, lpData, dwDataSize ); if( dwFlags & DPSET_LOCAL ) { @@ -1374,14 +1335,15 @@ DP_SetPlayerData( lpPlayerData lpPData, DWORD dwFlags, } else { - lpPData->lpRemoteData = lpNewData; + lpPData->lpRemoteData = HeapAlloc( GetProcessHeap(), 0, dwDataSize ); + CopyMemory( lpPData->lpRemoteData, lpData, dwDataSize ); lpPData->dwRemoteDataSize = dwDataSize; } } } -static HRESULT WINAPI DP_IF_CreatePlayer +static HRESULT DP_IF_CreatePlayer ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, /* NULL for local creation, non NULL for remote creation */ LPDPID lpidPlayer, @@ -1397,9 +1359,13 @@ static HRESULT WINAPI DP_IF_CreatePlayer lpPlayerList lpPList; DWORD dwCreateFlags = 0; - TRACE( "(%p)->(%p,%p,%p,%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } if( dwFlags == 0 ) { @@ -1447,7 +1413,7 @@ static HRESULT WINAPI DP_IF_CreatePlayer ) { /* Assume non fatal failure */ - ERR( "unknown dwFlags = 0x%08lx\n", dwFlags ); + ERR( "unknown dwFlags = 0x%08x\n", dwFlags ); } /* If the name is not specified, we must provide one */ @@ -1476,8 +1442,9 @@ static HRESULT WINAPI DP_IF_CreatePlayer */ } - /* FIXME: Should we be storing these dwFlags or the creation ones? */ - lpPData = DP_CreatePlayer( This, lpidPlayer, lpPlayerName, dwFlags, + /* We pass creation flags, so we can distinguish sysplayers and not count them in the current + player total */ + lpPData = DP_CreatePlayer( This, lpidPlayer, lpPlayerName, dwCreateFlags, hEvent, bAnsi ); if( lpPData == NULL ) @@ -1512,7 +1479,7 @@ static HRESULT WINAPI DP_IF_CreatePlayer data.lpSPMessageHeader = lpMsgHdr; data.lpISP = This->dp2->spData.lpISP; - TRACE( "Calling SP CreatePlayer 0x%08lx: dwFlags: 0x%08lx lpMsgHdr: %p\n", + TRACE( "Calling SP CreatePlayer 0x%08x: dwFlags: 0x%08x lpMsgHdr: %p\n", *lpidPlayer, data.dwFlags, data.lpSPMessageHeader ); hr = (*This->dp2->spData.lpCB->CreatePlayer)( &data ); @@ -1598,6 +1565,11 @@ static HRESULT WINAPI DirectPlay2AImpl_CreatePlayer { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; + if( lpidPlayer == NULL ) + { + return DPERR_INVALIDPARAMS; + } + if( dwFlags & DPPLAYER_SERVERPLAYER ) { *lpidPlayer = DPID_SERVERPLAYER; @@ -1617,6 +1589,11 @@ static HRESULT WINAPI DirectPlay2WImpl_CreatePlayer { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; + if( lpidPlayer == NULL ) + { + return DPERR_INVALIDPARAMS; + } + if( dwFlags & DPPLAYER_SERVERPLAYER ) { *lpidPlayer = DPID_SERVERPLAYER; @@ -1638,7 +1615,7 @@ static DPID DP_GetRemoteNextObjectId(void) return DP_NextObjectId(); } -static HRESULT WINAPI DP_IF_DeletePlayerFromGroup +static HRESULT DP_IF_DeletePlayerFromGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, DPID idPlayer, BOOL bAnsi ) { @@ -1647,7 +1624,7 @@ static HRESULT WINAPI DP_IF_DeletePlayerFromGroup lpGroupData lpGData; lpPlayerList lpPList; - TRACE( "(%p)->(%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(%p,0x%08x,0x%08x,%u)\n", This, lpMsgHdr, idGroup, idPlayer, bAnsi ); /* Find the group */ @@ -1727,7 +1704,7 @@ cbRemoveGroupOrPlayer( { lpDPRGOPContext lpCtxt = (lpDPRGOPContext)lpContext; - TRACE( "Removing element:0x%08lx (type:0x%08lx) from element:0x%08lx\n", + TRACE( "Removing element:0x%08x (type:0x%08x) from element:0x%08x\n", dpId, dwPlayerType, lpCtxt->idGroup ); if( dwPlayerType == DPPLAYERTYPE_GROUP ) @@ -1737,7 +1714,7 @@ cbRemoveGroupOrPlayer( ) ) { - ERR( "Unable to delete group 0x%08lx from group 0x%08lx\n", + ERR( "Unable to delete group 0x%08x from group 0x%08x\n", dpId, lpCtxt->idGroup ); } } @@ -1749,7 +1726,7 @@ cbRemoveGroupOrPlayer( ) ) { - ERR( "Unable to delete player 0x%08lx from grp 0x%08lx\n", + ERR( "Unable to delete player 0x%08x from grp 0x%08x\n", dpId, lpCtxt->idGroup ); } } @@ -1757,13 +1734,13 @@ cbRemoveGroupOrPlayer( return TRUE; /* Continue enumeration */ } -static HRESULT WINAPI DP_IF_DestroyGroup +static HRESULT DP_IF_DestroyGroup ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idGroup, BOOL bAnsi ) { lpGroupData lpGData; DPRGOPContext context; - FIXME( "(%p)->(%p,0x%08lx,%u): semi stub\n", + FIXME( "(%p)->(%p,0x%08x,%u): semi stub\n", This, lpMsgHdr, idGroup, bAnsi ); /* Find the group */ @@ -1778,7 +1755,7 @@ static HRESULT WINAPI DP_IF_DestroyGroup /* Remove all players that this group has */ DP_IF_EnumGroupPlayers( This, idGroup, NULL, - cbRemoveGroupOrPlayer, (LPVOID)&context, 0, bAnsi ); + cbRemoveGroupOrPlayer, &context, 0, bAnsi ); /* Remove all links to groups that this group has since this is dp3 */ DP_IF_EnumGroupsInGroup( (IDirectPlay3Impl*)This, idGroup, NULL, @@ -1836,12 +1813,12 @@ typedef struct _DPFAGContext BOOL bAnsi; } DPFAGContext, *lpDPFAGContext; -static HRESULT WINAPI DP_IF_DestroyPlayer +static HRESULT DP_IF_DestroyPlayer ( IDirectPlay2Impl* This, LPVOID lpMsgHdr, DPID idPlayer, BOOL bAnsi ) { DPFAGContext cbContext; - FIXME( "(%p)->(%p,0x%08lx,%u): semi stub\n", + FIXME( "(%p)->(%p,0x%08x,%u): semi stub\n", This, lpMsgHdr, idPlayer, bAnsi ); if( This->dp2->connectionInitialized == NO_PROVIDER ) @@ -1863,7 +1840,7 @@ static HRESULT WINAPI DP_IF_DestroyPlayer /* Find each group and call DeletePlayerFromGroup if the player is a member of the group */ DP_IF_EnumGroups( This, NULL, cbDeletePlayerFromAllGroups, - (LPVOID)&cbContext, DPENUMGROUPS_ALL, bAnsi ); + &cbContext, DPENUMGROUPS_ALL, bAnsi ); /* Now delete player and player list from the sys group */ DP_DeletePlayer( This, idPlayer ); @@ -1908,13 +1885,13 @@ cbDeletePlayerFromAllGroups( DP_IF_EnumGroupsInGroup( (IDirectPlay3Impl*)lpCtxt->This, dpId, NULL, cbDeletePlayerFromAllGroups, - (LPVOID)lpContext, DPENUMGROUPS_ALL, + lpContext, DPENUMGROUPS_ALL, lpCtxt->bAnsi ); } else { - ERR( "Group callback has dwPlayerType = 0x%08lx\n", dwPlayerType ); + ERR( "Group callback has dwPlayerType = 0x%08x\n", dwPlayerType ); } return TRUE; @@ -1934,7 +1911,7 @@ static HRESULT WINAPI DirectPlay2WImpl_DestroyPlayer return DP_IF_DestroyPlayer( This, NULL, idPlayer, FALSE ); } -static HRESULT WINAPI DP_IF_EnumGroupPlayers +static HRESULT DP_IF_EnumGroupPlayers ( IDirectPlay2Impl* This, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ) @@ -1942,7 +1919,7 @@ static HRESULT WINAPI DP_IF_EnumGroupPlayers lpGroupData lpGData; lpPlayerList lpPList; - FIXME("(%p)->(0x%08lx,%p,%p,%p,0x%08lx,%u): semi stub\n", + FIXME("(%p)->(0x%08x,%p,%p,%p,0x%08x,%u): semi stub\n", This, idGroup, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags, bAnsi ); @@ -1968,7 +1945,7 @@ static HRESULT WINAPI DP_IF_EnumGroupPlayers for( ;; ) { /* We do not enum the name server or app server as they are of no - * concequence to the end user. + * consequence to the end user. */ if( ( lpPList->lpPData->dpid != DPID_NAME_SERVER ) && ( lpPList->lpPData->dpid != DPID_SERVERPLAYER ) @@ -2022,7 +1999,7 @@ static HRESULT WINAPI DirectPlay2WImpl_EnumGroupPlayers } /* NOTE: This only enumerates top level groups (created with CreateGroup) */ -static HRESULT WINAPI DP_IF_EnumGroups +static HRESULT DP_IF_EnumGroups ( IDirectPlay2Impl* This, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ) @@ -2053,7 +2030,7 @@ static HRESULT WINAPI DirectPlay2WImpl_EnumGroups lpContext, dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_EnumPlayers +static HRESULT DP_IF_EnumPlayers ( IDirectPlay2Impl* This, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ) @@ -2118,11 +2095,11 @@ static void DP_InvokeEnumSessionCallbacks static DWORD CALLBACK DP_EnumSessionsSendAsyncRequestThread( LPVOID lpContext ) { - EnumSessionAsyncCallbackData* data = (EnumSessionAsyncCallbackData*)lpContext; + EnumSessionAsyncCallbackData* data = lpContext; HANDLE hSuicideRequest = data->hSuicideRequest; DWORD dwTimeout = data->dwTimeout; - TRACE( "Thread started with timeout = 0x%08lx\n", dwTimeout ); + TRACE( "Thread started with timeout = 0x%08x\n", dwTimeout ); for( ;; ) { @@ -2183,16 +2160,20 @@ static void DP_KillEnumSessionThread( IDirectPlay2Impl* This ) } } -static HRESULT WINAPI DP_IF_EnumSessions +static HRESULT DP_IF_EnumSessions ( IDirectPlay2Impl* This, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ) { HRESULT hr = DP_OK; - TRACE( "(%p)->(%p,0x%08lx,%p,%p,0x%08lx,%u)\n", + TRACE( "(%p)->(%p,0x%08x,%p,%p,0x%08x,%u)\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } /* Can't enumerate if the interface is already open */ if( This->dp2->bConnectionOpen ) @@ -2264,7 +2245,6 @@ static HRESULT WINAPI DP_IF_EnumSessions return hr; } - /* FIXME: Interface locking sucks in this method */ if( ( dwFlags & DPENUMSESSIONS_ASYNC ) ) { /* Enumerate everything presently in the local session cache */ @@ -2272,11 +2252,14 @@ static HRESULT WINAPI DP_IF_EnumSessions This->dp2->lpNameServerData, dwTimeout, lpContext ); + if( This->dp2->dwEnumSessionLock != 0 ) + return DPERR_CONNECTING; /* See if we've already created a thread to service this interface */ if( This->dp2->hEnumSessionThread == INVALID_HANDLE_VALUE ) { DWORD dwThreadId; + This->dp2->dwEnumSessionLock++; /* Send the first enum request inline since the user may cancel a dialog * if one is presented. Also, may also have a connecting return code. @@ -2284,14 +2267,14 @@ static HRESULT WINAPI DP_IF_EnumSessions hr = NS_SendSessionRequestBroadcast( &lpsd->guidApplication, dwFlags, &This->dp2->spData ); - if( !FAILED(hr) ) + if( SUCCEEDED(hr) ) { EnumSessionAsyncCallbackData* lpData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *lpData ) ); /* FIXME: need to kill the thread on object deletion */ lpData->lpSpData = &This->dp2->spData; - CopyMemory( &lpData->requestGuid, &lpsd->guidApplication, sizeof(GUID) ); + lpData->requestGuid = lpsd->guidApplication; lpData->dwEnumSessionFlags = dwFlags; lpData->dwTimeout = dwTimeout; @@ -2317,6 +2300,7 @@ static HRESULT WINAPI DP_IF_EnumSessions 0, &dwThreadId ); } + This->dp2->dwEnumSessionLock--; } } else @@ -2360,13 +2344,18 @@ static HRESULT WINAPI DirectPlay2WImpl_EnumSessions lpContext, dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_GetPlayerCaps +static HRESULT DP_IF_GetPlayerCaps ( IDirectPlay2Impl* This, DPID idPlayer, LPDPCAPS lpDPCaps, DWORD dwFlags ) { DPSP_GETCAPSDATA data; - TRACE("(%p)->(0x%08lx,%p,0x%08lx)\n", This, idPlayer, lpDPCaps, dwFlags); + TRACE("(%p)->(0x%08x,%p,0x%08x)\n", This, idPlayer, lpDPCaps, dwFlags); + + if ( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } /* Query the service provider */ data.idPlayer = idPlayer; @@ -2377,7 +2366,7 @@ static HRESULT WINAPI DP_IF_GetPlayerCaps return (*This->dp2->spData.lpCB->GetCaps)( &data ); } -static HRESULT WINAPI DP_IF_GetCaps +static HRESULT DP_IF_GetCaps ( IDirectPlay2Impl* This, LPDPCAPS lpDPCaps, DWORD dwFlags ) { return DP_IF_GetPlayerCaps( This, DPID_ALLPLAYERS, lpDPCaps, dwFlags ); @@ -2397,7 +2386,7 @@ static HRESULT WINAPI DirectPlay2WImpl_GetCaps return DP_IF_GetCaps( This, lpDPCaps, dwFlags ); } -static HRESULT WINAPI DP_IF_GetGroupData +static HRESULT DP_IF_GetGroupData ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags, BOOL bAnsi ) { @@ -2405,7 +2394,7 @@ static HRESULT WINAPI DP_IF_GetGroupData DWORD dwRequiredBufferSize; LPVOID lpCopyDataFrom; - TRACE( "(%p)->(0x%08lx,%p,%p,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,%p,0x%08x,%u)\n", This, idGroup, lpData, lpdwDataSize, dwFlags, bAnsi ); if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL ) @@ -2457,15 +2446,15 @@ static HRESULT WINAPI DirectPlay2WImpl_GetGroupData dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_GetGroupName +static HRESULT DP_IF_GetGroupName ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ) { lpGroupData lpGData; - LPDPNAME lpName = (LPDPNAME)lpData; + LPDPNAME lpName = lpData; DWORD dwRequiredDataSize; - FIXME("(%p)->(0x%08lx,%p,%p,%u) ANSI ignored\n", + FIXME("(%p)->(0x%08x,%p,%p,%u) ANSI ignored\n", This, idGroup, lpData, lpdwDataSize, bAnsi ); if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL ) @@ -2475,14 +2464,14 @@ static HRESULT WINAPI DP_IF_GetGroupName dwRequiredDataSize = lpGData->name.dwSize; - if( lpGData->name.lpszShortNameA ) + if( lpGData->name.u1.lpszShortNameA ) { - dwRequiredDataSize += strlen( lpGData->name.lpszShortNameA ) + 1; + dwRequiredDataSize += strlen( lpGData->name.u1.lpszShortNameA ) + 1; } - if( lpGData->name.lpszLongNameA ) + if( lpGData->name.u2.lpszLongNameA ) { - dwRequiredDataSize += strlen( lpGData->name.lpszLongNameA ) + 1; + dwRequiredDataSize += strlen( lpGData->name.u2.lpszLongNameA ) + 1; } if( ( lpData == NULL ) || @@ -2496,24 +2485,24 @@ static HRESULT WINAPI DP_IF_GetGroupName /* Copy the structure */ CopyMemory( lpName, &lpGData->name, lpGData->name.dwSize ); - if( lpGData->name.lpszShortNameA ) + if( lpGData->name.u1.lpszShortNameA ) { strcpy( ((char*)lpName)+lpGData->name.dwSize, - lpGData->name.lpszShortNameA ); + lpGData->name.u1.lpszShortNameA ); } else { - lpName->lpszShortNameA = NULL; + lpName->u1.lpszShortNameA = NULL; } - if( lpGData->name.lpszShortNameA ) + if( lpGData->name.u1.lpszShortNameA ) { strcpy( ((char*)lpName)+lpGData->name.dwSize, - lpGData->name.lpszLongNameA ); + lpGData->name.u2.lpszLongNameA ); } else { - lpName->lpszLongNameA = NULL; + lpName->u2.lpszLongNameA = NULL; } return DP_OK; @@ -2535,11 +2524,11 @@ static HRESULT WINAPI DirectPlay2WImpl_GetGroupName return DP_IF_GetGroupName( This, idGroup, lpData, lpdwDataSize, FALSE ); } -static HRESULT WINAPI DP_IF_GetMessageCount +static HRESULT DP_IF_GetMessageCount ( IDirectPlay2Impl* This, DPID idPlayer, LPDWORD lpdwCount, BOOL bAnsi ) { - FIXME("(%p)->(0x%08lx,%p,%u): stub\n", This, idPlayer, lpdwCount, bAnsi ); + FIXME("(%p)->(0x%08x,%p,%u): stub\n", This, idPlayer, lpdwCount, bAnsi ); return DP_IF_GetMessageQueue( (IDirectPlay4Impl*)This, 0, idPlayer, DPMESSAGEQUEUE_RECEIVE, lpdwCount, NULL, bAnsi ); @@ -2563,7 +2552,7 @@ static HRESULT WINAPI DirectPlay2AImpl_GetPlayerAddress ( LPDIRECTPLAY2A iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; - FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize ); return DP_OK; } @@ -2571,7 +2560,7 @@ static HRESULT WINAPI DirectPlay2WImpl_GetPlayerAddress ( LPDIRECTPLAY2 iface, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; - FIXME("(%p)->(0x%08lx,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,%p,%p): stub\n", This, idPlayer, lpData, lpdwDataSize ); return DP_OK; } @@ -2591,7 +2580,7 @@ static HRESULT WINAPI DirectPlay2WImpl_GetPlayerCaps return DP_IF_GetPlayerCaps( This, idPlayer, lpPlayerCaps, dwFlags ); } -static HRESULT WINAPI DP_IF_GetPlayerData +static HRESULT DP_IF_GetPlayerData ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, DWORD dwFlags, BOOL bAnsi ) { @@ -2599,7 +2588,7 @@ static HRESULT WINAPI DP_IF_GetPlayerData DWORD dwRequiredBufferSize; LPVOID lpCopyDataFrom; - TRACE( "(%p)->(0x%08lx,%p,%p,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,%p,0x%08x,%u)\n", This, idPlayer, lpData, lpdwDataSize, dwFlags, bAnsi ); if( This->dp2->connectionInitialized == NO_PROVIDER ) @@ -2656,17 +2645,22 @@ static HRESULT WINAPI DirectPlay2WImpl_GetPlayerData dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_GetPlayerName +static HRESULT DP_IF_GetPlayerName ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ) { lpPlayerList lpPList; - LPDPNAME lpName = (LPDPNAME)lpData; + LPDPNAME lpName = lpData; DWORD dwRequiredDataSize; - FIXME( "(%p)->(0x%08lx,%p,%p,%u): ANSI\n", + FIXME( "(%p)->(0x%08x,%p,%p,%u): ANSI\n", This, idPlayer, lpData, lpdwDataSize, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + if( ( lpPList = DP_FindPlayer( This, idPlayer ) ) == NULL ) { return DPERR_INVALIDPLAYER; @@ -2674,14 +2668,14 @@ static HRESULT WINAPI DP_IF_GetPlayerName dwRequiredDataSize = lpPList->lpPData->name.dwSize; - if( lpPList->lpPData->name.lpszShortNameA ) + if( lpPList->lpPData->name.u1.lpszShortNameA ) { - dwRequiredDataSize += strlen( lpPList->lpPData->name.lpszShortNameA ) + 1; + dwRequiredDataSize += strlen( lpPList->lpPData->name.u1.lpszShortNameA ) + 1; } - if( lpPList->lpPData->name.lpszLongNameA ) + if( lpPList->lpPData->name.u2.lpszLongNameA ) { - dwRequiredDataSize += strlen( lpPList->lpPData->name.lpszLongNameA ) + 1; + dwRequiredDataSize += strlen( lpPList->lpPData->name.u2.lpszLongNameA ) + 1; } if( ( lpData == NULL ) || @@ -2695,24 +2689,24 @@ static HRESULT WINAPI DP_IF_GetPlayerName /* Copy the structure */ CopyMemory( lpName, &lpPList->lpPData->name, lpPList->lpPData->name.dwSize ); - if( lpPList->lpPData->name.lpszShortNameA ) + if( lpPList->lpPData->name.u1.lpszShortNameA ) { strcpy( ((char*)lpName)+lpPList->lpPData->name.dwSize, - lpPList->lpPData->name.lpszShortNameA ); + lpPList->lpPData->name.u1.lpszShortNameA ); } else { - lpName->lpszShortNameA = NULL; + lpName->u1.lpszShortNameA = NULL; } - if( lpPList->lpPData->name.lpszShortNameA ) + if( lpPList->lpPData->name.u1.lpszShortNameA ) { strcpy( ((char*)lpName)+lpPList->lpPData->name.dwSize, - lpPList->lpPData->name.lpszLongNameA ); + lpPList->lpPData->name.u2.lpszLongNameA ); } else { - lpName->lpszLongNameA = NULL; + lpName->u2.lpszLongNameA = NULL; } return DP_OK; @@ -2734,7 +2728,7 @@ static HRESULT WINAPI DirectPlay2WImpl_GetPlayerName return DP_IF_GetPlayerName( This, idPlayer, lpData, lpdwDataSize, FALSE ); } -static HRESULT WINAPI DP_GetSessionDesc +static HRESULT DP_GetSessionDesc ( IDirectPlay2Impl* This, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ) { @@ -2801,16 +2795,27 @@ static HRESULT WINAPI DirectPlay2WImpl_Initialize } -static HRESULT WINAPI DP_SecureOpen +static HRESULT DP_SecureOpen ( IDirectPlay2Impl* This, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials, BOOL bAnsi ) { HRESULT hr = DP_OK; - FIXME( "(%p)->(%p,0x%08lx,%p,%p): partial stub\n", + FIXME( "(%p)->(%p,0x%08x,%p,%p): partial stub\n", This, lpsd, dwFlags, lpSecurity, lpCredentials ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + + if( lpsd->dwSize != sizeof(DPSESSIONDESC2) ) + { + TRACE( ": rejecting invalid dpsd size (%d).\n", lpsd->dwSize ); + return DPERR_INVALIDPARAMS; + } + if( This->dp2->bConnectionOpen ) { TRACE( ": rejecting already open connection.\n" ); @@ -2843,11 +2848,11 @@ static HRESULT WINAPI DP_SecureOpen FIXME( "Not all data fields are correct. Need new parameter\n" ); - data.bCreate = (dwFlags & DPOPEN_CREATE ) ? TRUE : FALSE; + data.bCreate = (dwFlags & DPOPEN_CREATE ) != 0; data.lpSPMessageHeader = (dwFlags & DPOPEN_CREATE ) ? NULL : NS_GetNSAddr( This->dp2->lpNameServerData ); data.lpISP = This->dp2->spData.lpISP; - data.bReturnStatus = (dwFlags & DPOPEN_RETURNSTATUS) ? TRUE : FALSE; + data.bReturnStatus = (dwFlags & DPOPEN_RETURNSTATUS) != 0; data.dwOpenFlags = dwFlags; data.dwSessionFlags = This->dp2->lpSessionDesc->dwFlags; @@ -2906,7 +2911,7 @@ static HRESULT WINAPI DirectPlay2AImpl_Open ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags ) { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; - TRACE("(%p)->(%p,0x%08lx)\n", This, lpsd, dwFlags ); + TRACE("(%p)->(%p,0x%08x)\n", This, lpsd, dwFlags ); return DP_SecureOpen( This, lpsd, dwFlags, NULL, NULL, TRUE ); } @@ -2914,17 +2919,17 @@ static HRESULT WINAPI DirectPlay2WImpl_Open ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags ) { IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface; - TRACE("(%p)->(%p,0x%08lx)\n", This, lpsd, dwFlags ); + TRACE("(%p)->(%p,0x%08x)\n", This, lpsd, dwFlags ); return DP_SecureOpen( This, lpsd, dwFlags, NULL, NULL, FALSE ); } -static HRESULT WINAPI DP_IF_Receive +static HRESULT DP_IF_Receive ( IDirectPlay2Impl* This, LPDPID lpidFrom, LPDPID lpidTo, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize, BOOL bAnsi ) { LPDPMSG lpMsg = NULL; - FIXME( "(%p)->(%p,%p,0x%08lx,%p,%p,%u): stub\n", + FIXME( "(%p)->(%p,%p,0x%08x,%p,%p,%u): stub\n", This, lpidFrom, lpidTo, dwFlags, lpData, lpdwDataSize, bAnsi ); if( This->dp2->connectionInitialized == NO_PROVIDER ) @@ -2958,11 +2963,11 @@ static HRESULT WINAPI DP_IF_Receive ( dwFlags & DPRECEIVE_FROMPLAYER ) ) { - FIXME( "Find matching message 0x%08lx\n", dwFlags ); + FIXME( "Find matching message 0x%08x\n", dwFlags ); } else { - ERR( "Hmmm..dwFlags 0x%08lx\n", dwFlags ); + ERR( "Hmmm..dwFlags 0x%08x\n", dwFlags ); } if( lpMsg == NULL ) @@ -2971,7 +2976,7 @@ static HRESULT WINAPI DP_IF_Receive } /* Copy into the provided buffer */ - CopyMemory( lpData, lpMsg->msg, *lpdwDataSize ); + if (lpData) CopyMemory( lpData, lpMsg->msg, *lpdwDataSize ); return DP_OK; } @@ -3010,13 +3015,13 @@ static HRESULT WINAPI DirectPlay2WImpl_Send 0, 0, NULL, NULL, FALSE ); } -static HRESULT WINAPI DP_IF_SetGroupData +static HRESULT DP_IF_SetGroupData ( IDirectPlay2Impl* This, DPID idGroup, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ) { lpGroupData lpGData; - TRACE( "(%p)->(0x%08lx,%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,0x%08x,0x%08x,%u)\n", This, idGroup, lpData, dwDataSize, dwFlags, bAnsi ); /* Parameter check */ @@ -3070,13 +3075,13 @@ static HRESULT WINAPI DirectPlay2WImpl_SetGroupData return DP_IF_SetGroupData( This, idGroup, lpData, dwDataSize, dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_SetGroupName +static HRESULT DP_IF_SetGroupName ( IDirectPlay2Impl* This, DPID idGroup, LPDPNAME lpGroupName, DWORD dwFlags, BOOL bAnsi ) { lpGroupData lpGData; - TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", This, idGroup, + TRACE( "(%p)->(0x%08x,%p,0x%08x,%u)\n", This, idGroup, lpGroupName, dwFlags, bAnsi ); if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL ) @@ -3108,15 +3113,20 @@ static HRESULT WINAPI DirectPlay2WImpl_SetGroupName return DP_IF_SetGroupName( This, idGroup, lpGroupName, dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_SetPlayerData +static HRESULT DP_IF_SetPlayerData ( IDirectPlay2Impl* This, DPID idPlayer, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ) { lpPlayerList lpPList; - TRACE( "(%p)->(0x%08lx,%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,0x%08x,0x%08x,%u)\n", This, idPlayer, lpData, dwDataSize, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + /* Parameter check */ if( ( lpData == NULL ) && ( dwDataSize != 0 ) @@ -3167,15 +3177,20 @@ static HRESULT WINAPI DirectPlay2WImpl_SetPlayerData dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_SetPlayerName +static HRESULT DP_IF_SetPlayerName ( IDirectPlay2Impl* This, DPID idPlayer, LPDPNAME lpPlayerName, DWORD dwFlags, BOOL bAnsi ) { lpPlayerList lpPList; - TRACE( "(%p)->(0x%08lx,%p,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,0x%08x,%u)\n", This, idPlayer, lpPlayerName, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + if( ( lpPList = DP_FindPlayer( This, idPlayer ) ) == NULL ) { return DPERR_INVALIDGROUP; @@ -3205,14 +3220,14 @@ static HRESULT WINAPI DirectPlay2WImpl_SetPlayerName return DP_IF_SetPlayerName( This, idPlayer, lpPlayerName, dwFlags, FALSE ); } -static HRESULT WINAPI DP_SetSessionDesc +static HRESULT DP_SetSessionDesc ( IDirectPlay2Impl* This, LPCDPSESSIONDESC2 lpSessDesc, DWORD dwFlags, BOOL bInitial, BOOL bAnsi ) { DWORD dwRequiredSize; LPDPSESSIONDESC2 lpTempSessDesc; - TRACE( "(%p)->(%p,0x%08lx,%u,%u)\n", + TRACE( "(%p)->(%p,0x%08x,%u,%u)\n", This, lpSessDesc, dwFlags, bInitial, bAnsi ); if( This->dp2->connectionInitialized == NO_PROVIDER ) @@ -3244,10 +3259,13 @@ static HRESULT WINAPI DP_SetSessionDesc HeapFree( GetProcessHeap(), 0, This->dp2->lpSessionDesc ); This->dp2->lpSessionDesc = lpTempSessDesc; - /* Set the new */ DP_CopySessionDesc( This->dp2->lpSessionDesc, lpSessDesc, bAnsi ); - + if( bInitial ) + { + /*Initializing session GUID*/ + CoCreateGuid( &(This->dp2->lpSessionDesc->guidInstance) ); + } /* If this is an external invocation of the interface, we should be * letting everyone know that things have changed. Otherwise this is * just an initialization and it doesn't need to be propagated. @@ -3275,7 +3293,7 @@ static HRESULT WINAPI DirectPlay2WImpl_SetSessionDesc } /* FIXME: See about merging some of this stuff with dplayx_global.c stuff */ -DWORD DP_CalcSessionDescSize( LPCDPSESSIONDESC2 lpSessDesc, BOOL bAnsi ) +static DWORD DP_CalcSessionDescSize( LPCDPSESSIONDESC2 lpSessDesc, BOOL bAnsi ) { DWORD dwSize = 0; @@ -3290,35 +3308,35 @@ DWORD DP_CalcSessionDescSize( LPCDPSESSIONDESC2 lpSessDesc, BOOL bAnsi ) if( bAnsi ) { - if( lpSessDesc->lpszSessionNameA ) + if( lpSessDesc->u1.lpszSessionNameA ) { - dwSize += lstrlenA( lpSessDesc->lpszSessionNameA ) + 1; + dwSize += lstrlenA( lpSessDesc->u1.lpszSessionNameA ) + 1; } - if( lpSessDesc->lpszPasswordA ) + if( lpSessDesc->u2.lpszPasswordA ) { - dwSize += lstrlenA( lpSessDesc->lpszPasswordA ) + 1; + dwSize += lstrlenA( lpSessDesc->u2.lpszPasswordA ) + 1; } } else /* UNICODE */ { - if( lpSessDesc->lpszSessionName ) + if( lpSessDesc->u1.lpszSessionName ) { dwSize += sizeof( WCHAR ) * - ( lstrlenW( lpSessDesc->lpszSessionName ) + 1 ); + ( lstrlenW( lpSessDesc->u1.lpszSessionName ) + 1 ); } - if( lpSessDesc->lpszPassword ) + if( lpSessDesc->u2.lpszPassword ) { dwSize += sizeof( WCHAR ) * - ( lstrlenW( lpSessDesc->lpszPassword ) + 1 ); + ( lstrlenW( lpSessDesc->u2.lpszPassword ) + 1 ); } } return dwSize; } -/* Assumes that contugous buffers are already allocated. */ +/* Assumes that contiguous buffers are already allocated. */ static void DP_CopySessionDesc( LPDPSESSIONDESC2 lpSessionDest, LPCDPSESSIONDESC2 lpSessionSrc, BOOL bAnsi ) { @@ -3336,57 +3354,57 @@ static void DP_CopySessionDesc( LPDPSESSIONDESC2 lpSessionDest, if( bAnsi ) { - if( lpSessionSrc->lpszSessionNameA ) + if( lpSessionSrc->u1.lpszSessionNameA ) { lstrcpyA( (LPSTR)lpStartOfFreeSpace, - lpSessionDest->lpszSessionNameA ); - lpSessionDest->lpszSessionNameA = (LPSTR)lpStartOfFreeSpace; + lpSessionDest->u1.lpszSessionNameA ); + lpSessionDest->u1.lpszSessionNameA = (LPSTR)lpStartOfFreeSpace; lpStartOfFreeSpace += - lstrlenA( (LPSTR)lpSessionDest->lpszSessionNameA ) + 1; + lstrlenA( lpSessionDest->u1.lpszSessionNameA ) + 1; } - if( lpSessionSrc->lpszPasswordA ) + if( lpSessionSrc->u2.lpszPasswordA ) { lstrcpyA( (LPSTR)lpStartOfFreeSpace, - lpSessionDest->lpszPasswordA ); - lpSessionDest->lpszPasswordA = (LPSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += - lstrlenA( (LPSTR)lpSessionDest->lpszPasswordA ) + 1; + lpSessionDest->u2.lpszPasswordA ); + lpSessionDest->u2.lpszPasswordA = (LPSTR)lpStartOfFreeSpace; } } else /* UNICODE */ { - if( lpSessionSrc->lpszSessionName ) + if( lpSessionSrc->u1.lpszSessionName ) { lstrcpyW( (LPWSTR)lpStartOfFreeSpace, - lpSessionDest->lpszSessionName ); - lpSessionDest->lpszSessionName = (LPWSTR)lpStartOfFreeSpace; + lpSessionDest->u1.lpszSessionName ); + lpSessionDest->u1.lpszSessionName = (LPWSTR)lpStartOfFreeSpace; lpStartOfFreeSpace += sizeof(WCHAR) * - ( lstrlenW( (LPWSTR)lpSessionDest->lpszSessionName ) + 1 ); + ( lstrlenW( lpSessionDest->u1.lpszSessionName ) + 1 ); } - if( lpSessionSrc->lpszPassword ) + if( lpSessionSrc->u2.lpszPassword ) { lstrcpyW( (LPWSTR)lpStartOfFreeSpace, - lpSessionDest->lpszPassword ); - lpSessionDest->lpszPassword = (LPWSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof(WCHAR) * - ( lstrlenW( (LPWSTR)lpSessionDest->lpszPassword ) + 1 ); + lpSessionDest->u2.lpszPassword ); + lpSessionDest->u2.lpszPassword = (LPWSTR)lpStartOfFreeSpace; } } } -static HRESULT WINAPI DP_IF_AddGroupToGroup +static HRESULT DP_IF_AddGroupToGroup ( IDirectPlay3Impl* This, DPID idParentGroup, DPID idGroup ) { - lpGroupData lpGParentData; lpGroupData lpGData; lpGroupList lpNewGList; - TRACE( "(%p)->(0x%08lx,0x%08lx)\n", This, idParentGroup, idGroup ); + TRACE( "(%p)->(0x%08x,0x%08x)\n", This, idParentGroup, idGroup ); - if( ( lpGParentData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idParentGroup ) ) == NULL ) + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + + if( DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idParentGroup ) == NULL ) { return DPERR_INVALIDGROUP; } @@ -3430,7 +3448,7 @@ static HRESULT WINAPI DirectPlay3WImpl_AddGroupToGroup return DP_IF_AddGroupToGroup( This, idParentGroup, idGroup ); } -static HRESULT WINAPI DP_IF_CreateGroupInGroup +static HRESULT DP_IF_CreateGroupInGroup ( IDirectPlay3Impl* This, LPVOID lpMsgHdr, DPID idParentGroup, LPDPID lpidGroup, LPDPNAME lpGroupName, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags, BOOL bAnsi ) @@ -3439,10 +3457,15 @@ static HRESULT WINAPI DP_IF_CreateGroupInGroup lpGroupList lpGList; lpGroupData lpGData; - TRACE( "(%p)->(0x%08lx,%p,%p,%p,0x%08lx,0x%08lx,%u)\n", + TRACE( "(%p)->(0x%08x,%p,%p,%p,0x%08x,0x%08x,%u)\n", This, idParentGroup, lpidGroup, lpGroupName, lpData, dwDataSize, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + /* Verify that the specified parent is valid */ if( ( lpGParentData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idParentGroup ) ) == NULL @@ -3547,13 +3570,13 @@ static HRESULT WINAPI DirectPlay3WImpl_CreateGroupInGroup dwFlags, FALSE ); } -static HRESULT WINAPI DP_IF_DeleteGroupFromGroup +static HRESULT DP_IF_DeleteGroupFromGroup ( IDirectPlay3Impl* This, DPID idParentGroup, DPID idGroup ) { lpGroupList lpGList; lpGroupData lpGParentData; - TRACE("(%p)->(0x%08lx,0x%08lx)\n", This, idParentGroup, idGroup ); + TRACE("(%p)->(0x%08x,0x%08x)\n", This, idParentGroup, idGroup ); /* Is the parent group valid? */ if( ( lpGParentData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idParentGroup ) ) == NULL ) @@ -3595,16 +3618,14 @@ static HRESULT WINAPI DirectPlay3WImpl_DeleteGroupFromGroup return DP_IF_DeleteGroupFromGroup( This, idParentGroup, idGroup ); } -static -BOOL WINAPI DP_BuildSPCompoundAddr( LPGUID lpcSpGuid, LPVOID* lplpAddrBuf, +static BOOL DP_BuildSPCompoundAddr( LPGUID lpcSpGuid, LPVOID* lplpAddrBuf, LPDWORD lpdwBufSize ) { DPCOMPOUNDADDRESSELEMENT dpCompoundAddress; HRESULT hr; dpCompoundAddress.dwDataSize = sizeof( GUID ); - memcpy( &dpCompoundAddress.guidDataType, &DPAID_ServiceProvider, - sizeof( GUID ) ) ; + dpCompoundAddress.guidDataType = DPAID_ServiceProvider; dpCompoundAddress.lpData = lpcSpGuid; *lplpAddrBuf = NULL; @@ -3638,7 +3659,7 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections ( LPDIRECTPLAY3A iface, LPCGUID lpguidApplication, LPDPENUMCONNECTIONSCALLBACK lpEnumCallback, LPVOID lpContext, DWORD dwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - TRACE("(%p)->(%p,%p,%p,0x%08lx)\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags ); + TRACE("(%p)->(%p,%p,%p,0x%08x)\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags ); /* A default dwFlags (0) is backwards compatible -- DPCONNECTION_DIRECTPLAY */ if( dwFlags == 0 ) @@ -3653,7 +3674,7 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections return DPERR_INVALIDFLAGS; } - if( !lpEnumCallback || !*lpEnumCallback ) + if( !lpEnumCallback ) { return DPERR_INVALIDPARAMS; } @@ -3711,8 +3732,10 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections &sizeOfReturnBuffer ) != ERROR_SUCCESS ) { ERR(": missing GUID registry data members\n" ); + RegCloseKey(hkServiceProvider); continue; } + RegCloseKey(hkServiceProvider); /* FIXME: Check return types to ensure we're interpreting data right */ MultiByteToWideChar( CP_ACP, 0, returnBuffer, -1, buff, sizeof(buff)/sizeof(WCHAR) ); @@ -3722,8 +3745,8 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections /* Fill in the DPNAME struct for the service provider */ dpName.dwSize = sizeof( dpName ); dpName.dwFlags = 0; - dpName.lpszShortNameA = subKeyName; - dpName.lpszLongNameA = NULL; + dpName.u1.lpszShortNameA = subKeyName; + dpName.u2.lpszLongNameA = NULL; /* Create the compound address for the service provider. * NOTE: This is a gruesome architectural scar right now. DP @@ -3745,7 +3768,7 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections /* The enumeration will return FALSE if we are not to continue */ if( !lpEnumCallback( &serviceProviderGUID, lpAddressBuffer, dwAddressBufferSize, - &dpName, DPCONNECTION_DIRECTPLAY, lpContext ) ) + &dpName, dwFlags, lpContext ) ) { return DP_OK; } @@ -3806,8 +3829,10 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections &sizeOfReturnBuffer ) != ERROR_SUCCESS ) { ERR(": missing GUID registry data members\n" ); + RegCloseKey(hkServiceProvider); continue; } + RegCloseKey(hkServiceProvider); /* FIXME: Check return types to ensure we're interpreting data right */ MultiByteToWideChar( CP_ACP, 0, returnBuffer, -1, buff, sizeof(buff)/sizeof(WCHAR) ); @@ -3817,8 +3842,8 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections /* Fill in the DPNAME struct for the service provider */ dpName.dwSize = sizeof( dpName ); dpName.dwFlags = 0; - dpName.lpszShortNameA = subKeyName; - dpName.lpszLongNameA = NULL; + dpName.u1.lpszShortNameA = subKeyName; + dpName.u2.lpszLongNameA = NULL; /* Create the compound address for the service provider. NOTE: This is a gruesome architectural scar right now. DP uses DPL and DPL uses DP @@ -3845,15 +3870,18 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections &dwAddressBufferSize, TRUE ) ) != DP_OK ) { ERR( "can't create address: %s\n", DPLAYX_HresultToString( hr ) ); + HeapFree( GetProcessHeap(), 0, lpAddressBuffer ); return hr; } /* The enumeration will return FALSE if we are not to continue */ if( !lpEnumCallback( &serviceProviderGUID, lpAddressBuffer, dwAddressBufferSize, - &dpName, DPCONNECTION_DIRECTPLAYLOBBY, lpContext ) ) + &dpName, dwFlags, lpContext ) ) { + HeapFree( GetProcessHeap(), 0, lpAddressBuffer ); return DP_OK; } + HeapFree( GetProcessHeap(), 0, lpAddressBuffer ); } } @@ -3864,11 +3892,11 @@ static HRESULT WINAPI DirectPlay3WImpl_EnumConnections ( LPDIRECTPLAY3 iface, LPCGUID lpguidApplication, LPDPENUMCONNECTIONSCALLBACK lpEnumCallback, LPVOID lpContext, DWORD dwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(%p,%p,%p,0x%08lx): stub\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags ); + FIXME("(%p)->(%p,%p,%p,0x%08x): stub\n", This, lpguidApplication, lpEnumCallback, lpContext, dwFlags ); return DP_OK; } -static HRESULT WINAPI DP_IF_EnumGroupsInGroup +static HRESULT DP_IF_EnumGroupsInGroup ( IDirectPlay3AImpl* This, DPID idGroup, LPGUID lpguidInstance, LPDPENUMPLAYERSCALLBACK2 lpEnumPlayersCallback2, LPVOID lpContext, DWORD dwFlags, BOOL bAnsi ) @@ -3876,10 +3904,15 @@ static HRESULT WINAPI DP_IF_EnumGroupsInGroup lpGroupList lpGList; lpGroupData lpGData; - FIXME( "(%p)->(0x%08lx,%p,%p,%p,0x%08lx,%u): semi stub\n", + FIXME( "(%p)->(0x%08x,%p,%p,%p,0x%08x,%u): semi stub\n", This, idGroup, lpguidInstance, lpEnumPlayersCallback2, lpContext, dwFlags, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + if( ( lpGData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idGroup ) ) == NULL ) { return DPERR_INVALIDGROUP; @@ -3941,7 +3974,7 @@ static HRESULT WINAPI DirectPlay3AImpl_GetGroupConnectionSettings ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,0x%08x,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize ); return DP_OK; } @@ -3949,7 +3982,7 @@ static HRESULT WINAPI DirectPlay3WImpl_GetGroupConnectionSettings ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,0x%08x,%p,%p): stub\n", This, dwFlags, idGroup, lpData, lpdwDataSize ); return DP_OK; } @@ -3964,12 +3997,12 @@ static BOOL CALLBACK DP_GetSpLpGuidFromCompoundAddress( ( IsEqualGUID( guidDataType, &DPAID_LobbyProvider ) ) ) { - TRACE( "Found SP/LP (%s) %s (data size = 0x%08lx)\n", + TRACE( "Found SP/LP (%s) %s (data size = 0x%08x)\n", debugstr_guid( guidDataType ), debugstr_guid( lpData ), dwDataSize ); if( dwDataSize != sizeof( GUID ) ) { - ERR( "Invalid sp/lp guid size 0x%08lx\n", dwDataSize ); + ERR( "Invalid sp/lp guid size 0x%08x\n", dwDataSize ); } memcpy( lpContext, lpData, dwDataSize ); @@ -4103,7 +4136,7 @@ static HMODULE DP_LoadSP( LPCGUID lpcGuid, LPSPINITDATA lpSpData, LPBOOL lpbIsDp NULL, NULL, (LPBYTE)returnBuffer, &sizeOfReturnBuffer ) ) != ERROR_SUCCESS ) { - ERR(": missing PATH registry data members: 0x%08lx\n", dwTemp ); + ERR(": missing PATH registry data members: 0x%08x\n", dwTemp ); continue; } @@ -4196,7 +4229,7 @@ HRESULT DP_InitializeDPLSP( IDirectPlay3Impl* This, HMODULE hLobbyProvider ) return hr; } -static HRESULT WINAPI DP_IF_InitializeConnection +static HRESULT DP_IF_InitializeConnection ( IDirectPlay3Impl* This, LPVOID lpConnection, DWORD dwFlags, BOOL bAnsi ) { HMODULE hServiceProvider; @@ -4205,13 +4238,23 @@ static HRESULT WINAPI DP_IF_InitializeConnection const DWORD dwAddrSize = 80; /* FIXME: Need to calculate it correctly */ BOOL bIsDpSp; /* TRUE if Direct Play SP, FALSE if Direct Play Lobby SP */ - TRACE("(%p)->(%p,0x%08lx,%u)\n", This, lpConnection, dwFlags, bAnsi ); + TRACE("(%p)->(%p,0x%08x,%u)\n", This, lpConnection, dwFlags, bAnsi ); + + if ( lpConnection == NULL ) + { + return DPERR_INVALIDPARAMS; + } if( dwFlags != 0 ) { return DPERR_INVALIDFLAGS; } + if( This->dp2->connectionInitialized != NO_PROVIDER ) + { + return DPERR_ALREADYINITIALIZED; + } + /* Find out what the requested SP is and how large this buffer is */ hr = DPL_EnumAddress( DP_GetSpLpGuidFromCompoundAddress, lpConnection, dwAddrSize, &guidSP ); @@ -4227,7 +4270,7 @@ static HRESULT WINAPI DP_IF_InitializeConnection if( hServiceProvider == 0 ) { - ERR( "Unable to load service provider\n" ); + ERR( "Unable to load service provider %s\n", debugstr_guid(&guidSP) ); return DPERR_UNAVAILABLE; } @@ -4305,7 +4348,7 @@ static HRESULT WINAPI DirectPlay3AImpl_SendChatMessage ( LPDIRECTPLAY3A iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDPCHAT lpChatMessage ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage ); + FIXME("(%p)->(0x%08x,0x%08x,0x%08x,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage ); return DP_OK; } @@ -4313,7 +4356,7 @@ static HRESULT WINAPI DirectPlay3WImpl_SendChatMessage ( LPDIRECTPLAY3 iface, DPID idFrom, DPID idTo, DWORD dwFlags, LPDPCHAT lpChatMessage ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,0x%08lx,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage ); + FIXME("(%p)->(0x%08x,0x%08x,0x%08x,%p): stub\n", This, idFrom, idTo, dwFlags, lpChatMessage ); return DP_OK; } @@ -4321,7 +4364,7 @@ static HRESULT WINAPI DirectPlay3AImpl_SetGroupConnectionSettings ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup, LPDPLCONNECTION lpConnection ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p): stub\n", This, dwFlags, idGroup, lpConnection ); + FIXME("(%p)->(0x%08x,0x%08x,%p): stub\n", This, dwFlags, idGroup, lpConnection ); return DP_OK; } @@ -4329,7 +4372,7 @@ static HRESULT WINAPI DirectPlay3WImpl_SetGroupConnectionSettings ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup, LPDPLCONNECTION lpConnection ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p): stub\n", This, dwFlags, idGroup, lpConnection ); + FIXME("(%p)->(0x%08x,0x%08x,%p): stub\n", This, dwFlags, idGroup, lpConnection ); return DP_OK; } @@ -4337,7 +4380,7 @@ static HRESULT WINAPI DirectPlay3AImpl_StartSession ( LPDIRECTPLAY3A iface, DWORD dwFlags, DPID idGroup ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwFlags, idGroup ); + FIXME("(%p)->(0x%08x,0x%08x): stub\n", This, dwFlags, idGroup ); return DP_OK; } @@ -4345,7 +4388,7 @@ static HRESULT WINAPI DirectPlay3WImpl_StartSession ( LPDIRECTPLAY3 iface, DWORD dwFlags, DPID idGroup ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, dwFlags, idGroup ); + FIXME("(%p)->(0x%08x,0x%08x): stub\n", This, dwFlags, idGroup ); return DP_OK; } @@ -4353,7 +4396,7 @@ static HRESULT WINAPI DirectPlay3AImpl_GetGroupFlags ( LPDIRECTPLAY3A iface, DPID idGroup, LPDWORD lpdwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpdwFlags ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idGroup, lpdwFlags ); return DP_OK; } @@ -4361,17 +4404,17 @@ static HRESULT WINAPI DirectPlay3WImpl_GetGroupFlags ( LPDIRECTPLAY3 iface, DPID idGroup, LPDWORD lpdwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpdwFlags ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idGroup, lpdwFlags ); return DP_OK; } -static HRESULT WINAPI DP_IF_GetGroupParent +static HRESULT DP_IF_GetGroupParent ( IDirectPlay3AImpl* This, DPID idGroup, LPDPID lpidGroup, BOOL bAnsi ) { lpGroupData lpGData; - TRACE("(%p)->(0x%08lx,%p,%u)\n", This, idGroup, lpidGroup, bAnsi ); + TRACE("(%p)->(0x%08x,%p,%u)\n", This, idGroup, lpidGroup, bAnsi ); if( ( lpGData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idGroup ) ) == NULL ) { @@ -4400,7 +4443,7 @@ static HRESULT WINAPI DirectPlay3AImpl_GetPlayerAccount ( LPDIRECTPLAY3A iface, DPID idPlayer, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,0x%08x,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize ); return DP_OK; } @@ -4408,7 +4451,7 @@ static HRESULT WINAPI DirectPlay3WImpl_GetPlayerAccount ( LPDIRECTPLAY3 iface, DPID idPlayer, DWORD dwFlags, LPVOID lpData, LPDWORD lpdwDataSize ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize ); + FIXME("(%p)->(0x%08x,0x%08x,%p,%p): stub\n", This, idPlayer, dwFlags, lpData, lpdwDataSize ); return DP_OK; } @@ -4416,7 +4459,7 @@ static HRESULT WINAPI DirectPlay3AImpl_GetPlayerFlags ( LPDIRECTPLAY3A iface, DPID idPlayer, LPDWORD lpdwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwFlags ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idPlayer, lpdwFlags ); return DP_OK; } @@ -4424,7 +4467,7 @@ static HRESULT WINAPI DirectPlay3WImpl_GetPlayerFlags ( LPDIRECTPLAY3 iface, DPID idPlayer, LPDWORD lpdwFlags ) { IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idPlayer, lpdwFlags ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idPlayer, lpdwFlags ); return DP_OK; } @@ -4432,7 +4475,7 @@ static HRESULT WINAPI DirectPlay4AImpl_GetGroupOwner ( LPDIRECTPLAY4A iface, DPID idGroup, LPDPID lpidGroupOwner ) { IDirectPlay4Impl *This = (IDirectPlay4Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroupOwner ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idGroup, lpidGroupOwner ); return DP_OK; } @@ -4440,7 +4483,7 @@ static HRESULT WINAPI DirectPlay4WImpl_GetGroupOwner ( LPDIRECTPLAY4 iface, DPID idGroup, LPDPID lpidGroupOwner ) { IDirectPlay4Impl *This = (IDirectPlay4Impl *)iface; - FIXME("(%p)->(0x%08lx,%p): stub\n", This, idGroup, lpidGroupOwner ); + FIXME("(%p)->(0x%08x,%p): stub\n", This, idGroup, lpidGroupOwner ); return DP_OK; } @@ -4448,7 +4491,7 @@ static HRESULT WINAPI DirectPlay4AImpl_SetGroupOwner ( LPDIRECTPLAY4A iface, DPID idGroup , DPID idGroupOwner ) { IDirectPlay4Impl *This = (IDirectPlay4Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idGroupOwner ); + FIXME("(%p)->(0x%08x,0x%08x): stub\n", This, idGroup, idGroupOwner ); return DP_OK; } @@ -4456,26 +4499,29 @@ static HRESULT WINAPI DirectPlay4WImpl_SetGroupOwner ( LPDIRECTPLAY4 iface, DPID idGroup , DPID idGroupOwner ) { IDirectPlay4Impl *This = (IDirectPlay4Impl *)iface; - FIXME("(%p)->(0x%08lx,0x%08lx): stub\n", This, idGroup, idGroupOwner ); + FIXME("(%p)->(0x%08x,0x%08x): stub\n", This, idGroup, idGroupOwner ); return DP_OK; } -static HRESULT WINAPI DP_SendEx +static HRESULT DP_SendEx ( IDirectPlay2Impl* This, DPID idFrom, DPID idTo, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID, BOOL bAnsi ) { - lpPlayerList lpPList; - lpGroupData lpGData; BOOL bValidDestination = FALSE; - FIXME( "(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,0x%08lx,0x%08lx,0x%08lx,%p,%p,%u)" + FIXME( "(%p)->(0x%08x,0x%08x,0x%08x,%p,0x%08x,0x%08x,0x%08x,%p,%p,%u)" ": stub\n", This, idFrom, idTo, dwFlags, lpData, dwDataSize, dwPriority, dwTimeout, lpContext, lpdwMsgID, bAnsi ); + if( This->dp2->connectionInitialized == NO_PROVIDER ) + { + return DPERR_UNINITIALIZED; + } + /* FIXME: Add parameter checking */ - /* FIXME: First call to this needs to aquire a message id which will be + /* FIXME: First call to this needs to acquire a message id which will be * used for multiple sends */ @@ -4486,9 +4532,9 @@ static HRESULT WINAPI DP_SendEx */ if( idFrom != DPID_UNKNOWN ) { - if( ( lpPList = DP_FindPlayer( This, idFrom ) ) == NULL ) + if( DP_FindPlayer( This, idFrom ) == NULL ) { - WARN( "INFO: Invalid from player 0x%08lx\n", idFrom ); + WARN( "INFO: Invalid from player 0x%08x\n", idFrom ); return DPERR_INVALIDPLAYER; } } @@ -4520,8 +4566,6 @@ static HRESULT WINAPI DP_SendEx ( DP_FindPlayer( This, idTo ) != NULL ) ) { - bValidDestination = TRUE; - /* Have the service provider send this message */ /* FIXME: Could optimize for local interface sends */ return DP_SP_SendEx( This, dwFlags, lpData, dwDataSize, dwPriority, @@ -4529,7 +4573,7 @@ static HRESULT WINAPI DP_SendEx } if( ( !bValidDestination ) && - ( ( lpGData = DP_FindAnyGroup( This, idTo ) ) != NULL ) + ( DP_FindAnyGroup( This, idTo ) != NULL ) ) { bValidDestination = TRUE; @@ -4596,7 +4640,7 @@ static HRESULT WINAPI DirectPlay4WImpl_SendEx dwPriority, dwTimeout, lpContext, lpdwMsgID, FALSE ); } -static HRESULT WINAPI DP_SP_SendEx +static HRESULT DP_SP_SendEx ( IDirectPlay2Impl* This, DWORD dwFlags, LPVOID lpData, DWORD dwDataSize, DWORD dwPriority, DWORD dwTimeout, LPVOID lpContext, LPDWORD lpdwMsgID ) @@ -4618,13 +4662,13 @@ static HRESULT WINAPI DP_SP_SendEx return DP_OK; } -static HRESULT WINAPI DP_IF_GetMessageQueue +static HRESULT DP_IF_GetMessageQueue ( IDirectPlay4Impl* This, DPID idFrom, DPID idTo, DWORD dwFlags, LPDWORD lpdwNumMsgs, LPDWORD lpdwNumBytes, BOOL bAnsi ) { HRESULT hr = DP_OK; - FIXME( "(%p)->(0x%08lx,0x%08lx,0x%08lx,%p,%p,%u): semi stub\n", + FIXME( "(%p)->(0x%08x,0x%08x,0x%08x,%p,%p,%u): semi stub\n", This, idFrom, idTo, dwFlags, lpdwNumMsgs, lpdwNumBytes, bAnsi ); /* FIXME: Do we need to do idFrom and idTo sanity checking here? */ @@ -4673,13 +4717,13 @@ static HRESULT WINAPI DirectPlay4WImpl_GetMessageQueue lpdwNumBytes, FALSE ); } -static HRESULT WINAPI DP_IF_CancelMessage +static HRESULT DP_IF_CancelMessage ( IDirectPlay4Impl* This, DWORD dwMsgID, DWORD dwFlags, DWORD dwMinPriority, DWORD dwMaxPriority, BOOL bAnsi ) { HRESULT hr = DP_OK; - FIXME( "(%p)->(0x%08lx,0x%08lx,%u): semi stub\n", + FIXME( "(%p)->(0x%08x,0x%08x,%u): semi stub\n", This, dwMsgID, dwFlags, bAnsi ); if( This->dp2->spData.lpCB->Cancel ) @@ -5120,7 +5164,6 @@ static const IDirectPlay4Vtbl directPlay4AVT = }; #undef XCAST -extern HRESULT DP_GetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID* lplpData ) @@ -5137,7 +5180,6 @@ HRESULT DP_GetSPPlayerData( IDirectPlay2Impl* lpDP, return DP_OK; } -extern HRESULT DP_SetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID lpData ) @@ -5188,7 +5230,7 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, 'S', 'e', 'r', 'v', 'i', 'c', 'e', ' ', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 's', 0 }; static const WCHAR guidKey[] = { 'G', 'u', 'i', 'd', 0 }; static const WCHAR descW[] = { 'D', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 'W', 0 }; - + DWORD dwIndex; FILETIME filetime; @@ -5196,12 +5238,12 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, DWORD max_sizeOfDescriptionA = 0; WCHAR *descriptionW = NULL; DWORD max_sizeOfDescriptionW = 0; - + if (!lpEnumCallbackA && !lpEnumCallbackW) { return DPERR_INVALIDPARAMS; } - + /* Need to loop over the service providers in the registry */ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, searchSubKey, 0, KEY_READ, &hkResult) != ERROR_SUCCESS) @@ -5210,7 +5252,7 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, ERR(": no service provider key in the registry - check your Wine installation !!!\n"); return DPERR_GENERIC; } - + /* Traverse all the service providers we have available */ dwIndex = 0; while (1) @@ -5222,7 +5264,7 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, WCHAR guidKeyContent[(2 * 16) + 1 + 6 /* This corresponds to '{....-..-..-..-......}' */ ]; DWORD sizeOfGuidKeyContent = sizeof(guidKeyContent); LONG ret_value; - + ret_value = RegEnumKeyExW(hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, &filetime); if (ret_value == ERROR_NO_MORE_ITEMS) @@ -5233,14 +5275,14 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, return DPERR_EXCEPTION; } TRACE(" this time through sub-key %s.\n", debugstr_w(subKeyName)); - + /* Open the key for this service provider */ if (RegOpenKeyExW(hkResult, subKeyName, 0, KEY_READ, &hkServiceProvider) != ERROR_SUCCESS) { ERR(": could not open registry key for service provider %s.\n", debugstr_w(subKeyName)); continue; } - + /* Get the GUID from the registry */ if (RegQueryValueExW(hkServiceProvider, guidKey, NULL, NULL, (LPBYTE) guidKeyContent, &sizeOfGuidKeyContent) != ERROR_SUCCESS) @@ -5254,18 +5296,18 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, continue; } CLSIDFromString(guidKeyContent, &serviceProviderGUID ); - + /* The enumeration will return FALSE if we are not to continue. * * Note: on my windows box, major / minor version is 6 / 0 for all service providers - * and have no relations to any of the two dwReserved1 and dwReserved2 keys. + * and have no relation to any of the two dwReserved1 and dwReserved2 keys. * I think that it simply means that they are in-line with DirectX 6.0 */ if (lpEnumCallbackA) { DWORD sizeOfDescription = 0; - - /* Note that this the the A case of this function, so use the A variant to get the description string */ + + /* Note that this is the A case of this function, so use the A variant to get the description string */ if (RegQueryValueExA(hkServiceProvider, "DescriptionA", NULL, NULL, NULL, &sizeOfDescription) != ERROR_SUCCESS) { @@ -5276,19 +5318,18 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, { HeapFree(GetProcessHeap(), 0, descriptionA); max_sizeOfDescriptionA = sizeOfDescription; - descriptionA = HeapAlloc(GetProcessHeap(), 0, max_sizeOfDescriptionA); } descriptionA = HeapAlloc(GetProcessHeap(), 0, sizeOfDescription); RegQueryValueExA(hkServiceProvider, "DescriptionA", NULL, NULL, (LPBYTE) descriptionA, &sizeOfDescription); - + if (!lpEnumCallbackA(&serviceProviderGUID, descriptionA, 6, 0, lpContext)) goto end; } else { DWORD sizeOfDescription = 0; - + if (RegQueryValueExW(hkServiceProvider, descW, NULL, NULL, NULL, &sizeOfDescription) != ERROR_SUCCESS) { @@ -5299,7 +5340,6 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, { HeapFree(GetProcessHeap(), 0, descriptionW); max_sizeOfDescriptionW = sizeOfDescription; - descriptionW = HeapAlloc(GetProcessHeap(), 0, max_sizeOfDescriptionW); } descriptionW = HeapAlloc(GetProcessHeap(), 0, sizeOfDescription); RegQueryValueExW(hkServiceProvider, descW, @@ -5308,14 +5348,14 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, if (!lpEnumCallbackW(&serviceProviderGUID, descriptionW, 6, 0, lpContext)) goto end; } - + dwIndex++; } end: HeapFree(GetProcessHeap(), 0, descriptionA); HeapFree(GetProcessHeap(), 0, descriptionW); - + return DP_OK; } @@ -5326,7 +5366,7 @@ static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA, HRESULT WINAPI DirectPlayEnumerateA(LPDPENUMDPCALLBACKA lpEnumCallback, LPVOID lpContext ) { TRACE("(%p,%p)\n", lpEnumCallback, lpContext); - + return DirectPlayEnumerateAW(lpEnumCallback, NULL, lpContext); } @@ -5336,7 +5376,7 @@ HRESULT WINAPI DirectPlayEnumerateA(LPDPENUMDPCALLBACKA lpEnumCallback, LPVOID l HRESULT WINAPI DirectPlayEnumerateW(LPDPENUMDPCALLBACKW lpEnumCallback, LPVOID lpContext ) { TRACE("(%p,%p)\n", lpEnumCallback, lpContext); - + return DirectPlayEnumerateAW(NULL, lpEnumCallback, lpContext); } @@ -5379,7 +5419,7 @@ static BOOL CALLBACK cbDPCreateEnumConnections( * */ HRESULT WINAPI DirectPlayCreate -( LPGUID lpGUID, LPDIRECTPLAY2 *lplpDP, IUnknown *pUnk) +( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk ) { HRESULT hr; LPDIRECTPLAY3A lpDP3A; @@ -5392,6 +5432,12 @@ HRESULT WINAPI DirectPlayCreate return CLASS_E_NOAGGREGATION; } + if( (lplpDP == NULL) || (lpGUID == NULL) ) + { + return DPERR_INVALIDPARAMS; + } + + /* Create an IDirectPlay object. We don't support that so we'll cheat and give them an IDirectPlay2A object and hope that doesn't cause problems */ if( DP_CreateInterface( &IID_IDirectPlay2A, (LPVOID*)lplpDP ) != DP_OK ) diff --git a/reactos/dll/directx/dplayx/dplay_global.h b/reactos/dll/directx/dplayx/dplay_global.h index 516a61b3200..086801e29cd 100644 --- a/reactos/dll/directx/dplayx/dplay_global.h +++ b/reactos/dll/directx/dplayx/dplay_global.h @@ -13,12 +13,15 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPLAY_GLOBAL_INCLUDED #define __WINE_DPLAY_GLOBAL_INCLUDED +#define WIN32_NO_STATUS +#define _INC_WINDOWS + //#include <stdarg.h> //#include "windef.h" @@ -29,9 +32,7 @@ extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, DWORD dwAddressSize, - LPVOID lpContext ); - -extern DWORD DP_CalcSessionDescSize( LPCDPSESSIONDESC2 lpSessDesc, BOOL bAnsi ); + LPVOID lpContext ) DECLSPEC_HIDDEN; /***************************************************************************** * Predeclare the interface implementation structures @@ -69,7 +70,7 @@ typedef struct tagDP_MSG_REPLY_STRUCT typedef struct tagDP_MSG_REPLY_STRUCT_LIST { - DPQ_ENTRY(tagDP_MSG_REPLY_STRUCT_LIST) replysExpected; + DPQ_ENTRY(tagDP_MSG_REPLY_STRUCT_LIST) repliesExpected; DP_MSG_REPLY_STRUCT replyExpected; } DP_MSG_REPLY_STRUCT_LIST, *LPDP_MSG_REPLY_STRUCT_LIST; @@ -164,6 +165,7 @@ typedef struct tagDirectPlay2Data /* For async EnumSessions requests */ HANDLE hEnumSessionThread; HANDLE hKillEnumSessionThreadEvent; + DWORD dwEnumSessionLock; LPVOID lpNameServerData; /* DPlay interface doesn't know contents */ @@ -194,7 +196,7 @@ typedef struct tagDirectPlay2Data enum SPSTATE connectionInitialized; /* Expected messages queue */ - DPQ_HEAD( tagDP_MSG_REPLY_STRUCT_LIST ) replysExpected; + DPQ_HEAD( tagDP_MSG_REPLY_STRUCT_LIST ) repliesExpected; } DirectPlay2Data; typedef struct tagDirectPlay3Data @@ -234,13 +236,13 @@ struct IDirectPlay4Impl HRESULT DP_HandleMessage( IDirectPlay2Impl* This, LPCVOID lpMessageBody, DWORD dwMessageBodySize, LPCVOID lpMessageHeader, WORD wCommandId, WORD wVersion, - LPVOID* lplpReply, LPDWORD lpdwMsgSize ); + LPVOID* lplpReply, LPDWORD lpdwMsgSize ) DECLSPEC_HIDDEN; /* DP SP external interfaces into DirectPlay */ -extern HRESULT DP_GetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID* lplpData ); -extern HRESULT DP_SetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID lpData ); +extern HRESULT DP_GetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID* lplpData ) DECLSPEC_HIDDEN; +extern HRESULT DP_SetSPPlayerData( IDirectPlay2Impl* lpDP, DPID idPlayer, LPVOID lpData ) DECLSPEC_HIDDEN; /* DP external interfaces to call into DPSP interface */ -extern LPVOID DPSP_CreateSPPlayerData(void); +extern LPVOID DPSP_CreateSPPlayerData(void) DECLSPEC_HIDDEN; #endif /* __WINE_DPLAY_GLOBAL_INCLUDED */ diff --git a/reactos/dll/directx/dplayx/dplaysp.c b/reactos/dll/directx/dplayx/dplaysp.c index 29087ca99f3..e4f458c9ad6 100644 --- a/reactos/dll/directx/dplayx/dplaysp.c +++ b/reactos/dll/directx/dplayx/dplaysp.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ //#include <string.h> @@ -86,7 +86,6 @@ typedef struct tagDP_SPPLAYERDATA } DP_SPPLAYERDATA, *LPDP_SPPLAYERDATA; /* Create the SP interface */ -extern HRESULT DPSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp ) { TRACE( " for %s\n", debugstr_guid( riid ) ); @@ -101,7 +100,7 @@ HRESULT DPSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp if( IsEqualGUID( &IID_IDirectPlaySP, riid ) ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)*ppvObj; + IDirectPlaySPImpl *This = *ppvObj; This->lpVtbl = &directPlaySPVT; } else @@ -134,7 +133,7 @@ HRESULT DPSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp static BOOL DPSP_CreateIUnknown( LPVOID lpSP ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)lpSP; + IDirectPlaySPImpl *This = lpSP; This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) ); @@ -144,14 +143,16 @@ static BOOL DPSP_CreateIUnknown( LPVOID lpSP ) } InitializeCriticalSection( &This->unk->DPSP_lock ); + This->unk->DPSP_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlaySPImpl*->DirectPlaySPIUnknownData*->DPSP_lock"); return TRUE; } static BOOL DPSP_DestroyIUnknown( LPVOID lpSP ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)lpSP; + IDirectPlaySPImpl *This = lpSP; + This->unk->DPSP_lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection( &This->unk->DPSP_lock ); HeapFree( GetProcessHeap(), 0, This->unk ); @@ -161,7 +162,7 @@ static BOOL DPSP_DestroyIUnknown( LPVOID lpSP ) static BOOL DPSP_CreateDirectPlaySP( LPVOID lpSP, IDirectPlay2Impl* dp ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)lpSP; + IDirectPlaySPImpl *This = lpSP; This->sp = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->sp) ) ); @@ -192,7 +193,7 @@ static BOOL DPSP_CreateDirectPlaySP( LPVOID lpSP, IDirectPlay2Impl* dp ) static BOOL DPSP_DestroyDirectPlaySP( LPVOID lpSP ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)lpSP; + IDirectPlaySPImpl *This = lpSP; /* Normally we should be keeping a reference, but since only the dplay * interface that created us can destroy us, we do not keep a reference @@ -234,7 +235,7 @@ static HRESULT WINAPI DPSP_QueryInterface if( IsEqualGUID( &IID_IDirectPlaySP, riid ) ) { - IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)*ppvObj; + IDirectPlaySPImpl *This = *ppvObj; This->lpVtbl = &directPlaySPVT; } else @@ -260,7 +261,7 @@ static ULONG WINAPI DPSP_AddRef ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef ); - TRACE( "ref count incremented to %lu:%lu for %p\n", + TRACE( "ref count incremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); return ulObjRefCount; @@ -275,7 +276,7 @@ static ULONG WINAPI DPSP_Release ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef ); - TRACE( "ref count decremented to %lu:%lu for %p\n", + TRACE( "ref count decremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); /* Deallocate if this is the last reference to the object */ @@ -306,7 +307,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_AddMRUEntry /* Should be able to call the comctl32 undocumented MRU routines. I suspect that the interface works appropriately */ - FIXME( "(%p)->(%p,%p%p,0x%08lx,0x%08lx): stub\n", + FIXME( "(%p)->(%p,%p%p,0x%08x,0x%08x): stub\n", This, lpSection, lpKey, lpData, dwDataSize, dwMaxEntries ); return DP_OK; @@ -324,7 +325,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_CreateAddress { IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - FIXME( "(%p)->(%s,%s,%p,0x%08lx,%p,%p): stub\n", + FIXME( "(%p)->(%s,%s,%p,0x%08x,%p,%p): stub\n", This, debugstr_guid(guidSP), debugstr_guid(guidDataType), lpData, dwDataSize, lpAddress, lpdwAddressSize ); @@ -341,7 +342,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_EnumAddress { IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - TRACE( "(%p)->(%p,%p,0x%08lx,%p)\n", + TRACE( "(%p)->(%p,%p,0x%08x,%p)\n", This, lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); DPL_EnumAddress( lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); @@ -375,7 +376,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_GetPlayerFlags { IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - FIXME( "(%p)->(0x%08lx,%p): stub\n", + FIXME( "(%p)->(0x%08x,%p): stub\n", This, idPlayer, lpdwPlayerFlags ); return DP_OK; @@ -393,7 +394,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_GetSPPlayerData LPDP_SPPLAYERDATA lpPlayerData; IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - TRACE( "(%p)->(0x%08lx,%p,%p,0x%08lx)\n", + TRACE( "(%p)->(0x%08x,%p,%p,0x%08x)\n", This, idPlayer, lplpData, lpdwDataSize, dwFlags ); hr = DP_GetSPPlayerData( This->sp->dplay, idPlayer, (LPVOID*)&lpPlayerData ); @@ -433,7 +434,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage LPVOID lpMessageHeader ) { - LPDPMSG_SENDENVELOPE lpMsg = (LPDPMSG_SENDENVELOPE)lpMessageBody; + LPDPMSG_SENDENVELOPE lpMsg = lpMessageBody; HRESULT hr = DPERR_GENERIC; WORD wCommandId; WORD wVersion; @@ -441,24 +442,24 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - FIXME( "(%p)->(%p,0x%08lx,%p): mostly stub\n", + FIXME( "(%p)->(%p,0x%08x,%p): mostly stub\n", This, lpMessageBody, dwMessageBodySize, lpMessageHeader ); wCommandId = lpMsg->wCommandId; wVersion = lpMsg->wVersion; - TRACE( "Incoming message has envelope of 0x%08lx, %u, %u\n", + TRACE( "Incoming message has envelope of 0x%08x, %u, %u\n", lpMsg->dwMagic, wCommandId, wVersion ); if( lpMsg->dwMagic != DPMSGMAGIC_DPLAYMSG ) { - ERR( "Unknown magic 0x%08lx!\n", lpMsg->dwMagic ); + ERR( "Unknown magic 0x%08x!\n", lpMsg->dwMagic ); return DPERR_GENERIC; } #if 0 { - const LPDWORD lpcHeader = (LPDWORD)lpMessageHeader; + const LPDWORD lpcHeader = lpMessageHeader; TRACE( "lpMessageHeader = [0x%08lx] [0x%08lx] [0x%08lx] [0x%08lx] [0x%08lx]\n", lpcHeader[0], lpcHeader[1], lpcHeader[2], lpcHeader[3], lpcHeader[4] ); @@ -499,7 +500,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage #if 0 HRESULT hr = DP_OK; HANDLE hReceiveEvent = 0; - /* FIXME: Aquire some sort of interface lock */ + /* FIXME: Acquire some sort of interface lock */ /* FIXME: Need some sort of context for this callback. Need to determine * how this is actually done with the SP */ @@ -508,7 +509,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage { case DPSYS_CREATEPLAYERORGROUP: { - LPDPMSG_CREATEPLAYERORGROUP msg = (LPDPMSG_CREATEPLAYERORGROUP)lpMsg; + LPDPMSG_CREATEPLAYERORGROUP msg = lpMsg; if( msg->dwPlayerType == DPPLAYERTYPE_PLAYER ) { @@ -543,7 +544,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_DESTROYPLAYERORGROUP: { - LPDPMSG_DESTROYPLAYERORGROUP msg = (LPDPMSG_DESTROYPLAYERORGROUP)lpMsg; + LPDPMSG_DESTROYPLAYERORGROUP msg = lpMsg; if( msg->dwPlayerType == DPPLAYERTYPE_PLAYER ) { @@ -564,7 +565,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_ADDPLAYERTOGROUP: { - LPDPMSG_ADDPLAYERTOGROUP msg = (LPDPMSG_ADDPLAYERTOGROUP)lpMsg; + LPDPMSG_ADDPLAYERTOGROUP msg = lpMsg; hr = DP_IF_AddPlayerToGroup( This, msg->dpIdGroup, msg->dpIdPlayer, ... ); break; @@ -572,7 +573,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_DELETEPLAYERFROMGROUP: { - LPDPMSG_DELETEPLAYERFROMGROUP msg = (LPDPMSG_DELETEPLAYERFROMGROUP)lpMsg; + LPDPMSG_DELETEPLAYERFROMGROUP msg = lpMsg; hr = DP_IF_DeletePlayerFromGroup( This, msg->dpIdGroup, msg->dpIdPlayer, ... ); @@ -582,7 +583,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SESSIONLOST: { - LPDPMSG_SESSIONLOST msg = (LPDPMSG_SESSIONLOST)lpMsg; + LPDPMSG_SESSIONLOST msg = lpMsg; FIXME( "DPSYS_SESSIONLOST not handled\n" ); @@ -591,7 +592,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_HOST: { - LPDPMSG_HOST msg = (LPDPMSG_HOST)lpMsg; + LPDPMSG_HOST msg = lpMsg; FIXME( "DPSYS_HOST not handled\n" ); @@ -600,7 +601,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SETPLAYERORGROUPDATA: { - LPDPMSG_SETPLAYERORGROUPDATA msg = (LPDPMSG_SETPLAYERORGROUPDATA)lpMsg; + LPDPMSG_SETPLAYERORGROUPDATA msg = lpMsg; if( msg->dwPlayerType == DPPLAYERTYPE_PLAYER ) { @@ -622,7 +623,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SETPLAYERORGROUPNAME: { - LPDPMSG_SETPLAYERORGROUPNAME msg = (LPDPMSG_SETPLAYERORGROUPNAME)lpMsg; + LPDPMSG_SETPLAYERORGROUPNAME msg = lpMsg; if( msg->dwPlayerType == DPPLAYERTYPE_PLAYER ) { @@ -643,7 +644,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SETSESSIONDESC; { - LPDPMSG_SETSESSIONDESC msg = (LPDPMSG_SETSESSIONDESC)lpMsg; + LPDPMSG_SETSESSIONDESC msg = lpMsg; hr = DP_IF_SetSessionDesc( This, &msg->dpDesc ); @@ -652,7 +653,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_ADDGROUPTOGROUP: { - LPDPMSG_ADDGROUPTOGROUP msg = (LPDPMSG_ADDGROUPTOGROUP)lpMsg; + LPDPMSG_ADDGROUPTOGROUP msg = lpMsg; hr = DP_IF_AddGroupToGroup( This, msg->dpIdParentGroup, msg->dpIdGroup, ... ); @@ -662,7 +663,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_DELETEGROUPFROMGROUP: { - LPDPMSG_DELETEGROUPFROMGROUP msg = (LPDPMSG_DELETEGROUPFROMGROUP)lpMsg; + LPDPMSG_DELETEGROUPFROMGROUP msg = lpMsg; hr = DP_IF_DeleteGroupFromGroup( This, msg->dpIdParentGroup, msg->dpIdGroup, ... ); @@ -672,7 +673,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SECUREMESSAGE: { - LPDPMSG_SECUREMESSAGE msg = (LPDPMSG_SECUREMESSAGE)lpMsg; + LPDPMSG_SECUREMESSAGE msg = lpMsg; FIXME( "DPSYS_SECUREMESSAGE not implemented\n" ); @@ -681,7 +682,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_STARTSESSION: { - LPDPMSG_STARTSESSION msg = (LPDPMSG_STARTSESSION)lpMsg; + LPDPMSG_STARTSESSION msg = lpMsg; FIXME( "DPSYS_STARTSESSION not implemented\n" ); @@ -690,7 +691,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_CHAT: { - LPDPMSG_CHAT msg = (LPDPMSG_CHAT)lpMsg; + LPDPMSG_CHAT msg = lpMsg; FIXME( "DPSYS_CHAT not implemeneted\n" ); @@ -699,7 +700,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SETGROUPOWNER: { - LPDPMSG_SETGROUPOWNER msg = (LPDPMSG_SETGROUPOWNER)lpMsg; + LPDPMSG_SETGROUPOWNER msg = lpMsg; FIXME( "DPSYS_SETGROUPOWNER not implemented\n" ); @@ -708,7 +709,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_HandleMessage case DPSYS_SENDCOMPLETE: { - LPDPMSG_SENDCOMPLETE msg = (LPDPMSG_SENDCOMPLETE)lpMsg; + LPDPMSG_SENDCOMPLETE msg = lpMsg; FIXME( "DPSYS_SENDCOMPLETE not implemented\n" ); @@ -755,7 +756,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_SetSPPlayerData IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; /* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */ - TRACE( "(%p)->(0x%08lx,%p,0x%08lx,0x%08lx)\n", + TRACE( "(%p)->(0x%08x,%p,0x%08x,0x%08x)\n", This, idPlayer, lpData, dwDataSize, dwFlags ); hr = DP_GetSPPlayerData( This->sp->dplay, idPlayer, (LPVOID*)&lpPlayerEntry ); @@ -794,7 +795,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_CreateCompoundAddress { IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - FIXME( "(%p)->(%p,0x%08lx,%p,%p): stub\n", + FIXME( "(%p)->(%p,0x%08x,%p,%p): stub\n", This, lpElements, dwElementCount, lpAddress, lpdwAddressSize ); return DP_OK; @@ -811,7 +812,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_GetSPData IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; /* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */ - TRACE( "(%p)->(%p,%p,0x%08lx)\n", + TRACE( "(%p)->(%p,%p,0x%08x)\n", This, lplpData, lpdwDataSize, dwFlags ); #if 0 @@ -827,7 +828,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_GetSPData */ if( dwFlags != DPSET_REMOTE ) { - TRACE( "Undocumented dwFlags 0x%08lx used\n", dwFlags ); + TRACE( "Undocumented dwFlags 0x%08x used\n", dwFlags ); } #endif @@ -870,7 +871,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_SetSPData IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; /* TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */ - TRACE( "(%p)->(%p,0x%08lx,0x%08lx)\n", + TRACE( "(%p)->(%p,0x%08x,0x%08x)\n", This, lpData, dwDataSize, dwFlags ); #if 0 @@ -886,7 +887,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_SetSPData */ if( dwFlags != DPSET_REMOTE ) { - TRACE( "Undocumented dwFlags 0x%08lx used\n", dwFlags ); + TRACE( "Undocumented dwFlags 0x%08x used\n", dwFlags ); } #endif @@ -918,7 +919,7 @@ static VOID WINAPI IDirectPlaySPImpl_SendComplete { IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface; - FIXME( "(%p)->(%p,0x%08lx): stub\n", + FIXME( "(%p)->(%p,0x%08x): stub\n", This, unknownA, unknownB ); } @@ -947,7 +948,7 @@ static const IDirectPlaySPVtbl directPlaySPVT = /* DP external interfaces to call into DPSP interface */ /* Allocate the structure */ -extern LPVOID DPSP_CreateSPPlayerData(void) +LPVOID DPSP_CreateSPPlayerData(void) { TRACE( "Creating SPPlayer data struct\n" ); return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, diff --git a/reactos/dll/directx/dplayx/dplayx.idl b/reactos/dll/directx/dplayx/dplayx.idl new file mode 100644 index 00000000000..cf9dd206535 --- /dev/null +++ b/reactos/dll/directx/dplayx/dplayx.idl @@ -0,0 +1,33 @@ +/* + * COM Classes for dplayx + * + * Copyright 2010 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + helpstring("DirectPlay Object"), + threading(both), + uuid(d1eb6d20-8923-11d0-9d97-00a0c90a43cb) +] +coclass DirectPlay { interface IDirectPlay; } + +[ + helpstring("DirectPlayLobby Object"), + threading(both), + uuid(2fe8f810-b2a5-11d0-a787-0000f803abfc) +] +coclass DirectPlayLobby { interface IDirectPlayLobby; } diff --git a/reactos/dll/directx/dplayx/dplayx.rgs b/reactos/dll/directx/dplayx/dplayx.rgs new file mode 100644 index 00000000000..5e35076d64c --- /dev/null +++ b/reactos/dll/directx/dplayx/dplayx.rgs @@ -0,0 +1,17 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{D1EB6D20-8923-11D0-9D97-00A0C90A43CB}' = s 'DirectPlay Object' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{2FE8F810-B2A5-11D0-A787-0000F803ABFC}' = s 'DirectPlayLobby Object' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/directx/dplayx/dplayx_global.c b/reactos/dll/directx/dplayx/dplayx_global.c index fc3fa41232d..86551b55846 100644 --- a/reactos/dll/directx/dplayx/dplayx_global.c +++ b/reactos/dll/directx/dplayx/dplayx_global.c @@ -15,14 +15,14 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * - * NOTES: + * NOTES: * o Implementation of all things which are associated with dplay on - * the computer - ie shared resources and such. Methods in this - * compilation unit should not call anything out side this unit - * excepting base windows services and an interface to start the + * the computer - i.e. shared resources and such. Methods in this + * compilation unit should not call anything outside of this unit + * except base windows services and an interface to start the * messaging thread. * o Methods that begin with DPLAYX_ are used for dealing with * dplayx.dll data which is accessible from all processes. @@ -51,16 +51,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(dplay); /* FIXME: Need to do all that fun other dll referencing type of stuff */ /* Static data for all processes */ -static LPCSTR lpszDplayxSemaName = "WINE_DPLAYX_SM"; +static const char lpszDplayxSemaName[] = "WINE_DPLAYX_SM"; static HANDLE hDplayxSema; -static LPCSTR lpszDplayxFileMapping = "WINE_DPLAYX_FM"; +static const char lpszDplayxFileMapping[] = "WINE_DPLAYX_FM"; static HANDLE hDplayxSharedMem; static LPVOID lpSharedStaticData = NULL; -#define DPLAYX_AquireSemaphore() TRACE( "Waiting for DPLAYX semaphore\n" ); \ +#define DPLAYX_AcquireSemaphore() TRACE( "Waiting for DPLAYX semaphore\n" ); \ WaitForSingleObject( hDplayxSema, INFINITE );\ TRACE( "Through wait\n" ) @@ -89,8 +89,7 @@ typedef struct static DPLAYX_MEM_SLICE* lpMemArea; -void DPLAYX_PrivHeapFree( LPVOID addr ); -void DPLAYX_PrivHeapFree( LPVOID addr ) +static void DPLAYX_PrivHeapFree( LPVOID addr ) { LPVOID lpAddrStart; DWORD dwBlockUsed; @@ -107,16 +106,14 @@ void DPLAYX_PrivHeapFree( LPVOID addr ) lpMemArea[ dwBlockUsed ].used = 0; } -/* FIXME: This should be static, but is being used for a hack right now */ -LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ); -LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ) +static LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ) { LPVOID lpvArea = NULL; UINT uBlockUsed; if( size > (dwBlockSize - sizeof(DWORD)) ) { - FIXME( "Size exceeded. Request of 0x%08lx\n", size ); + FIXME( "Size exceeded. Request of 0x%08x\n", size ); size = dwBlockSize - sizeof(DWORD); } @@ -128,7 +125,7 @@ LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ) { /* Set the area used */ lpMemArea[ uBlockUsed ].used = 1; - lpvArea = &(lpMemArea[ uBlockUsed ].data); + lpvArea = lpMemArea[ uBlockUsed ].data; } else { @@ -144,27 +141,6 @@ LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ) return lpvArea; } -LPSTR DPLAYX_strdupA( DWORD flags, LPCSTR str ); -LPSTR DPLAYX_strdupA( DWORD flags, LPCSTR str ) -{ - LPSTR p = DPLAYX_PrivHeapAlloc( flags, strlen(str) + 1 ); - if(p) { - strcpy( p, str ); - } - return p; -} - -LPWSTR DPLAYX_strdupW( DWORD flags, LPCWSTR str ); -LPWSTR DPLAYX_strdupW( DWORD flags, LPCWSTR str ) -{ - INT len = strlenW(str) + 1; - LPWSTR p = DPLAYX_PrivHeapAlloc( flags, len * sizeof(WCHAR) ); - if(p) { - strcpyW( p, str ); - } - return p; -} - enum { numSupportedLobbies = 32, numSupportedSessions = 32 }; typedef struct tagDPLAYX_LOBBYDATA @@ -198,17 +174,181 @@ static DPLAYX_LOBBYDATA* lobbyData = NULL; static DPSESSIONDESC2* sessionData = NULL; /* static DPSESSIONDESC2* sessionData[ numSupportedSessions ]; */ -/* Function prototypes */ -DWORD DPLAYX_SizeOfLobbyDataA( LPDPLCONNECTION lpDplData ); -DWORD DPLAYX_SizeOfLobbyDataW( LPDPLCONNECTION lpDplData ); -void DPLAYX_CopyConnStructA( LPDPLCONNECTION dest, LPDPLCONNECTION src ); -void DPLAYX_CopyConnStructW( LPDPLCONNECTION dest, LPDPLCONNECTION src ); -BOOL DPLAYX_IsAppIdLobbied( DWORD dwAppId, LPDPLAYX_LOBBYDATA* dplData ); -void DPLAYX_InitializeLobbyDataEntry( LPDPLAYX_LOBBYDATA lpData ); -BOOL DPLAYX_CopyIntoSessionDesc2A( LPDPSESSIONDESC2 lpSessionDest, - LPCDPSESSIONDESC2 lpSessionSrc ); +static void DPLAYX_InitializeLobbyDataEntry( LPDPLAYX_LOBBYDATA lpData ) +{ + ZeroMemory( lpData, sizeof( *lpData ) ); +} +/* NOTE: This must be called with the semaphore acquired. + * TRUE/FALSE with a pointer to it's data returned. Pointer data is + * is only valid if TRUE is returned. + */ +static BOOL DPLAYX_IsAppIdLobbied( DWORD dwAppID, LPDPLAYX_LOBBYDATA* lplpDplData ) +{ + UINT i; + + *lplpDplData = NULL; + + if( dwAppID == 0 ) + { + dwAppID = GetCurrentProcessId(); + TRACE( "Translated dwAppID == 0 into 0x%08x\n", dwAppID ); + } + + for( i=0; i < numSupportedLobbies; i++ ) + { + if( lobbyData[ i ].dwAppID == dwAppID ) + { + /* This process is lobbied */ + TRACE( "Found 0x%08x @ %u\n", dwAppID, i ); + *lplpDplData = &lobbyData[ i ]; + return TRUE; + } + } + + return FALSE; +} + +/* Reserve a spot for the new application. TRUE means success and FALSE failure. */ +BOOL DPLAYX_CreateLobbyApplication( DWORD dwAppID ) +{ + UINT i; + + /* 0 is the marker for unused application data slots */ + if( dwAppID == 0 ) + { + return FALSE; + } + + DPLAYX_AcquireSemaphore(); + + /* Find an empty space in the list and insert the data */ + for( i=0; i < numSupportedLobbies; i++ ) + { + if( lobbyData[ i ].dwAppID == 0 ) + { + /* This process is now lobbied */ + TRACE( "Setting lobbyData[%u] for (0x%08x,0x%08x)\n", + i, dwAppID, GetCurrentProcessId() ); + + lobbyData[ i ].dwAppID = dwAppID; + lobbyData[ i ].dwAppLaunchedFromID = GetCurrentProcessId(); + + /* FIXME: Where is the best place for this? In interface or here? */ + lobbyData[ i ].hInformOnAppStart = 0; + lobbyData[ i ].hInformOnAppDeath = 0; + lobbyData[ i ].hInformOnSettingRead = 0; + + DPLAYX_ReleaseSemaphore(); + return TRUE; + } + } + + ERR( "No empty lobbies\n" ); + + DPLAYX_ReleaseSemaphore(); + return FALSE; +} + +BOOL DPLAYX_SetLobbyHandles( DWORD dwAppID, + HANDLE hStart, HANDLE hDeath, HANDLE hConnRead ) +{ + LPDPLAYX_LOBBYDATA lpLData; + + /* Need to explicitly give lobby application. Can't set for yourself */ + if( dwAppID == 0 ) + { + return FALSE; + } + + DPLAYX_AcquireSemaphore(); + + if( !DPLAYX_IsAppIdLobbied( dwAppID, &lpLData ) ) + { + DPLAYX_ReleaseSemaphore(); + return FALSE; + } + + lpLData->hInformOnAppStart = hStart; + lpLData->hInformOnAppDeath = hDeath; + lpLData->hInformOnSettingRead = hConnRead; + + DPLAYX_ReleaseSemaphore(); + + return TRUE; +} + +static BOOL DPLAYX_GetThisLobbyHandles( LPHANDLE lphStart, + LPHANDLE lphDeath, + LPHANDLE lphConnRead, + BOOL bClearSetHandles ) +{ + LPDPLAYX_LOBBYDATA lpLData; + + DPLAYX_AcquireSemaphore(); + + if( !DPLAYX_IsAppIdLobbied( 0, &lpLData ) ) + { + DPLAYX_ReleaseSemaphore(); + return FALSE; + } + + if( lphStart != NULL ) + { + if( lpLData->hInformOnAppStart == 0 ) + { + DPLAYX_ReleaseSemaphore(); + return FALSE; + } + + *lphStart = lpLData->hInformOnAppStart; + + if( bClearSetHandles ) + { + CloseHandle( lpLData->hInformOnAppStart ); + lpLData->hInformOnAppStart = 0; + } + } + + if( lphDeath != NULL ) + { + if( lpLData->hInformOnAppDeath == 0 ) + { + DPLAYX_ReleaseSemaphore(); + return FALSE; + } + + *lphDeath = lpLData->hInformOnAppDeath; + + if( bClearSetHandles ) + { + CloseHandle( lpLData->hInformOnAppDeath ); + lpLData->hInformOnAppDeath = 0; + } + } + + if( lphConnRead != NULL ) + { + if( lpLData->hInformOnSettingRead == 0 ) + { + DPLAYX_ReleaseSemaphore(); + return FALSE; + } + + *lphConnRead = lpLData->hInformOnSettingRead; + + if( bClearSetHandles ) + { + CloseHandle( lpLData->hInformOnSettingRead ); + lpLData->hInformOnSettingRead = 0; + } + } + + DPLAYX_ReleaseSemaphore(); + + return TRUE; +} /*************************************************************************** * Called to initialize the global data. This will only be used on the @@ -229,7 +369,7 @@ BOOL DPLAYX_ConstructData(void) s_attrib.lpSecurityDescriptor = NULL; s_attrib.nLength = sizeof(s_attrib); - hDplayxSema = CreateSemaphoreA( &s_attrib, 1, 1, lpszDplayxSemaName ); + hDplayxSema = CreateSemaphoreA( &s_attrib, 0, 1, lpszDplayxSemaName ); /* First instance creates the semaphore. Others just use it */ if( GetLastError() == ERROR_SUCCESS ) @@ -242,17 +382,16 @@ BOOL DPLAYX_ConstructData(void) else if ( GetLastError() == ERROR_ALREADY_EXISTS ) { TRACE( "Found semaphore handle %p\n", hDplayxSema ); + DPLAYX_AcquireSemaphore(); } else { - ERR( ": semaphore error %ld\n", GetLastError() ); + ERR( ": semaphore error %d\n", GetLastError() ); return FALSE; } SetLastError( ERROR_SUCCESS ); - DPLAYX_AquireSemaphore(); - hDplayxSharedMem = CreateFileMappingA( INVALID_HANDLE_VALUE, &s_attrib, PAGE_READWRITE | SEC_COMMIT, @@ -270,7 +409,8 @@ BOOL DPLAYX_ConstructData(void) } else { - ERR( ": unable to create shared memory (%ld)\n", GetLastError() ); + ERR( ": unable to create shared memory (%d)\n", GetLastError() ); + DPLAYX_ReleaseSemaphore(); return FALSE; } @@ -280,8 +420,9 @@ BOOL DPLAYX_ConstructData(void) if( lpSharedStaticData == NULL ) { - ERR( ": unable to map static data into process memory space (%ld)\n", + ERR( ": unable to map static data into process memory space (%d)\n", GetLastError() ); + DPLAYX_ReleaseSemaphore(); return FALSE; } else @@ -293,7 +434,7 @@ BOOL DPLAYX_ConstructData(void) else { /* Presently the shared data structures use pointers. If the - * files are no mapped into the same area, the pointers will no + * files are not mapped into the same area, the pointers will no * longer make any sense :( * FIXME: In the future make the shared data structures have some * sort of fixup to make them independent between data spaces. @@ -308,7 +449,7 @@ BOOL DPLAYX_ConstructData(void) lpMemArea = (LPVOID)((BYTE*)lpSharedStaticData + dwStaticSharedSize); /* FIXME: Crude hack */ - lobbyData = (DPLAYX_LOBBYDATA*)lpSharedStaticData; + lobbyData = lpSharedStaticData; sessionData = (DPSESSIONDESC2*)((BYTE*)lpSharedStaticData + (dwStaticSharedSize/2)); /* Initialize shared data segments. */ @@ -330,7 +471,7 @@ BOOL DPLAYX_ConstructData(void) sessionData[i].dwSize = 0; } - /* Zero out the dynmaic area */ + /* Zero out the dynamic area */ ZeroMemory( lpMemArea, dwDynamicSharedSize ); /* Just for fun sync the whole data area */ @@ -395,209 +536,241 @@ BOOL DPLAYX_DestructData(void) } -void DPLAYX_InitializeLobbyDataEntry( LPDPLAYX_LOBBYDATA lpData ) +/* Assumption: Enough contiguous space was allocated at dest */ +static void DPLAYX_CopyConnStructA( LPDPLCONNECTION dest, const DPLCONNECTION *src ) { - ZeroMemory( lpData, sizeof( *lpData ) ); + BYTE* lpStartOfFreeSpace; + + *dest = *src; + + lpStartOfFreeSpace = ((BYTE*)dest) + sizeof( DPLCONNECTION ); + + /* Copy the LPDPSESSIONDESC2 structure if it exists */ + if( src->lpSessionDesc ) + { + dest->lpSessionDesc = (LPDPSESSIONDESC2)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof( DPSESSIONDESC2 ); + *dest->lpSessionDesc = *src->lpSessionDesc; + + /* Session names may or may not exist */ + if( src->lpSessionDesc->u1.lpszSessionNameA ) + { + strcpy( (LPSTR)lpStartOfFreeSpace, src->lpSessionDesc->u1.lpszSessionNameA ); + dest->lpSessionDesc->u1.lpszSessionNameA = (LPSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += + strlen( dest->lpSessionDesc->u1.lpszSessionNameA ) + 1; + } + + if( src->lpSessionDesc->u2.lpszPasswordA ) + { + strcpy( (LPSTR)lpStartOfFreeSpace, src->lpSessionDesc->u2.lpszPasswordA ); + dest->lpSessionDesc->u2.lpszPasswordA = (LPSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += + strlen( dest->lpSessionDesc->u2.lpszPasswordA ) + 1; + } + } + + /* DPNAME structure is optional */ + if( src->lpPlayerName ) + { + dest->lpPlayerName = (LPDPNAME)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof( DPNAME ); + *dest->lpPlayerName = *src->lpPlayerName; + + if( src->lpPlayerName->u1.lpszShortNameA ) + { + strcpy( (LPSTR)lpStartOfFreeSpace, src->lpPlayerName->u1.lpszShortNameA ); + dest->lpPlayerName->u1.lpszShortNameA = (LPSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += + strlen( dest->lpPlayerName->u1.lpszShortNameA ) + 1; + } + + if( src->lpPlayerName->u2.lpszLongNameA ) + { + strcpy( (LPSTR)lpStartOfFreeSpace, src->lpPlayerName->u2.lpszLongNameA ); + dest->lpPlayerName->u2.lpszLongNameA = (LPSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += + strlen( (LPSTR)dest->lpPlayerName->u2.lpszLongName ) + 1 ; + } + + } + + /* Copy address if it exists */ + if( src->lpAddress ) + { + dest->lpAddress = lpStartOfFreeSpace; + CopyMemory( lpStartOfFreeSpace, src->lpAddress, src->dwAddressSize ); + /* No need to advance lpStartOfFreeSpace as there is no more "dynamic" data */ + } } -/* NOTE: This must be called with the semaphore aquired. - * TRUE/FALSE with a pointer to it's data returned. Pointer data is - * is only valid if TRUE is returned. - */ -BOOL DPLAYX_IsAppIdLobbied( DWORD dwAppID, LPDPLAYX_LOBBYDATA* lplpDplData ) +/* Assumption: Enough contiguous space was allocated at dest */ +static void DPLAYX_CopyConnStructW( LPDPLCONNECTION dest, const DPLCONNECTION *src ) { - UINT i; + BYTE* lpStartOfFreeSpace; - *lplpDplData = NULL; + *dest = *src; - if( dwAppID == 0 ) + lpStartOfFreeSpace = ( (BYTE*)dest) + sizeof( DPLCONNECTION ); + + /* Copy the LPDPSESSIONDESC2 structure if it exists */ + if( src->lpSessionDesc ) { - dwAppID = GetCurrentProcessId(); - TRACE( "Translated dwAppID == 0 into 0x%08lx\n", dwAppID ); - } + dest->lpSessionDesc = (LPDPSESSIONDESC2)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof( DPSESSIONDESC2 ); + *dest->lpSessionDesc = *src->lpSessionDesc; - for( i=0; i < numSupportedLobbies; i++ ) - { - if( lobbyData[ i ].dwAppID == dwAppID ) + /* Session names may or may not exist */ + if( src->lpSessionDesc->u1.lpszSessionName ) { - /* This process is lobbied */ - TRACE( "Found 0x%08lx @ %u\n", dwAppID, i ); - *lplpDplData = &lobbyData[ i ]; - return TRUE; + strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpSessionDesc->u1.lpszSessionName ); + dest->lpSessionDesc->u1.lpszSessionName = (LPWSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof(WCHAR) * + ( strlenW( dest->lpSessionDesc->u1.lpszSessionName ) + 1 ); + } + + if( src->lpSessionDesc->u2.lpszPassword ) + { + strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpSessionDesc->u2.lpszPassword ); + dest->lpSessionDesc->u2.lpszPassword = (LPWSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof(WCHAR) * + ( strlenW( dest->lpSessionDesc->u2.lpszPassword ) + 1 ); } } - return FALSE; + /* DPNAME structure is optional */ + if( src->lpPlayerName ) + { + dest->lpPlayerName = (LPDPNAME)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof( DPNAME ); + *dest->lpPlayerName = *src->lpPlayerName; + + if( src->lpPlayerName->u1.lpszShortName ) + { + strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpPlayerName->u1.lpszShortName ); + dest->lpPlayerName->u1.lpszShortName = (LPWSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof(WCHAR) * + ( strlenW( dest->lpPlayerName->u1.lpszShortName ) + 1 ); + } + + if( src->lpPlayerName->u2.lpszLongName ) + { + strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpPlayerName->u2.lpszLongName ); + dest->lpPlayerName->u2.lpszLongName = (LPWSTR)lpStartOfFreeSpace; + lpStartOfFreeSpace += sizeof(WCHAR) * + ( strlenW( dest->lpPlayerName->u2.lpszLongName ) + 1 ); + } + + } + + /* Copy address if it exists */ + if( src->lpAddress ) + { + dest->lpAddress = lpStartOfFreeSpace; + CopyMemory( lpStartOfFreeSpace, src->lpAddress, src->dwAddressSize ); + /* No need to advance lpStartOfFreeSpace as there is no more "dynamic" data */ + } + } -/* Reserve a spot for the new appliction. TRUE means success and FALSE failure. */ -BOOL DPLAYX_CreateLobbyApplication( DWORD dwAppID ) +static DWORD DPLAYX_SizeOfLobbyDataA( const DPLCONNECTION *lpConn ) { - UINT i; + DWORD dwTotalSize = sizeof( DPLCONNECTION ); - /* 0 is the marker for unused application data slots */ - if( dwAppID == 0 ) + /* Just a safety check */ + if( lpConn == NULL ) { - return FALSE; + ERR( "lpConn is NULL\n" ); + return 0; } - DPLAYX_AquireSemaphore(); - - /* Find an empty space in the list and insert the data */ - for( i=0; i < numSupportedLobbies; i++ ) + if( lpConn->lpSessionDesc != NULL ) { - if( lobbyData[ i ].dwAppID == 0 ) + dwTotalSize += sizeof( DPSESSIONDESC2 ); + + if( lpConn->lpSessionDesc->u1.lpszSessionNameA ) { - /* This process is now lobbied */ - TRACE( "Setting lobbyData[%u] for (0x%08lx,0x%08lx)\n", - i, dwAppID, GetCurrentProcessId() ); + dwTotalSize += strlen( lpConn->lpSessionDesc->u1.lpszSessionNameA ) + 1; + } - lobbyData[ i ].dwAppID = dwAppID; - lobbyData[ i ].dwAppLaunchedFromID = GetCurrentProcessId(); - - /* FIXME: Where is the best place for this? In interface or here? */ - lobbyData[ i ].hInformOnAppStart = 0; - lobbyData[ i ].hInformOnAppDeath = 0; - lobbyData[ i ].hInformOnSettingRead = 0; - - DPLAYX_ReleaseSemaphore(); - return TRUE; + if( lpConn->lpSessionDesc->u2.lpszPasswordA ) + { + dwTotalSize += strlen( lpConn->lpSessionDesc->u2.lpszPasswordA ) + 1; } } - ERR( "No empty lobbies\n" ); + if( lpConn->lpPlayerName != NULL ) + { + dwTotalSize += sizeof( DPNAME ); - DPLAYX_ReleaseSemaphore(); - return FALSE; + if( lpConn->lpPlayerName->u1.lpszShortNameA ) + { + dwTotalSize += strlen( lpConn->lpPlayerName->u1.lpszShortNameA ) + 1; + } + + if( lpConn->lpPlayerName->u2.lpszLongNameA ) + { + dwTotalSize += strlen( lpConn->lpPlayerName->u2.lpszLongNameA ) + 1; + } + + } + + dwTotalSize += lpConn->dwAddressSize; + + return dwTotalSize; } -/* I'm not sure when I'm going to need this, but here it is */ -BOOL DPLAYX_DestroyLobbyApplication( DWORD dwAppID ) +static DWORD DPLAYX_SizeOfLobbyDataW( const DPLCONNECTION *lpConn ) { - UINT i; + DWORD dwTotalSize = sizeof( DPLCONNECTION ); - DPLAYX_AquireSemaphore(); - - /* Find an empty space in the list and insert the data */ - for( i=0; i < numSupportedLobbies; i++ ) + /* Just a safety check */ + if( lpConn == NULL ) { - if( lobbyData[ i ].dwAppID == dwAppID ) - { - /* FIXME: Should free up anything unused. Tisk tisk :0 */ - /* Mark this entry unused */ - TRACE( "Marking lobbyData[%u] unused\n", i ); - DPLAYX_InitializeLobbyDataEntry( &lobbyData[ i ] ); + ERR( "lpConn is NULL\n" ); + return 0; + } - DPLAYX_ReleaseSemaphore(); - return TRUE; + if( lpConn->lpSessionDesc != NULL ) + { + dwTotalSize += sizeof( DPSESSIONDESC2 ); + + if( lpConn->lpSessionDesc->u1.lpszSessionName ) + { + dwTotalSize += sizeof( WCHAR ) * + ( strlenW( lpConn->lpSessionDesc->u1.lpszSessionName ) + 1 ); + } + + if( lpConn->lpSessionDesc->u2.lpszPassword ) + { + dwTotalSize += sizeof( WCHAR ) * + ( strlenW( lpConn->lpSessionDesc->u2.lpszPassword ) + 1 ); } } - DPLAYX_ReleaseSemaphore(); - ERR( "Unable to find global entry for application\n" ); - return FALSE; + if( lpConn->lpPlayerName != NULL ) + { + dwTotalSize += sizeof( DPNAME ); + + if( lpConn->lpPlayerName->u1.lpszShortName ) + { + dwTotalSize += sizeof( WCHAR ) * + ( strlenW( lpConn->lpPlayerName->u1.lpszShortName ) + 1 ); + } + + if( lpConn->lpPlayerName->u2.lpszLongName ) + { + dwTotalSize += sizeof( WCHAR ) * + ( strlenW( lpConn->lpPlayerName->u2.lpszLongName ) + 1 ); + } + + } + + dwTotalSize += lpConn->dwAddressSize; + + return dwTotalSize; } -BOOL DPLAYX_SetLobbyHandles( DWORD dwAppID, - HANDLE hStart, HANDLE hDeath, HANDLE hConnRead ) -{ - LPDPLAYX_LOBBYDATA lpLData; - - /* Need to explictly give lobby application. Can't set for yourself */ - if( dwAppID == 0 ) - { - return FALSE; - } - - DPLAYX_AquireSemaphore(); - - if( !DPLAYX_IsAppIdLobbied( dwAppID, &lpLData ) ) - { - DPLAYX_ReleaseSemaphore(); - return FALSE; - } - - lpLData->hInformOnAppStart = hStart; - lpLData->hInformOnAppDeath = hDeath; - lpLData->hInformOnSettingRead = hConnRead; - - DPLAYX_ReleaseSemaphore(); - - return TRUE; -} - -BOOL DPLAYX_GetThisLobbyHandles( LPHANDLE lphStart, - LPHANDLE lphDeath, - LPHANDLE lphConnRead, - BOOL bClearSetHandles ) -{ - LPDPLAYX_LOBBYDATA lpLData; - - DPLAYX_AquireSemaphore(); - - if( !DPLAYX_IsAppIdLobbied( 0, &lpLData ) ) - { - DPLAYX_ReleaseSemaphore(); - return FALSE; - } - - if( lphStart != NULL ) - { - if( lpLData->hInformOnAppStart == 0 ) - { - DPLAYX_ReleaseSemaphore(); - return FALSE; - } - - *lphStart = lpLData->hInformOnAppStart; - - if( bClearSetHandles ) - { - CloseHandle( lpLData->hInformOnAppStart ); - lpLData->hInformOnAppStart = 0; - } - } - - if( lphDeath != NULL ) - { - if( lpLData->hInformOnAppDeath == 0 ) - { - DPLAYX_ReleaseSemaphore(); - return FALSE; - } - - *lphDeath = lpLData->hInformOnAppDeath; - - if( bClearSetHandles ) - { - CloseHandle( lpLData->hInformOnAppDeath ); - lpLData->hInformOnAppDeath = 0; - } - } - - if( lphConnRead != NULL ) - { - if( lpLData->hInformOnSettingRead == 0 ) - { - DPLAYX_ReleaseSemaphore(); - return FALSE; - } - - *lphConnRead = lpLData->hInformOnSettingRead; - - if( bClearSetHandles ) - { - CloseHandle( lpLData->hInformOnSettingRead ); - lpLData->hInformOnSettingRead = 0; - } - } - - DPLAYX_ReleaseSemaphore(); - - return TRUE; -} - - HRESULT DPLAYX_GetConnectionSettingsA ( DWORD dwAppID, LPVOID lpData, @@ -607,13 +780,13 @@ HRESULT DPLAYX_GetConnectionSettingsA DWORD dwRequiredDataSize = 0; HANDLE hInformOnSettingRead; - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if ( ! DPLAYX_IsAppIdLobbied( dwAppID, &lpDplData ) ) { DPLAYX_ReleaseSemaphore(); - TRACE( "Application 0x%08lx is not lobbied\n", dwAppID ); + TRACE( "Application 0x%08x is not lobbied\n", dwAppID ); return DPERR_NOTLOBBIED; } @@ -633,7 +806,7 @@ HRESULT DPLAYX_GetConnectionSettingsA return DPERR_BUFFERTOOSMALL; } - DPLAYX_CopyConnStructA( (LPDPLCONNECTION)lpData, lpDplData->lpConn ); + DPLAYX_CopyConnStructA( lpData, lpDplData->lpConn ); DPLAYX_ReleaseSemaphore(); @@ -654,74 +827,6 @@ HRESULT DPLAYX_GetConnectionSettingsA return DP_OK; } -/* Assumption: Enough contiguous space was allocated at dest */ -void DPLAYX_CopyConnStructA( LPDPLCONNECTION dest, LPDPLCONNECTION src ) -{ - BYTE* lpStartOfFreeSpace; - - CopyMemory( dest, src, sizeof( DPLCONNECTION ) ); - - lpStartOfFreeSpace = ((BYTE*)dest) + sizeof( DPLCONNECTION ); - - /* Copy the LPDPSESSIONDESC2 structure if it exists */ - if( src->lpSessionDesc ) - { - dest->lpSessionDesc = (LPDPSESSIONDESC2)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof( DPSESSIONDESC2 ); - CopyMemory( dest->lpSessionDesc, src->lpSessionDesc, sizeof( DPSESSIONDESC2 ) ); - - /* Session names may or may not exist */ - if( src->lpSessionDesc->lpszSessionNameA ) - { - strcpy( (LPSTR)lpStartOfFreeSpace, src->lpSessionDesc->lpszSessionNameA ); - dest->lpSessionDesc->lpszSessionNameA = (LPSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += - strlen( (LPSTR)dest->lpSessionDesc->lpszSessionNameA ) + 1; - } - - if( src->lpSessionDesc->lpszPasswordA ) - { - strcpy( (LPSTR)lpStartOfFreeSpace, src->lpSessionDesc->lpszPasswordA ); - dest->lpSessionDesc->lpszPasswordA = (LPSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += - strlen( (LPSTR)dest->lpSessionDesc->lpszPasswordA ) + 1; - } - } - - /* DPNAME structure is optional */ - if( src->lpPlayerName ) - { - dest->lpPlayerName = (LPDPNAME)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof( DPNAME ); - CopyMemory( dest->lpPlayerName, src->lpPlayerName, sizeof( DPNAME ) ); - - if( src->lpPlayerName->lpszShortNameA ) - { - strcpy( (LPSTR)lpStartOfFreeSpace, src->lpPlayerName->lpszShortNameA ); - dest->lpPlayerName->lpszShortNameA = (LPSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += - strlen( (LPSTR)dest->lpPlayerName->lpszShortNameA ) + 1; - } - - if( src->lpPlayerName->lpszLongNameA ) - { - strcpy( (LPSTR)lpStartOfFreeSpace, src->lpPlayerName->lpszLongNameA ); - dest->lpPlayerName->lpszLongNameA = (LPSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += - strlen( (LPSTR)dest->lpPlayerName->lpszLongName ) + 1 ; - } - - } - - /* Copy address if it exists */ - if( src->lpAddress ) - { - dest->lpAddress = (LPVOID)lpStartOfFreeSpace; - CopyMemory( lpStartOfFreeSpace, src->lpAddress, src->dwAddressSize ); - /* No need to advance lpStartOfFreeSpace as there is no more "dynamic" data */ - } -} - HRESULT DPLAYX_GetConnectionSettingsW ( DWORD dwAppID, LPVOID lpData, @@ -731,7 +836,7 @@ HRESULT DPLAYX_GetConnectionSettingsW DWORD dwRequiredDataSize = 0; HANDLE hInformOnSettingRead; - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if ( ! DPLAYX_IsAppIdLobbied( dwAppID, &lpDplData ) ) { @@ -755,7 +860,7 @@ HRESULT DPLAYX_GetConnectionSettingsW return DPERR_BUFFERTOOSMALL; } - DPLAYX_CopyConnStructW( (LPDPLCONNECTION)lpData, lpDplData->lpConn ); + DPLAYX_CopyConnStructW( lpData, lpDplData->lpConn ); DPLAYX_ReleaseSemaphore(); @@ -776,83 +881,14 @@ HRESULT DPLAYX_GetConnectionSettingsW return DP_OK; } -/* Assumption: Enough contiguous space was allocated at dest */ -void DPLAYX_CopyConnStructW( LPDPLCONNECTION dest, LPDPLCONNECTION src ) -{ - BYTE* lpStartOfFreeSpace; - - CopyMemory( dest, src, sizeof( DPLCONNECTION ) ); - - lpStartOfFreeSpace = ( (BYTE*)dest) + sizeof( DPLCONNECTION ); - - /* Copy the LPDPSESSIONDESC2 structure if it exists */ - if( src->lpSessionDesc ) - { - dest->lpSessionDesc = (LPDPSESSIONDESC2)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof( DPSESSIONDESC2 ); - CopyMemory( dest->lpSessionDesc, src->lpSessionDesc, sizeof( DPSESSIONDESC2 ) ); - - /* Session names may or may not exist */ - if( src->lpSessionDesc->lpszSessionName ) - { - strcpyW( (LPWSTR)lpStartOfFreeSpace, dest->lpSessionDesc->lpszSessionName ); - src->lpSessionDesc->lpszSessionName = (LPWSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof(WCHAR) * - ( strlenW( (LPWSTR)dest->lpSessionDesc->lpszSessionName ) + 1 ); - } - - if( src->lpSessionDesc->lpszPassword ) - { - strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpSessionDesc->lpszPassword ); - dest->lpSessionDesc->lpszPassword = (LPWSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof(WCHAR) * - ( strlenW( (LPWSTR)dest->lpSessionDesc->lpszPassword ) + 1 ); - } - } - - /* DPNAME structure is optional */ - if( src->lpPlayerName ) - { - dest->lpPlayerName = (LPDPNAME)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof( DPNAME ); - CopyMemory( dest->lpPlayerName, src->lpPlayerName, sizeof( DPNAME ) ); - - if( src->lpPlayerName->lpszShortName ) - { - strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpPlayerName->lpszShortName ); - dest->lpPlayerName->lpszShortName = (LPWSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof(WCHAR) * - ( strlenW( (LPWSTR)dest->lpPlayerName->lpszShortName ) + 1 ); - } - - if( src->lpPlayerName->lpszLongName ) - { - strcpyW( (LPWSTR)lpStartOfFreeSpace, src->lpPlayerName->lpszLongName ); - dest->lpPlayerName->lpszLongName = (LPWSTR)lpStartOfFreeSpace; - lpStartOfFreeSpace += sizeof(WCHAR) * - ( strlenW( (LPWSTR)dest->lpPlayerName->lpszLongName ) + 1 ); - } - - } - - /* Copy address if it exists */ - if( src->lpAddress ) - { - dest->lpAddress = (LPVOID)lpStartOfFreeSpace; - CopyMemory( lpStartOfFreeSpace, src->lpAddress, src->dwAddressSize ); - /* No need to advance lpStartOfFreeSpace as there is no more "dynamic" data */ - } - -} - -/* Store the structure into the shared data structre. Ensure that allocs for +/* Store the structure into the shared data structure. Ensure that allocs for * variable length strings come from the shared data structure. - * FIXME: We need to free information as well + * FIXME: We need to free information as well. */ HRESULT DPLAYX_SetConnectionSettingsA ( DWORD dwFlags, DWORD dwAppID, - LPDPLCONNECTION lpConn ) + const DPLCONNECTION *lpConn ) { LPDPLAYX_LOBBYDATA lpDplData; @@ -866,13 +902,12 @@ HRESULT DPLAYX_SetConnectionSettingsA /* Store information */ if( lpConn->dwSize != sizeof(DPLCONNECTION) ) { - ERR(": old/new DPLCONNECTION type? Size=%08lx vs. expected=%ul bytes\n", - lpConn->dwSize, sizeof( DPLCONNECTION ) ); + ERR(": old/new DPLCONNECTION type? Size=%08x\n", lpConn->dwSize ); return DPERR_INVALIDPARAMS; } - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if ( ! DPLAYX_IsAppIdLobbied( dwAppID, &lpDplData ) ) { @@ -887,8 +922,8 @@ HRESULT DPLAYX_SetConnectionSettingsA { DPLAYX_ReleaseSemaphore(); - ERR("DPSESSIONDESC passed in? Size=%lu vs. expected=%u bytes\n", - lpConn->lpSessionDesc->dwSize, sizeof( DPSESSIONDESC2 ) ); + ERR("DPSESSIONDESC passed in? Size=%u\n", + lpConn->lpSessionDesc?lpConn->lpSessionDesc->dwSize:0 ); return DPERR_INVALIDPARAMS; } @@ -909,14 +944,14 @@ HRESULT DPLAYX_SetConnectionSettingsA return DP_OK; } -/* Store the structure into the shared data structre. Ensure that allocs for +/* Store the structure into the shared data structure. Ensure that allocs for * variable length strings come from the shared data structure. * FIXME: We need to free information as well */ HRESULT DPLAYX_SetConnectionSettingsW ( DWORD dwFlags, DWORD dwAppID, - LPDPLCONNECTION lpConn ) + const DPLCONNECTION *lpConn ) { LPDPLAYX_LOBBYDATA lpDplData; @@ -930,13 +965,12 @@ HRESULT DPLAYX_SetConnectionSettingsW /* Store information */ if( lpConn->dwSize != sizeof(DPLCONNECTION) ) { - ERR(": old/new DPLCONNECTION type? Size=%lu vs. expected=%u bytes\n", - lpConn->dwSize, sizeof( DPLCONNECTION ) ); + ERR(": old/new DPLCONNECTION type? Size=%u\n", lpConn->dwSize ); return DPERR_INVALIDPARAMS; } - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if ( ! DPLAYX_IsAppIdLobbied( dwAppID, &lpDplData ) ) { @@ -961,193 +995,11 @@ HRESULT DPLAYX_SetConnectionSettingsW return DP_OK; } -DWORD DPLAYX_SizeOfLobbyDataA( LPDPLCONNECTION lpConn ) -{ - DWORD dwTotalSize = sizeof( DPLCONNECTION ); - - /* Just a safety check */ - if( lpConn == NULL ) - { - ERR( "lpConn is NULL\n" ); - return 0; - } - - if( lpConn->lpSessionDesc != NULL ) - { - dwTotalSize += sizeof( DPSESSIONDESC2 ); - - if( lpConn->lpSessionDesc->lpszSessionNameA ) - { - dwTotalSize += strlen( lpConn->lpSessionDesc->lpszSessionNameA ) + 1; - } - - if( lpConn->lpSessionDesc->lpszPasswordA ) - { - dwTotalSize += strlen( lpConn->lpSessionDesc->lpszPasswordA ) + 1; - } - } - - if( lpConn->lpPlayerName != NULL ) - { - dwTotalSize += sizeof( DPNAME ); - - if( lpConn->lpPlayerName->lpszShortNameA ) - { - dwTotalSize += strlen( lpConn->lpPlayerName->lpszShortNameA ) + 1; - } - - if( lpConn->lpPlayerName->lpszLongNameA ) - { - dwTotalSize += strlen( lpConn->lpPlayerName->lpszLongNameA ) + 1; - } - - } - - dwTotalSize += lpConn->dwAddressSize; - - return dwTotalSize; -} - -DWORD DPLAYX_SizeOfLobbyDataW( LPDPLCONNECTION lpConn ) -{ - DWORD dwTotalSize = sizeof( DPLCONNECTION ); - - /* Just a safety check */ - if( lpConn == NULL ) - { - ERR( "lpConn is NULL\n" ); - return 0; - } - - if( lpConn->lpSessionDesc != NULL ) - { - dwTotalSize += sizeof( DPSESSIONDESC2 ); - - if( lpConn->lpSessionDesc->lpszSessionName ) - { - dwTotalSize += sizeof( WCHAR ) * - ( strlenW( lpConn->lpSessionDesc->lpszSessionName ) + 1 ); - } - - if( lpConn->lpSessionDesc->lpszPassword ) - { - dwTotalSize += sizeof( WCHAR ) * - ( strlenW( lpConn->lpSessionDesc->lpszPassword ) + 1 ); - } - } - - if( lpConn->lpPlayerName != NULL ) - { - dwTotalSize += sizeof( DPNAME ); - - if( lpConn->lpPlayerName->lpszShortName ) - { - dwTotalSize += sizeof( WCHAR ) * - ( strlenW( lpConn->lpPlayerName->lpszShortName ) + 1 ); - } - - if( lpConn->lpPlayerName->lpszLongName ) - { - dwTotalSize += sizeof( WCHAR ) * - ( strlenW( lpConn->lpPlayerName->lpszLongName ) + 1 ); - } - - } - - dwTotalSize += lpConn->dwAddressSize; - - return dwTotalSize; -} - - - -static LPDPSESSIONDESC2 DPLAYX_CopyAndAllocateSessionDesc2A( LPCDPSESSIONDESC2 lpSessionSrc ) -{ - LPDPSESSIONDESC2 lpSessionDest = - HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *lpSessionSrc ) ); - DPLAYX_CopyIntoSessionDesc2A( lpSessionDest, lpSessionSrc ); - - return lpSessionDest; -} - -/* Copy an ANSI session desc structure to the given buffer */ -BOOL DPLAYX_CopyIntoSessionDesc2A( LPDPSESSIONDESC2 lpSessionDest, - LPCDPSESSIONDESC2 lpSessionSrc ) -{ - CopyMemory( lpSessionDest, lpSessionSrc, sizeof( *lpSessionSrc ) ); - - if( lpSessionSrc->lpszSessionNameA ) - { - if ((lpSessionDest->lpszSessionNameA = HeapAlloc( GetProcessHeap(), 0, - strlen(lpSessionSrc->lpszSessionNameA)+1 ))) - strcpy( lpSessionDest->lpszSessionNameA, lpSessionSrc->lpszSessionNameA ); - } - if( lpSessionSrc->lpszPasswordA ) - { - if ((lpSessionDest->lpszPasswordA = HeapAlloc( GetProcessHeap(), 0, - strlen(lpSessionSrc->lpszPasswordA)+1 ))) - strcpy( lpSessionDest->lpszPasswordA, lpSessionSrc->lpszPasswordA ); - } - - return TRUE; -} - -/* Start the index at 0. index will be updated to equal that which should - be passed back into this function for the next element */ -LPDPSESSIONDESC2 DPLAYX_CopyAndAllocateLocalSession( UINT* index ) -{ - for( ; (*index) < numSupportedSessions; (*index)++ ) - { - if( sessionData[(*index)].dwSize != 0 ) - { - return DPLAYX_CopyAndAllocateSessionDesc2A( &sessionData[(*index)++] ); - } - } - - /* No more sessions */ - return NULL; -} - -/* Start the index at 0. index will be updated to equal that which should - be passed back into this function for the next element */ -BOOL DPLAYX_CopyLocalSession( UINT* index, LPDPSESSIONDESC2 lpsd ) -{ - for( ; (*index) < numSupportedSessions; (*index)++ ) - { - if( sessionData[(*index)].dwSize != 0 ) - { - return DPLAYX_CopyIntoSessionDesc2A( lpsd, &sessionData[(*index)++] ); - } - } - - /* No more sessions */ - return FALSE; -} - -void DPLAYX_SetLocalSession( LPCDPSESSIONDESC2 lpsd ) -{ - UINT i; - - /* FIXME: Is this an error if it exists already? */ - - /* Crude/wrong implementation for now. Just always add to first empty spot */ - for( i=0; i < numSupportedSessions; i++ ) - { - /* Is this one empty? */ - if( sessionData[i].dwSize == 0 ) - { - DPLAYX_CopyIntoSessionDesc2A( &sessionData[i], lpsd ); - break; - } - } - -} - BOOL DPLAYX_WaitForConnectionSettings( BOOL bWait ) { LPDPLAYX_LOBBYDATA lpLobbyData; - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if( !DPLAYX_IsAppIdLobbied( 0, &lpLobbyData ) ) { @@ -1167,7 +1019,7 @@ BOOL DPLAYX_AnyLobbiesWaitingForConnSettings(void) UINT i; BOOL bFound = FALSE; - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); for( i=0; i < numSupportedLobbies; i++ ) { @@ -1189,7 +1041,7 @@ BOOL DPLAYX_SetLobbyMsgThreadId( DWORD dwAppId, DWORD dwThreadId ) { LPDPLAYX_LOBBYDATA lpLobbyData; - DPLAYX_AquireSemaphore(); + DPLAYX_AcquireSemaphore(); if( !DPLAYX_IsAppIdLobbied( dwAppId, &lpLobbyData ) ) { @@ -1347,7 +1199,7 @@ LPCSTR DPLAYX_HresultToString(HRESULT hr) default: /* For errors not in the list, return HRESULT as a string This part is not thread safe */ - WARN( "Unknown error 0x%08lx\n", hr ); + WARN( "Unknown error 0x%08x\n", hr ); wsprintfA( szTempStr, "0x%08lx", hr ); return szTempStr; } diff --git a/reactos/dll/directx/dplayx/dplayx_global.h b/reactos/dll/directx/dplayx/dplayx_global.h index 4d9571eeb7a..db86a90529c 100644 --- a/reactos/dll/directx/dplayx/dplayx_global.h +++ b/reactos/dll/directx/dplayx/dplayx_global.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPLAYX_GLOBAL @@ -21,7 +21,6 @@ #define WIN32_NO_STATUS #define _INC_WINDOWS -#define COM_NO_WINDOWS_H #include <stdarg.h> @@ -30,51 +29,35 @@ //#include "winuser.h" #include <dplay.h> -BOOL DPLAYX_ConstructData(void); -BOOL DPLAYX_DestructData(void); +BOOL DPLAYX_ConstructData(void) DECLSPEC_HIDDEN; +BOOL DPLAYX_DestructData(void) DECLSPEC_HIDDEN; HRESULT DPLAYX_GetConnectionSettingsA ( DWORD dwAppID, LPVOID lpData, - LPDWORD lpdwDataSize ); + LPDWORD lpdwDataSize ) DECLSPEC_HIDDEN; HRESULT DPLAYX_GetConnectionSettingsW ( DWORD dwAppID, LPVOID lpData, - LPDWORD lpdwDataSize ); + LPDWORD lpdwDataSize ) DECLSPEC_HIDDEN; HRESULT DPLAYX_SetConnectionSettingsA ( DWORD dwFlags, DWORD dwAppID, - LPDPLCONNECTION lpConn ); + const DPLCONNECTION *lpConn ) DECLSPEC_HIDDEN; HRESULT DPLAYX_SetConnectionSettingsW ( DWORD dwFlags, DWORD dwAppID, - LPDPLCONNECTION lpConn ); + const DPLCONNECTION *lpConn ) DECLSPEC_HIDDEN; -BOOL DPLAYX_CreateLobbyApplication( DWORD dwAppID ); -BOOL DPLAYX_DestroyLobbyApplication( DWORD dwAppID ); +BOOL DPLAYX_CreateLobbyApplication( DWORD dwAppID ) DECLSPEC_HIDDEN; -BOOL DPLAYX_WaitForConnectionSettings( BOOL bWait ); -BOOL DPLAYX_AnyLobbiesWaitingForConnSettings(void); +BOOL DPLAYX_WaitForConnectionSettings( BOOL bWait ) DECLSPEC_HIDDEN; +BOOL DPLAYX_AnyLobbiesWaitingForConnSettings(void) DECLSPEC_HIDDEN; BOOL DPLAYX_SetLobbyHandles( DWORD dwAppID, - HANDLE hStart, HANDLE hDeath, HANDLE hConnRead ); -BOOL DPLAYX_GetThisLobbyHandles( LPHANDLE lphStart, - LPHANDLE lphDeath, - LPHANDLE lphConnRead, BOOL bClearSetHandles ); + HANDLE hStart, HANDLE hDeath, HANDLE hConnRead ) DECLSPEC_HIDDEN; -LPDPSESSIONDESC2 DPLAYX_CopyAndAllocateLocalSession( UINT* index ); -BOOL DPLAYX_CopyLocalSession( UINT* index, LPDPSESSIONDESC2 lpsd ); -void DPLAYX_SetLocalSession( LPCDPSESSIONDESC2 lpsd ); - -BOOL DPLAYX_SetLobbyMsgThreadId( DWORD dwAppId, DWORD dwThreadId ); - -/* FIXME: This should not be here */ -LPVOID DPLAYX_PrivHeapAlloc( DWORD flags, DWORD size ); -void DPLAYX_PrivHeapFree( LPVOID addr ); - -LPSTR DPLAYX_strdupA( DWORD flags, LPCSTR str ); -LPWSTR DPLAYX_strdupW( DWORD flags, LPCWSTR str ); -/* FIXME: End shared data alloc which should be local */ +BOOL DPLAYX_SetLobbyMsgThreadId( DWORD dwAppId, DWORD dwThreadId ) DECLSPEC_HIDDEN; /* Convert a DP or DPL HRESULT code into a string for human consumption */ -LPCSTR DPLAYX_HresultToString( HRESULT hr ); +LPCSTR DPLAYX_HresultToString( HRESULT hr ) DECLSPEC_HIDDEN; #endif /* __WINE_DPLAYX_GLOBAL */ diff --git a/reactos/dll/directx/dplayx/dplayx_main.c b/reactos/dll/directx/dplayx/dplayx_main.c index 822c5c70663..ac8eb9cc4a7 100644 --- a/reactos/dll/directx/dplayx/dplayx_main.c +++ b/reactos/dll/directx/dplayx/dplayx_main.c @@ -16,21 +16,21 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES * o DPMSGCMD_ENUMSESSIONSREPLY & DPMSGCMD_ENUMSESSIONSREQUEST * Have most fields understood, but not all. Everything seems to work. * o DPMSGCMD_REQUESTNEWPLAYERID & DPMSGCMD_NEWPLAYERIDREPLY - * Barely work. This needs to be completed for sessions to start. + * Barely works. This needs to be completed for sessions to start. * o A small issue will be the fact that DirectX 6.1(ie. DirectPlay4) - * introduces a layer of functionality inside the DP objects which + * introduces a layer of functionality inside the DP objects which * provide guaranteed protocol delivery. This is even if the native * protocol, IPX or modem for instance, doesn't guarantee it. I'm going - * to leave this kind of implementation to as close to the end as - * possible. However, I will implement an abstraction layer, where - * possible, for this functionality. It will do nothing to start, but - * will require only the implementation of the guaranteness to give + * to leave this kind of implementation to as close to the end as + * possible. However, I will implement an abstraction layer, where + * possible, for this functionality. It will do nothing to start, but + * will require only the implementation of the guarantee to give * final implementation. * * TODO: @@ -41,31 +41,39 @@ * - Change RegEnumKeyEx enumeration pattern to allow error handling and to * share registry implementation (or at least simplify). * - Add in appropriate RegCloseKey calls for all the opening we're doing... - * - Fix all the buffer sizes for registry calls. They're off by one - + * - Fix all the buffer sizes for registry calls. They're off by one - * but in a safe direction. * - Fix race condition on interface destruction * - Handles need to be correctly reference counted - * - Check if we need to deallocate any list objects when destroying + * - Check if we need to deallocate any list objects when destroying * a dplay interface - * - RunApplication process spawning needs to have correct syncronization. + * - RunApplication process spawning needs to have correct synchronization. * - Need to get inter lobby messages working. - * - Decypher dplay messages between applications and implement... + * - Decipher dplay messages between applications and implement... * - Need to implement lobby session spawning. * - Improve footprint and realtime blocking by setting up a separate data share * between lobby application and client since there can be multiple apps per * client. Also get rid of offset dependency by making data offset independent * somehow. */ -//#include <stdarg.h> + +#define WIN32_NO_STATUS +#define _INC_WINDOWS + +#include <stdarg.h> //#include "winerror.h" -//#include "windef.h" -//#include "winbase.h" +#include <windef.h> +#include <winbase.h> +#include <objbase.h> +#include <rpcproxy.h> #include <wine/debug.h> #include "dplayx_global.h" WINE_DEFAULT_DEBUG_CHANNEL(dplay); +static HINSTANCE instance; + /* This is a globally exported variable at ordinal 6 of DPLAYX.DLL */ DWORD gdwDPlaySPRefCount = 0; /* FIXME: Should it be initialized here? */ @@ -73,11 +81,12 @@ DWORD gdwDPlaySPRefCount = 0; /* FIXME: Should it be initialized here? */ BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) { - TRACE( "(%p,%ld,%p)\n", hinstDLL, fdwReason, lpvReserved ); + TRACE( "(%p,%d,%p)\n", hinstDLL, fdwReason, lpvReserved ); switch ( fdwReason ) { case DLL_PROCESS_ATTACH: + instance = hinstDLL; DisableThreadLibraryCalls(hinstDLL); /* First instance perform construction of global processor data */ return DPLAYX_ConstructData(); @@ -102,10 +111,26 @@ HRESULT WINAPI DllCanUnloadNow(void) HRESULT hr = ( gdwDPlaySPRefCount > 0 ) ? S_FALSE : S_OK; /* FIXME: Should I be putting a check in for class factory objects - * as well + * as well? */ - TRACE( ": returning 0x%08lx\n", hr ); + TRACE( ": returning 0x%08x\n", hr ); return hr; } + +/*********************************************************************** + * DllRegisterServer (DPLAYX.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (DPLAYX.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} diff --git a/reactos/dll/directx/dplayx/dplayx_messages.c b/reactos/dll/directx/dplayx/dplayx_messages.c index e6d1f130d99..ed3ddebb699 100644 --- a/reactos/dll/directx/dplayx/dplayx_messages.c +++ b/reactos/dll/directx/dplayx/dplayx_messages.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES * o Messaging interface required for both DirectPlay and DirectPlayLobby. @@ -110,7 +110,7 @@ error: static DWORD CALLBACK DPL_MSG_ThreadMain( LPVOID lpContext ) { - LPMSGTHREADINFO lpThreadInfo = (LPMSGTHREADINFO)lpContext; + LPMSGTHREADINFO lpThreadInfo = lpContext; DWORD dwWaitResult; TRACE( "Msg thread created. Waiting on app startup\n" ); @@ -119,7 +119,7 @@ static DWORD CALLBACK DPL_MSG_ThreadMain( LPVOID lpContext ) dwWaitResult = WaitForSingleObject( lpThreadInfo->hStart, 10000 /* 10 sec */ ); if( dwWaitResult == WAIT_TIMEOUT ) { - FIXME( "Should signal app/wait creation failure (0x%08lx)\n", dwWaitResult ); + FIXME( "Should signal app/wait creation failure (0x%08x)\n", dwWaitResult ); goto end_of_thread; } @@ -131,14 +131,14 @@ static DWORD CALLBACK DPL_MSG_ThreadMain( LPVOID lpContext ) dwWaitResult = WaitForSingleObject( lpThreadInfo->hSettingRead, INFINITE ); if( dwWaitResult == WAIT_TIMEOUT ) { - ERR( "App Read connection setting timeout fail (0x%08lx)\n", dwWaitResult ); + ERR( "App Read connection setting timeout fail (0x%08x)\n", dwWaitResult ); } /* Close this handle as it's not needed anymore */ CloseHandle( lpThreadInfo->hSettingRead ); lpThreadInfo->hSettingRead = 0; - TRACE( "App created && intialized starting main message reception loop\n" ); + TRACE( "App created && initialized starting main message reception loop\n" ); for ( ;; ) { @@ -153,7 +153,7 @@ end_of_thread: return 0; } -/* DP messageing stuff */ +/* DP messaging stuff */ static HANDLE DP_MSG_BuildAndLinkReplyStruct( IDirectPlay2Impl* This, LPDP_MSG_REPLY_STRUCT_LIST lpReplyStructList, WORD wReplyCommandId ); @@ -172,7 +172,7 @@ HANDLE DP_MSG_BuildAndLinkReplyStruct( IDirectPlay2Impl* This, /* Insert into the message queue while locked */ EnterCriticalSection( &This->unk->DP_lock ); - DPQ_INSERT( This->dp2->replysExpected, lpReplyStructList, replysExpected ); + DPQ_INSERT( This->dp2->repliesExpected, lpReplyStructList, repliesExpected ); LeaveCriticalSection( &This->unk->DP_lock ); return lpReplyStructList->replyExpected.hReceipt; @@ -225,7 +225,7 @@ HRESULT DP_MSG_SendRequestPlayerId( IDirectPlay2AImpl* This, DWORD dwFlags, data.bSystemMessage = TRUE; /* Allow reply to be sent */ data.lpISP = This->dp2->spData.lpISP; - TRACE( "Asking for player id w/ dwFlags 0x%08lx\n", + TRACE( "Asking for player id w/ dwFlags 0x%08x\n", lpMsgBody->dwFlags ); DP_MSG_ExpectReply( This, &data, DPMSG_DEFAULT_WAIT_TIME, DPMSGCMD_NEWPLAYERIDREPLY, @@ -233,20 +233,20 @@ HRESULT DP_MSG_SendRequestPlayerId( IDirectPlay2AImpl* This, DWORD dwFlags, } /* Need to examine the data and extract the new player id */ - if( !FAILED(hr) ) + if( SUCCEEDED(hr) ) { LPCDPMSG_NEWPLAYERIDREPLY lpcReply; - lpcReply = (LPCDPMSG_NEWPLAYERIDREPLY)lpMsg; + lpcReply = lpMsg; *lpdpidAllocatedId = lpcReply->dpidNewPlayerId; - TRACE( "Received reply for id = 0x%08lx\n", lpcReply->dpidNewPlayerId ); + TRACE( "Received reply for id = 0x%08x\n", lpcReply->dpidNewPlayerId ); /* FIXME: I think that the rest of the message has something to do * with remote data for the player that perhaps I need to setup. * However, with the information that is passed, all that it could - * be used for is a standardized intialization value, which I'm + * be used for is a standardized initialization value, which I'm * guessing we can do without. Unless the message content is the same * for several different messages? */ @@ -282,7 +282,7 @@ HRESULT DP_MSG_ForwardPlayerCreation( IDirectPlay2AImpl* This, DPID dpidServer ) DWORD dwDataSize; /* SP Player remote data needs to be propagated at some point - is this the point? */ - IDirectPlaySP_GetSPPlayerData( This->dp2->spData.lpISP, 0, (LPVOID*)&lpPData, &dwDataSize, DPSET_REMOTE ); + IDirectPlaySP_GetSPPlayerData( This->dp2->spData.lpISP, 0, &lpPData, &dwDataSize, DPSET_REMOTE ); ERR( "Player Data size is 0x%08lx\n" "[%02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x]\n" @@ -323,18 +323,14 @@ HRESULT DP_MSG_ForwardPlayerCreation( IDirectPlay2AImpl* This, DPID dpidServer ) lpMsgBody->unknown4[3] = NS_GetNsMagic( This->dp2->lpNameServerData ) - 0x02000000; - TRACE( "Setting first magic to 0x%08lx\n", lpMsgBody->unknown4[3] ); + TRACE( "Setting first magic to 0x%08x\n", lpMsgBody->unknown4[3] ); lpMsgBody->unknown4[4] = 0x0; lpMsgBody->unknown4[5] = 0x0; lpMsgBody->unknown4[6] = 0x0; -#if 0 - lpMsgBody->unknown4[7] = NS_GetOtherMagic( This->dp2->lpNameServerData ) -#else lpMsgBody->unknown4[7] = NS_GetNsMagic( This->dp2->lpNameServerData ); -#endif - TRACE( "Setting second magic to 0x%08lx\n", lpMsgBody->unknown4[7] ); + TRACE( "Setting second magic to 0x%08x\n", lpMsgBody->unknown4[7] ); lpMsgBody->unknown4[8] = 0x0; lpMsgBody->unknown4[9] = 0x0; @@ -356,7 +352,7 @@ HRESULT DP_MSG_ForwardPlayerCreation( IDirectPlay2AImpl* This, DPID dpidServer ) data.bSystemMessage = TRUE; /* Allow reply to be sent */ data.lpISP = This->dp2->spData.lpISP; - TRACE( "Sending forward player request with 0x%08lx\n", dpidServer ); + TRACE( "Sending forward player request with 0x%08x\n", dpidServer ); lpMsg = DP_MSG_ExpectReply( This, &data, DPMSG_WAIT_60_SECS, @@ -393,7 +389,7 @@ LPVOID DP_MSG_ExpectReply( IDirectPlay2AImpl* This, LPDPSP_SENDDATA lpData, hMsgReceipt = DP_MSG_BuildAndLinkReplyStruct( This, &replyStructList, wReplyCommandId ); - TRACE( "Sending msg and expecting cmd %u in reply within %lu ticks\n", + TRACE( "Sending msg and expecting cmd %u in reply within %u ticks\n", wReplyCommandId, dwWaitTime ); hr = (*This->dp2->spData.lpCB->Send)( lpData ); @@ -409,7 +405,7 @@ LPVOID DP_MSG_ExpectReply( IDirectPlay2AImpl* This, LPDPSP_SENDDATA lpData, dwWaitReturn = WaitForSingleObject( hMsgReceipt, dwWaitTime ); if( dwWaitReturn != WAIT_OBJECT_0 ) { - ERR( "Wait failed 0x%08lx\n", dwWaitReturn ); + ERR( "Wait failed 0x%08x\n", dwWaitReturn ); return NULL; } @@ -437,7 +433,7 @@ void DP_MSG_ReplyReceived( IDirectPlay2AImpl* This, WORD wCommandId, * avoid problems. */ EnterCriticalSection( &This->unk->DP_lock ); - DPQ_REMOVE_ENTRY( This->dp2->replysExpected, replysExpected, replyExpected.wExpectedReply,\ + DPQ_REMOVE_ENTRY( This->dp2->repliesExpected, repliesExpected, replyExpected.wExpectedReply, ==, wCommandId, lpReplyList ); LeaveCriticalSection( &This->unk->DP_lock ); @@ -502,7 +498,7 @@ void DP_MSG_ErrorReceived( IDirectPlay2AImpl* This, WORD wCommandId, { LPCDPMSG_FORWARDADDPLAYERNACK lpcErrorMsg; - lpcErrorMsg = (LPCDPMSG_FORWARDADDPLAYERNACK)lpMsgBody; + lpcErrorMsg = lpMsgBody; ERR( "Received error message %u. Error is %s\n", wCommandId, DPLAYX_HresultToString( lpcErrorMsg->errorCode) ); diff --git a/reactos/dll/directx/dplayx/dplayx_messages.h b/reactos/dll/directx/dplayx/dplayx_messages.h index 60f08576475..fbf6b33be6e 100644 --- a/reactos/dll/directx/dplayx/dplayx_messages.h +++ b/reactos/dll/directx/dplayx/dplayx_messages.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPLAYX_MESSAGES__ @@ -29,17 +29,17 @@ #include "dplay_global.h" DWORD CreateLobbyMessageReceptionThread( HANDLE hNotifyEvent, HANDLE hStart, - HANDLE hDeath, HANDLE hConnRead ); + HANDLE hDeath, HANDLE hConnRead ) DECLSPEC_HIDDEN; HRESULT DP_MSG_SendRequestPlayerId( IDirectPlay2AImpl* This, DWORD dwFlags, - LPDPID lpdipidAllocatedId ); -HRESULT DP_MSG_ForwardPlayerCreation( IDirectPlay2AImpl* This, DPID dpidServer ); + LPDPID lpdipidAllocatedId ) DECLSPEC_HIDDEN; +HRESULT DP_MSG_ForwardPlayerCreation( IDirectPlay2AImpl* This, DPID dpidServer ) DECLSPEC_HIDDEN; void DP_MSG_ReplyReceived( IDirectPlay2AImpl* This, WORD wCommandId, - LPCVOID lpMsgBody, DWORD dwMsgBodySize ); + LPCVOID lpMsgBody, DWORD dwMsgBodySize ) DECLSPEC_HIDDEN; void DP_MSG_ErrorReceived( IDirectPlay2AImpl* This, WORD wCommandId, - LPCVOID lpMsgBody, DWORD dwMsgBodySize ); -void DP_MSG_ToSelf( IDirectPlay2AImpl* This, DPID dpidSelf ); + LPCVOID lpMsgBody, DWORD dwMsgBodySize ) DECLSPEC_HIDDEN; +void DP_MSG_ToSelf( IDirectPlay2AImpl* This, DPID dpidSelf ) DECLSPEC_HIDDEN; /* Timings -> 1000 ticks/sec */ #define DPMSG_WAIT_5_SECS 5000 diff --git a/reactos/dll/directx/dplayx/dplayx_queue.h b/reactos/dll/directx/dplayx/dplayx_queue.h index 9bad0cc56ba..33467ee895e 100644 --- a/reactos/dll/directx/dplayx/dplayx_queue.h +++ b/reactos/dll/directx/dplayx/dplayx_queue.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES * o Linked list implementation for dplay/dplobby. Based off of the BSD @@ -122,7 +122,7 @@ do { \ * elm - how to find the next element * field - to be concatenated to rc to compare with fieldToCompare * fieldToCompare - The value that we're comparing against - * compare_cb - Callback to invoke to determine if comparision should continue. + * compare_cb - Callback to invoke to determine if comparison should continue. * Callback must be defined with DPQ_DECL_COMPARECB. * rc - Variable to put the return code. Same type as (head).lpQHFirst */ @@ -174,7 +174,7 @@ do { \ * elm - how to find the next element * field - to be concatenated to rc to compare with fieldToCompare * fieldToCompare - The value that we're comparing against - * compare_cb - Callback to invoke to determine if comparision should continue. + * compare_cb - Callback to invoke to determine if comparison should continue. * Callback must be defined with DPQ_DECL_COMPARECB. * rc - Variable to put the return code. Same type as (head).lpQHFirst */ @@ -211,6 +211,6 @@ do \ #define DPQ_DECL_DELETECB( name, type ) void name( type elem ) /* Prototype of a method which just performs a HeapFree on the elem */ -DPQ_DECL_DELETECB( cbDeleteElemFromHeap, LPVOID ); +DPQ_DECL_DELETECB( cbDeleteElemFromHeap, LPVOID ) DECLSPEC_HIDDEN; #endif /* __WINE_DPLAYX_QUEUE_H */ diff --git a/reactos/dll/directx/dplayx/dplobby.c b/reactos/dll/directx/dplayx/dplobby.c index 7bfc9ce0434..b8500334df3 100644 --- a/reactos/dll/directx/dplayx/dplobby.c +++ b/reactos/dll/directx/dplayx/dplobby.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include <stdarg.h> //#include <string.h> @@ -48,9 +48,9 @@ typedef struct IDirectPlayLobby3Impl IDirectPlayLobby3WImpl; /* Forward declarations for this module helper methods */ HRESULT DPL_CreateCompoundAddress ( LPCDPCOMPOUNDADDRESSELEMENT lpElements, DWORD dwElementCount, - LPVOID lpAddress, LPDWORD lpdwAddressSize, BOOL bAnsiInterface ); + LPVOID lpAddress, LPDWORD lpdwAddressSize, BOOL bAnsiInterface )DECLSPEC_HIDDEN; -HRESULT DPL_CreateAddress( REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, DWORD dwDataSize, +static HRESULT DPL_CreateAddress( REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, DWORD dwDataSize, LPVOID lpAddress, LPDWORD lpdwAddressSize, BOOL bAnsiInterface ); @@ -58,11 +58,11 @@ HRESULT DPL_CreateAddress( REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, DWORD dwAddressSize, LPVOID lpContext ); -static HRESULT WINAPI DPL_ConnectEx( IDirectPlayLobbyAImpl* This, - DWORD dwFlags, REFIID riid, - LPVOID* lplpDP, IUnknown* pUnk ); +static HRESULT DPL_ConnectEx( IDirectPlayLobbyAImpl* This, + DWORD dwFlags, REFIID riid, + LPVOID* lplpDP, IUnknown* pUnk ); -BOOL DPL_CreateAndSetLobbyHandles( DWORD dwDestProcessId, HANDLE hDestProcess, +static BOOL DPL_CreateAndSetLobbyHandles( DWORD dwDestProcessId, HANDLE hDestProcess, LPHANDLE lphStart, LPHANDLE lphDeath, LPHANDLE lphRead ); @@ -145,7 +145,7 @@ static const IDirectPlayLobby3Vtbl directPlayLobby3AVT; static BOOL DPL_CreateIUnknown( LPVOID lpDPL ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)lpDPL; + IDirectPlayLobbyAImpl *This = lpDPL; This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) ); if ( This->unk == NULL ) @@ -154,14 +154,16 @@ static BOOL DPL_CreateIUnknown( LPVOID lpDPL ) } InitializeCriticalSection( &This->unk->DPL_lock ); + This->unk->DPL_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDirectPlayLobbyAImpl*->DirectPlayLobbyIUnknownData*->DPL_lock"); return TRUE; } static BOOL DPL_DestroyIUnknown( LPVOID lpDPL ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)lpDPL; + IDirectPlayLobbyAImpl *This = lpDPL; + This->unk->DPL_lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection( &This->unk->DPL_lock ); HeapFree( GetProcessHeap(), 0, This->unk ); @@ -170,7 +172,7 @@ static BOOL DPL_DestroyIUnknown( LPVOID lpDPL ) static BOOL DPL_CreateLobby1( LPVOID lpDPL ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)lpDPL; + IDirectPlayLobbyAImpl *This = lpDPL; This->dpl = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dpl) ) ); if ( This->dpl == NULL ) @@ -185,7 +187,7 @@ static BOOL DPL_CreateLobby1( LPVOID lpDPL ) static BOOL DPL_DestroyLobby1( LPVOID lpDPL ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)lpDPL; + IDirectPlayLobbyAImpl *This = lpDPL; if( This->dpl->dwMsgThread ) { @@ -202,7 +204,7 @@ static BOOL DPL_DestroyLobby1( LPVOID lpDPL ) static BOOL DPL_CreateLobby2( LPVOID lpDPL ) { - IDirectPlayLobby2AImpl *This = (IDirectPlayLobby2AImpl *)lpDPL; + IDirectPlayLobby2AImpl *This = lpDPL; This->dpl2 = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dpl2) ) ); if ( This->dpl2 == NULL ) @@ -215,7 +217,7 @@ static BOOL DPL_CreateLobby2( LPVOID lpDPL ) static BOOL DPL_DestroyLobby2( LPVOID lpDPL ) { - IDirectPlayLobby2AImpl *This = (IDirectPlayLobby2AImpl *)lpDPL; + IDirectPlayLobby2AImpl *This = lpDPL; HeapFree( GetProcessHeap(), 0, This->dpl2 ); @@ -224,7 +226,7 @@ static BOOL DPL_DestroyLobby2( LPVOID lpDPL ) static BOOL DPL_CreateLobby3( LPVOID lpDPL ) { - IDirectPlayLobby3AImpl *This = (IDirectPlayLobby3AImpl *)lpDPL; + IDirectPlayLobby3AImpl *This = lpDPL; This->dpl3 = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->dpl3) ) ); if ( This->dpl3 == NULL ) @@ -237,7 +239,7 @@ static BOOL DPL_CreateLobby3( LPVOID lpDPL ) static BOOL DPL_DestroyLobby3( LPVOID lpDPL ) { - IDirectPlayLobby3AImpl *This = (IDirectPlayLobby3AImpl *)lpDPL; + IDirectPlayLobby3AImpl *This = lpDPL; HeapFree( GetProcessHeap(), 0, This->dpl3 ); @@ -268,7 +270,6 @@ static BOOL DPL_DestroyLobby3( LPVOID lpDPL ) * successfully for a third interface, a query for the first interface * through the pointer for the third interface must succeed. */ -extern HRESULT DPL_CreateInterface ( REFIID riid, LPVOID* ppvObj ) { @@ -284,32 +285,32 @@ HRESULT DPL_CreateInterface if( IsEqualGUID( &IID_IDirectPlayLobby, riid ) ) { - IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)*ppvObj; + IDirectPlayLobbyWImpl *This = *ppvObj; This->lpVtbl = &directPlayLobbyWVT; } else if( IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)*ppvObj; + IDirectPlayLobbyAImpl *This = *ppvObj; This->lpVtbl = &directPlayLobbyAVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby2, riid ) ) { - IDirectPlayLobby2WImpl *This = (IDirectPlayLobby2WImpl *)*ppvObj; + IDirectPlayLobby2WImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby2WVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) ) { - IDirectPlayLobby2AImpl *This = (IDirectPlayLobby2AImpl *)*ppvObj; + IDirectPlayLobby2AImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby2AVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby3, riid ) ) { - IDirectPlayLobby3WImpl *This = (IDirectPlayLobby3WImpl *)*ppvObj; + IDirectPlayLobby3WImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby3WVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby3A, riid ) ) { - IDirectPlayLobby3AImpl *This = (IDirectPlayLobby3AImpl *)*ppvObj; + IDirectPlayLobby3AImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby3AVT; } else @@ -364,32 +365,32 @@ static HRESULT WINAPI DPL_QueryInterface if( IsEqualGUID( &IID_IDirectPlayLobby, riid ) ) { - IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)*ppvObj; + IDirectPlayLobbyWImpl *This = *ppvObj; This->lpVtbl = &directPlayLobbyWVT; } else if( IsEqualGUID( &IID_IDirectPlayLobbyA, riid ) ) { - IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)*ppvObj; + IDirectPlayLobbyAImpl *This = *ppvObj; This->lpVtbl = &directPlayLobbyAVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby2, riid ) ) { - IDirectPlayLobby2WImpl *This = (IDirectPlayLobby2WImpl *)*ppvObj; + IDirectPlayLobby2WImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby2WVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby2A, riid ) ) { - IDirectPlayLobby2AImpl *This = (IDirectPlayLobby2AImpl *)*ppvObj; + IDirectPlayLobby2AImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby2AVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby3, riid ) ) { - IDirectPlayLobby3WImpl *This = (IDirectPlayLobby3WImpl *)*ppvObj; + IDirectPlayLobby3WImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby3WVT; } else if( IsEqualGUID( &IID_IDirectPlayLobby3A, riid ) ) { - IDirectPlayLobby3AImpl *This = (IDirectPlayLobby3AImpl *)*ppvObj; + IDirectPlayLobby3AImpl *This = *ppvObj; This->lpVtbl = &directPlayLobby3AVT; } else @@ -419,7 +420,7 @@ static ULONG WINAPI DPL_AddRef ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef ); - TRACE( "ref count incremented to %lu:%lu for %p\n", + TRACE( "ref count incremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); return ulObjRefCount; @@ -439,7 +440,7 @@ static ULONG WINAPI DPL_Release ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef ); - TRACE( "ref count decremented to %lu:%lu for %p\n", + TRACE( "ref count decremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); /* Deallocate if this is the last reference to the object */ @@ -468,7 +469,7 @@ static ULONG WINAPI DPL_Release * Returns an IDirectPlay interface. * */ -static HRESULT WINAPI DPL_ConnectEx +static HRESULT DPL_ConnectEx ( IDirectPlayLobbyAImpl* This, DWORD dwFlags, REFIID riid, @@ -480,7 +481,7 @@ static HRESULT WINAPI DPL_ConnectEx DWORD dwConnSize = 0; LPDPLCONNECTION lpConn; - FIXME("(%p)->(0x%08lx,%p,%p): semi stub\n", This, dwFlags, lplpDP, pUnk ); + FIXME("(%p)->(0x%08x,%p,%p): semi stub\n", This, dwFlags, lplpDP, pUnk ); if( pUnk ) { @@ -610,7 +611,7 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_CreateAddress lpAddress, lpdwAddressSize, FALSE ); } -HRESULT DPL_CreateAddress( +static HRESULT DPL_CreateAddress( REFGUID guidSP, REFGUID guidDataType, LPCVOID lpData, @@ -622,7 +623,7 @@ HRESULT DPL_CreateAddress( const DWORD dwNumAddElements = 2; /* Service Provide & address data type */ DPCOMPOUNDADDRESSELEMENT addressElements[ 2 /* dwNumAddElements */ ]; - TRACE( "(%p)->(%p,%p,0x%08lx,%p,%p,%d)\n", guidSP, guidDataType, lpData, dwDataSize, + TRACE( "(%p)->(%p,%p,0x%08x,%p,%p,%d)\n", guidSP, guidDataType, lpData, dwDataSize, lpAddress, lpdwAddressSize, bAnsiInterface ); addressElements[ 0 ].guidDataType = DPAID_ServiceProvider; @@ -656,7 +657,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddress { IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)iface; - TRACE("(%p)->(%p,%p,0x%08lx,%p)\n", This, lpEnumAddressCallback, lpAddress, + TRACE("(%p)->(%p,%p,0x%08x,%p)\n", This, lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); return DPL_EnumAddress( lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); @@ -671,14 +672,14 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_EnumAddress { IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; - TRACE("(%p)->(%p,%p,0x%08lx,%p)\n", This, lpEnumAddressCallback, lpAddress, + TRACE("(%p)->(%p,%p,0x%08x,%p)\n", This, lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); return DPL_EnumAddress( lpEnumAddressCallback, lpAddress, dwAddressSize, lpContext ); } -extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, - DWORD dwAddressSize, LPVOID lpContext ) +HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, LPCVOID lpAddress, + DWORD dwAddressSize, LPVOID lpContext ) { DWORD dwTotalSizeEnumerated = 0; @@ -686,13 +687,13 @@ extern HRESULT DPL_EnumAddress( LPDPENUMADDRESSCALLBACK lpEnumAddressCallback, L while ( dwTotalSizeEnumerated < dwAddressSize ) { - const DPADDRESS* lpElements = (const DPADDRESS*)lpAddress; + const DPADDRESS* lpElements = lpAddress; DWORD dwSizeThisEnumeration; /* Invoke the enum method. If false is returned, stop enumeration */ if ( !lpEnumAddressCallback( &lpElements->guidDataType, lpElements->dwDataSize, - (BYTE*)lpElements + sizeof( DPADDRESS ), + (const BYTE *)lpElements + sizeof( DPADDRESS ), lpContext ) ) { break; @@ -727,14 +728,14 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes char subKeyName[51]; FILETIME filetime; - TRACE(" (%p)->(%p,%p,%p,0x%08lx)\n", This, lpEnumAddressTypeCallback, guidSP, lpContext, dwFlags ); + TRACE(" (%p)->(%p,%p,%p,0x%08x)\n", This, lpEnumAddressTypeCallback, guidSP, lpContext, dwFlags ); if( dwFlags != 0 ) { return DPERR_INVALIDPARAMS; } - if( !lpEnumAddressTypeCallback || !*lpEnumAddressTypeCallback ) + if( !lpEnumAddressTypeCallback ) { return DPERR_INVALIDPARAMS; } @@ -863,7 +864,7 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_EnumLocalApplications { IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; - FIXME("(%p)->(%p,%p,0x%08lx):stub\n", This, lpEnumLocalAppCallback, lpContext, dwFlags ); + FIXME("(%p)->(%p,%p,0x%08x):stub\n", This, lpEnumLocalAppCallback, lpContext, dwFlags ); return DPERR_OUTOFMEMORY; } @@ -883,14 +884,14 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications char subKeyName[51]; FILETIME filetime; - TRACE("(%p)->(%p,%p,0x%08lx)\n", This, lpEnumLocalAppCallback, lpContext, dwFlags ); + TRACE("(%p)->(%p,%p,0x%08x)\n", This, lpEnumLocalAppCallback, lpContext, dwFlags ); if( dwFlags != 0 ) { return DPERR_INVALIDPARAMS; } - if( !lpEnumLocalAppCallback || !*lpEnumLocalAppCallback ) + if( !lpEnumLocalAppCallback ) { return DPERR_INVALIDPARAMS; } @@ -979,7 +980,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_GetConnectionSettings IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)iface; HRESULT hr; - TRACE("(%p)->(0x%08lx,%p,%p)\n", This, dwAppID, lpData, lpdwDataSize ); + TRACE("(%p)->(0x%08x,%p,%p)\n", This, dwAppID, lpData, lpdwDataSize ); EnterCriticalSection( &This->unk->DPL_lock ); @@ -1002,7 +1003,7 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_GetConnectionSettings IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; HRESULT hr; - TRACE("(%p)->(0x%08lx,%p,%p)\n", This, dwAppID, lpData, lpdwDataSize ); + TRACE("(%p)->(0x%08x,%p,%p)\n", This, dwAppID, lpData, lpdwDataSize ); EnterCriticalSection( &This->unk->DPL_lock ); @@ -1031,7 +1032,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_ReceiveLobbyMessage LPDWORD lpdwDataSize ) { IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)iface; - FIXME(":stub %p %08lx %08lx %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, + FIXME(":stub %p %08x %08x %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, lpdwDataSize ); return DPERR_OUTOFMEMORY; } @@ -1045,7 +1046,7 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_ReceiveLobbyMessage LPDWORD lpdwDataSize ) { IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; - FIXME(":stub %p %08lx %08lx %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, + FIXME(":stub %p %08x %08x %p %p %p\n", This, dwFlags, dwAppID, lpdwMessageFlags, lpData, lpdwDataSize ); return DPERR_OUTOFMEMORY; } @@ -1143,7 +1144,7 @@ static BOOL CALLBACK RunApplicationA_EnumLocalApplications return TRUE; /* Keep enumerating, haven't found the application yet */ } -BOOL DPL_CreateAndSetLobbyHandles( DWORD dwDestProcessId, HANDLE hDestProcess, +static BOOL DPL_CreateAndSetLobbyHandles( DWORD dwDestProcessId, HANDLE hDestProcess, LPHANDLE lphStart, LPHANDLE lphDeath, LPHANDLE lphRead ) { @@ -1212,7 +1213,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_RunApplication DWORD dwSuspendCount; HANDLE hStart, hDeath, hSettingRead; - TRACE( "(%p)->(0x%08lx,%p,%p,%p)\n", + TRACE( "(%p)->(0x%08x,%p,%p,%p)\n", This, dwFlags, lpdwAppID, lpConn, hReceiveEvent ); if( dwFlags != 0 ) @@ -1234,7 +1235,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_RunApplication /* Our callback function will fill up the enumData structure with all the information required to start a new process */ IDirectPlayLobby_EnumLocalApplications( iface, RunApplicationA_EnumLocalApplications, - (LPVOID)(&enumData), 0 ); + (&enumData), 0 ); /* First the application name */ strcpy( temp, enumData.lpszPath ); @@ -1287,7 +1288,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_RunApplication /* Reserve this global application id! */ if( !DPLAYX_CreateLobbyApplication( newProcessInfo.dwProcessId ) ) { - ERR( "Unable to create global application data for 0x%08lx\n", + ERR( "Unable to create global application data for 0x%08x\n", newProcessInfo.dwProcessId ); } @@ -1319,7 +1320,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_RunApplication /* Unsuspend the process - should return the prev suspension count */ if( ( dwSuspendCount = ResumeThread( newProcessInfo.hThread ) ) != 1 ) { - ERR( "ResumeThread failed with 0x%08lx\n", dwSuspendCount ); + ERR( "ResumeThread failed with 0x%08x\n", dwSuspendCount ); } return DP_OK; @@ -1333,7 +1334,7 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_RunApplication HANDLE hReceiveEvent ) { IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; - FIXME( "(%p)->(0x%08lx,%p,%p,%p):stub\n", This, dwFlags, lpdwAppID, lpConn, (void *)hReceiveEvent ); + FIXME( "(%p)->(0x%08x,%p,%p,%p):stub\n", This, dwFlags, lpdwAppID, lpConn, hReceiveEvent ); return DPERR_OUTOFMEMORY; } @@ -1380,13 +1381,13 @@ static HRESULT WINAPI IDirectPlayLobbyWImpl_SetConnectionSettings IDirectPlayLobbyWImpl *This = (IDirectPlayLobbyWImpl *)iface; HRESULT hr; - TRACE("(%p)->(0x%08lx,0x%08lx,%p)\n", This, dwFlags, dwAppID, lpConn ); + TRACE("(%p)->(0x%08x,0x%08x,%p)\n", This, dwFlags, dwAppID, lpConn ); EnterCriticalSection( &This->unk->DPL_lock ); hr = DPLAYX_SetConnectionSettingsW( dwFlags, dwAppID, lpConn ); - /* FIXME: Don't think that this is supposed to fail, but the docuementation + /* FIXME: Don't think that this is supposed to fail, but the documentation is somewhat sketchy. I'll try creating a lobby application for this... */ if( hr == DPERR_NOTLOBBIED ) @@ -1414,13 +1415,13 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_SetConnectionSettings IDirectPlayLobbyAImpl *This = (IDirectPlayLobbyAImpl *)iface; HRESULT hr; - TRACE("(%p)->(0x%08lx,0x%08lx,%p)\n", This, dwFlags, dwAppID, lpConn ); + TRACE("(%p)->(0x%08x,0x%08x,%p)\n", This, dwFlags, dwAppID, lpConn ); EnterCriticalSection( &This->unk->DPL_lock ); hr = DPLAYX_SetConnectionSettingsA( dwFlags, dwAppID, lpConn ); - /* FIXME: Don't think that this is supposed to fail, but the docuementation + /* FIXME: Don't think that this is supposed to fail, but the documentation is somewhat sketchy. I'll try creating a lobby application for this... */ if( hr == DPERR_NOTLOBBIED ) @@ -1494,7 +1495,7 @@ HRESULT DPL_CreateCompoundAddress DWORD dwElements; LPCDPCOMPOUNDADDRESSELEMENT lpOrigElements = lpElements; - TRACE("(%p,0x%08lx,%p,%p)\n", lpElements, dwElementCount, lpAddress, lpdwAddressSize ); + TRACE("(%p,0x%08x,%p,%p)\n", lpElements, dwElementCount, lpAddress, lpdwAddressSize ); /* Parameter check */ if( ( lpElements == NULL ) || @@ -1570,9 +1571,9 @@ HRESULT DPL_CreateCompoundAddress /* Add the total size chunk */ { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &DPAID_TotalSize, sizeof( GUID ) ); + lpdpAddress->guidDataType = DPAID_TotalSize; lpdpAddress->dwDataSize = sizeof( DWORD ); lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); @@ -1589,10 +1590,9 @@ HRESULT DPL_CreateCompoundAddress ( IsEqualGUID( &lpElements->guidDataType, &DPAID_LobbyProvider ) ) ) { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &lpElements->guidDataType, - sizeof( GUID ) ); + lpdpAddress->guidDataType = lpElements->guidDataType; lpdpAddress->dwDataSize = sizeof( GUID ); lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); @@ -1604,16 +1604,13 @@ HRESULT DPL_CreateCompoundAddress ( IsEqualGUID( &lpElements->guidDataType, &DPAID_INet ) ) ) { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &lpElements->guidDataType, - sizeof( GUID ) ); + lpdpAddress->guidDataType = lpElements->guidDataType; lpdpAddress->dwDataSize = lpElements->dwDataSize; lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); - lstrcpynA( (LPSTR)lpAddress, - (LPCSTR)lpElements->lpData, - lpElements->dwDataSize ); + lstrcpynA( lpAddress, lpElements->lpData, lpElements->dwDataSize ); lpAddress = (char *) lpAddress + lpElements->dwDataSize; } else if ( ( IsEqualGUID( &lpElements->guidDataType, &DPAID_PhoneW ) ) || @@ -1621,24 +1618,20 @@ HRESULT DPL_CreateCompoundAddress ( IsEqualGUID( &lpElements->guidDataType, &DPAID_INetW ) ) ) { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &lpElements->guidDataType, - sizeof( GUID ) ); + lpdpAddress->guidDataType = lpElements->guidDataType; lpdpAddress->dwDataSize = lpElements->dwDataSize; lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); - lstrcpynW( (LPWSTR)lpAddress, - (LPCWSTR)lpElements->lpData, - lpElements->dwDataSize ); + lstrcpynW( lpAddress, lpElements->lpData, lpElements->dwDataSize ); lpAddress = (char *) lpAddress + lpElements->dwDataSize * sizeof( WCHAR ); } else if ( IsEqualGUID( &lpElements->guidDataType, &DPAID_INetPort ) ) { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &lpElements->guidDataType, - sizeof( GUID ) ); + lpdpAddress->guidDataType = lpElements->guidDataType; lpdpAddress->dwDataSize = lpElements->dwDataSize; lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); @@ -1647,10 +1640,9 @@ HRESULT DPL_CreateCompoundAddress } else if ( IsEqualGUID( &lpElements->guidDataType, &DPAID_ComPort ) ) { - LPDPADDRESS lpdpAddress = (LPDPADDRESS)lpAddress; + LPDPADDRESS lpdpAddress = lpAddress; - CopyMemory( &lpdpAddress->guidDataType, &lpElements->guidDataType, - sizeof( GUID ) ); + lpdpAddress->guidDataType = lpElements->guidDataType; lpdpAddress->dwDataSize = lpElements->dwDataSize; lpAddress = (char *) lpAddress + sizeof( DPADDRESS ); @@ -1712,9 +1704,9 @@ static HRESULT WINAPI IDirectPlayLobby3WImpl_WaitForConnectionSettings ( LPDIRECTPLAYLOBBY3 iface, DWORD dwFlags ) { HRESULT hr = DP_OK; - BOOL bStartWait = (dwFlags & DPLWAIT_CANCEL) ? FALSE : TRUE; + BOOL bStartWait = !(dwFlags & DPLWAIT_CANCEL); - TRACE( "(%p)->(0x%08lx)\n", iface, dwFlags ); + TRACE( "(%p)->(0x%08x)\n", iface, dwFlags ); if( DPLAYX_WaitForConnectionSettings( bStartWait ) ) { @@ -1729,9 +1721,9 @@ static HRESULT WINAPI IDirectPlayLobby3AImpl_WaitForConnectionSettings ( LPDIRECTPLAYLOBBY3A iface, DWORD dwFlags ) { HRESULT hr = DP_OK; - BOOL bStartWait = (dwFlags & DPLWAIT_CANCEL) ? FALSE : TRUE; + BOOL bStartWait = !(dwFlags & DPLWAIT_CANCEL); - TRACE( "(%p)->(0x%08lx)\n", iface, dwFlags ); + TRACE( "(%p)->(0x%08x)\n", iface, dwFlags ); if( DPLAYX_WaitForConnectionSettings( bStartWait ) ) { @@ -1838,7 +1830,7 @@ static const IDirectPlayLobby2Vtbl directPlayLobby2AVT = /* Note: Hack so we can reuse the old functions without compiler warnings */ #if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(directPlayLobby2AVT.fun)) +# define XCAST(fun) (typeof(directPlayLobby2WVT.fun)) #else # define XCAST(fun) (void*) #endif @@ -1956,7 +1948,7 @@ HRESULT WINAPI DirectPlayLobbyCreateA( LPGUID lpGUIDDSP, LPVOID lpData, DWORD dwDataSize ) { - TRACE("lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n", + TRACE("lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08x\n", lpGUIDDSP,lplpDPL,lpUnk,lpData,dwDataSize); /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must @@ -1988,7 +1980,7 @@ HRESULT WINAPI DirectPlayLobbyCreateW( LPGUID lpGUIDDSP, LPVOID lpData, DWORD dwDataSize ) { - TRACE("lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08lx\n", + TRACE("lpGUIDDSP=%p lplpDPL=%p lpUnk=%p lpData=%p dwDataSize=%08x\n", lpGUIDDSP,lplpDPL,lpUnk,lpData,dwDataSize); /* Parameter Check: lpGUIDSP, lpUnk & lpData must be NULL. dwDataSize must diff --git a/reactos/dll/directx/dplayx/lobbysp.c b/reactos/dll/directx/dplayx/lobbysp.c index 18e4165e24b..4574d154e54 100644 --- a/reactos/dll/directx/dplayx/lobbysp.c +++ b/reactos/dll/directx/dplayx/lobbysp.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ //#include "winerror.h" @@ -76,7 +76,7 @@ HRESULT DPLSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp if( IsEqualGUID( &IID_IDPLobbySP, riid ) ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)*ppvObj; + IDPLobbySPImpl *This = *ppvObj; This->lpVtbl = &dpLobbySPVT; } else @@ -109,7 +109,7 @@ HRESULT DPLSP_CreateInterface( REFIID riid, LPVOID* ppvObj, IDirectPlay2Impl* dp static BOOL DPLSP_CreateIUnknown( LPVOID lpSP ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)lpSP; + IDPLobbySPImpl *This = lpSP; This->unk = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->unk) ) ); @@ -119,14 +119,16 @@ static BOOL DPLSP_CreateIUnknown( LPVOID lpSP ) } InitializeCriticalSection( &This->unk->DPLSP_lock ); + This->unk->DPLSP_lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IDPLobbySPImpl*->DPLobbySPIUnknownData*->DPLSP_lock"); return TRUE; } static BOOL DPLSP_DestroyIUnknown( LPVOID lpSP ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)lpSP; + IDPLobbySPImpl *This = lpSP; + This->unk->DPLSP_lock.DebugInfo->Spare[0] = 0; DeleteCriticalSection( &This->unk->DPLSP_lock ); HeapFree( GetProcessHeap(), 0, This->unk ); @@ -135,7 +137,7 @@ static BOOL DPLSP_DestroyIUnknown( LPVOID lpSP ) static BOOL DPLSP_CreateDPLobbySP( LPVOID lpSP, IDirectPlay2Impl* dp ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)lpSP; + IDPLobbySPImpl *This = lpSP; This->sp = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof( *(This->sp) ) ); @@ -167,7 +169,7 @@ static BOOL DPLSP_CreateDPLobbySP( LPVOID lpSP, IDirectPlay2Impl* dp ) static BOOL DPLSP_DestroyDPLobbySP( LPVOID lpSP ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)lpSP; + IDPLobbySPImpl *This = lpSP; HeapFree( GetProcessHeap(), 0, This->sp ); @@ -197,7 +199,7 @@ HRESULT WINAPI DPLSP_QueryInterface if( IsEqualGUID( &IID_IDPLobbySP, riid ) ) { - IDPLobbySPImpl *This = (IDPLobbySPImpl *)*ppvObj; + IDPLobbySPImpl *This = *ppvObj; This->lpVtbl = &dpLobbySPVT; } else @@ -224,7 +226,7 @@ ULONG WINAPI DPLSP_AddRef ulObjRefCount = InterlockedIncrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedIncrement( &This->ulInterfaceRef ); - TRACE( "ref count incremented to %lu:%lu for %p\n", + TRACE( "ref count incremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); return ulObjRefCount; @@ -240,7 +242,7 @@ ULONG WINAPI DPLSP_Release ulObjRefCount = InterlockedDecrement( &This->unk->ulObjRef ); ulInterfaceRefCount = InterlockedDecrement( &This->ulInterfaceRef ); - TRACE( "ref count decremented to %lu:%lu for %p\n", + TRACE( "ref count decremented to %u:%u for %p\n", ulInterfaceRefCount, ulObjRefCount, This ); /* Deallocate if this is the last reference to the object */ diff --git a/reactos/dll/directx/dplayx/lobbysp.h b/reactos/dll/directx/dplayx/lobbysp.h index 8897201c616..df446da010b 100644 --- a/reactos/dll/directx/dplayx/lobbysp.h +++ b/reactos/dll/directx/dplayx/lobbysp.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_LOBBY_SP_H @@ -70,14 +70,14 @@ typedef struct SPDATA_ADDREMOTEPLAYERTOGROUP LPDPNAME lpName; } SPDATA_ADDREMOTEPLAYERTOGROUP, *LPSPDATA_ADDREMOTEPLAYERTOGROUP; -typedef struct SPDATA_BUILDPARENTALHEIRARCHY +typedef struct SPDATA_BUILDPARENTALHIERARCHY { DWORD dwSize; LPDPLOBBYSP lpISP; DWORD dwGroupID; DWORD dwMessage; DWORD dwParentID; -} SPDATA_BUILDPARENTALHEIRARCHY, *LPSPDATA_BUILDPARENTALHEIRARCHY; +} SPDATA_BUILDPARENTALHIERARCHY, *LPSPDATA_BUILDPARENTALHIERARCHY; typedef struct SPDATA_CLOSE { @@ -388,7 +388,7 @@ typedef struct SPDATA_STARTSESSIONCOMMAND /* Prototypes for callbacks returned by DPLSPInit */ typedef HRESULT (WINAPI *LPSP_ADDGROUPTOGROUP)(LPSPDATA_ADDGROUPTOGROUP); typedef HRESULT (WINAPI *LPSP_ADDPLAYERTOGROUP)(LPSPDATA_ADDPLAYERTOGROUP); -typedef HRESULT (WINAPI *LPSP_BUILDPARENTALHEIRARCHY)(LPSPDATA_BUILDPARENTALHEIRARCHY); +typedef HRESULT (WINAPI *LPSP_BUILDPARENTALHIERARCHY)(LPSPDATA_BUILDPARENTALHIERARCHY); typedef HRESULT (WINAPI *LPSP_CLOSE)(LPSPDATA_CLOSE); typedef HRESULT (WINAPI *LPSP_CREATEGROUP)(LPSPDATA_CREATEGROUP); typedef HRESULT (WINAPI *LPSP_CREATEGROUPINGROUP)(LPSPDATA_CREATEGROUPINGROUP); @@ -422,7 +422,7 @@ typedef struct SP_CALLBACKS DWORD dwFlags; LPSP_ADDGROUPTOGROUP AddGroupToGroup; LPSP_ADDPLAYERTOGROUP AddPlayerToGroup; - LPSP_BUILDPARENTALHEIRARCHY BuildParentalHeirarchy; + LPSP_BUILDPARENTALHIERARCHY BuildParentalHierarchy; LPSP_CLOSE Close; LPSP_CREATEGROUP CreateGroup; LPSP_CREATEGROUPINGROUP CreateGroupInGroup; @@ -458,7 +458,7 @@ typedef struct SPDATA_INIT } SPDATA_INIT, *LPSPDATA_INIT; typedef HRESULT (WINAPI *LPSP_INIT)(LPSPDATA_INIT); -HRESULT WINAPI DPLSPInit(LPSPDATA_INIT); +HRESULT WINAPI DPLSPInit(LPSPDATA_INIT) DECLSPEC_HIDDEN; /* Define the COM interface */ #define INTERFACE IDPLobbySP @@ -515,6 +515,6 @@ DECLARE_INTERFACE_(IDPLobbySP,IUnknown) /* This variable is exported from the DLL at ordinal 6 to be accessed by the * SP directly. This is the same variable that the DP SP will use. */ -extern DWORD gdwDPlaySPRefCount; +extern DWORD gdwDPlaySPRefCount DECLSPEC_HIDDEN; #endif diff --git a/reactos/dll/directx/dplayx/name_server.c b/reactos/dll/directx/dplayx/name_server.c index ec47bd97968..fee13cd72a3 100644 --- a/reactos/dll/directx/dplayx/name_server.c +++ b/reactos/dll/directx/dplayx/name_server.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ /* NOTE: Methods with the NS_ prefix are name server methods */ @@ -67,50 +67,38 @@ struct NSCache typedef struct NSCache NSCache, *lpNSCache; /* Function prototypes */ -DPQ_DECL_DELETECB( cbDeleteNSNodeFromHeap, lpNSCacheData ); +static DPQ_DECL_DELETECB( cbDeleteNSNodeFromHeap, lpNSCacheData ); /* Name Server functions * --------------------- */ void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ) { -#if 0 - /* FIXME: Remove this method? */ - DPLAYX_SetLocalSession( lpsd ); -#endif lpNSCache lpCache = (lpNSCache)lpNSInfo; lpCache->bNsIsLocal = TRUE; } -void NS_SetRemoteComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ) -{ - lpNSCache lpCache = (lpNSCache)lpNSInfo; - - lpCache->bNsIsLocal = FALSE; -} - static DPQ_DECL_COMPARECB( cbUglyPig, GUID ) { return IsEqualGUID( elem1, elem2 ); } /* Store the given NS remote address for future reference */ -/* FIXME: LPDPMSG_ENUMSESSIONSREPLY should be const */ -void NS_AddRemoteComputerAsNameServer( LPCVOID lpcNSAddrHdr, - DWORD dwHdrSize, - LPDPMSG_ENUMSESSIONSREPLY lpMsg, - LPVOID lpNSInfo ) +void NS_AddRemoteComputerAsNameServer( LPCVOID lpcNSAddrHdr, + DWORD dwHdrSize, + LPCDPMSG_ENUMSESSIONSREPLY lpcMsg, + LPVOID lpNSInfo ) { DWORD len; lpNSCache lpCache = (lpNSCache)lpNSInfo; lpNSCacheData lpCacheNode; - TRACE( "%p, %p, %p\n", lpcNSAddrHdr, lpMsg, lpNSInfo ); + TRACE( "%p, %p, %p\n", lpcNSAddrHdr, lpcMsg, lpNSInfo ); /* See if we can find this session. If we can, remove it as it's a dup */ DPQ_REMOVE_ENTRY_CB( lpCache->first, next, data->guidInstance, cbUglyPig, - lpMsg->sd.guidInstance, lpCacheNode ); + lpcMsg->sd.guidInstance, lpCacheNode ); if( lpCacheNode != NULL ) { @@ -137,15 +125,16 @@ void NS_AddRemoteComputerAsNameServer( LPCVOID lpcNSAddrHdr, if( lpCacheNode->data == NULL ) { ERR( "no memory for SESSIONDESC2\n" ); + HeapFree( GetProcessHeap(), 0, lpCacheNode ); return; } - CopyMemory( lpCacheNode->data, &lpMsg->sd, sizeof( *lpCacheNode->data ) ); - len = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)(lpMsg+1), -1, NULL, 0, NULL, NULL ); - if ((lpCacheNode->data->lpszSessionNameA = HeapAlloc( GetProcessHeap(), 0, len ))) + *lpCacheNode->data = lpcMsg->sd; + len = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)(lpcMsg+1), -1, NULL, 0, NULL, NULL ); + if ((lpCacheNode->data->u1.lpszSessionNameA = HeapAlloc( GetProcessHeap(), 0, len ))) { - WideCharToMultiByte( CP_ACP, 0, (LPWSTR)(lpMsg+1), -1, - lpCacheNode->data->lpszSessionNameA, len, NULL, NULL ); + WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)(lpcMsg+1), -1, + lpCacheNode->data->u1.lpszSessionNameA, len, NULL, NULL ); } lpCacheNode->dwTime = timeGetTime(); @@ -169,7 +158,7 @@ LPVOID NS_GetNSAddr( LPVOID lpNSInfo ) /* Ok. Cheat and don't search for the correct stuff just take the first. * FIXME: In the future how are we to know what is _THE_ enum we used? * This is going to have to go into dplay somehow. Perhaps it - * comes back with app server id for the join command! Oh...that + * comes back with app server id for the join command! Oh... that * must be it. That would make this method obsolete once that's * in place. */ @@ -185,19 +174,11 @@ LPVOID NS_GetNSAddr( LPVOID lpNSInfo ) /* Get the magic number associated with the Name Server */ DWORD NS_GetNsMagic( LPVOID lpNSInfo ) { - LPDWORD lpHdrInfo = (LPDWORD)NS_GetNSAddr( lpNSInfo ); + LPDWORD lpHdrInfo = NS_GetNSAddr( lpNSInfo ); return lpHdrInfo[1]; } -/* Get the magic number associated with the non NS end */ -DWORD NS_GetOtherMagic( LPVOID lpNSInfo ) -{ - lpNSCache lpCache = (lpNSCache)lpNSInfo; - - return ((LPDWORD)lpCache->lpLocalAddrHdr)[1]; -} - void NS_SetLocalAddr( LPVOID lpNSInfo, LPCVOID lpHdr, DWORD dwHdrSize ) { lpNSCache lpCache = (lpNSCache)lpNSInfo; @@ -212,7 +193,7 @@ void NS_SetLocalAddr( LPVOID lpNSInfo, LPCVOID lpHdr, DWORD dwHdrSize ) */ HRESULT NS_SendSessionRequestBroadcast( LPCGUID lpcGuid, DWORD dwFlags, - LPSPINITDATA lpSpData ) + const SPINITDATA *lpSpData ) { DPSP_ENUMSESSIONSDATA data; @@ -227,7 +208,7 @@ HRESULT NS_SendSessionRequestBroadcast( LPCGUID lpcGuid, data.lpMessage = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, data.dwMessageSize ); data.lpISP = lpSpData->lpISP; - data.bReturnStatus = (dwFlags & DPENUMSESSIONS_RETURNSTATUS) ? TRUE : FALSE; + data.bReturnStatus = (dwFlags & DPENUMSESSIONS_RETURNSTATUS) != 0; lpMsg = (LPDPMSG_ENUMSESSIONSREQUEST)(((BYTE*)data.lpMessage)+lpSpData->dwSPHeaderSize); @@ -240,13 +221,13 @@ HRESULT NS_SendSessionRequestBroadcast( LPCGUID lpcGuid, lpMsg->dwPasswordSize = 0; /* FIXME: If enumerating passwords..? */ lpMsg->dwFlags = dwFlags; - CopyMemory( &lpMsg->guidApplication, lpcGuid, sizeof( *lpcGuid ) ); + lpMsg->guidApplication = *lpcGuid; return (lpSpData->lpCB->EnumSessions)( &data ); } /* Delete a name server node which has been allocated on the heap */ -DPQ_DECL_DELETECB( cbDeleteNSNodeFromHeap, lpNSCacheData ) +static DPQ_DECL_DELETECB( cbDeleteNSNodeFromHeap, lpNSCacheData ) { /* NOTE: This proc doesn't deal with the walking pointer */ @@ -381,21 +362,13 @@ void NS_ReplyToEnumSessionsRequest( LPCVOID lpcMsg, DWORD dwVariableSize; DWORD dwVariableLen; /* LPCDPMSG_ENUMSESSIONSREQUEST msg = (LPDPMSG_ENUMSESSIONSREQUEST)lpcMsg; */ - BOOL bAnsi = TRUE; /* FIXME: This needs to be in the DPLAY interface */ - FIXME( ": few fixed + need to check request for response\n" ); - - if (bAnsi) - { - dwVariableLen = MultiByteToWideChar( CP_ACP, 0, - lpDP->dp2->lpSessionDesc->lpszSessionNameA, - -1, NULL, 0 ); - } - else - { - dwVariableLen = strlenW( lpDP->dp2->lpSessionDesc->lpszSessionName ) + 1; - } + /* FIXME: Should handle ANSI or WIDECHAR input. Currently just ANSI input */ + FIXME( ": few fixed + need to check request for response, might need UNICODE input ability.\n" ); + dwVariableLen = MultiByteToWideChar( CP_ACP, 0, + lpDP->dp2->lpSessionDesc->u1.lpszSessionNameA, + -1, NULL, 0 ); dwVariableSize = dwVariableLen * sizeof( WCHAR ); *lpdwReplySize = lpDP->dp2->spData.dwSPHeaderSize + @@ -411,15 +384,8 @@ void NS_ReplyToEnumSessionsRequest( LPCVOID lpcMsg, rmsg->envelope.wVersion = DPMSGVER_DP6; CopyMemory( &rmsg->sd, lpDP->dp2->lpSessionDesc, - sizeof( lpDP->dp2->lpSessionDesc->dwSize ) ); + lpDP->dp2->lpSessionDesc->dwSize ); rmsg->dwUnknown = 0x0000005c; - if( bAnsi ) - { - MultiByteToWideChar( CP_ACP, 0, lpDP->dp2->lpSessionDesc->lpszSessionNameA, -1, - (LPWSTR)(rmsg+1), dwVariableLen ); - } - else - { - strcpyW( (LPWSTR)(rmsg+1), lpDP->dp2->lpSessionDesc->lpszSessionName ); - } + MultiByteToWideChar( CP_ACP, 0, lpDP->dp2->lpSessionDesc->u1.lpszSessionNameA, -1, + (LPWSTR)(rmsg+1), dwVariableLen ); } diff --git a/reactos/dll/directx/dplayx/name_server.h b/reactos/dll/directx/dplayx/name_server.h index 15fdde5f5cf..ab39e3c724b 100644 --- a/reactos/dll/directx/dplayx/name_server.h +++ b/reactos/dll/directx/dplayx/name_server.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPLAYX_NAMESERVER @@ -28,34 +28,32 @@ #include "dplayx_messages.h" //#include "dplay_global.h" -void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ); -void NS_SetRemoteComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ); +void NS_SetLocalComputerAsNameServer( LPCDPSESSIONDESC2 lpsd, LPVOID lpNSInfo ) DECLSPEC_HIDDEN; void NS_AddRemoteComputerAsNameServer( LPCVOID lpNSAddrHdr, DWORD dwHdrSize, - LPDPMSG_ENUMSESSIONSREPLY lpMsg, - LPVOID lpNSInfo ); -LPVOID NS_GetNSAddr( LPVOID lpNSInfo ); -DWORD NS_GetNsMagic( LPVOID lpNSInfo ); -DWORD NS_GetOtherMagic( LPVOID lpNSInfo ); -void NS_SetLocalAddr( LPVOID lpNSInfo, LPCVOID lpHdr, DWORD dwHdrSize ); + LPCDPMSG_ENUMSESSIONSREPLY lpcMsg, + LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +LPVOID NS_GetNSAddr( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +DWORD NS_GetNsMagic( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +void NS_SetLocalAddr( LPVOID lpNSInfo, LPCVOID lpHdr, DWORD dwHdrSize ) DECLSPEC_HIDDEN; void NS_ReplyToEnumSessionsRequest( LPCVOID lpcMsg, LPVOID* lplpReplyData, LPDWORD lpdwReplySize, - IDirectPlay2Impl* lpDP ); + IDirectPlay2Impl* lpDP ) DECLSPEC_HIDDEN; HRESULT NS_SendSessionRequestBroadcast( LPCGUID lpcGuid, DWORD dwFlags, - LPSPINITDATA lpSpData ); + const SPINITDATA *lpSpData ) DECLSPEC_HIDDEN; -BOOL NS_InitializeSessionCache( LPVOID* lplpNSInfo ); -void NS_DeleteSessionCache( LPVOID lpNSInfo ); -void NS_InvalidateSessionCache( LPVOID lpNSInfo ); +BOOL NS_InitializeSessionCache( LPVOID* lplpNSInfo ) DECLSPEC_HIDDEN; +void NS_DeleteSessionCache( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +void NS_InvalidateSessionCache( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; -void NS_ResetSessionEnumeration( LPVOID lpNSInfo ); -LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo ); -void NS_PruneSessionCache( LPVOID lpNSInfo ); +void NS_ResetSessionEnumeration( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +LPDPSESSIONDESC2 NS_WalkSessions( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; +void NS_PruneSessionCache( LPVOID lpNSInfo ) DECLSPEC_HIDDEN; #endif /* __WINE_DPLAYX_NAMESERVER */ diff --git a/reactos/dll/directx/dplayx/regsvr.c b/reactos/dll/directx/dplayx/regsvr.c deleted file mode 100644 index c8579b180ec..00000000000 --- a/reactos/dll/directx/dplayx/regsvr.c +++ /dev/null @@ -1,560 +0,0 @@ -/* - * self-registerable dll functions for dplayx.dll - * - * Copyright (C) 2003 John K. Hohm - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#define WIN32_NO_STATUS -#define _INC_WINDOWS -#define COM_NO_WINDOWS_H - -#include <stdarg.h> -//#include <string.h> - -#include <windef.h> -#include <winbase.h> -//#include "winuser.h" -#include <winreg.h> -//#include "winerror.h" - -//#include "dplay.h" -#include <dplobby.h> - -#include <wine/debug.h> - -WINE_DEFAULT_DEBUG_CHANNEL(dplayx); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); -static LONG recursive_delete_key(HKEY key); -static LONG recursive_delete_keyA(HKEY base, char const *name); -static LONG recursive_delete_keyW(HKEY base, WCHAR const *name); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - wsprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = recursive_delete_keyW(interface_key, buf); - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = recursive_delete_keyW(coclass_key, buf); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->progid); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) -{ - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * recursive_delete_key - */ -static LONG recursive_delete_key(HKEY key) -{ - LONG res; - WCHAR subkey_name[MAX_PATH]; - DWORD cName; - HKEY subkey; - - for (;;) { - cName = sizeof(subkey_name) / sizeof(WCHAR); - res = RegEnumKeyExW(key, 0, subkey_name, &cName, - NULL, NULL, NULL, NULL); - if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) { - res = ERROR_SUCCESS; /* presumably we're done enumerating */ - break; - } - res = RegOpenKeyExW(key, subkey_name, 0, - KEY_READ | KEY_WRITE, &subkey); - if (res == ERROR_FILE_NOT_FOUND) continue; - if (res != ERROR_SUCCESS) break; - - res = recursive_delete_key(subkey); - RegCloseKey(subkey); - if (res != ERROR_SUCCESS) break; - } - - if (res == ERROR_SUCCESS) res = RegDeleteKeyW(key, 0); - return res; -} - -/*********************************************************************** - * recursive_delete_keyA - */ -static LONG recursive_delete_keyA(HKEY base, char const *name) -{ - LONG res; - HKEY key; - - res = RegOpenKeyExA(base, name, 0, KEY_READ | KEY_WRITE, &key); - if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; - if (res != ERROR_SUCCESS) return res; - res = recursive_delete_key(key); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * recursive_delete_keyW - */ -static LONG recursive_delete_keyW(HKEY base, WCHAR const *name) -{ - LONG res; - HKEY key; - - res = RegOpenKeyExW(base, name, 0, KEY_READ | KEY_WRITE, &key); - if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; - if (res != ERROR_SUCCESS) return res; - res = recursive_delete_key(key); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { &CLSID_DirectPlay, - "DirectPlay Object", - NULL, - "dplayx.dll", - "Both" - }, - { &CLSID_DirectPlayLobby, - "DirectPlayLobby Object", - NULL, - "dplayx.dll", - "Both" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ - -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (DPLAYX.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (DPLAYX.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/dll/directx/dplayx/version.rc b/reactos/dll/directx/dplayx/version.rc index 4b0f15a06dc..9a0e12f522c 100644 --- a/reactos/dll/directx/dplayx/version.rc +++ b/reactos/dll/directx/dplayx/version.rc @@ -13,15 +13,17 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_OLESELFREGISTER +1 WINE_REGISTRY dplayx.rgs + #define WINE_FILEDESCRIPTION_STR "Wine DirectPlay" #define WINE_FILENAME_STR "dplayx.dll" -#define WINE_FILEVERSION 5,3,0,900 -#define WINE_FILEVERSION_STR "5.3.0.900" -#define WINE_PRODUCTVERSION 5,3,0,900 -#define WINE_PRODUCTVERSION_STR "5.3" +#define WINE_FILEVERSION 5,3,1,904 +#define WINE_FILEVERSION_STR "5.3.1.904" +#define WINE_PRODUCTVERSION 5,3,1,904 +#define WINE_PRODUCTVERSION_STR "5.3.1.904" +#define WINE_EXTRAVALUES VALUE "OLESelfRegister","" -#include "wine/wine_common_ver.rc" +#include <wine/wine_common_ver.rc> diff --git a/reactos/include/psdk/dplay.h b/reactos/include/psdk/dplay.h index 929a1f0401d..2294ba851fa 100644 --- a/reactos/include/psdk/dplay.h +++ b/reactos/include/psdk/dplay.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DPLAY_H @@ -192,18 +192,16 @@ typedef struct tagDPNAME { LPWSTR lpszShortName; LPSTR lpszShortNameA; - }; + } DUMMYUNIONNAME1; union /*playerLongName */ /* Player's formal/real name */ { LPWSTR lpszLongName; LPSTR lpszLongNameA; - }; + } DUMMYUNIONNAME2; } DPNAME, *LPDPNAME; - - #define DPLONGNAMELEN 52 #define DPSHORTNAMELEN 20 #define DPSESSIONNAMELEN 32 @@ -244,13 +242,13 @@ typedef struct tagDPSESSIONDESC2 { LPWSTR lpszSessionName; LPSTR lpszSessionNameA; - }; + } DUMMYUNIONNAME1; union /* Optional password */ { LPWSTR lpszPassword; LPSTR lpszPasswordA; - }; + } DUMMYUNIONNAME2; DWORD dwReserved1; DWORD dwReserved2; @@ -260,8 +258,6 @@ typedef struct tagDPSESSIONDESC2 DWORD dwUser3; DWORD dwUser4; } DPSESSIONDESC2, *LPDPSESSIONDESC2; - - typedef const DPSESSIONDESC2* LPCDPSESSIONDESC2; #define DPOPEN_JOIN 0x00000001 @@ -279,6 +275,9 @@ typedef const DPSESSIONDESC2* LPCDPSESSIONDESC2; #define DPSESSION_PASSWORDREQUIRED 0x00000400 #define DPSESSION_MULTICASTSERVER 0x00000800 #define DPSESSION_CLIENTSERVER 0x00001000 +#define DPSESSION_DIRECTPLAYPROTOCOL 0x00002000 +#define DPSESSION_NOPRESERVEORDER 0x00004000 +#define DPSESSION_OPTIMIZELATENCY 0x00008000 typedef struct tagDPLCONNECTION { @@ -396,7 +395,7 @@ typedef BOOL (CALLBACK *LPDPENUMSESSIONSCALLBACK)( extern HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA, LPVOID ); extern HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW, LPVOID ); -extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY2 *lplpDP, IUnknown *pUnk); +extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk ); typedef BOOL (CALLBACK *LPDPENUMPLAYERSCALLBACK)( DPID dpId, @@ -1065,6 +1064,20 @@ DECLARE_INTERFACE_(IDirectPlay4,IDirectPlay3) /* DirectPlay::Connect */ #define DPCONNECT_RETURNSTATUS (DPENUMSESSIONS_RETURNSTATUS) +/* DirectPlay::GetCaps and DirectPlay::GetPlayerCaps */ +#define DPCAPS_ISHOST 0x00000002 +#define DPCAPS_GROUPOPTIMIZED 0x00000008 +#define DPCAPS_KEEPALIVEOPTIMIZED 0x00000010 +#define DPCAPS_GUARANTEEDOPTIMIZED 0x00000020 +#define DPCAPS_GUARANTEEDSUPPORTED 0x00000040 +#define DPCAPS_SIGNINGSUPPORTED 0x00000080 +#define DPCAPS_ENCRYPTIONSUPPORTED 0x00000100 +#define DPPLAYERCAPS_LOCAL 0x00000800 +#define DPCAPS_ASYNCCANCELSUPPORTED 0x00001000 +#define DPCAPS_ASYNCCANCELALLSUPPORTED 0x00002000 +#define DPCAPS_SENDTIMEOUTSUPPORTED 0x00004000 +#define DPCAPS_SENDPRIORITYSUPPORTED 0x00008000 +#define DPCAPS_ASYNCSUPPORTED 0x00010000 /** DirectPlay system messages **/ diff --git a/reactos/dll/directx/dplayx/dplaysp.h b/reactos/include/reactos/wine/dplaysp.h similarity index 97% rename from reactos/dll/directx/dplayx/dplaysp.h rename to reactos/include/reactos/wine/dplaysp.h index d83cd291934..95361d1bf65 100644 --- a/reactos/dll/directx/dplayx/dplaysp.h +++ b/reactos/include/reactos/wine/dplaysp.h @@ -13,23 +13,19 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_DIRECT_PLAY_SP_H #define __WINE_DIRECT_PLAY_SP_H -#define WIN32_NO_STATUS -#define _INC_WINDOWS -#define COM_NO_WINDOWS_H +#include <stdarg.h> -//#include <stdarg.h> - -//#include "windef.h" -#include <winbase.h> -//#include "winuser.h" -//#include "dplay.h" -#include <dplobby.h> +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "dplay.h" +#include "dplobby.h" /* GUID for IDirectPlaySP {0C9F6360-CC61-11cf-ACEC-00AA006886E3} */ DEFINE_GUID(IID_IDirectPlaySP, 0xc9f6360, 0xcc61, 0x11cf, 0xac, 0xec, 0x0, 0xaa, 0x0, 0x68, 0x86, 0xe3); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 62d51775a7d..bd09611dbb2 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -31,8 +31,8 @@ reactos/dll/directx/amstream # Synced to Wine-1.3.37 reactos/dll/directx/dinput # Synced to Wine-20090208 reactos/dll/directx/dinput8 # Synced to Wine-20090208 reactos/dll/directx/dmusic # Synced to Wine-1_1_23 -reactos/dll/directx/dplay # Synced to Wine-0_9_5 -reactos/dll/directx/dplayx # Synced to Wine-0_9_5 +reactos/dll/directx/dplay # Synced to Wine-1.5.26 +reactos/dll/directx/dplayx # Synced to Wine-1.5.26 reactos/dll/directx/dxdiagn # Synced to Wine-0_9_5 reactos/dll/directx/msdmo # Autosync reactos/dll/directx/qedit # Autosync From 4eb24ad42a870f2c918303a2dda3dde0589dd1bf Mon Sep 17 00:00:00 2001 From: Eric Kohl <eric.kohl@reactos.org> Date: Sat, 13 Apr 2013 15:33:56 +0000 Subject: [PATCH 35/37] [SAMSRV] - Implement SamIFree_SAMPR_ENUMERATION_BUFFER. - Fix some typos in the spec file. svn path=/trunk/; revision=58737 --- reactos/dll/win32/samsrv/samsrv.c | 24 ++++++++++++++++++++++++ reactos/dll/win32/samsrv/samsrv.spec | 10 +++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/samsrv/samsrv.c b/reactos/dll/win32/samsrv/samsrv.c index 59d5b8718cf..23049e00249 100644 --- a/reactos/dll/win32/samsrv/samsrv.c +++ b/reactos/dll/win32/samsrv/samsrv.c @@ -101,6 +101,30 @@ SampInitializeRegistry(VOID) } +VOID +NTAPI +SamIFree_SAMPR_ENUMERATION_BUFFER(PSAMPR_ENUMERATION_BUFFER Ptr) +{ + ULONG i; + + if (Ptr != NULL) + { + if (Ptr->Buffer != NULL) + { + for (i = 0; i < Ptr->EntriesRead; i++) + { + if (Ptr->Buffer[i].Name.Buffer != NULL) + MIDL_user_free(Ptr->Buffer[i].Name.Buffer); + } + + MIDL_user_free(Ptr->Buffer); + } + + MIDL_user_free(Ptr); + } +} + + VOID NTAPI SamIFree_SAMPR_PSID_ARRAY(PSAMPR_PSID_ARRAY Ptr) diff --git a/reactos/dll/win32/samsrv/samsrv.spec b/reactos/dll/win32/samsrv/samsrv.spec index e4ae0d2b29f..4d5e97d05ad 100644 --- a/reactos/dll/win32/samsrv/samsrv.spec +++ b/reactos/dll/win32/samsrv/samsrv.spec @@ -20,7 +20,7 @@ @ stub SamIFree_SAMPR_ALIAS_INFO_BUFFER @ stub SamIFree_SAMPR_DISPLAY_INFO_BUFFER @ stub SamIFree_SAMPR_DOMAIN_INFO_BUFFER -@ stub SamIFree_SAMPR_ENUMERATION_BUFFER +@ stdcall SamIFree_SAMPR_ENUMERATION_BUFFER(ptr) @ stub SamIFree_SAMPR_GET_GROUPS_BUFFER @ stub SamIFree_SAMPR_GET_MEMBERS_BUFFER @ stub SamIFree_SAMPR_GROUP_INFO_BUFFER @@ -36,13 +36,13 @@ @ stub SamIGetBootKeyInformation @ stub SamIGetDefaultAdministratorName @ stub SamIGetFixedAttributes -@ stub SamIGetinterdomainTrustAccountPasswordsForUpgrade +@ stub SamIGetInterdomainTrustAccountPasswordsForUpgrade @ stub SamIGetPrivateData @ stub SamIGetResourceGroupmembershipsTransitive @ stub SamIGetSerialNumberDomain -@ stub SamIGetuserLogonInformation -@ stub SamIGetuserLogonInformation2 -@ stub SamIGetuserLogonInformationEx +@ stub SamIGetUserLogonInformation +@ stub SamIGetUserLogonInformation2 +@ stub SamIGetUserLogonInformationEx @ stub SamIImpersonateNullSession @ stub SamIIncrementPerformanceCounter @ stdcall SamIInitialize() From 12eabcde287f914dc54a6c66d4b24e31c49740f4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer <timo.kreuzer@reactos.org> Date: Sat, 13 Apr 2013 16:10:09 +0000 Subject: [PATCH 36/37] [DDK] Fix the definition of BYTES_TO_PAGES. While the macro might look overcomplicated, it actually needs to be this way to prevent integer overflows. svn path=/trunk/; revision=58738 --- reactos/include/ddk/wdm.h | 36 ++++++++++++++++++----------------- reactos/include/xdk/mmfuncs.h | 36 ++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 5b1a3169409..86f90b2fcfc 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -11248,36 +11248,38 @@ void __PREfastPagedCodeLocked(void); /* ULONG * BYTE_OFFSET( - * IN PVOID Va) + * _In_ PVOID Va) */ #define BYTE_OFFSET(Va) \ ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) /* ULONG * BYTES_TO_PAGES( - * IN ULONG Size) + * _In_ ULONG Size) + * + * Note: This needs to be like this to avoid overflows! */ #define BYTES_TO_PAGES(Size) \ - (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) + (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) /* PVOID * PAGE_ALIGN( - * IN PVOID Va) + * _In_ PVOID Va) */ #define PAGE_ALIGN(Va) \ ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) /* ULONG_PTR * ROUND_TO_PAGES( - * IN ULONG_PTR Size) + * _In_ ULONG_PTR Size) */ #define ROUND_TO_PAGES(Size) \ (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) /* ULONG * ADDRESS_AND_SIZE_TO_SPAN_PAGES( - * IN PVOID Va, - * IN ULONG Size) + * _In_ PVOID Va, + * _In_ ULONG Size) */ #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \ ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ @@ -11289,7 +11291,7 @@ void __PREfastPagedCodeLocked(void); /* * ULONG * MmGetMdlByteCount( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlByteCount(_Mdl) \ ((_Mdl)->ByteCount) @@ -11307,7 +11309,7 @@ void __PREfastPagedCodeLocked(void); /* * PPFN_NUMBER * MmGetMdlPfnArray( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlPfnArray(_Mdl) \ ((PPFN_NUMBER) ((_Mdl) + 1)) @@ -11315,7 +11317,7 @@ void __PREfastPagedCodeLocked(void); /* * PVOID * MmGetMdlVirtualAddress( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlVirtualAddress(_Mdl) \ ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) @@ -11324,7 +11326,7 @@ void __PREfastPagedCodeLocked(void); #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address) /* PVOID MmGetSystemAddressForMdl( - * IN PMDL Mdl); + * _In_ PMDL Mdl); */ #define MmGetSystemAddressForMdl(Mdl) \ (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ @@ -11334,8 +11336,8 @@ void __PREfastPagedCodeLocked(void); /* PVOID * MmGetSystemAddressForMdlSafe( - * IN PMDL Mdl, - * IN MM_PAGE_PRIORITY Priority) + * _In_ PMDL Mdl, + * _In_ MM_PAGE_PRIORITY Priority) */ #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ @@ -11347,9 +11349,9 @@ void __PREfastPagedCodeLocked(void); /* * VOID * MmInitializeMdl( - * IN PMDL MemoryDescriptorList, - * IN PVOID BaseVa, - * IN SIZE_T Length) + * _In_ PMDL MemoryDescriptorList, + * _In_ PVOID BaseVa, + * _In_ SIZE_T Length) */ #define MmInitializeMdl(_MemoryDescriptorList, \ _BaseVa, \ @@ -11367,7 +11369,7 @@ void __PREfastPagedCodeLocked(void); /* * VOID * MmPrepareMdlForReuse( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmPrepareMdlForReuse(_Mdl) \ { \ diff --git a/reactos/include/xdk/mmfuncs.h b/reactos/include/xdk/mmfuncs.h index 1427766e184..9a2fd1ecccb 100644 --- a/reactos/include/xdk/mmfuncs.h +++ b/reactos/include/xdk/mmfuncs.h @@ -45,36 +45,38 @@ $if (_WDMDDK_) /* ULONG * BYTE_OFFSET( - * IN PVOID Va) + * _In_ PVOID Va) */ #define BYTE_OFFSET(Va) \ ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) /* ULONG * BYTES_TO_PAGES( - * IN ULONG Size) + * _In_ ULONG Size) + * + * Note: This needs to be like this to avoid overflows! */ #define BYTES_TO_PAGES(Size) \ - (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) + (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) /* PVOID * PAGE_ALIGN( - * IN PVOID Va) + * _In_ PVOID Va) */ #define PAGE_ALIGN(Va) \ ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) /* ULONG_PTR * ROUND_TO_PAGES( - * IN ULONG_PTR Size) + * _In_ ULONG_PTR Size) */ #define ROUND_TO_PAGES(Size) \ (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) /* ULONG * ADDRESS_AND_SIZE_TO_SPAN_PAGES( - * IN PVOID Va, - * IN ULONG Size) + * _In_ PVOID Va, + * _In_ ULONG Size) */ #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \ ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ @@ -86,7 +88,7 @@ $if (_WDMDDK_) /* * ULONG * MmGetMdlByteCount( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlByteCount(_Mdl) \ ((_Mdl)->ByteCount) @@ -104,7 +106,7 @@ $if (_WDMDDK_) /* * PPFN_NUMBER * MmGetMdlPfnArray( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlPfnArray(_Mdl) \ ((PPFN_NUMBER) ((_Mdl) + 1)) @@ -112,7 +114,7 @@ $if (_WDMDDK_) /* * PVOID * MmGetMdlVirtualAddress( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmGetMdlVirtualAddress(_Mdl) \ ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) @@ -121,7 +123,7 @@ $if (_WDMDDK_) #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address) /* PVOID MmGetSystemAddressForMdl( - * IN PMDL Mdl); + * _In_ PMDL Mdl); */ #define MmGetSystemAddressForMdl(Mdl) \ (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \ @@ -131,8 +133,8 @@ $if (_WDMDDK_) /* PVOID * MmGetSystemAddressForMdlSafe( - * IN PMDL Mdl, - * IN MM_PAGE_PRIORITY Priority) + * _In_ PMDL Mdl, + * _In_ MM_PAGE_PRIORITY Priority) */ #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \ (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \ @@ -144,9 +146,9 @@ $if (_WDMDDK_) /* * VOID * MmInitializeMdl( - * IN PMDL MemoryDescriptorList, - * IN PVOID BaseVa, - * IN SIZE_T Length) + * _In_ PMDL MemoryDescriptorList, + * _In_ PVOID BaseVa, + * _In_ SIZE_T Length) */ #define MmInitializeMdl(_MemoryDescriptorList, \ _BaseVa, \ @@ -164,7 +166,7 @@ $if (_WDMDDK_) /* * VOID * MmPrepareMdlForReuse( - * IN PMDL Mdl) + * _In_ PMDL Mdl) */ #define MmPrepareMdlForReuse(_Mdl) \ { \ From c2d5094a679749667fd7c7b4ff3da7fc66e5189d Mon Sep 17 00:00:00 2001 From: Amine Khaldi <amine.khaldi@reactos.org> Date: Sat, 13 Apr 2013 17:29:01 +0000 Subject: [PATCH 37/37] [DMUSIC] * Sync with Wine 1.5.26. svn path=/trunk/; revision=58739 --- reactos/dll/directx/dmusic/CMakeLists.txt | 27 +- reactos/dll/directx/dmusic/buffer.c | 326 +++-- reactos/dll/directx/dmusic/clock.c | 121 +- reactos/dll/directx/dmusic/collection.c | 1290 +++++++++-------- reactos/dll/directx/dmusic/dmusic.c | 551 ++++--- reactos/dll/directx/dmusic/dmusic.idl | 35 + reactos/dll/directx/dmusic/dmusic.rgs | 39 + reactos/dll/directx/dmusic/dmusic_main.c | 228 +-- reactos/dll/directx/dmusic/dmusic_private.h | 225 +-- reactos/dll/directx/dmusic/download.c | 110 +- .../dll/directx/dmusic/downloadedinstrument.c | 88 -- reactos/dll/directx/dmusic/instrument.c | 754 +++++----- reactos/dll/directx/dmusic/port.c | 904 ++++++++---- reactos/dll/directx/dmusic/version.rc | 6 +- reactos/include/dxsdk/dmusicc.h | 4 +- reactos/include/dxsdk/dmusics.h | 340 +++-- reactos/include/psdk/dmksctrl.h | 142 +- reactos/media/doc/README.WINE | 2 +- 18 files changed, 3075 insertions(+), 2117 deletions(-) create mode 100644 reactos/dll/directx/dmusic/dmusic.idl create mode 100644 reactos/dll/directx/dmusic/dmusic.rgs delete mode 100644 reactos/dll/directx/dmusic/downloadedinstrument.c diff --git a/reactos/dll/directx/dmusic/CMakeLists.txt b/reactos/dll/directx/dmusic/CMakeLists.txt index 21928a85db0..754ef2afa3b 100644 --- a/reactos/dll/directx/dmusic/CMakeLists.txt +++ b/reactos/dll/directx/dmusic/CMakeLists.txt @@ -1,44 +1,27 @@ - -add_definitions(-D__WINESRC__) - remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) +add_definitions(-D__WINESRC__) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) - spec2def(dmusic.dll dmusic.spec) -add_library(dmusic SHARED +list(APPEND SOURCE buffer.c clock.c collection.c dmusic.c dmusic_main.c download.c - downloadedinstrument.c instrument.c port.c - regsvr.c version.rc ${CMAKE_CURRENT_BINARY_DIR}/dmusic.def) +add_library(dmusic SHARED ${SOURCE}) set_module_type(dmusic win32dll UNICODE) - -target_link_libraries(dmusic - dxguid - uuid - wine) - -add_importlibs(dmusic - msvcrt - user32 - advapi32 - ole32 - dsound - kernel32 - ntdll) - +target_link_libraries(dmusic dxguid uuid wine) +add_importlibs(dmusic ole32 advapi32 winmm msvcrt kernel32 ntdll) add_dependencies(dmusic psdk) add_pch(dmusic dmusic_private.h) add_cd_file(TARGET dmusic DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/directx/dmusic/buffer.c b/reactos/dll/directx/dmusic/buffer.c index c8c7ca1418e..f6156f366ff 100644 --- a/reactos/dll/directx/dmusic/buffer.c +++ b/reactos/dll/directx/dmusic/buffer.c @@ -1,6 +1,8 @@ -/* IDirectMusicBuffer Implementation +/* + * IDirectMusicBuffer Implementation * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,126 +20,241 @@ */ #include "dmusic_private.h" +//#include "initguid.h" +#include "dmksctrl.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); +static inline IDirectMusicBufferImpl *impl_from_IDirectMusicBuffer(IDirectMusicBuffer *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicBufferImpl, IDirectMusicBuffer_iface); +} + /* IDirectMusicBufferImpl IUnknown part: */ -static HRESULT WINAPI IDirectMusicBufferImpl_QueryInterface (LPDIRECTMUSICBUFFER iface, REFIID riid, LPVOID *ppobj) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - TRACE("(%p, (%s, %p)\n",This,debugstr_dmguid(riid),ppobj); - if (IsEqualIID (riid, &IID_IUnknown) - || IsEqualIID (riid, &IID_IDirectMusicBuffer)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - WARN("(%p, (%s, %p): not found\n",This,debugstr_dmguid(riid),ppobj); - return E_NOINTERFACE; +static HRESULT WINAPI IDirectMusicBufferImpl_QueryInterface(LPDIRECTMUSICBUFFER iface, REFIID riid, LPVOID *ret_iface) +{ + TRACE("(%p)->(%s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectMusicBuffer)) + { + IDirectMusicBuffer_AddRef(iface); + *ret_iface = iface; + return S_OK; + } + + *ret_iface = NULL; + + WARN("(%p)->(%s, %p): not found\n", iface, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static ULONG WINAPI IDirectMusicBufferImpl_AddRef (LPDIRECTMUSICBUFFER iface) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IDirectMusicBufferImpl_AddRef(LPDIRECTMUSICBUFFER iface) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IDirectMusicBufferImpl_Release (LPDIRECTMUSICBUFFER iface) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IDirectMusicBufferImpl_Release(LPDIRECTMUSICBUFFER iface) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) { + HeapFree(GetProcessHeap(), 0, This->data); + HeapFree(GetProcessHeap(), 0, This); + } - DMUSIC_UnlockModule(); - - return refCount; + DMUSIC_UnlockModule(); + + return ref; } /* IDirectMusicBufferImpl IDirectMusicBuffer part: */ -static HRESULT WINAPI IDirectMusicBufferImpl_Flush (LPDIRECTMUSICBUFFER iface) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p): stub\n", This); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_Flush(LPDIRECTMUSICBUFFER iface) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->()\n", iface); + + This->write_pos = 0; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_TotalTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prtTime) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, prtTime); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_TotalTime(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prtTime) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + FIXME("(%p, %p): stub\n", This, prtTime); + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_PackStructured (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD dwChannelMessage) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, 0x%s, %d, %d): stub\n", This, wine_dbgstr_longlong(rt), dwChannelGroup, dwChannelMessage); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_PackStructured(LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time, DWORD channel_group, DWORD channel_message) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + DWORD new_write_pos = This->write_pos + sizeof(DMUS_EVENTHEADER) + sizeof(DWORD); + DMUS_EVENTHEADER header; + + TRACE("(%p)->(0x%s, %u, 0x%x)\n", iface, wine_dbgstr_longlong(ref_time), channel_group, channel_message); + + if (new_write_pos > This->size) + return DMUS_E_BUFFER_FULL; + + /* Channel_message 0xZZYYXX (3 bytes) is a midi message where XX = status byte, YY = byte 1 and ZZ = byte 2 */ + + if (!(channel_message & 0x80)) + { + /* Status byte MSB is always set */ + return DMUS_E_INVALID_EVENT; + } + + if (!This->write_pos) + This->start_time = ref_time; + + header.cbEvent = 3; /* Midi message takes 4 bytes space but only 3 are relevant */ + header.dwChannelGroup = channel_group; + header.rtDelta = ref_time - This->start_time; + header.dwFlags = DMUS_EVENT_STRUCTURED; + + memcpy(This->data + This->write_pos, &header, sizeof(header)); + *(DWORD*)(This->data + This->write_pos + sizeof(header)) = channel_message; + This->write_pos = new_write_pos; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD cb, LPBYTE lpb) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, 0x%s, %d, %d, %p): stub\n", This, wine_dbgstr_longlong(rt), dwChannelGroup, cb, lpb); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_PackUnstructured(LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt, DWORD dwChannelGroup, DWORD cb, LPBYTE lpb) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + FIXME("(%p, 0x%s, %d, %d, %p): stub\n", This, wine_dbgstr_longlong(rt), dwChannelGroup, cb, lpb); + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr (LPDIRECTMUSICBUFFER iface) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p): stub\n", This); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_ResetReadPtr(LPDIRECTMUSICBUFFER iface) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + FIXME("(%p): stub\n", This); + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt, LPDWORD pdwChannelGroup, LPDWORD pdwLength, LPBYTE* ppData) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p, %p, %p, %p): stub\n", This, prt, pdwChannelGroup, pdwLength, ppData); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetNextEvent(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt, LPDWORD pdwChannelGroup, LPDWORD pdwLength, LPBYTE* ppData) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + FIXME("(%p, %p, %p, %p, %p): stub\n", This, prt, pdwChannelGroup, pdwLength, ppData); + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr (LPDIRECTMUSICBUFFER iface, LPBYTE* ppData) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, ppData); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetRawBufferPtr(LPDIRECTMUSICBUFFER iface, LPBYTE* data) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%p)\n", iface, data); + + if (!data) + return E_POINTER; + + *data = This->data; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime (LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME prt) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, prt); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetStartTime(LPDIRECTMUSICBUFFER iface, LPREFERENCE_TIME ref_time) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%p)\n", iface, ref_time); + + if (!ref_time) + return E_POINTER; + if (!This->write_pos) + return DMUS_E_BUFFER_EMPTY; + + *ref_time = This->start_time; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes (LPDIRECTMUSICBUFFER iface, LPDWORD pcb) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, pcb); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetUsedBytes(LPDIRECTMUSICBUFFER iface, LPDWORD used_bytes) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%p)\n", iface, used_bytes); + + if (!used_bytes) + return E_POINTER; + + *used_bytes = This->write_pos; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes (LPDIRECTMUSICBUFFER iface, LPDWORD pcb) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, pcb); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetMaxBytes(LPDIRECTMUSICBUFFER iface, LPDWORD max_bytes) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%p)\n", iface, max_bytes); + + if (!max_bytes) + return E_POINTER; + + *max_bytes = This->size; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat (LPDIRECTMUSICBUFFER iface, LPGUID pGuidFormat) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %p): stub\n", This, pGuidFormat); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_GetBufferFormat(LPDIRECTMUSICBUFFER iface, LPGUID format) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%p)\n", iface, format); + + if (!format) + return E_POINTER; + + *format = This->format; + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime (LPDIRECTMUSICBUFFER iface, REFERENCE_TIME rt) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, 0x%s): stub\n", This, wine_dbgstr_longlong(rt)); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_SetStartTime(LPDIRECTMUSICBUFFER iface, REFERENCE_TIME ref_time) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(0x%s)\n", This, wine_dbgstr_longlong(ref_time)); + + This->start_time = ref_time; + + return S_OK; } -static HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes (LPDIRECTMUSICBUFFER iface, DWORD cb) { - IDirectMusicBufferImpl *This = (IDirectMusicBufferImpl *)iface; - FIXME("(%p, %d): stub\n", This, cb); - return S_OK; +static HRESULT WINAPI IDirectMusicBufferImpl_SetUsedBytes(LPDIRECTMUSICBUFFER iface, DWORD used_bytes) +{ + IDirectMusicBufferImpl *This = impl_from_IDirectMusicBuffer(iface); + + TRACE("(%p)->(%u)\n", iface, used_bytes); + + if (used_bytes > This->size) + return DMUS_E_BUFFER_FULL; + + This->write_pos = used_bytes; + + return S_OK; } static const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl = { @@ -159,17 +276,40 @@ static const IDirectMusicBufferVtbl DirectMusicBuffer_Vtbl = { IDirectMusicBufferImpl_SetUsedBytes }; -/* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { - IDirectMusicBufferImpl* dmbuff; - - dmbuff = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicBufferImpl)); - if (NULL == dmbuff) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - dmbuff->lpVtbl = &DirectMusicBuffer_Vtbl; - dmbuff->ref = 0; /* will be inited by QueryInterface */ - - return IDirectMusicBufferImpl_QueryInterface ((LPDIRECTMUSICBUFFER)dmbuff, lpcGUID, ppobj); +HRESULT DMUSIC_CreateDirectMusicBufferImpl(LPDMUS_BUFFERDESC desc, LPVOID* ret_iface) +{ + IDirectMusicBufferImpl* dmbuffer; + HRESULT hr; + + TRACE("(%p, %p)\n", desc, ret_iface); + + *ret_iface = NULL; + + dmbuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicBufferImpl)); + if (!dmbuffer) + return E_OUTOFMEMORY; + + dmbuffer->IDirectMusicBuffer_iface.lpVtbl = &DirectMusicBuffer_Vtbl; + dmbuffer->ref = 0; /* Will be inited by QueryInterface */ + + if (IsEqualGUID(&desc->guidBufferFormat, &GUID_NULL)) + dmbuffer->format = KSDATAFORMAT_SUBTYPE_MIDI; + else + dmbuffer->format = desc->guidBufferFormat; + dmbuffer->size = (desc->cbBuffer + 3) & ~3; /* Buffer size must be multiple of 4 bytes */ + + dmbuffer->data = HeapAlloc(GetProcessHeap(), 0, dmbuffer->size); + if (!dmbuffer->data) { + HeapFree(GetProcessHeap(), 0, dmbuffer); + return E_OUTOFMEMORY; + } + + hr = IDirectMusicBufferImpl_QueryInterface((LPDIRECTMUSICBUFFER)dmbuffer, &IID_IDirectMusicBuffer, ret_iface); + if (FAILED(hr)) + { + HeapFree(GetProcessHeap(), 0, dmbuffer->data); + HeapFree(GetProcessHeap(), 0, dmbuffer); + } + + return hr; } diff --git a/reactos/dll/directx/dmusic/clock.c b/reactos/dll/directx/dmusic/clock.c index 53f77153ab0..2a8cd09e712 100644 --- a/reactos/dll/directx/dmusic/clock.c +++ b/reactos/dll/directx/dmusic/clock.c @@ -1,4 +1,5 @@ -/* IReferenceClock Implementation +/* + * IReferenceClock Implementation * * Copyright (C) 2003-2004 Rok Mandeljc * @@ -21,9 +22,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmusic); +static inline IReferenceClockImpl *impl_from_IReferenceClock(IReferenceClock *iface) +{ + return CONTAINING_RECORD(iface, IReferenceClockImpl, IReferenceClock_iface); +} + /* IReferenceClockImpl IUnknown part: */ -static HRESULT WINAPI IReferenceClockImpl_QueryInterface (IReferenceClock *iface, REFIID riid, LPVOID *ppobj) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; +static HRESULT WINAPI IReferenceClockImpl_QueryInterface(IReferenceClock *iface, REFIID riid, LPVOID *ppobj) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); if (IsEqualIID (riid, &IID_IUnknown) || @@ -36,56 +43,70 @@ static HRESULT WINAPI IReferenceClockImpl_QueryInterface (IReferenceClock *iface return E_NOINTERFACE; } -static ULONG WINAPI IReferenceClockImpl_AddRef (IReferenceClock *iface) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IReferenceClockImpl_AddRef(IReferenceClock *iface) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p)->(): new ref = %u\n", This, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IReferenceClockImpl_Release (IReferenceClock *iface) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IReferenceClockImpl_Release(IReferenceClock *iface) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p)->(): new ref = %u\n", This, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) + HeapFree(GetProcessHeap(), 0, This); - DMUSIC_UnlockModule(); + DMUSIC_UnlockModule(); - return refCount; + return ref; } /* IReferenceClockImpl IReferenceClock part: */ -static HRESULT WINAPI IReferenceClockImpl_GetTime (IReferenceClock *iface, REFERENCE_TIME* pTime) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - TRACE("(%p, %p)\n", This, pTime); - *pTime = This->rtTime; - return S_OK; +static HRESULT WINAPI IReferenceClockImpl_GetTime(IReferenceClock *iface, REFERENCE_TIME* pTime) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + + TRACE("(%p)->(%p)\n", This, pTime); + + *pTime = This->rtTime; + + return S_OK; } -static HRESULT WINAPI IReferenceClockImpl_AdviseTime (IReferenceClock *iface, REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HANDLE hEvent, DWORD* pdwAdviseCookie) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - FIXME("(%p, 0x%s, 0x%s, %p, %p): stub\n", This, wine_dbgstr_longlong(baseTime), wine_dbgstr_longlong(streamTime), hEvent, pdwAdviseCookie); - return S_OK; +static HRESULT WINAPI IReferenceClockImpl_AdviseTime(IReferenceClock *iface, REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HANDLE hEvent, DWORD* pdwAdviseCookie) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + + FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This, wine_dbgstr_longlong(baseTime), wine_dbgstr_longlong(streamTime), hEvent, pdwAdviseCookie); + + return S_OK; } -static HRESULT WINAPI IReferenceClockImpl_AdvisePeriodic (IReferenceClock *iface, REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HANDLE hSemaphore, DWORD* pdwAdviseCookie) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - FIXME("(%p, 0x%s, 0x%s, %p, %p): stub\n", This, wine_dbgstr_longlong(startTime), wine_dbgstr_longlong(periodTime), hSemaphore, pdwAdviseCookie); - return S_OK; +static HRESULT WINAPI IReferenceClockImpl_AdvisePeriodic(IReferenceClock *iface, REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HANDLE hSemaphore, DWORD* pdwAdviseCookie) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + + FIXME("(%p)->(0x%s, 0x%s, %p, %p): stub\n", This, wine_dbgstr_longlong(startTime), wine_dbgstr_longlong(periodTime), hSemaphore, pdwAdviseCookie); + + return S_OK; } -static HRESULT WINAPI IReferenceClockImpl_Unadvise (IReferenceClock *iface, DWORD dwAdviseCookie) { - IReferenceClockImpl *This = (IReferenceClockImpl *)iface; - FIXME("(%p, %d): stub\n", This, dwAdviseCookie); - return S_OK; +static HRESULT WINAPI IReferenceClockImpl_Unadvise(IReferenceClock *iface, DWORD dwAdviseCookie) +{ + IReferenceClockImpl *This = impl_from_IReferenceClock(iface); + + FIXME("(%p)->(%d): stub\n", This, dwAdviseCookie); + + return S_OK; } static const IReferenceClockVtbl ReferenceClock_Vtbl = { @@ -99,18 +120,22 @@ static const IReferenceClockVtbl ReferenceClock_Vtbl = { }; /* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateReferenceClockImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { - IReferenceClockImpl* clock; +HRESULT DMUSIC_CreateReferenceClockImpl(LPCGUID riid, LPVOID* ret_iface, LPUNKNOWN unkouter) +{ + IReferenceClockImpl* clock; - clock = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IReferenceClockImpl)); - if (NULL == clock) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - clock->lpVtbl = &ReferenceClock_Vtbl; - clock->ref = 0; /* will be inited by QueryInterface */ - clock->rtTime = 0; - clock->pClockInfo.dwSize = sizeof (DMUS_CLOCKINFO); - - return IReferenceClockImpl_QueryInterface ((IReferenceClock *)clock, lpcGUID, ppobj); + TRACE("(%p,%p,%p)\n", riid, ret_iface, unkouter); + + clock = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IReferenceClockImpl)); + if (!clock) { + *ret_iface = NULL; + return E_OUTOFMEMORY; + } + + clock->IReferenceClock_iface.lpVtbl = &ReferenceClock_Vtbl; + clock->ref = 0; /* Will be inited by QueryInterface */ + clock->rtTime = 0; + clock->pClockInfo.dwSize = sizeof (DMUS_CLOCKINFO); + + return IReferenceClockImpl_QueryInterface((IReferenceClock*)clock, riid, ret_iface); } diff --git a/reactos/dll/directx/dmusic/collection.c b/reactos/dll/directx/dmusic/collection.c index 8c9f2aab156..e30f89d1219 100644 --- a/reactos/dll/directx/dmusic/collection.c +++ b/reactos/dll/directx/dmusic/collection.c @@ -1,4 +1,5 @@ -/* IDirectMusicCollection Implementation +/* + * IDirectMusicCollection Implementation * * Copyright (C) 2003-2004 Rok Mandeljc * @@ -22,139 +23,138 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmusic); WINE_DECLARE_DEBUG_CHANNEL(dmfile); -static ULONG WINAPI IDirectMusicCollectionImpl_IUnknown_AddRef (LPUNKNOWN iface); -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_AddRef (LPDIRECTMUSICCOLLECTION iface); -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface); -static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface); +static inline IDirectMusicCollectionImpl *impl_from_IDirectMusicCollection(IDirectMusicCollection *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IDirectMusicCollection_iface); +} + +static inline IDirectMusicCollectionImpl *impl_from_IDirectMusicObject(IDirectMusicObject *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IDirectMusicObject_iface); +} + +static inline IDirectMusicCollectionImpl *impl_from_IPersistStream(IPersistStream *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicCollectionImpl, IPersistStream_iface); +} /***************************************************************************** * IDirectMusicCollectionImpl implementation */ /* IDirectMusicCollectionImpl IUnknown part: */ -static HRESULT WINAPI IDirectMusicCollectionImpl_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, UnknownVtbl, iface); - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_QueryInterface(LPDIRECTMUSICCOLLECTION iface, REFIID riid, LPVOID *ret_iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicCollection(iface); - if (IsEqualIID (riid, &IID_IUnknown)) { - *ppobj = &This->UnknownVtbl; - IDirectMusicCollectionImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); - return S_OK; - } else if (IsEqualIID (riid, &IID_IDirectMusicCollection)) { - *ppobj = &This->CollectionVtbl; - IDirectMusicCollectionImpl_IDirectMusicCollection_AddRef ((LPDIRECTMUSICCOLLECTION)&This->CollectionVtbl); - return S_OK; - } else if (IsEqualIID (riid, &IID_IDirectMusicObject)) { - *ppobj = &This->ObjectVtbl; - IDirectMusicCollectionImpl_IDirectMusicObject_AddRef ((LPDIRECTMUSICOBJECT)&This->ObjectVtbl); - return S_OK; - } else if (IsEqualIID (riid, &IID_IPersistStream)) { - *ppobj = &This->PersistStreamVtbl; - IDirectMusicCollectionImpl_IPersistStream_AddRef ((LPPERSISTSTREAM)&This->PersistStreamVtbl); - return S_OK; - } - - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; + TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectMusicCollection)) + { + *ret_iface = iface; + IDirectMusicCollection_AddRef(iface); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IDirectMusicObject)) + { + *ret_iface = &This->IDirectMusicObject_iface; + IDirectMusicCollection_AddRef(iface); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IPersistStream)) + { + *ret_iface = &This->IPersistStream_iface; + IDirectMusicCollection_AddRef(iface); + return S_OK; + } + + *ret_iface = NULL; + + WARN("(%p/%p)->(%s, %p): not found\n", iface, This, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static ULONG WINAPI IDirectMusicCollectionImpl_IUnknown_AddRef (LPUNKNOWN iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, UnknownVtbl, iface); - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_AddRef(LPDIRECTMUSICCOLLECTION iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicCollection(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IDirectMusicCollectionImpl_IUnknown_Release (LPUNKNOWN iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, UnknownVtbl, iface); - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_Release(LPDIRECTMUSICCOLLECTION iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicCollection(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) + HeapFree(GetProcessHeap(), 0, This); - DMUSIC_UnlockModule(); + DMUSIC_UnlockModule(); - return refCount; + return ref; } -static const IUnknownVtbl DirectMusicCollection_Unknown_Vtbl = { - IDirectMusicCollectionImpl_IUnknown_QueryInterface, - IDirectMusicCollectionImpl_IUnknown_AddRef, - IDirectMusicCollectionImpl_IUnknown_Release -}; +/* IDirectMusicCollection Interface follows: */ +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_GetInstrument(LPDIRECTMUSICCOLLECTION iface, DWORD patch, IDirectMusicInstrument** instrument) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicCollection(iface); + DMUS_PRIVATE_INSTRUMENTENTRY *inst_entry; + struct list *list_entry; + DWORD inst_patch; -/* IDirectMusicCollectionImpl IDirectMusicCollection part: */ -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_QueryInterface (LPDIRECTMUSICCOLLECTION iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, CollectionVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj); + TRACE("(%p/%p)->(%u, %p)\n", iface, This, patch, instrument); + + LIST_FOR_EACH(list_entry, &This->Instruments) { + inst_entry = LIST_ENTRY(list_entry, DMUS_PRIVATE_INSTRUMENTENTRY, entry); + IDirectMusicInstrument_GetPatch(inst_entry->pInstrument, &inst_patch); + if (patch == inst_patch) { + *instrument = inst_entry->pInstrument; + IDirectMusicInstrument_AddRef(inst_entry->pInstrument); + IDirectMusicInstrumentImpl_CustomLoad(inst_entry->pInstrument, This->pStm); + TRACE(": returning instrument %p\n", *instrument); + return S_OK; + } + } + + TRACE(": instrument not found\n"); + + return DMUS_E_INVALIDPATCH; } -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_AddRef (LPDIRECTMUSICCOLLECTION iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, CollectionVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); -} +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_EnumInstrument(LPDIRECTMUSICCOLLECTION iface, DWORD index, DWORD* patch, LPWSTR name, DWORD name_length) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicCollection(iface); + DWORD i = 0; + DMUS_PRIVATE_INSTRUMENTENTRY *inst_entry; + struct list *list_entry; + DWORD length; -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_Release (LPDIRECTMUSICCOLLECTION iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, CollectionVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl); -} + TRACE("(%p/%p)->(%d, %p, %p, %d)\n", iface, This, index, patch, name, name_length); -/* IDirectMusicCollection Interface follow: */ -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_GetInstrument (LPDIRECTMUSICCOLLECTION iface, DWORD dwPatch, IDirectMusicInstrument** ppInstrument) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, CollectionVtbl, iface); - DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry; - struct list *listEntry; - DWORD dwInstPatch; + LIST_FOR_EACH(list_entry, &This->Instruments) { + inst_entry = LIST_ENTRY(list_entry, DMUS_PRIVATE_INSTRUMENTENTRY, entry); + if (i == index) { + IDirectMusicInstrumentImpl *instrument = impl_from_IDirectMusicInstrument(inst_entry->pInstrument); + IDirectMusicInstrument_GetPatch(inst_entry->pInstrument, patch); + if (name) { + length = min(strlenW(instrument->wszName), name_length - 1); + memcpy(name, instrument->wszName, length * sizeof(WCHAR)); + name[length] = '\0'; + } + return S_OK; + } + i++; + } - TRACE("(%p, %d, %p)\n", This, dwPatch, ppInstrument); - - LIST_FOR_EACH (listEntry, &This->Instruments) { - tmpEntry = LIST_ENTRY(listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry); - IDirectMusicInstrument_GetPatch (tmpEntry->pInstrument, &dwInstPatch); - if (dwPatch == dwInstPatch) { - *ppInstrument = tmpEntry->pInstrument; - IDirectMusicInstrument_AddRef (tmpEntry->pInstrument); - IDirectMusicInstrumentImpl_Custom_Load (tmpEntry->pInstrument, This->pStm); /* load instrument before returning it */ - TRACE(": returning instrument %p\n", *ppInstrument); - return S_OK; - } - - } - TRACE(": instrument not found\n"); - - return DMUS_E_INVALIDPATCH; -} - -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicCollection_EnumInstrument (LPDIRECTMUSICCOLLECTION iface, DWORD dwIndex, DWORD* pdwPatch, LPWSTR pwszName, DWORD dwNameLen) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, CollectionVtbl, iface); - unsigned int r = 0; - DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry; - struct list *listEntry; - DWORD dwLen; - - TRACE("(%p, %d, %p, %p, %d)\n", This, dwIndex, pdwPatch, pwszName, dwNameLen); - LIST_FOR_EACH (listEntry, &This->Instruments) { - tmpEntry = LIST_ENTRY(listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry); - if (r == dwIndex) { - ICOM_NAME_MULTI (IDirectMusicInstrumentImpl, InstrumentVtbl, tmpEntry->pInstrument, pInstrument); - IDirectMusicInstrument_GetPatch (tmpEntry->pInstrument, pdwPatch); - if (pwszName) { - dwLen = min(strlenW(pInstrument->wszName),dwNameLen-1); - memcpy (pwszName, pInstrument->wszName, dwLen * sizeof(WCHAR)); - pwszName[dwLen] = '\0'; - } - return S_OK; - } - r++; - } - - return S_FALSE; + return S_FALSE; } static const IDirectMusicCollectionVtbl DirectMusicCollection_Collection_Vtbl = { @@ -166,32 +166,50 @@ static const IDirectMusicCollectionVtbl DirectMusicCollection_Collection_Vtbl = }; /* IDirectMusicCollectionImpl IDirectMusicObject part: */ -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_QueryInterface (LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj); +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_QueryInterface(LPDIRECTMUSICOBJECT iface, REFIID riid, LPVOID *ret_iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + return IDirectMusicCollection_QueryInterface(&This->IDirectMusicCollection_iface, riid, ret_iface); } -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_AddRef (LPDIRECTMUSICOBJECT iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); +static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_AddRef(LPDIRECTMUSICOBJECT iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + return IDirectMusicCollection_AddRef(&This->IDirectMusicCollection_iface); } -static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_Release (LPDIRECTMUSICOBJECT iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl); +static ULONG WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_Release(LPDIRECTMUSICOBJECT iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + return IDirectMusicCollection_Release(&This->IDirectMusicCollection_iface); } -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_GetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - TRACE("(%p, %p)\n", This, pDesc); - /* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */ - memcpy (pDesc, This->pDesc, This->pDesc->dwSize); - return S_OK; +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_GetDescriptor(LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + + TRACE("(%p/%p)->(%p)\n", iface, This, pDesc); + + /* I think we shouldn't return pointer here since then values can be changed; it'd be a mess */ + memcpy (pDesc, This->pDesc, This->pDesc->dwSize); + + return S_OK; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_SetDescriptor (LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - TRACE("(%p, %p): setting descriptor:\n%s\n", This, pDesc, debugstr_DMUS_OBJECTDESC (pDesc)); +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_SetDescriptor(LPDIRECTMUSICOBJECT iface, LPDMUS_OBJECTDESC pDesc) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + + TRACE("(%p, %p)\n", iface, pDesc); + + if (!pDesc) + return E_POINTER; + + if (TRACE_ON(dmusic)) + { + TRACE("Setting descriptor:\n"); + dump_DMUS_OBJECTDESC(pDesc); + } /* According to MSDN, we should copy only given values, not whole struct */ if (pDesc->dwValidData & DMUS_OBJ_OBJECT) @@ -223,172 +241,210 @@ static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_SetDescripto return S_OK; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor (LPDIRECTMUSICOBJECT iface, LPSTREAM pStream, LPDMUS_OBJECTDESC pDesc) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, ObjectVtbl, iface); - DMUS_PRIVATE_CHUNK Chunk; - DWORD StreamSize, StreamCount, ListSize[1], ListCount[1]; - LARGE_INTEGER liMove; /* used when skipping chunks */ +static HRESULT read_from_stream(IStream *stream, void *data, ULONG size) +{ + ULONG read; + HRESULT hr; - TRACE("(%p, %p, %p)\n", This, pStream, pDesc); + hr = IStream_Read(stream, data, size, &read); + if (FAILED(hr)) { + TRACE("IStream_Read failed: %08x\n", hr); + return hr; + } + if (read < size) { + TRACE("Didn't read full chunk: %u < %u\n", read, size); + return E_FAIL; + } - /* FIXME: should this be determined from stream? */ - pDesc->dwValidData |= DMUS_OBJ_CLASS; - pDesc->guidClass = CLSID_DirectMusicCollection; + return S_OK; +} - IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_RIFF: { - IStream_Read (pStream, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(Chunk.fccID)); - StreamSize = Chunk.dwSize - sizeof(FOURCC); - StreamCount = 0; - if (Chunk.fccID == mmioFOURCC('D','L','S',' ')) { - TRACE_(dmfile)(": collection form\n"); - do { - IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - StreamCount += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_DLID: { - TRACE_(dmfile)(": GUID chunk\n"); - pDesc->dwValidData |= DMUS_OBJ_OBJECT; - IStream_Read (pStream, &pDesc->guidObject, Chunk.dwSize, NULL); - break; - } - case DMUS_FOURCC_VERSION_CHUNK: { - TRACE_(dmfile)(": version chunk\n"); - pDesc->dwValidData |= DMUS_OBJ_VERSION; - IStream_Read (pStream, &pDesc->vVersion, Chunk.dwSize, NULL); - break; - } - case DMUS_FOURCC_CATEGORY_CHUNK: { - TRACE_(dmfile)(": category chunk\n"); - pDesc->dwValidData |= DMUS_OBJ_CATEGORY; - IStream_Read (pStream, pDesc->wszCategory, Chunk.dwSize, NULL); - break; - } - case FOURCC_LIST: { - IStream_Read (pStream, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[0] = Chunk.dwSize - sizeof(FOURCC); - ListCount[0] = 0; - switch (Chunk.fccID) { - /* pure INFO list, such can be found in dls collections */ - case mmioFOURCC('I','N','F','O'): { - TRACE_(dmfile)(": INFO list\n"); - do { - IStream_Read (pStream, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case mmioFOURCC('I','N','A','M'):{ - CHAR szName[DMUS_MAX_NAME]; - TRACE_(dmfile)(": name chunk\n"); - pDesc->dwValidData |= DMUS_OBJ_NAME; - IStream_Read (pStream, szName, Chunk.dwSize, NULL); - MultiByteToWideChar (CP_ACP, 0, szName, -1, pDesc->wszName, DMUS_MAX_NAME); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - liMove.QuadPart = 1; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - } - break; - } - case mmioFOURCC('I','A','R','T'): { - TRACE_(dmfile)(": artist chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','O','P'): { - TRACE_(dmfile)(": copyright chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','S','B','J'): { - TRACE_(dmfile)(": subject chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','M','T'): { - TRACE_(dmfile)(": comment chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - break; - } - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": StreamCount[0] = %d < StreamSize[0] = %d\n", StreamCount, StreamSize); - } while (StreamCount < StreamSize); - } else { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = StreamSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return E_FAIL; - } - - TRACE_(dmfile)(": reading finished\n"); - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return DMUS_E_INVALIDFILE; - } - } - - TRACE(": returning descriptor:\n%s\n", debugstr_DMUS_OBJECTDESC (pDesc)); - - return S_OK; +static HRESULT WINAPI IDirectMusicCollectionImpl_IDirectMusicObject_ParseDescriptor(LPDIRECTMUSICOBJECT iface, LPSTREAM stream, LPDMUS_OBJECTDESC desc) +{ + IDirectMusicCollectionImpl *This = impl_from_IDirectMusicObject(iface); + DMUS_PRIVATE_CHUNK chunk; + DWORD StreamSize, StreamCount, ListSize[1], ListCount[1]; + LARGE_INTEGER liMove; /* used when skipping chunks */ + HRESULT hr; + + TRACE("(%p)->(%p, %p)\n", This, stream, desc); + + /* FIXME: should this be determined from stream? */ + desc->dwValidData |= DMUS_OBJ_CLASS; + desc->guidClass = CLSID_DirectMusicCollection; + + hr = read_from_stream(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD)); + if (FAILED(hr)) + return hr; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + + if (chunk.fccID != FOURCC_RIFF) { + TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ + return DMUS_E_INVALIDFILE; + } + + hr = read_from_stream(stream, &chunk.fccID, sizeof(FOURCC)); + if (FAILED(hr)) + return hr; + TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunk.fccID)); + StreamSize = chunk.dwSize - sizeof(FOURCC); + + if (chunk.fccID != mmioFOURCC('D','L','S',' ')) { + TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); + liMove.QuadPart = StreamSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ + return E_FAIL; + } + + StreamCount = 0; + TRACE_(dmfile)(": collection form\n"); + + do { + hr = read_from_stream(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD)); + if (FAILED(hr)) + return hr; + StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case FOURCC_DLID: + TRACE_(dmfile)(": GUID chunk\n"); + desc->dwValidData |= DMUS_OBJ_OBJECT; + hr = read_from_stream(stream, &desc->guidObject, chunk.dwSize); + if (FAILED(hr)) + return hr; + break; + + case DMUS_FOURCC_VERSION_CHUNK: + TRACE_(dmfile)(": version chunk\n"); + desc->dwValidData |= DMUS_OBJ_VERSION; + hr = read_from_stream(stream, &desc->vVersion, chunk.dwSize); + if (FAILED(hr)) + return hr; + break; + + case DMUS_FOURCC_CATEGORY_CHUNK: + TRACE_(dmfile)(": category chunk\n"); + desc->dwValidData |= DMUS_OBJ_CATEGORY; + hr = read_from_stream(stream, desc->wszCategory, chunk.dwSize); + if (FAILED(hr)) + return hr; + break; + + case FOURCC_LIST: + hr = read_from_stream(stream, &chunk.fccID, sizeof(FOURCC)); + if (FAILED(hr)) + return hr; + TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID)); + ListSize[0] = chunk.dwSize - sizeof(FOURCC); + ListCount[0] = 0; + switch (chunk.fccID) { + /* pure INFO list, such can be found in dls collections */ + case mmioFOURCC('I','N','F','O'): + TRACE_(dmfile)(": INFO list\n"); + do { + hr = read_from_stream(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD)); + if (FAILED(hr)) + return hr; + ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case mmioFOURCC('I','N','A','M'): { + CHAR szName[DMUS_MAX_NAME]; + TRACE_(dmfile)(": name chunk\n"); + desc->dwValidData |= DMUS_OBJ_NAME; + hr = read_from_stream(stream, szName, chunk.dwSize); + if (FAILED(hr)) + return hr; + MultiByteToWideChar (CP_ACP, 0, szName, -1, desc->wszName, DMUS_MAX_NAME); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + liMove.QuadPart = 1; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + } + break; + } + + case mmioFOURCC('I','A','R','T'): + TRACE_(dmfile)(": artist chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + + case mmioFOURCC('I','C','O','P'): + TRACE_(dmfile)(": copyright chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + + case mmioFOURCC('I','S','B','J'): + TRACE_(dmfile)(": subject chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + + case mmioFOURCC('I','C','M','T'): + TRACE_(dmfile)(": comment chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + + default: + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0] ++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); + } while (ListCount[0] < ListSize[0]); + break; + + default: + TRACE_(dmfile)(": unknown (skipping)\n"); + liMove.QuadPart = chunk.dwSize - sizeof(FOURCC); + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + break; + + default: + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + TRACE_(dmfile)(": StreamCount[0] = %d < StreamSize[0] = %d\n", StreamCount, StreamSize); + } while (StreamCount < StreamSize); + + TRACE_(dmfile)(": reading finished\n"); + + if (TRACE_ON(dmusic)) { + TRACE("Returning descriptor:\n"); + dump_DMUS_OBJECTDESC(desc); + } + + return S_OK; } static const IDirectMusicObjectVtbl DirectMusicCollection_Object_Vtbl = { @@ -401,345 +457,345 @@ static const IDirectMusicObjectVtbl DirectMusicCollection_Object_Vtbl = { }; /* IDirectMusicCollectionImpl IPersistStream part: */ -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_QueryInterface (LPPERSISTSTREAM iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, PersistStreamVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj); +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_QueryInterface(LPPERSISTSTREAM iface, REFIID riid, LPVOID *ret_iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface); + return IDirectMusicCollection_QueryInterface(&This->IDirectMusicCollection_iface, riid, ret_iface); } -static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, PersistStreamVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); +static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_AddRef (LPPERSISTSTREAM iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface); + return IDirectMusicCollection_AddRef(&This->IDirectMusicCollection_iface); } -static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_Release (LPPERSISTSTREAM iface) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, PersistStreamVtbl, iface); - return IDirectMusicCollectionImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl); +static ULONG WINAPI IDirectMusicCollectionImpl_IPersistStream_Release (LPPERSISTSTREAM iface) +{ + IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface); + return IDirectMusicCollection_Release(&This->IDirectMusicCollection_iface); } -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetClassID (LPPERSISTSTREAM iface, CLSID* pClassID) { - return E_NOTIMPL; +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetClassID(LPPERSISTSTREAM iface, CLSID* pClassID) +{ + return E_NOTIMPL; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_IsDirty (LPPERSISTSTREAM iface) { - return E_NOTIMPL; +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_IsDirty(LPPERSISTSTREAM iface) +{ + return E_NOTIMPL; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Load (LPPERSISTSTREAM iface, IStream* pStm) { - ICOM_THIS_MULTI(IDirectMusicCollectionImpl, PersistStreamVtbl, iface); +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Load(LPPERSISTSTREAM iface, IStream* stream) +{ + IDirectMusicCollectionImpl *This = impl_from_IPersistStream(iface); + DMUS_PRIVATE_CHUNK chunk; + DWORD StreamSize, StreamCount, ListSize[2], ListCount[2]; + LARGE_INTEGER liMove; /* used when skipping chunks */ + ULARGE_INTEGER dlibCollectionPosition, dlibInstrumentPosition, dlibWavePoolPosition; - DMUS_PRIVATE_CHUNK Chunk; - DWORD StreamSize, StreamCount, ListSize[3], ListCount[3]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - ULARGE_INTEGER dlibCollectionPosition, dlibInstrumentPosition, dlibWavePoolPosition; - - IStream_AddRef (pStm); /* add count for later references */ - liMove.QuadPart = 0; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibCollectionPosition); /* store offset, in case it'll be needed later */ - This->liCollectionPosition.QuadPart = dlibCollectionPosition.QuadPart; - This->pStm = pStm; - - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_RIFF: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(Chunk.fccID)); - StreamSize = Chunk.dwSize - sizeof(FOURCC); - StreamCount = 0; - switch (Chunk.fccID) { - case FOURCC_DLS: { - TRACE_(dmfile)(": collection form\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - StreamCount += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_COLH: { - TRACE_(dmfile)(": collection header chunk\n"); - This->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize); - IStream_Read (pStm, This->pHeader, Chunk.dwSize, NULL); - break; - } - case FOURCC_DLID: { - TRACE_(dmfile)(": DLID (GUID) chunk\n"); - This->pDesc->dwValidData |= DMUS_OBJ_OBJECT; - IStream_Read (pStm, &This->pDesc->guidObject, Chunk.dwSize, NULL); - break; - } - case FOURCC_VERS: { - TRACE_(dmfile)(": version chunk\n"); - This->pDesc->dwValidData |= DMUS_OBJ_VERSION; - IStream_Read (pStm, &This->pDesc->vVersion, Chunk.dwSize, NULL); - break; - } - case FOURCC_PTBL: { - TRACE_(dmfile)(": pool table chunk\n"); - This->pPoolTable = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(POOLTABLE)); - IStream_Read (pStm, This->pPoolTable, sizeof(POOLTABLE), NULL); - Chunk.dwSize -= sizeof(POOLTABLE); - This->pPoolCues = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, This->pPoolTable->cCues*sizeof(POOLCUE)); - IStream_Read (pStm, This->pPoolCues, Chunk.dwSize, NULL); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[0] = Chunk.dwSize - sizeof(FOURCC); - ListCount[0] = 0; - switch (Chunk.fccID) { - case mmioFOURCC('I','N','F','O'): { - TRACE_(dmfile)(": INFO list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case mmioFOURCC('I','N','A','M'): { - CHAR szName[DMUS_MAX_NAME]; - TRACE_(dmfile)(": name chunk\n"); - This->pDesc->dwValidData |= DMUS_OBJ_NAME; - IStream_Read (pStm, szName, Chunk.dwSize, NULL); - MultiByteToWideChar (CP_ACP, 0, szName, -1, This->pDesc->wszName, DMUS_MAX_NAME); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - liMove.QuadPart = 1; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - } - break; - } - case mmioFOURCC('I','A','R','T'): { - TRACE_(dmfile)(": artist chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','O','P'): { - TRACE_(dmfile)(": copyright chunk\n"); - This->szCopyright = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize); - IStream_Read (pStm, This->szCopyright, Chunk.dwSize, NULL); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - liMove.QuadPart = 1; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - } - break; - } - case mmioFOURCC('I','S','B','J'): { - TRACE_(dmfile)(": subject chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','M','T'): { - TRACE_(dmfile)(": comment chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[0] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - break; - } - case FOURCC_WVPL: { - TRACE_(dmfile)(": wave pool list (mark & skip)\n"); - liMove.QuadPart = 0; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibWavePoolPosition); /* store position */ - This->liWavePoolTablePosition.QuadPart = dlibWavePoolPosition.QuadPart; - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case FOURCC_LINS: { - TRACE_(dmfile)(": instruments list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case FOURCC_INS: { - LPDMUS_PRIVATE_INSTRUMENTENTRY pNewInstrument = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_INSTRUMENTENTRY)); - TRACE_(dmfile)(": instrument list\n"); - DMUSIC_CreateDirectMusicInstrumentImpl (&IID_IDirectMusicInstrument, (LPVOID*)&pNewInstrument->pInstrument, NULL); /* only way to create this one... even M$ does it discretely */ - { - ICOM_NAME_MULTI (IDirectMusicInstrumentImpl, InstrumentVtbl, pNewInstrument->pInstrument, pInstrument); - liMove.QuadPart = 0; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, &dlibInstrumentPosition); - pInstrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart - (2*sizeof(FOURCC) + sizeof(DWORD)); /* store offset, it'll be needed later */ + IStream_AddRef(stream); /* add count for later references */ + liMove.QuadPart = 0; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibCollectionPosition); /* store offset, in case it'll be needed later */ + This->liCollectionPosition.QuadPart = dlibCollectionPosition.QuadPart; + This->pStm = stream; - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_INSH: { - TRACE_(dmfile)(": instrument header chunk\n"); - pInstrument->pHeader = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize); - IStream_Read (pStm, pInstrument->pHeader, Chunk.dwSize, NULL); - break; - } - case FOURCC_DLID: { - TRACE_(dmfile)(": DLID (GUID) chunk\n"); - pInstrument->pInstrumentID = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, Chunk.dwSize); - IStream_Read (pStm, pInstrument->pInstrumentID, Chunk.dwSize, NULL); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[2] = Chunk.dwSize - sizeof(FOURCC); - ListCount[2] = 0; - switch (Chunk.fccID) { - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - /* DEBUG: dumps whole instrument object tree: */ - if (TRACE_ON(dmusic)) { - TRACE("*** IDirectMusicInstrument (%p) ***\n", pInstrument); - if (pInstrument->pInstrumentID) - TRACE(" - GUID = %s\n", debugstr_dmguid(pInstrument->pInstrumentID)); - - TRACE(" - Instrument header:\n"); - TRACE(" - cRegions: %d\n", pInstrument->pHeader->cRegions); - TRACE(" - Locale:\n"); - TRACE(" - ulBank: %d\n", pInstrument->pHeader->Locale.ulBank); - TRACE(" - ulInstrument: %d\n", pInstrument->pHeader->Locale.ulInstrument); - TRACE(" => dwPatch: %d\n", MIDILOCALE2Patch(&pInstrument->pHeader->Locale)); - } - list_add_tail (&This->Instruments, &pNewInstrument->entry); - } - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - break; - } - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": StreamCount = %d < StreamSize = %d\n", StreamCount, StreamSize); - } while (StreamCount < StreamSize); - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = StreamSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return E_FAIL; - } - } - TRACE_(dmfile)(": reading finished\n"); - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return E_FAIL; - } - } + IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL); + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); - /* DEBUG: dumps whole collection object tree: */ - if (TRACE_ON(dmusic)) { - int r = 0; - DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry; - struct list *listEntry; + if (chunk.fccID != FOURCC_RIFF) { + TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ + return E_FAIL; + } - TRACE("*** IDirectMusicCollection (%p) ***\n", This->CollectionVtbl); - if (This->pDesc->dwValidData & DMUS_OBJ_OBJECT) - TRACE(" - GUID = %s\n", debugstr_dmguid(&This->pDesc->guidObject)); - if (This->pDesc->dwValidData & DMUS_OBJ_VERSION) - TRACE(" - Version = %i,%i,%i,%i\n", (This->pDesc->vVersion.dwVersionMS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionMS & 0x0000FFFF, - (This->pDesc->vVersion.dwVersionLS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionLS & 0x0000FFFF); - if (This->pDesc->dwValidData & DMUS_OBJ_NAME) - TRACE(" - Name = %s\n", debugstr_w(This->pDesc->wszName)); - - TRACE(" - Collection header:\n"); - TRACE(" - cInstruments: %d\n", This->pHeader->cInstruments); - TRACE(" - Instruments:\n"); - - LIST_FOR_EACH (listEntry, &This->Instruments) { - tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry ); - TRACE(" - Instrument[%i]: %p\n", r, tmpEntry->pInstrument); - r++; - } - } - - return S_OK; + IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL); + TRACE_(dmfile)(": RIFF chunk of type %s", debugstr_fourcc(chunk.fccID)); + StreamSize = chunk.dwSize - sizeof(FOURCC); + StreamCount = 0; + + if (chunk.fccID != FOURCC_DLS) { + TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); + liMove.QuadPart = StreamSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ + return E_FAIL; + } + + TRACE_(dmfile)(": collection form\n"); + do { + IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL); + StreamCount += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case FOURCC_COLH: { + TRACE_(dmfile)(": collection header chunk\n"); + This->pHeader = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize); + IStream_Read(stream, This->pHeader, chunk.dwSize, NULL); + break; + } + case FOURCC_DLID: { + TRACE_(dmfile)(": DLID (GUID) chunk\n"); + This->pDesc->dwValidData |= DMUS_OBJ_OBJECT; + IStream_Read(stream, &This->pDesc->guidObject, chunk.dwSize, NULL); + break; + } + case FOURCC_VERS: { + TRACE_(dmfile)(": version chunk\n"); + This->pDesc->dwValidData |= DMUS_OBJ_VERSION; + IStream_Read(stream, &This->pDesc->vVersion, chunk.dwSize, NULL); + break; + } + case FOURCC_PTBL: { + TRACE_(dmfile)(": pool table chunk\n"); + This->pPoolTable = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(POOLTABLE)); + IStream_Read(stream, This->pPoolTable, sizeof(POOLTABLE), NULL); + chunk.dwSize -= sizeof(POOLTABLE); + This->pPoolCues = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pPoolTable->cCues * sizeof(POOLCUE)); + IStream_Read(stream, This->pPoolCues, chunk.dwSize, NULL); + break; + } + case FOURCC_LIST: { + IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL); + TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID)); + ListSize[0] = chunk.dwSize - sizeof(FOURCC); + ListCount[0] = 0; + switch (chunk.fccID) { + case mmioFOURCC('I','N','F','O'): { + TRACE_(dmfile)(": INFO list\n"); + do { + IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL); + ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case mmioFOURCC('I','N','A','M'): { + CHAR szName[DMUS_MAX_NAME]; + TRACE_(dmfile)(": name chunk\n"); + This->pDesc->dwValidData |= DMUS_OBJ_NAME; + IStream_Read(stream, szName, chunk.dwSize, NULL); + MultiByteToWideChar(CP_ACP, 0, szName, -1, This->pDesc->wszName, DMUS_MAX_NAME); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + liMove.QuadPart = 1; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + } + break; + } + case mmioFOURCC('I','A','R','T'): { + TRACE_(dmfile)(": artist chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + case mmioFOURCC('I','C','O','P'): { + TRACE_(dmfile)(": copyright chunk\n"); + This->szCopyright = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, chunk.dwSize); + IStream_Read(stream, This->szCopyright, chunk.dwSize, NULL); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + liMove.QuadPart = 1; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + } + break; + } + case mmioFOURCC('I','S','B','J'): { + TRACE_(dmfile)(": subject chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + case mmioFOURCC('I','C','M','T'): { + TRACE_(dmfile)(": comment chunk (ignored)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + default: { + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + if (even_or_odd(chunk.dwSize)) { + ListCount[0]++; + chunk.dwSize++; + } + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); + } while (ListCount[0] < ListSize[0]); + break; + } + case FOURCC_WVPL: { + TRACE_(dmfile)(": wave pool list (mark & skip)\n"); + liMove.QuadPart = 0; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibWavePoolPosition); /* store position */ + This->liWavePoolTablePosition.QuadPart = dlibWavePoolPosition.QuadPart; + liMove.QuadPart = chunk.dwSize - sizeof(FOURCC); + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + case FOURCC_LINS: { + TRACE_(dmfile)(": instruments list\n"); + do { + IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL); + ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case FOURCC_LIST: { + IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL); + TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID)); + ListSize[1] = chunk.dwSize - sizeof(FOURCC); + ListCount[1] = 0; + switch (chunk.fccID) { + case FOURCC_INS: { + LPDMUS_PRIVATE_INSTRUMENTENTRY new_instrument = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_PRIVATE_INSTRUMENTENTRY)); + TRACE_(dmfile)(": instrument list\n"); + /* Only way to create this one... even M$ does it discretely */ + DMUSIC_CreateDirectMusicInstrumentImpl(&IID_IDirectMusicInstrument, (void**)&new_instrument->pInstrument, NULL); + { + IDirectMusicInstrumentImpl *instrument = impl_from_IDirectMusicInstrument(new_instrument->pInstrument); + /* Store offset and length, they will be needed when loading the instrument */ + liMove.QuadPart = 0; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, &dlibInstrumentPosition); + instrument->liInstrumentPosition.QuadPart = dlibInstrumentPosition.QuadPart; + instrument->length = ListSize[1]; + do { + IStream_Read(stream, &chunk, sizeof(FOURCC) + sizeof(DWORD), NULL); + ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + chunk.dwSize; + TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc(chunk.fccID), chunk.dwSize); + switch (chunk.fccID) { + case FOURCC_INSH: { + TRACE_(dmfile)(": instrument header chunk\n"); + IStream_Read(stream, &instrument->header, chunk.dwSize, NULL); + break; + } + case FOURCC_DLID: { + TRACE_(dmfile)(": DLID (GUID) chunk\n"); + IStream_Read(stream, &instrument->id, chunk.dwSize, NULL); + break; + } + case FOURCC_LIST: { + IStream_Read(stream, &chunk.fccID, sizeof(FOURCC), NULL); + TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(chunk.fccID)); + switch (chunk.fccID) { + default: { + TRACE_(dmfile)(": unknown (skipping)\n"); + liMove.QuadPart = chunk.dwSize - sizeof(FOURCC); + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + break; + } + default: { + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]); + } while (ListCount[1] < ListSize[1]); + /* DEBUG: dumps whole instrument object tree: */ + if (TRACE_ON(dmusic)) { + TRACE("*** IDirectMusicInstrument (%p) ***\n", instrument); + if (!IsEqualGUID(&instrument->id, &GUID_NULL)) + TRACE(" - GUID = %s\n", debugstr_dmguid(&instrument->id)); + TRACE(" - Instrument header:\n"); + TRACE(" - cRegions: %d\n", instrument->header.cRegions); + TRACE(" - Locale:\n"); + TRACE(" - ulBank: %d\n", instrument->header.Locale.ulBank); + TRACE(" - ulInstrument: %d\n", instrument->header.Locale.ulInstrument); + TRACE(" => dwPatch: %d\n", MIDILOCALE2Patch(&instrument->header.Locale)); + } + list_add_tail(&This->Instruments, &new_instrument->entry); + } + break; + } + } + break; + } + default: { + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); + } while (ListCount[0] < ListSize[0]); + break; + } + default: { + TRACE_(dmfile)(": unknown (skipping)\n"); + liMove.QuadPart = chunk.dwSize - sizeof(FOURCC); + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + break; + } + default: { + TRACE_(dmfile)(": unknown chunk (irrelevant & skipping)\n"); + liMove.QuadPart = chunk.dwSize; + IStream_Seek(stream, liMove, STREAM_SEEK_CUR, NULL); + break; + } + } + TRACE_(dmfile)(": StreamCount = %d < StreamSize = %d\n", StreamCount, StreamSize); + } while (StreamCount < StreamSize); + + TRACE_(dmfile)(": reading finished\n"); + + + /* DEBUG: dumps whole collection object tree: */ + if (TRACE_ON(dmusic)) { + int r = 0; + DMUS_PRIVATE_INSTRUMENTENTRY *tmpEntry; + struct list *listEntry; + + TRACE("*** IDirectMusicCollection (%p) ***\n", &This->IDirectMusicCollection_iface); + if (This->pDesc->dwValidData & DMUS_OBJ_OBJECT) + TRACE(" - GUID = %s\n", debugstr_dmguid(&This->pDesc->guidObject)); + if (This->pDesc->dwValidData & DMUS_OBJ_VERSION) + TRACE(" - Version = %i,%i,%i,%i\n", (This->pDesc->vVersion.dwVersionMS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionMS & 0x0000FFFF, + (This->pDesc->vVersion.dwVersionLS >> 8) & 0x0000FFFF, This->pDesc->vVersion.dwVersionLS & 0x0000FFFF); + if (This->pDesc->dwValidData & DMUS_OBJ_NAME) + TRACE(" - Name = %s\n", debugstr_w(This->pDesc->wszName)); + + TRACE(" - Collection header:\n"); + TRACE(" - cInstruments: %d\n", This->pHeader->cInstruments); + TRACE(" - Instruments:\n"); + + LIST_FOR_EACH(listEntry, &This->Instruments) { + tmpEntry = LIST_ENTRY( listEntry, DMUS_PRIVATE_INSTRUMENTENTRY, entry ); + TRACE(" - Instrument[%i]: %p\n", r, tmpEntry->pInstrument); + r++; + } + } + + return S_OK; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Save (LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) { - return E_NOTIMPL; +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_Save(LPPERSISTSTREAM iface, IStream* pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; } -static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetSizeMax (LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) { - return E_NOTIMPL; +static HRESULT WINAPI IDirectMusicCollectionImpl_IPersistStream_GetSizeMax(LPPERSISTSTREAM iface, ULARGE_INTEGER* pcbSize) +{ + return E_NOTIMPL; } static const IPersistStreamVtbl DirectMusicCollection_PersistStream_Vtbl = { @@ -755,7 +811,8 @@ static const IPersistStreamVtbl DirectMusicCollection_PersistStream_Vtbl = { /* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { +HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl(LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) +{ IDirectMusicCollectionImpl* obj; obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicCollectionImpl)); @@ -763,10 +820,9 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl (LPCGUID lpcGUID, LPVOID* *ppobj = NULL; return E_OUTOFMEMORY; } - obj->UnknownVtbl = &DirectMusicCollection_Unknown_Vtbl; - obj->CollectionVtbl = &DirectMusicCollection_Collection_Vtbl; - obj->ObjectVtbl = &DirectMusicCollection_Object_Vtbl; - obj->PersistStreamVtbl = &DirectMusicCollection_PersistStream_Vtbl; + obj->IDirectMusicCollection_iface.lpVtbl = &DirectMusicCollection_Collection_Vtbl; + obj->IDirectMusicObject_iface.lpVtbl = &DirectMusicCollection_Object_Vtbl; + obj->IPersistStream_iface.lpVtbl = &DirectMusicCollection_PersistStream_Vtbl; obj->pDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DMUS_OBJECTDESC)); DM_STRUCT_INIT(obj->pDesc); obj->pDesc->dwValidData |= DMUS_OBJ_CLASS; @@ -774,5 +830,5 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl (LPCGUID lpcGUID, LPVOID* obj->ref = 0; /* will be inited by QueryInterface */ list_init (&obj->Instruments); - return IDirectMusicCollectionImpl_IUnknown_QueryInterface ((LPUNKNOWN)&obj->UnknownVtbl, lpcGUID, ppobj); + return IDirectMusicCollection_QueryInterface(&obj->IDirectMusicCollection_iface, lpcGUID, ppobj); } diff --git a/reactos/dll/directx/dmusic/dmusic.c b/reactos/dll/directx/dmusic/dmusic.c index 09c63eaf404..e5efcb52d0a 100644 --- a/reactos/dll/directx/dmusic/dmusic.c +++ b/reactos/dll/directx/dmusic/dmusic.c @@ -1,6 +1,8 @@ -/* IDirectMusic8 Implementation +/* + * IDirectMusic8 Implementation * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,245 +18,420 @@ * License along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +//#include <stdio.h> + #include "dmusic_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); +static inline IDirectMusic8Impl *impl_from_IDirectMusic8(IDirectMusic8 *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusic8Impl, IDirectMusic8_iface); +} + /* IDirectMusic8Impl IUnknown part: */ -static HRESULT WINAPI IDirectMusic8Impl_QueryInterface (LPDIRECTMUSIC8 iface, REFIID riid, LPVOID *ppobj) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); +static HRESULT WINAPI IDirectMusic8Impl_QueryInterface(LPDIRECTMUSIC8 iface, REFIID riid, LPVOID *ret_iface) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); - if (IsEqualIID (riid, &IID_IUnknown) || - IsEqualIID (riid, &IID_IDirectMusic) || - IsEqualIID (riid, &IID_IDirectMusic2) || - IsEqualIID (riid, &IID_IDirectMusic8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } + TRACE("(%p)->(%s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; + if (IsEqualIID (riid, &IID_IUnknown) || + IsEqualIID (riid, &IID_IDirectMusic) || + IsEqualIID (riid, &IID_IDirectMusic2) || + IsEqualIID (riid, &IID_IDirectMusic8)) + { + IDirectMusic8_AddRef(iface); + *ret_iface = iface; + return S_OK; + } + + *ret_iface = NULL; + + WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static ULONG WINAPI IDirectMusic8Impl_AddRef (LPDIRECTMUSIC8 iface) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IDirectMusic8Impl_AddRef(LPDIRECTMUSIC8 iface) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p)->(): new ref = %u\n", This, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IDirectMusic8Impl_Release (LPDIRECTMUSIC8 iface) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IDirectMusic8Impl_Release(LPDIRECTMUSIC8 iface) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p)->(): new ref = %u\n", This, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) { + HeapFree(GetProcessHeap(), 0, This->system_ports); + HeapFree(GetProcessHeap(), 0, This->ppPorts); + HeapFree(GetProcessHeap(), 0, This); + } - DMUSIC_UnlockModule(); - - return refCount; + DMUSIC_UnlockModule(); + + return ref; } /* IDirectMusic8Impl IDirectMusic part: */ -static HRESULT WINAPI IDirectMusic8Impl_EnumPort(LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - TRACE("(%p, %d, %p)\n", This, dwIndex, pPortCaps); - if (NULL == pPortCaps) { return E_POINTER; } - /* i guess the first port shown is always software synthesizer */ - if (dwIndex == 0) - { - IDirectMusicSynth8* synth; - TRACE("enumerating 'Microsoft Software Synthesizer' port\n"); - CoCreateInstance (&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth8, (void**)&synth); - IDirectMusicSynth8_GetPortCaps (synth, pPortCaps); - IDirectMusicSynth8_Release (synth); - return S_OK; - } +static HRESULT WINAPI IDirectMusic8Impl_EnumPort(LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_PORTCAPS port_caps) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); -/* it seems that the rest of devices are obtained thru dmusic32.EnumLegacyDevices...*sigh*...which is undocumented*/ -#if 0 - int numMIDI = midiOutGetNumDevs(); - int numWAVE = waveOutGetNumDevs(); - int i; - /* then return digital sound ports */ - for (i = 1; i <= numWAVE; i++) - { - TRACE("enumerating 'digital sound' ports\n"); - if (i == dwIndex) - { - DirectSoundEnumerateA(register_waveport, pPortCaps); - return S_OK; - } - } - /* finally, list all *real* MIDI ports*/ - for (i = numWAVE + 1; i <= numWAVE + numMIDI; i++) - { - TRACE("enumerating 'real MIDI' ports\n"); - if (i == dwIndex) - FIXME("Found MIDI port, but *real* MIDI ports not supported yet\n"); - } -#endif - return S_FALSE; + TRACE("(%p, %d, %p)\n", This, index, port_caps); + + if (!port_caps) + return E_POINTER; + + if (index >= This->nb_system_ports) + return S_FALSE; + + *port_caps = This->system_ports[index].caps; + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer (LPDIRECTMUSIC8 iface, LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER** ppBuffer, LPUNKNOWN pUnkOuter) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; +static HRESULT WINAPI IDirectMusic8Impl_CreateMusicBuffer(LPDIRECTMUSIC8 iface, LPDMUS_BUFFERDESC buffer_desc, LPDIRECTMUSICBUFFER* buffer, LPUNKNOWN unkouter) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); - TRACE("(%p, %p, %p, %p)\n", This, pBufferDesc, ppBuffer, pUnkOuter); + TRACE("(%p)->(%p, %p, %p)\n", This, buffer_desc, buffer, unkouter); - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; + if (unkouter) + return CLASS_E_NOAGGREGATION; - if (!pBufferDesc || !ppBuffer) - return E_POINTER; + if (!buffer_desc || !buffer) + return E_POINTER; - return DMUSIC_CreateDirectMusicBufferImpl(&IID_IDirectMusicBuffer, (LPVOID)ppBuffer, NULL); + return DMUSIC_CreateDirectMusicBufferImpl(buffer_desc, (LPVOID)buffer); } -static HRESULT WINAPI IDirectMusic8Impl_CreatePort (LPDIRECTMUSIC8 iface, REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT* ppPort, LPUNKNOWN pUnkOuter) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - int i/*, j*/; - DMUS_PORTCAPS PortCaps; - IDirectMusicPort* pNewPort = NULL; - HRESULT hr = E_FAIL; +static HRESULT WINAPI IDirectMusic8Impl_CreatePort(LPDIRECTMUSIC8 iface, REFCLSID rclsid_port, LPDMUS_PORTPARAMS port_params, LPDIRECTMUSICPORT* port, LPUNKNOWN unkouter) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + int i; + DMUS_PORTCAPS port_caps; + IDirectMusicPort* new_port = NULL; + HRESULT hr; + GUID default_port; + const GUID *request_port = rclsid_port; - TRACE("(%p, %s, %p, %p, %p)\n", This, debugstr_dmguid(rclsidPort), pPortParams, ppPort, pUnkOuter); - ZeroMemory(&PortCaps, sizeof(DMUS_PORTCAPS)); - PortCaps.dwSize = sizeof(DMUS_PORTCAPS); + TRACE("(%p)->(%s, %p, %p, %p)\n", This, debugstr_dmguid(rclsid_port), port_params, port, unkouter); - for (i = 0; S_FALSE != IDirectMusic8Impl_EnumPort(iface, i, &PortCaps); i++) { - if (IsEqualCLSID (rclsidPort, &PortCaps.guidPort)) { - hr = DMUSIC_CreateDirectMusicPortImpl(&IID_IDirectMusicPort, (LPVOID*) &pNewPort, (LPUNKNOWN) This, pPortParams, &PortCaps); - if (FAILED(hr)) { - *ppPort = NULL; - return hr; - } - This->nrofports++; - if (!This->ppPorts) This->ppPorts = HeapAlloc(GetProcessHeap(), 0, sizeof(LPDIRECTMUSICPORT) * This->nrofports); - else This->ppPorts = HeapReAlloc(GetProcessHeap(), 0, This->ppPorts, sizeof(LPDIRECTMUSICPORT) * This->nrofports); - This->ppPorts[This->nrofports - 1] = pNewPort; - *ppPort = pNewPort; - return S_OK; - } - } - /* FIXME: place correct error here */ - return E_NOINTERFACE; + if (!rclsid_port) + return E_POINTER; + if (!port_params) + return E_INVALIDARG; + if (!port) + return E_POINTER; + if (unkouter) + return CLASS_E_NOAGGREGATION; + + if (TRACE_ON(dmusic)) + dump_DMUS_PORTPARAMS(port_params); + + ZeroMemory(&port_caps, sizeof(DMUS_PORTCAPS)); + port_caps.dwSize = sizeof(DMUS_PORTCAPS); + + if (IsEqualGUID(request_port, &GUID_NULL)) { + hr = IDirectMusic8_GetDefaultPort(iface, &default_port); + if(FAILED(hr)) + return hr; + request_port = &default_port; + } + + for (i = 0; S_FALSE != IDirectMusic8Impl_EnumPort(iface, i, &port_caps); i++) { + if (IsEqualCLSID(request_port, &port_caps.guidPort)) { + hr = This->system_ports[i].create(&IID_IDirectMusicPort, (LPVOID*)&new_port, (LPUNKNOWN)This, port_params, &port_caps, This->system_ports[i].device); + if (FAILED(hr)) { + *port = NULL; + return hr; + } + This->nrofports++; + if (!This->ppPorts) + This->ppPorts = HeapAlloc(GetProcessHeap(), 0, sizeof(LPDIRECTMUSICPORT) * This->nrofports); + else + This->ppPorts = HeapReAlloc(GetProcessHeap(), 0, This->ppPorts, sizeof(LPDIRECTMUSICPORT) * This->nrofports); + This->ppPorts[This->nrofports - 1] = new_port; + *port = new_port; + return S_OK; + } + } + + return E_NOINTERFACE; } -static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock (LPDIRECTMUSIC8 iface, DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - FIXME("(%p, %d, %p): stub\n", This, dwIndex, lpClockInfo); - return S_FALSE; +static HRESULT WINAPI IDirectMusic8Impl_EnumMasterClock(LPDIRECTMUSIC8 iface, DWORD index, LPDMUS_CLOCKINFO clock_info) +{ + TRACE("(%p)->(%d, %p)\n", iface, index, clock_info); + + if (!clock_info) + return E_POINTER; + + if (index > 1) + return S_FALSE; + + if (!index) + { + static const GUID guid_system_clock = { 0x58d58419, 0x71b4, 0x11d1, { 0xa7, 0x4c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12 } }; + static const WCHAR name_system_clock[] = { 'S','y','s','t','e','m',' ','C','l','o','c','k',0 }; + + clock_info->ctType = 0; + clock_info->guidClock = guid_system_clock; + strcpyW(clock_info->wszDescription, name_system_clock); + } + else + { + static const GUID guid_dsound_clock = { 0x58d58420, 0x71b4, 0x11d1, { 0xa7, 0x4c, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12 } }; + static const WCHAR name_dsound_clock[] = { 'D','i','r','e','c','t','S','o','u','n','d',' ','C','l','o','c','k',0 }; + + clock_info->ctType = 0; + clock_info->guidClock = guid_dsound_clock; + strcpyW(clock_info->wszDescription, name_dsound_clock); + } + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_GetMasterClock (LPDIRECTMUSIC8 iface, LPGUID pguidClock, IReferenceClock** ppReferenceClock) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; +static HRESULT WINAPI IDirectMusic8Impl_GetMasterClock(LPDIRECTMUSIC8 iface, LPGUID guid_clock, IReferenceClock** reference_clock) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); - TRACE("(%p, %p, %p)\n", This, pguidClock, ppReferenceClock); - if (pguidClock) - *pguidClock = This->pMasterClock->pClockInfo.guidClock; - if(ppReferenceClock) - *ppReferenceClock = (IReferenceClock *)This->pMasterClock; + TRACE("(%p)->(%p, %p)\n", This, guid_clock, reference_clock); - return S_OK; + if (guid_clock) + *guid_clock = This->pMasterClock->pClockInfo.guidClock; + if (reference_clock) + *reference_clock = (IReferenceClock*)This->pMasterClock; + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_SetMasterClock (LPDIRECTMUSIC8 iface, REFGUID rguidClock) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - FIXME("(%p, %s): stub\n", This, debugstr_dmguid(rguidClock)); - return S_OK; +static HRESULT WINAPI IDirectMusic8Impl_SetMasterClock(LPDIRECTMUSIC8 iface, REFGUID rguidClock) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + + FIXME("(%p)->(%s): stub\n", This, debugstr_dmguid(rguidClock)); + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_Activate (LPDIRECTMUSIC8 iface, BOOL fEnable) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - int i; - - FIXME("(%p, %d): stub\n", This, fEnable); - for (i = 0; i < This->nrofports; i++) { - IDirectMusicPortImpl_Activate(This->ppPorts[i], fEnable); - } - - return S_OK; +static HRESULT WINAPI IDirectMusic8Impl_Activate(LPDIRECTMUSIC8 iface, BOOL enable) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + int i; + HRESULT hr; + + TRACE("(%p)->(%u)\n", This, enable); + + for (i = 0; i < This->nrofports; i++) + { + hr = IDirectMusicPort_Activate(This->ppPorts[i], enable); + if (FAILED(hr)) + return hr; + } + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort (LPDIRECTMUSIC8 iface, LPGUID pguidPort) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - HKEY hkGUID; - DWORD returnTypeGUID, sizeOfReturnBuffer = 50; - char returnBuffer[51]; - GUID defaultPortGUID; - WCHAR buff[51]; +static HRESULT WINAPI IDirectMusic8Impl_GetDefaultPort(LPDIRECTMUSIC8 iface, LPGUID guid_port) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + HKEY hkGUID; + DWORD returnTypeGUID, sizeOfReturnBuffer = 50; + char returnBuffer[51]; + GUID defaultPortGUID; + WCHAR buff[51]; - TRACE("(%p, %p)\n", This, pguidPort); - if ((RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\DirectMusic\\Defaults" , 0, KEY_READ, &hkGUID) != ERROR_SUCCESS) || - (RegQueryValueExA(hkGUID, "DefaultOutputPort", NULL, &returnTypeGUID, (LPBYTE)returnBuffer, &sizeOfReturnBuffer) != ERROR_SUCCESS)) - { - WARN(": registry entry missing\n" ); - *pguidPort = CLSID_DirectMusicSynth; - return S_OK; - } - /* FIXME: Check return types to ensure we're interpreting data right */ - MultiByteToWideChar(CP_ACP, 0, returnBuffer, -1, buff, sizeof(buff) / sizeof(WCHAR)); - CLSIDFromString(buff, &defaultPortGUID); - *pguidPort = defaultPortGUID; - - return S_OK; + TRACE("(%p)->(%p)\n", This, guid_port); + + if ((RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\DirectMusic\\Defaults" , 0, KEY_READ, &hkGUID) != ERROR_SUCCESS) || + (RegQueryValueExA(hkGUID, "DefaultOutputPort", NULL, &returnTypeGUID, (LPBYTE)returnBuffer, &sizeOfReturnBuffer) != ERROR_SUCCESS)) + { + WARN(": registry entry missing\n" ); + *guid_port = CLSID_DirectMusicSynth; + return S_OK; + } + /* FIXME: Check return types to ensure we're interpreting data right */ + MultiByteToWideChar(CP_ACP, 0, returnBuffer, -1, buff, sizeof(buff) / sizeof(WCHAR)); + CLSIDFromString(buff, &defaultPortGUID); + *guid_port = defaultPortGUID; + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_SetDirectSound (LPDIRECTMUSIC8 iface, LPDIRECTSOUND pDirectSound, HWND hWnd) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - FIXME("(%p, %p, %p): stub\n", This, pDirectSound, hWnd); - return S_OK; +static HRESULT WINAPI IDirectMusic8Impl_SetDirectSound(LPDIRECTMUSIC8 iface, LPDIRECTSOUND dsound, HWND wnd) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + + FIXME("(%p)->(%p, %p): stub\n", This, dsound, wnd); + + return S_OK; } -static HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock (LPDIRECTMUSIC8 iface, IReferenceClock* pClock) { - IDirectMusic8Impl *This = (IDirectMusic8Impl *)iface; - FIXME("(%p, %p): stub\n", This, pClock); - return S_OK; +static HRESULT WINAPI IDirectMusic8Impl_SetExternalMasterClock(LPDIRECTMUSIC8 iface, IReferenceClock* clock) +{ + IDirectMusic8Impl *This = impl_from_IDirectMusic8(iface); + + FIXME("(%p)->(%p): stub\n", This, clock); + + return S_OK; } static const IDirectMusic8Vtbl DirectMusic8_Vtbl = { - IDirectMusic8Impl_QueryInterface, - IDirectMusic8Impl_AddRef, - IDirectMusic8Impl_Release, - IDirectMusic8Impl_EnumPort, - IDirectMusic8Impl_CreateMusicBuffer, - IDirectMusic8Impl_CreatePort, - IDirectMusic8Impl_EnumMasterClock, - IDirectMusic8Impl_GetMasterClock, - IDirectMusic8Impl_SetMasterClock, - IDirectMusic8Impl_Activate, - IDirectMusic8Impl_GetDefaultPort, - IDirectMusic8Impl_SetDirectSound, - IDirectMusic8Impl_SetExternalMasterClock + IDirectMusic8Impl_QueryInterface, + IDirectMusic8Impl_AddRef, + IDirectMusic8Impl_Release, + IDirectMusic8Impl_EnumPort, + IDirectMusic8Impl_CreateMusicBuffer, + IDirectMusic8Impl_CreatePort, + IDirectMusic8Impl_EnumMasterClock, + IDirectMusic8Impl_GetMasterClock, + IDirectMusic8Impl_SetMasterClock, + IDirectMusic8Impl_Activate, + IDirectMusic8Impl_GetDefaultPort, + IDirectMusic8Impl_SetDirectSound, + IDirectMusic8Impl_SetExternalMasterClock }; -/* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { - IDirectMusic8Impl *dmusic; +static void create_system_ports_list(IDirectMusic8Impl* object) +{ + port_info * port; + const WCHAR emulated[] = {' ','[','E','m','u','l','a','t','e','d',']',0}; + ULONG nb_ports; + ULONG nb_midi_out; + ULONG nb_midi_in; + MIDIOUTCAPSW caps_out; + MIDIINCAPSW caps_in; + IDirectMusicSynth8* synth; + HRESULT hr; + ULONG i; - TRACE("(%p,%p,%p)\n",lpcGUID, ppobj, pUnkOuter); + TRACE("(%p)\n", object); - dmusic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusic8Impl)); - if (NULL == dmusic) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - dmusic->lpVtbl = &DirectMusic8_Vtbl; - dmusic->ref = 0; /* will be inited with QueryInterface */ - dmusic->pMasterClock = NULL; - dmusic->ppPorts = NULL; - dmusic->nrofports = 0; - DMUSIC_CreateReferenceClockImpl (&IID_IReferenceClock, (LPVOID*)&dmusic->pMasterClock, NULL); - - return IDirectMusic8Impl_QueryInterface ((LPDIRECTMUSIC8)dmusic, lpcGUID, ppobj); + /* NOTE: + - it seems some native versions get the rest of devices through dmusic32.EnumLegacyDevices...*sigh*...which is undocumented + - should we enum wave devices ? Native does not seem to + */ + + nb_midi_out = midiOutGetNumDevs(); + nb_midi_in = midiInGetNumDevs(); + nb_ports = 1 /* midi mapper */ + nb_midi_out + nb_midi_in + 1 /* synth port */; + + port = object->system_ports = HeapAlloc(GetProcessHeap(), 0, nb_ports * sizeof(port_info)); + if (!object->system_ports) + return; + + /* Fill common port caps for all winmm ports */ + for (i = 0; i < (nb_ports - 1 /* synth port*/); i++) + { + object->system_ports[i].caps.dwSize = sizeof(DMUS_PORTCAPS); + object->system_ports[i].caps.dwType = DMUS_PORT_WINMM_DRIVER; + object->system_ports[i].caps.dwMemorySize = 0; + object->system_ports[i].caps.dwMaxChannelGroups = 1; + object->system_ports[i].caps.dwMaxVoices = 0; + object->system_ports[i].caps.dwMaxAudioChannels = 0; + object->system_ports[i].caps.dwEffectFlags = DMUS_EFFECT_NONE; + /* Fake port GUID */ + object->system_ports[i].caps.guidPort = IID_IUnknown; + object->system_ports[i].caps.guidPort.Data1 = i + 1; + } + + /* Fill midi mapper port info */ + port->device = MIDI_MAPPER; + port->create = DMUSIC_CreateMidiOutPortImpl; + midiOutGetDevCapsW(MIDI_MAPPER, &caps_out, sizeof(caps_out)); + strcpyW(port->caps.wszDescription, caps_out.szPname); + strcatW(port->caps.wszDescription, emulated); + port->caps.dwFlags = DMUS_PC_SHAREABLE; + port->caps.dwClass = DMUS_PC_OUTPUTCLASS; + port++; + + /* Fill midi out port info */ + for (i = 0; i < nb_midi_out; i++) + { + port->device = i; + port->create = DMUSIC_CreateMidiOutPortImpl; + midiOutGetDevCapsW(i, &caps_out, sizeof(caps_out)); + strcpyW(port->caps.wszDescription, caps_out.szPname); + strcatW(port->caps.wszDescription, emulated); + port->caps.dwFlags = DMUS_PC_SHAREABLE | DMUS_PC_EXTERNAL; + port->caps.dwClass = DMUS_PC_OUTPUTCLASS; + port++; + } + + /* Fill midi in port info */ + for (i = 0; i < nb_midi_in; i++) + { + port->device = i; + port->create = DMUSIC_CreateMidiInPortImpl; + midiInGetDevCapsW(i, &caps_in, sizeof(caps_in)); + strcpyW(port->caps.wszDescription, caps_in.szPname); + strcatW(port->caps.wszDescription, emulated); + port->caps.dwFlags = DMUS_PC_EXTERNAL; + port->caps.dwClass = DMUS_PC_INPUTCLASS; + port++; + } + + /* Fill synth port info */ + port->create = DMUSIC_CreateSynthPortImpl; + hr = CoCreateInstance(&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth8, (void**)&synth); + if (SUCCEEDED(hr)) + { + port->caps.dwSize = sizeof(port->caps); + hr = IDirectMusicSynth8_GetPortCaps(synth, &port->caps); + IDirectMusicSynth8_Release(synth); + } + if (FAILED(hr)) + nb_ports--; + + object->nb_system_ports = nb_ports; +} + +/* For ClassFactory */ +HRESULT WINAPI DMUSIC_CreateDirectMusicImpl(LPCGUID riid, LPVOID* ret_iface, LPUNKNOWN unkouter) +{ + IDirectMusic8Impl *dmusic; + HRESULT ret; + + TRACE("(%p,%p,%p)\n", riid, ret_iface, unkouter); + + *ret_iface = NULL; + + dmusic = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusic8Impl)); + if (!dmusic) + return E_OUTOFMEMORY; + + dmusic->IDirectMusic8_iface.lpVtbl = &DirectMusic8_Vtbl; + dmusic->ref = 0; /* Will be inited by QueryInterface */ + dmusic->pMasterClock = NULL; + dmusic->ppPorts = NULL; + dmusic->nrofports = 0; + ret = DMUSIC_CreateReferenceClockImpl(&IID_IReferenceClock, (LPVOID*)&dmusic->pMasterClock, NULL); + if (FAILED(ret)) { + HeapFree(GetProcessHeap(), 0, dmusic); + return ret; + } + + ret = IDirectMusic8Impl_QueryInterface(&dmusic->IDirectMusic8_iface, riid, ret_iface); + if (FAILED(ret)) { + IReferenceClock_Release(&dmusic->pMasterClock->IReferenceClock_iface); + HeapFree(GetProcessHeap(), 0, dmusic); + return ret; + } + + create_system_ports_list(dmusic); + + return S_OK; } diff --git a/reactos/dll/directx/dmusic/dmusic.idl b/reactos/dll/directx/dmusic/dmusic.idl new file mode 100644 index 00000000000..efa0b9652b1 --- /dev/null +++ b/reactos/dll/directx/dmusic/dmusic.idl @@ -0,0 +1,35 @@ +/* + * COM Classes for dmusic + * + * Copyright 2010 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + threading(both), + progid("Microsoft.DirectMusic.1"), + vi_progid("Microsoft.DirectMusic"), + uuid(636b9f10-0c7d-11d1-95b2-0020afdc7421) +] +coclass DirectMusic { interface IDirectMusic; } + +[ + threading(both), + progid("Microsoft.DirectMusicCollection.1"), + vi_progid("Microsoft.DirectMusicCollection"), + uuid(480ff4b0-28b2-11d1-bef7-00c04fbf8fef) +] +coclass DirectMusicCollection { interface IDirectMusicCollection; } diff --git a/reactos/dll/directx/dmusic/dmusic.rgs b/reactos/dll/directx/dmusic/dmusic.rgs new file mode 100644 index 00000000000..9fc408399b2 --- /dev/null +++ b/reactos/dll/directx/dmusic/dmusic.rgs @@ -0,0 +1,39 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{636B9F10-0C7D-11D1-95B2-0020AFDC7421}' = s 'DirectMusic' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'Microsoft.DirectMusic.1' + VersionIndependentProgId = s 'Microsoft.DirectMusic' + } + '{480FF4B0-28B2-11D1-BEF7-00C04FBF8FEF}' = s 'DirectMusicCollection' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'Microsoft.DirectMusicCollection.1' + VersionIndependentProgId = s 'Microsoft.DirectMusicCollection' + } + } + 'Microsoft.DirectMusic.1' = s 'DirectMusic' + { + CLSID = s '{636B9F10-0C7D-11D1-95B2-0020AFDC7421}' + } + 'Microsoft.DirectMusic' = s 'DirectMusic' + { + CLSID = s '{636B9F10-0C7D-11D1-95B2-0020AFDC7421}' + CurVer = s 'Microsoft.DirectMusic.1' + } + 'Microsoft.DirectMusicCollection.1' = s 'DirectMusicCollection' + { + CLSID = s '{480FF4B0-28B2-11D1-BEF7-00C04FBF8FEF}' + } + 'Microsoft.DirectMusicCollection' = s 'DirectMusicCollection' + { + CLSID = s '{480FF4B0-28B2-11D1-BEF7-00C04FBF8FEF}' + CurVer = s 'Microsoft.DirectMusicCollection.1' + } +} diff --git a/reactos/dll/directx/dmusic/dmusic_main.c b/reactos/dll/directx/dmusic/dmusic_main.c index f8e901494f3..6ad4ed5c059 100644 --- a/reactos/dll/directx/dmusic/dmusic_main.c +++ b/reactos/dll/directx/dmusic/dmusic_main.c @@ -23,112 +23,93 @@ #include <stdio.h> #include "dmusic_private.h" +#include "rpcproxy.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); +static HINSTANCE instance; LONG DMUSIC_refCount = 0; typedef struct { - const IClassFactoryVtbl *lpVtbl; + IClassFactory IClassFactory_iface; + HRESULT (WINAPI *fnCreateInstance)(REFIID riid, void **ppv, IUnknown *pUnkOuter); } IClassFactoryImpl; /****************************************************************** - * DirectMusic ClassFactory + * IClassFactory implementation */ -static HRESULT WINAPI DirectMusicCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { - FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); - - if (ppobj == NULL) return E_POINTER; - - return E_NOINTERFACE; +static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface); } -static ULONG WINAPI DirectMusicCF_AddRef(LPCLASSFACTORY iface) { - DMUSIC_LockModule(); +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + if (ppv == NULL) + return E_POINTER; - return 2; /* non-heap based object */ + if (IsEqualGUID(&IID_IUnknown, riid)) + TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv); + else if (IsEqualGUID(&IID_IClassFactory, riid)) + TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv); + else { + FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + *ppv = iface; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; } -static ULONG WINAPI DirectMusicCF_Release(LPCLASSFACTORY iface) { - DMUSIC_UnlockModule(); +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + DMUSIC_LockModule(); - return 1; /* non-heap based object */ + return 2; /* non-heap based object */ } -static HRESULT WINAPI DirectMusicCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { - TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); - return DMUSIC_CreateDirectMusicImpl (riid, ppobj, pOuter); +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + DMUSIC_UnlockModule(); + + return 1; /* non-heap based object */ } -static HRESULT WINAPI DirectMusicCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { - TRACE("(%d)\n", dolock); +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter, + REFIID riid, void **ppv) +{ + IClassFactoryImpl *This = impl_from_IClassFactory(iface); - if (dolock) - DMUSIC_LockModule(); - else - DMUSIC_UnlockModule(); - - return S_OK; + TRACE ("(%p, %s, %p)\n", pUnkOuter, debugstr_dmguid(riid), ppv); + + return This->fnCreateInstance(riid, ppv, pUnkOuter); } -static const IClassFactoryVtbl DirectMusicCF_Vtbl = { - DirectMusicCF_QueryInterface, - DirectMusicCF_AddRef, - DirectMusicCF_Release, - DirectMusicCF_CreateInstance, - DirectMusicCF_LockServer +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock) +{ + TRACE("(%d)\n", dolock); + + if (dolock) + DMUSIC_LockModule(); + else + DMUSIC_UnlockModule(); + + return S_OK; +} + +static const IClassFactoryVtbl classfactory_vtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + ClassFactory_CreateInstance, + ClassFactory_LockServer }; -static IClassFactoryImpl DirectMusic_CF = {&DirectMusicCF_Vtbl}; - -/****************************************************************** - * DirectMusicCollection ClassFactory - */ -static HRESULT WINAPI CollectionCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { - FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid)); - - if (ppobj == NULL) return E_POINTER; - - return E_NOINTERFACE; -} - -static ULONG WINAPI CollectionCF_AddRef(LPCLASSFACTORY iface) { - DMUSIC_LockModule(); - - return 2; /* non-heap based object */ -} - -static ULONG WINAPI CollectionCF_Release(LPCLASSFACTORY iface) { - DMUSIC_UnlockModule(); - - return 1; /* non-heap based object */ -} - -static HRESULT WINAPI CollectionCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { - TRACE ("(%p, %s, %p)\n", pOuter, debugstr_dmguid(riid), ppobj); - return DMUSIC_CreateDirectMusicCollectionImpl (riid, ppobj, pOuter); -} - -static HRESULT WINAPI CollectionCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) { - TRACE("(%d)\n", dolock); - - if (dolock) - DMUSIC_LockModule(); - else - DMUSIC_UnlockModule(); - - return S_OK; -} - -static const IClassFactoryVtbl CollectionCF_Vtbl = { - CollectionCF_QueryInterface, - CollectionCF_AddRef, - CollectionCF_Release, - CollectionCF_CreateInstance, - CollectionCF_LockServer -}; - -static IClassFactoryImpl Collection_CF = {&CollectionCF_Vtbl}; +static IClassFactoryImpl DirectMusic_CF = {{&classfactory_vtbl}, DMUSIC_CreateDirectMusicImpl}; +static IClassFactoryImpl Collection_CF = {{&classfactory_vtbl}, + DMUSIC_CreateDirectMusicCollectionImpl}; /****************************************************************** * DllMain @@ -137,6 +118,7 @@ static IClassFactoryImpl Collection_CF = {&CollectionCF_Vtbl}; */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { + instance = hinstDLL; DisableThreadLibraryCalls(hinstDLL); /* FIXME: Initialisation */ } else if (fdwReason == DLL_PROCESS_DETACH) { @@ -180,6 +162,21 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) return CLASS_E_CLASSNOTAVAILABLE; } +/*********************************************************************** + * DllRegisterServer (DMUSIC.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (DMUSIC.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} /****************************************************************** * Helper functions @@ -187,7 +184,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) * */ /* dwPatch from MIDILOCALE */ -DWORD MIDILOCALE2Patch (LPMIDILOCALE pLocale) { +DWORD MIDILOCALE2Patch (const MIDILOCALE *pLocale) { DWORD dwPatch = 0; if (!pLocale) return 0; dwPatch |= (pLocale->ulBank & F_INSTRUMENT_DRUMS); /* set drum bit */ @@ -449,27 +446,48 @@ static const char *debugstr_DMUS_OBJ_FLAGS (DWORD flagmask) { return debugstr_flags (flagmask, flags, sizeof(flags)/sizeof(flags[0])); } -/* dump whole DMUS_OBJECTDESC struct */ -const char *debugstr_DMUS_OBJECTDESC (LPDMUS_OBJECTDESC pDesc) { - if (pDesc) { - char buffer[1024] = "", *ptr = &buffer[0]; - - ptr += sprintf(ptr, "DMUS_OBJECTDESC (%p):\n", pDesc); - ptr += sprintf(ptr, " - dwSize = %d\n", pDesc->dwSize); - ptr += sprintf(ptr, " - dwValidData = %s\n", debugstr_DMUS_OBJ_FLAGS (pDesc->dwValidData)); - if (pDesc->dwValidData & DMUS_OBJ_CLASS) ptr += sprintf(ptr, " - guidClass = %s\n", debugstr_dmguid(&pDesc->guidClass)); - if (pDesc->dwValidData & DMUS_OBJ_OBJECT) ptr += sprintf(ptr, " - guidObject = %s\n", debugstr_guid(&pDesc->guidObject)); - if (pDesc->dwValidData & DMUS_OBJ_DATE) ptr += sprintf(ptr, " - ftDate = FIXME\n"); - if (pDesc->dwValidData & DMUS_OBJ_VERSION) ptr += sprintf(ptr, " - vVersion = %s\n", debugstr_dmversion(&pDesc->vVersion)); - if (pDesc->dwValidData & DMUS_OBJ_NAME) ptr += sprintf(ptr, " - wszName = %s\n", debugstr_w(pDesc->wszName)); - if (pDesc->dwValidData & DMUS_OBJ_CATEGORY) ptr += sprintf(ptr, " - wszCategory = %s\n", debugstr_w(pDesc->wszCategory)); - if (pDesc->dwValidData & DMUS_OBJ_FILENAME) ptr += sprintf(ptr, " - wszFileName = %s\n", debugstr_w(pDesc->wszFileName)); - if (pDesc->dwValidData & DMUS_OBJ_MEMORY) ptr += sprintf(ptr, " - llMemLength = 0x%s\n - pbMemData = %p\n", - wine_dbgstr_longlong(pDesc->llMemLength), pDesc->pbMemData); - if (pDesc->dwValidData & DMUS_OBJ_STREAM) ptr += sprintf(ptr, " - pStream = %p", pDesc->pStream); - - return wine_dbg_sprintf("%s", buffer); - } else { - return wine_dbg_sprintf("(NULL)"); - } +/* Dump whole DMUS_OBJECTDESC struct */ +void dump_DMUS_OBJECTDESC(LPDMUS_OBJECTDESC desc) +{ + TRACE("DMUS_OBJECTDESC (%p):\n", desc); + TRACE(" - dwSize = %d\n", desc->dwSize); + TRACE(" - dwValidData = %s\n", debugstr_DMUS_OBJ_FLAGS (desc->dwValidData)); + if (desc->dwValidData & DMUS_OBJ_CLASS) TRACE(" - guidClass = %s\n", debugstr_dmguid(&desc->guidClass)); + if (desc->dwValidData & DMUS_OBJ_OBJECT) TRACE(" - guidObject = %s\n", debugstr_guid(&desc->guidObject)); + if (desc->dwValidData & DMUS_OBJ_DATE) TRACE(" - ftDate = FIXME\n"); + if (desc->dwValidData & DMUS_OBJ_VERSION) TRACE(" - vVersion = %s\n", debugstr_dmversion(&desc->vVersion)); + if (desc->dwValidData & DMUS_OBJ_NAME) TRACE(" - wszName = %s\n", debugstr_w(desc->wszName)); + if (desc->dwValidData & DMUS_OBJ_CATEGORY) TRACE(" - wszCategory = %s\n", debugstr_w(desc->wszCategory)); + if (desc->dwValidData & DMUS_OBJ_FILENAME) TRACE(" - wszFileName = %s\n", debugstr_w(desc->wszFileName)); + if (desc->dwValidData & DMUS_OBJ_MEMORY) TRACE(" - llMemLength = 0x%s\n - pbMemData = %p\n", + wine_dbgstr_longlong(desc->llMemLength), desc->pbMemData); + if (desc->dwValidData & DMUS_OBJ_STREAM) TRACE(" - pStream = %p\n", desc->pStream); +} + +/* Dump DMUS_PORTPARAMS flags */ +static const char* debugstr_DMUS_PORTPARAMS_FLAGS(DWORD flagmask) +{ + static const flag_info flags[] = { + FE(DMUS_PORTPARAMS_VOICES), + FE(DMUS_PORTPARAMS_CHANNELGROUPS), + FE(DMUS_PORTPARAMS_AUDIOCHANNELS), + FE(DMUS_PORTPARAMS_SAMPLERATE), + FE(DMUS_PORTPARAMS_EFFECTS), + FE(DMUS_PORTPARAMS_SHARE) + }; + return debugstr_flags(flagmask, flags, sizeof(flags)/sizeof(flags[0])); +} + +/* Dump whole DMUS_PORTPARAMS struct */ +void dump_DMUS_PORTPARAMS(LPDMUS_PORTPARAMS params) +{ + TRACE("DMUS_PORTPARAMS (%p):\n", params); + TRACE(" - dwSize = %d\n", params->dwSize); + TRACE(" - dwValidParams = %s\n", debugstr_DMUS_PORTPARAMS_FLAGS(params->dwValidParams)); + if (params->dwValidParams & DMUS_PORTPARAMS_VOICES) TRACE(" - dwVoices = %u\n", params->dwVoices); + if (params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS) TRACE(" - dwChannelGroup = %u\n", params->dwChannelGroups); + if (params->dwValidParams & DMUS_PORTPARAMS_AUDIOCHANNELS) TRACE(" - dwAudioChannels = %u\n", params->dwAudioChannels); + if (params->dwValidParams & DMUS_PORTPARAMS_SAMPLERATE) TRACE(" - dwSampleRate = %u\n", params->dwSampleRate); + if (params->dwValidParams & DMUS_PORTPARAMS_EFFECTS) TRACE(" - dwEffectFlags = %x\n", params->dwEffectFlags); + if (params->dwValidParams & DMUS_PORTPARAMS_SHARE) TRACE(" - fShare = %u\n", params->fShare); } diff --git a/reactos/dll/directx/dmusic/dmusic_private.h b/reactos/dll/directx/dmusic/dmusic_private.h index 54340655a96..efb70c6e4e8 100644 --- a/reactos/dll/directx/dmusic/dmusic_private.h +++ b/reactos/dll/directx/dmusic/dmusic_private.h @@ -1,6 +1,8 @@ -/* DirectMusic Private Include +/* + * DirectMusic Private Include * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -50,14 +52,12 @@ typedef struct IDirectMusic8Impl IDirectMusic8Impl; typedef struct IDirectMusicBufferImpl IDirectMusicBufferImpl; typedef struct IDirectMusicDownloadedInstrumentImpl IDirectMusicDownloadedInstrumentImpl; typedef struct IDirectMusicDownloadImpl IDirectMusicDownloadImpl; -typedef struct IDirectMusicPortDownloadImpl IDirectMusicPortDownloadImpl; -typedef struct IDirectMusicPortImpl IDirectMusicPortImpl; -typedef struct IDirectMusicThruImpl IDirectMusicThruImpl; typedef struct IReferenceClockImpl IReferenceClockImpl; typedef struct IDirectMusicCollectionImpl IDirectMusicCollectionImpl; typedef struct IDirectMusicInstrumentImpl IDirectMusicInstrumentImpl; +typedef struct SynthPortImpl SynthPortImpl; /***************************************************************************** * Some stuff to make my life easier :=) @@ -74,102 +74,133 @@ typedef struct DMUSIC_PRIVATE_CHANNEL_GROUP_ { DMUSIC_PRIVATE_MCHANNEL channel[16]; /* 16 channels in a group */ } DMUSIC_PRIVATE_CHANNEL_GROUP, *LPDMUSIC_PRIVATE_CHANNEL_GROUP; +typedef struct port_info { + DMUS_PORTCAPS caps; + HRESULT (*create)(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device); + ULONG device; +} port_info; + +typedef struct instrument_region { + RGNHEADER header; + WAVELINK wave_link; + WSMPL wave_sample; + WLOOP wave_loop; + BOOL loop_present; +} instrument_region; + +typedef struct instrument_articulation { + CONNECTIONLIST connections_list; + CONNECTION *connections; +} instrument_articulation; /***************************************************************************** * ClassFactory */ -extern HRESULT WINAPI DMUSIC_CreateDirectMusicImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateDirectMusicBufferImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadedInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateReferenceClockImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter); +/* CLSID */ +extern HRESULT WINAPI DMUSIC_CreateDirectMusicImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN; +extern HRESULT WINAPI DMUSIC_CreateDirectMusicCollectionImpl(LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN; + +/* Internal */ +extern HRESULT DMUSIC_CreateDirectMusicBufferImpl(LPDMUS_BUFFERDESC desc, LPVOID* ret_iface) DECLSPEC_HIDDEN; +extern HRESULT DMUSIC_CreateDirectMusicDownloadImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN; +extern HRESULT DMUSIC_CreateReferenceClockImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN; +extern HRESULT DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN; /***************************************************************************** * IDirectMusic8Impl implementation structure */ struct IDirectMusic8Impl { - /* IUnknown fields */ - const IDirectMusic8Vtbl *lpVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusic8 IDirectMusic8_iface; + LONG ref; - /* IDirectMusicImpl fields */ - IReferenceClockImpl* pMasterClock; - IDirectMusicPort** ppPorts; - int nrofports; + /* IDirectMusicImpl fields */ + IReferenceClockImpl* pMasterClock; + IDirectMusicPort** ppPorts; + int nrofports; + port_info* system_ports; + int nb_system_ports; }; /***************************************************************************** * IDirectMusicBufferImpl implementation structure */ struct IDirectMusicBufferImpl { - /* IUnknown fields */ - const IDirectMusicBufferVtbl *lpVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusicBuffer IDirectMusicBuffer_iface; + LONG ref; - /* IDirectMusicBufferImpl fields */ + /* IDirectMusicBufferImpl fields */ + GUID format; + DWORD size; + LPBYTE data; + DWORD write_pos; + REFERENCE_TIME start_time; }; /***************************************************************************** * IDirectMusicDownloadedInstrumentImpl implementation structure */ struct IDirectMusicDownloadedInstrumentImpl { - /* IUnknown fields */ - const IDirectMusicDownloadedInstrumentVtbl *lpVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusicDownloadedInstrument IDirectMusicDownloadedInstrument_iface; + LONG ref; - /* IDirectMusicDownloadedInstrumentImpl fields */ + /* IDirectMusicDownloadedInstrumentImpl fields */ + BOOL downloaded; + void *data; }; /***************************************************************************** * IDirectMusicDownloadImpl implementation structure */ struct IDirectMusicDownloadImpl { - /* IUnknown fields */ - const IDirectMusicDownloadVtbl *lpVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusicDownload IDirectMusicDownload_iface; + LONG ref; - /* IDirectMusicDownloadImpl fields */ + /* IDirectMusicDownloadImpl fields */ }; /***************************************************************************** - * IDirectMusicPortImpl implementation structure + * SynthPortImpl implementation structure */ -struct IDirectMusicPortImpl { - /* IUnknown fields */ - const IDirectMusicPortVtbl *lpVtbl; - const IDirectMusicPortDownloadVtbl *lpDownloadVtbl; - const IDirectMusicThruVtbl *lpThruVtbl; - LONG ref; +struct SynthPortImpl { + /* IUnknown fields */ + IDirectMusicPort IDirectMusicPort_iface; + IDirectMusicPortDownload IDirectMusicPortDownload_iface; + IDirectMusicThru IDirectMusicThru_iface; + LONG ref; - /* IDirectMusicPortImpl fields */ - IDirectSound* pDirectSound; - IReferenceClock* pLatencyClock; - BOOL fActive; - DMUS_PORTCAPS caps; - DMUS_PORTPARAMS params; - int nrofgroups; - DMUSIC_PRIVATE_CHANNEL_GROUP group[1]; + /* IDirectMusicPort fields */ + IDirectSound* pDirectSound; + IReferenceClock* pLatencyClock; + IDirectMusicSynth* synth; + IDirectMusicSynthSink* synth_sink; + BOOL fActive; + DMUS_PORTCAPS caps; + DMUS_PORTPARAMS params; + int nrofgroups; + DMUSIC_PRIVATE_CHANNEL_GROUP group[1]; }; -extern HRESULT WINAPI IDirectMusicPortImpl_Activate (LPDIRECTMUSICPORT iface, BOOL fActive); - /** Internal factory */ -extern HRESULT WINAPI DMUSIC_CreateDirectMusicPortImpl (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter, LPDMUS_PORTPARAMS pPortParams, LPDMUS_PORTCAPS pPortCaps); +extern HRESULT DMUSIC_CreateSynthPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) DECLSPEC_HIDDEN; +extern HRESULT DMUSIC_CreateMidiOutPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) DECLSPEC_HIDDEN; +extern HRESULT DMUSIC_CreateMidiInPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) DECLSPEC_HIDDEN; /***************************************************************************** * IReferenceClockImpl implementation structure */ struct IReferenceClockImpl { - /* IUnknown fields */ - const IReferenceClockVtbl *lpVtbl; - LONG ref; + /* IUnknown fields */ + IReferenceClock IReferenceClock_iface; + LONG ref; - /* IReferenceClockImpl fields */ - REFERENCE_TIME rtTime; - DMUS_CLOCKINFO pClockInfo; + /* IReferenceClockImpl fields */ + REFERENCE_TIME rtTime; + DMUS_CLOCKINFO pClockInfo; }; typedef struct _DMUS_PRIVATE_INSTRUMENT_ENTRY { @@ -185,51 +216,59 @@ typedef struct _DMUS_PRIVATE_POOLCUE { * IDirectMusicCollectionImpl implementation structure */ struct IDirectMusicCollectionImpl { - /* IUnknown fields */ - const IUnknownVtbl *UnknownVtbl; - const IDirectMusicCollectionVtbl *CollectionVtbl; - const IDirectMusicObjectVtbl *ObjectVtbl; - const IPersistStreamVtbl *PersistStreamVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusicCollection IDirectMusicCollection_iface; + IDirectMusicObject IDirectMusicObject_iface; + IPersistStream IPersistStream_iface; + LONG ref; - /* IDirectMusicCollectionImpl fields */ - IStream *pStm; /* stream from which we load collection and later instruments */ - LARGE_INTEGER liCollectionPosition; /* offset in a stream where collection was loaded from */ - LARGE_INTEGER liWavePoolTablePosition; /* offset in a stream where wave pool table can be found */ - LPDMUS_OBJECTDESC pDesc; - CHAR* szCopyright; /* FIXME: should probably placed somewhere else */ - LPDLSHEADER pHeader; - /* pool table */ - LPPOOLTABLE pPoolTable; - LPPOOLCUE pPoolCues; - /* instruments */ - struct list Instruments; + /* IDirectMusicCollectionImpl fields */ + IStream *pStm; /* stream from which we load collection and later instruments */ + LARGE_INTEGER liCollectionPosition; /* offset in a stream where collection was loaded from */ + LARGE_INTEGER liWavePoolTablePosition; /* offset in a stream where wave pool table can be found */ + LPDMUS_OBJECTDESC pDesc; + CHAR* szCopyright; /* FIXME: should probably placed somewhere else */ + LPDLSHEADER pHeader; + /* pool table */ + LPPOOLTABLE pPoolTable; + LPPOOLCUE pPoolCues; + /* instruments */ + struct list Instruments; }; /***************************************************************************** * IDirectMusicInstrumentImpl implementation structure */ struct IDirectMusicInstrumentImpl { - /* IUnknown fields */ - const IUnknownVtbl *UnknownVtbl; - const IDirectMusicInstrumentVtbl *InstrumentVtbl; - LONG ref; + /* IUnknown fields */ + IDirectMusicInstrument IDirectMusicInstrument_iface; + LONG ref; - /* IDirectMusicInstrumentImpl fields */ - LARGE_INTEGER liInstrumentPosition; /* offset in a stream where instrument chunk can be found */ - LPGUID pInstrumentID; - LPINSTHEADER pHeader; - WCHAR wszName[DMUS_MAX_NAME]; - /* instrument data */ + /* IDirectMusicInstrumentImpl fields */ + LARGE_INTEGER liInstrumentPosition; /* offset in a stream where instrument chunk can be found */ + ULONG length; /* Length of the instrument in the stream */ + GUID id; + INSTHEADER header; + WCHAR wszName[DMUS_MAX_NAME]; + /* instrument data */ + BOOL loaded; + instrument_region *regions; + ULONG nb_articulations; + instrument_articulation *articulations; }; +static inline IDirectMusicInstrumentImpl *impl_from_IDirectMusicInstrument(IDirectMusicInstrument *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicInstrumentImpl, IDirectMusicInstrument_iface); +} + /* custom :) */ -extern HRESULT WINAPI IDirectMusicInstrumentImpl_Custom_Load (LPDIRECTMUSICINSTRUMENT iface, LPSTREAM pStm); +extern HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, IStream *stream) DECLSPEC_HIDDEN; /********************************************************************** * Dll lifetime tracking declaration for dmusic.dll */ -extern LONG DMUSIC_refCount; +extern LONG DMUSIC_refCount DECLSPEC_HIDDEN; static inline void DMUSIC_LockModule(void) { InterlockedIncrement( &DMUSIC_refCount ); } static inline void DMUSIC_UnlockModule(void) { InterlockedDecrement( &DMUSIC_refCount ); } @@ -269,17 +308,19 @@ typedef struct { #define GE(x) { &x, #x } /* dwPatch from MIDILOCALE */ -extern DWORD MIDILOCALE2Patch (LPMIDILOCALE pLocale); +extern DWORD MIDILOCALE2Patch (const MIDILOCALE *pLocale) DECLSPEC_HIDDEN; /* MIDILOCALE from dwPatch */ -extern void Patch2MIDILOCALE (DWORD dwPatch, LPMIDILOCALE pLocale); +extern void Patch2MIDILOCALE (DWORD dwPatch, LPMIDILOCALE pLocale) DECLSPEC_HIDDEN; /* check whether the given DWORD is even (return 0) or odd (return 1) */ -extern int even_or_odd (DWORD number); +extern int even_or_odd (DWORD number) DECLSPEC_HIDDEN; /* FOURCC to string conversion for debug messages */ -extern const char *debugstr_fourcc (DWORD fourcc); +extern const char *debugstr_fourcc (DWORD fourcc) DECLSPEC_HIDDEN; /* returns name of given GUID */ -extern const char *debugstr_dmguid (const GUID *id); -/* dump whole DMUS_OBJECTDESC struct */ -extern const char *debugstr_DMUS_OBJECTDESC (LPDMUS_OBJECTDESC pDesc); +extern const char *debugstr_dmguid (const GUID *id) DECLSPEC_HIDDEN; +/* Dump whole DMUS_OBJECTDESC struct */ +extern void dump_DMUS_OBJECTDESC(LPDMUS_OBJECTDESC desc) DECLSPEC_HIDDEN; +/* Dump whole DMUS_PORTPARAMS struct */ +extern void dump_DMUS_PORTPARAMS(LPDMUS_PORTPARAMS params) DECLSPEC_HIDDEN; -#endif /* __WINE_DMUSIC_PRIVATE_H */ +#endif /* __WINE_DMUSIC_PRIVATE_H */ diff --git a/reactos/dll/directx/dmusic/download.c b/reactos/dll/directx/dmusic/download.c index a4b4ae0cdab..cc2b0241e23 100644 --- a/reactos/dll/directx/dmusic/download.c +++ b/reactos/dll/directx/dmusic/download.c @@ -1,4 +1,5 @@ -/* IDirectMusicDownload Implementation +/* + * IDirectMusicDownload Implementation * * Copyright (C) 2003-2004 Rok Mandeljc * @@ -21,72 +22,85 @@ WINE_DEFAULT_DEBUG_CHANNEL(dmusic); +static inline IDirectMusicDownloadImpl* impl_from_IDirectMusicDownload(IDirectMusicDownload *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicDownloadImpl, IDirectMusicDownload_iface); +} + /* IDirectMusicDownloadImpl IUnknown part: */ -static HRESULT WINAPI IDirectMusicDownloadImpl_QueryInterface (LPDIRECTMUSICDOWNLOAD iface, REFIID riid, LPVOID *ppobj) { - IDirectMusicDownloadImpl *This = (IDirectMusicDownloadImpl *)iface; - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); +static HRESULT WINAPI IDirectMusicDownloadImpl_QueryInterface(IDirectMusicDownload *iface, REFIID riid, void **ret_iface) +{ + TRACE("(%p, %s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); - if (IsEqualIID (riid, &IID_IUnknown) - || IsEqualIID (riid, &IID_IDirectMusicDownload)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectMusicDownload)) + { + IDirectMusicDownload_AddRef(iface); + *ret_iface = iface; + return S_OK; + } + + *ret_iface = NULL; + WARN("(%p, %s, %p): not found\n", iface, debugstr_dmguid(riid), ret_iface); + return E_NOINTERFACE; } -static ULONG WINAPI IDirectMusicDownloadImpl_AddRef (LPDIRECTMUSICDOWNLOAD iface) { - IDirectMusicDownloadImpl *This = (IDirectMusicDownloadImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IDirectMusicDownloadImpl_AddRef(IDirectMusicDownload *iface) +{ + IDirectMusicDownloadImpl *This = impl_from_IDirectMusicDownload(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IDirectMusicDownloadImpl_Release (LPDIRECTMUSICDOWNLOAD iface) { - IDirectMusicDownloadImpl *This = (IDirectMusicDownloadImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IDirectMusicDownloadImpl_Release(IDirectMusicDownload *iface) +{ + IDirectMusicDownloadImpl *This = impl_from_IDirectMusicDownload(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) + HeapFree(GetProcessHeap(), 0, This); - DMUSIC_UnlockModule(); - - return refCount; + DMUSIC_UnlockModule(); + + return ref; } /* IDirectMusicDownloadImpl IDirectMusicDownload part: */ -static HRESULT WINAPI IDirectMusicDownloadImpl_GetBuffer (LPDIRECTMUSICDOWNLOAD iface, void** ppvBuffer, DWORD* pdwSize) { - IDirectMusicDownloadImpl *This = (IDirectMusicDownloadImpl *)iface; - FIXME("(%p, %p, %p): stub\n", This, ppvBuffer, pdwSize); - return S_OK; +static HRESULT WINAPI IDirectMusicDownloadImpl_GetBuffer(IDirectMusicDownload *iface, void **buffer, DWORD *size) +{ + FIXME("(%p, %p, %p): stub\n", iface, buffer, size); + + return S_OK; } static const IDirectMusicDownloadVtbl DirectMusicDownload_Vtbl = { - IDirectMusicDownloadImpl_QueryInterface, - IDirectMusicDownloadImpl_AddRef, - IDirectMusicDownloadImpl_Release, - IDirectMusicDownloadImpl_GetBuffer + IDirectMusicDownloadImpl_QueryInterface, + IDirectMusicDownloadImpl_AddRef, + IDirectMusicDownloadImpl_Release, + IDirectMusicDownloadImpl_GetBuffer }; /* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { - IDirectMusicDownloadImpl* dmdl; - - dmdl = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicDownloadImpl)); - if (NULL == dmdl) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - dmdl->lpVtbl = &DirectMusicDownload_Vtbl; - dmdl->ref = 0; /* will be inited by QueryInterface */ - - return IDirectMusicDownloadImpl_QueryInterface ((LPDIRECTMUSICDOWNLOAD)dmdl, lpcGUID, ppobj); +HRESULT DMUSIC_CreateDirectMusicDownloadImpl(const GUID *guid, void **ret_iface, IUnknown *unk_outer) +{ + IDirectMusicDownloadImpl *download; + + download = HeapAlloc(GetProcessHeap(), 0, sizeof(*download)); + if (!download) + { + *ret_iface = NULL; + return E_OUTOFMEMORY; + } + + download->IDirectMusicDownload_iface.lpVtbl = &DirectMusicDownload_Vtbl; + download->ref = 1; + *ret_iface = download; + return S_OK; } diff --git a/reactos/dll/directx/dmusic/downloadedinstrument.c b/reactos/dll/directx/dmusic/downloadedinstrument.c deleted file mode 100644 index 2a71a3eeb20..00000000000 --- a/reactos/dll/directx/dmusic/downloadedinstrument.c +++ /dev/null @@ -1,88 +0,0 @@ -/* IDirectMusicDownloadedInstrument Implementation - * - * Copyright (C) 2003-2004 Rok Mandeljc - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "dmusic_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(dmusic); - -/* IDirectMusicDownloadedInstrumentImpl IUnknown part: */ -static HRESULT WINAPI IDirectMusicDownloadedInstrumentImpl_QueryInterface (LPDIRECTMUSICDOWNLOADEDINSTRUMENT iface, REFIID riid, LPVOID *ppobj) { - IDirectMusicDownloadedInstrumentImpl *This = (IDirectMusicDownloadedInstrumentImpl *)iface; - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); - - if (IsEqualIID (riid, &IID_IUnknown) - || IsEqualIID (riid, &IID_IDirectMusicDownloadedInstrument) - || IsEqualIID (riid, &IID_IDirectMusicDownloadedInstrument8)) { - IUnknown_AddRef(iface); - *ppobj = This; - return S_OK; - } - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; -} - -static ULONG WINAPI IDirectMusicDownloadedInstrumentImpl_AddRef (LPDIRECTMUSICDOWNLOADEDINSTRUMENT iface) { - IDirectMusicDownloadedInstrumentImpl *This = (IDirectMusicDownloadedInstrumentImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); - - DMUSIC_LockModule(); - - return refCount; -} - -static ULONG WINAPI IDirectMusicDownloadedInstrumentImpl_Release (LPDIRECTMUSICDOWNLOADEDINSTRUMENT iface) { - IDirectMusicDownloadedInstrumentImpl *This = (IDirectMusicDownloadedInstrumentImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); - - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } - - DMUSIC_UnlockModule(); - - return refCount; -} - -/* IDirectMusicDownloadedInstrumentImpl IDirectMusicDownloadedInstrument part: */ -/* none at this time */ - -static const IDirectMusicDownloadedInstrumentVtbl DirectMusicDownloadedInstrument_Vtbl = { - IDirectMusicDownloadedInstrumentImpl_QueryInterface, - IDirectMusicDownloadedInstrumentImpl_AddRef, - IDirectMusicDownloadedInstrumentImpl_Release -}; - -/* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicDownloadedInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { - IDirectMusicDownloadedInstrumentImpl* dmdlinst; - - dmdlinst = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicDownloadedInstrumentImpl)); - if (NULL == dmdlinst) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - dmdlinst->lpVtbl = &DirectMusicDownloadedInstrument_Vtbl; - dmdlinst->ref = 0; /* will be inited by QueryInterface */ - - return IDirectMusicDownloadedInstrumentImpl_QueryInterface ((LPDIRECTMUSICDOWNLOADEDINSTRUMENT)dmdlinst, lpcGUID, ppobj); -} diff --git a/reactos/dll/directx/dmusic/instrument.c b/reactos/dll/directx/dmusic/instrument.c index 11a19fd3d40..9df3e0c1005 100644 --- a/reactos/dll/directx/dmusic/instrument.c +++ b/reactos/dll/directx/dmusic/instrument.c @@ -1,4 +1,5 @@ -/* IDirectMusicInstrument Implementation +/* + * IDirectMusicInstrument Implementation * * Copyright (C) 2003-2004 Rok Mandeljc * @@ -20,113 +21,109 @@ #include "dmusic_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); -WINE_DECLARE_DEBUG_CHANNEL(dmfile); -static const GUID IID_IDirectMusicInstrumentPRIVATE = {0xbcb20080,0xa40c,0x11d1,{0x86,0xbc,0x00,0xc0,0x4f,0xbf,0x8f,0xef}}; - -static ULONG WINAPI IDirectMusicInstrumentImpl_IUnknown_AddRef (LPUNKNOWN iface); -static ULONG WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_AddRef (LPDIRECTMUSICINSTRUMENT iface); +static const GUID IID_IDirectMusicInstrumentPRIVATE = { 0xbcb20080, 0xa40c, 0x11d1, { 0x86, 0xbc, 0x00, 0xc0, 0x4f, 0xbf, 0x8f, 0xef } }; /* IDirectMusicInstrument IUnknown part: */ -static HRESULT WINAPI IDirectMusicInstrumentImpl_IUnknown_QueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, UnknownVtbl, iface); - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); - - if (IsEqualIID (riid, &IID_IUnknown)) { - *ppobj = &This->UnknownVtbl; - IDirectMusicInstrumentImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); - return S_OK; - } else if (IsEqualIID (riid, &IID_IDirectMusicInstrument)) { - *ppobj = &This->InstrumentVtbl; - IDirectMusicInstrumentImpl_IDirectMusicInstrument_AddRef ((LPDIRECTMUSICINSTRUMENT)&This->InstrumentVtbl); - return S_OK; - } else if (IsEqualIID (riid, &IID_IDirectMusicInstrumentPRIVATE)) { - /* it seems to me that this interface is only basic IUnknown, without any - other inherited functions... *sigh* this is the worst scenario, since it means - that whoever calls it knows the layout of original implementation table and therefore - tries to get data by direct access... expect crashes */ - FIXME("*sigh*... requested private/unspecified interface\n"); - *ppobj = &This->UnknownVtbl; - IDirectMusicInstrumentImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); - return S_OK; - } - - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; +static HRESULT WINAPI IDirectMusicInstrumentImpl_QueryInterface(LPDIRECTMUSICINSTRUMENT iface, REFIID riid, LPVOID *ret_iface) +{ + TRACE("(%p)->(%s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectMusicInstrument)) + { + *ret_iface = iface; + IDirectMusicInstrument_AddRef(iface); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IDirectMusicInstrumentPRIVATE)) + { + /* it seems to me that this interface is only basic IUnknown, without any + * other inherited functions... *sigh* this is the worst scenario, since it means + * that whoever calls it knows the layout of original implementation table and therefore + * tries to get data by direct access... expect crashes + */ + FIXME("*sigh*... requested private/unspecified interface\n"); + + *ret_iface = iface; + IDirectMusicInstrument_AddRef(iface); + return S_OK; + } + + WARN("(%p)->(%s, %p): not found\n", iface, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static ULONG WINAPI IDirectMusicInstrumentImpl_IUnknown_AddRef (LPUNKNOWN iface) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, UnknownVtbl, iface); - ULONG refCount = InterlockedIncrement(&This->ref); +static ULONG WINAPI IDirectMusicInstrumentImpl_AddRef(LPDIRECTMUSICINSTRUMENT iface) +{ + IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - DMUSIC_LockModule(); + DMUSIC_LockModule(); - return refCount; + return ref; } -static ULONG WINAPI IDirectMusicInstrumentImpl_IUnknown_Release (LPUNKNOWN iface) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, UnknownVtbl, iface); - ULONG refCount = InterlockedDecrement(&This->ref); +static ULONG WINAPI IDirectMusicInstrumentImpl_Release(LPDIRECTMUSICINSTRUMENT iface) +{ + IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } + if (!ref) + { + ULONG i; - DMUSIC_UnlockModule(); - - return refCount; + HeapFree(GetProcessHeap(), 0, This->regions); + for (i = 0; i < This->nb_articulations; i++) + HeapFree(GetProcessHeap(), 0, This->articulations->connections); + HeapFree(GetProcessHeap(), 0, This->articulations); + HeapFree(GetProcessHeap(), 0, This); + } + + DMUSIC_UnlockModule(); + + return ref; } -static const IUnknownVtbl DirectMusicInstrument_Unknown_Vtbl = { - IDirectMusicInstrumentImpl_IUnknown_QueryInterface, - IDirectMusicInstrumentImpl_IUnknown_AddRef, - IDirectMusicInstrumentImpl_IUnknown_Release -}; - /* IDirectMusicInstrumentImpl IDirectMusicInstrument part: */ -static HRESULT WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_QueryInterface (LPDIRECTMUSICINSTRUMENT iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - return IDirectMusicInstrumentImpl_IUnknown_QueryInterface ((LPUNKNOWN)&This->UnknownVtbl, riid, ppobj); +static HRESULT WINAPI IDirectMusicInstrumentImpl_GetPatch(LPDIRECTMUSICINSTRUMENT iface, DWORD* pdwPatch) +{ + IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface); + + TRACE("(%p)->(%p)\n", This, pdwPatch); + + *pdwPatch = MIDILOCALE2Patch(&This->header.Locale); + + return S_OK; } -static ULONG WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_AddRef (LPDIRECTMUSICINSTRUMENT iface) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - return IDirectMusicInstrumentImpl_IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); +static HRESULT WINAPI IDirectMusicInstrumentImpl_SetPatch(LPDIRECTMUSICINSTRUMENT iface, DWORD dwPatch) +{ + IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface); + + TRACE("(%p)->(%d): stub\n", This, dwPatch); + + Patch2MIDILOCALE(dwPatch, &This->header.Locale); + + return S_OK; } -static ULONG WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_Release (LPDIRECTMUSICINSTRUMENT iface) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - return IDirectMusicInstrumentImpl_IUnknown_Release ((LPUNKNOWN)&This->UnknownVtbl); -} - -static HRESULT WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_GetPatch (LPDIRECTMUSICINSTRUMENT iface, DWORD* pdwPatch) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - TRACE("(%p, %p)\n", This, pdwPatch); - *pdwPatch = MIDILOCALE2Patch(&This->pHeader->Locale); - return S_OK; -} - -static HRESULT WINAPI IDirectMusicInstrumentImpl_IDirectMusicInstrument_SetPatch (LPDIRECTMUSICINSTRUMENT iface, DWORD dwPatch) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - TRACE("(%p, %d): stub\n", This, dwPatch); - Patch2MIDILOCALE(dwPatch, &This->pHeader->Locale); - return S_OK; -} - -static const IDirectMusicInstrumentVtbl DirectMusicInstrument_Instrument_Vtbl = { - IDirectMusicInstrumentImpl_IDirectMusicInstrument_QueryInterface, - IDirectMusicInstrumentImpl_IDirectMusicInstrument_AddRef, - IDirectMusicInstrumentImpl_IDirectMusicInstrument_Release, - IDirectMusicInstrumentImpl_IDirectMusicInstrument_GetPatch, - IDirectMusicInstrumentImpl_IDirectMusicInstrument_SetPatch +static const IDirectMusicInstrumentVtbl DirectMusicInstrument_Vtbl = +{ + IDirectMusicInstrumentImpl_QueryInterface, + IDirectMusicInstrumentImpl_AddRef, + IDirectMusicInstrumentImpl_Release, + IDirectMusicInstrumentImpl_GetPatch, + IDirectMusicInstrumentImpl_SetPatch }; /* for ClassFactory */ -HRESULT WINAPI DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { +HRESULT DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) { IDirectMusicInstrumentImpl* dminst; dminst = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicInstrumentImpl)); @@ -134,296 +131,311 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicInstrumentImpl (LPCGUID lpcGUID, LPVOID* *ppobj = NULL; return E_OUTOFMEMORY; } - dminst->UnknownVtbl = &DirectMusicInstrument_Unknown_Vtbl; - dminst->InstrumentVtbl = &DirectMusicInstrument_Instrument_Vtbl; + dminst->IDirectMusicInstrument_iface.lpVtbl = &DirectMusicInstrument_Vtbl; dminst->ref = 0; /* will be inited by QueryInterface */ - return IDirectMusicInstrumentImpl_IUnknown_QueryInterface ((LPUNKNOWN)&dminst->UnknownVtbl, lpcGUID, ppobj); + return IDirectMusicInstrument_QueryInterface(&dminst->IDirectMusicInstrument_iface, lpcGUID, ppobj); } -/* aux. function that completely loads instrument; my tests indicate that it's - called somewhere around IDirectMusicCollection_GetInstrument */ -HRESULT WINAPI IDirectMusicInstrumentImpl_Custom_Load (LPDIRECTMUSICINSTRUMENT iface, LPSTREAM pStm) { - ICOM_THIS_MULTI(IDirectMusicInstrumentImpl, InstrumentVtbl, iface); - - DMUS_PRIVATE_CHUNK Chunk; - DWORD ListSize[4], ListCount[4]; - LARGE_INTEGER liMove; /* used when skipping chunks */ - - TRACE("(%p, %p, offset = %s)\n", This, pStm, wine_dbgstr_longlong(This->liInstrumentPosition.QuadPart)); +static HRESULT read_from_stream(IStream *stream, void *data, ULONG size) +{ + ULONG bytes_read; + HRESULT hr; - /* goto the beginning of chunk */ - IStream_Seek (pStm, This->liInstrumentPosition, STREAM_SEEK_SET, NULL); - - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[0] = Chunk.dwSize - sizeof(FOURCC); - ListCount[0] = 0; - switch (Chunk.fccID) { - case FOURCC_INS: { - TRACE_(dmfile)(": instrument list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[0] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_INSH: { - TRACE_(dmfile)(": instrument header chunk\n"); - /* should be already initialised */ - IStream_Read (pStm, This->pHeader, Chunk.dwSize, NULL); - break; - } - case FOURCC_DLID: { - TRACE_(dmfile)(": DLID (GUID) chunk\n"); - /* should be already initialised */ - IStream_Read (pStm, This->pInstrumentID, Chunk.dwSize, NULL); - break; - } - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[1] = Chunk.dwSize - sizeof(FOURCC); - ListCount[1] = 0; - switch (Chunk.fccID) { - case FOURCC_LRGN: { - TRACE_(dmfile)(": regions list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_LIST: { - IStream_Read (pStm, &Chunk.fccID, sizeof(FOURCC), NULL); - TRACE_(dmfile)(": LIST chunk of type %s", debugstr_fourcc(Chunk.fccID)); - ListSize[2] = Chunk.dwSize - sizeof(FOURCC); - ListCount[2] = 0; - switch (Chunk.fccID) { - case FOURCC_RGN: { - /* temporary structures */ - RGNHEADER tmpRegionHeader; - WSMPL tmpWaveSample; - WLOOP tmpWaveLoop; - WAVELINK tmpWaveLink; - - TRACE_(dmfile)(": region list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[2] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_RGNH: { - TRACE_(dmfile)(": region header chunk\n"); - memset (&tmpRegionHeader, 0, sizeof(RGNHEADER)); /* reset */ - IStream_Read (pStm, &tmpRegionHeader, Chunk.dwSize, NULL); - break; - } - case FOURCC_WSMP: { - TRACE_(dmfile)(": wave sample chunk\n"); - memset (&tmpWaveSample, 0, sizeof(WSMPL)); /* reset */ - memset (&tmpWaveLoop, 0, sizeof(WLOOP)); /* reset */ - if (Chunk.dwSize != (sizeof(WSMPL) + sizeof(WLOOP))) ERR(": incorrect chunk size\n"); - IStream_Read (pStm, &tmpWaveSample, sizeof(WSMPL), NULL); - IStream_Read (pStm, &tmpWaveLoop, sizeof(WLOOP), NULL); - break; - } - case FOURCC_WLNK: { - TRACE_(dmfile)(": wave link chunk\n"); - memset (&tmpWaveLink, 0, sizeof(WAVELINK)); /* reset */ - IStream_Read (pStm, &tmpWaveLink, Chunk.dwSize, NULL); - break; - } - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[2] = %d < ListSize[2] = %d\n", ListCount[2], ListSize[2]); - } while (ListCount[2] < ListSize[2]); - FIXME(": need to write temporary data to instrument data\n"); - break; - } - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - case FOURCC_LART: { - TRACE_(dmfile)(": articulators list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case FOURCC_ART1: { - /* temporary structures */ - CONNECTIONLIST tmpConnectionList; - LPCONNECTION tmpConnections; - - TRACE_(dmfile)(": level 1 articulator chunk\n"); - memset (&tmpConnectionList, 0, sizeof(CONNECTIONLIST)); /* reset */ - tmpConnections = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, sizeof(CONNECTION)*tmpConnectionList.cConnections); - if (Chunk.dwSize != (sizeof(CONNECTIONLIST) + sizeof(CONNECTION)*tmpConnectionList.cConnections)) ERR(": incorrect chunk size\n"); - IStream_Read (pStm, &tmpConnectionList, sizeof(CONNECTIONLIST), NULL); - IStream_Read (pStm, tmpConnections, sizeof(CONNECTION)*tmpConnectionList.cConnections, NULL); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - case mmioFOURCC('I','N','F','O'): { - TRACE_(dmfile)(": INFO list\n"); - do { - IStream_Read (pStm, &Chunk, sizeof(FOURCC)+sizeof(DWORD), NULL); - ListCount[1] += sizeof(FOURCC) + sizeof(DWORD) + Chunk.dwSize; - TRACE_(dmfile)(": %s chunk (size = 0x%04x)", debugstr_fourcc (Chunk.fccID), Chunk.dwSize); - switch (Chunk.fccID) { - case mmioFOURCC('I','N','A','M'): { - TRACE_(dmfile)(": name chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','A','R','T'): { - TRACE_(dmfile)(": artist chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','O','P'): { - /* temporary structures */ - CHAR tmpCopyright[DMUS_MAX_NAME]; - - TRACE_(dmfile)(": copyright chunk\n"); - IStream_Read (pStm, tmpCopyright, Chunk.dwSize, NULL); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - liMove.QuadPart = 1; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - } - break; - } - case mmioFOURCC('I','S','B','J'): { - TRACE_(dmfile)(": subject chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - case mmioFOURCC('I','C','M','T'): { - TRACE_(dmfile)(": comment chunk (ignored)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - if (even_or_odd(Chunk.dwSize)) { - ListCount[1] ++; - Chunk.dwSize++; - } - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[1] = %d < ListSize[1] = %d\n", ListCount[1], ListSize[1]); - } while (ListCount[1] < ListSize[1]); - break; - } - - default: { - TRACE_(dmfile)(": unknown (skipping)\n"); - liMove.QuadPart = Chunk.dwSize - sizeof(FOURCC); - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - TRACE_(dmfile)(": ListCount[0] = %d < ListSize[0] = %d\n", ListCount[0], ListSize[0]); - } while (ListCount[0] < ListSize[0]); - break; - } - default: { - TRACE_(dmfile)(": unknown chunk (irrevelant & skipping)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); - break; - } - } - break; - } - default: { - TRACE_(dmfile)(": unexpected chunk; loading failed)\n"); - liMove.QuadPart = Chunk.dwSize; - IStream_Seek (pStm, liMove, STREAM_SEEK_CUR, NULL); /* skip the rest of the chunk */ - return E_FAIL; - } - } - /* DEBUG: dumps whole instrument object tree: */ -/* if (TRACE_ON(dmusic)) { - TRACE("*** IDirectMusicInstrument (%p) ***\n", This); - if (This->pInstrumentID) - TRACE(" - GUID = %s\n", debugstr_dmguid(This->pInstrumentID)); - - TRACE(" - Instrument header:\n"); - TRACE(" - cRegions: %ld\n", This->pHeader->cRegions); - TRACE(" - Locale:\n"); - TRACE(" - ulBank: %ld\n", This->pHeader->Locale.ulBank); - TRACE(" - ulInstrument: %ld\n", This->pHeader->Locale.ulInstrument); - TRACE(" => dwPatch: %ld\n", MIDILOCALE2Patch(&This->pHeader->Locale)); - }*/ + hr = IStream_Read(stream, data, size, &bytes_read); + if(FAILED(hr)){ + TRACE("IStream_Read failed: %08x\n", hr); + return hr; + } + if (bytes_read < size) { + TRACE("Didn't read full chunk: %u < %u\n", bytes_read, size); + return E_FAIL; + } - return S_OK; + return S_OK; +} + +static inline DWORD subtract_bytes(DWORD len, DWORD bytes) +{ + if(bytes > len){ + TRACE("Apparent mismatch in chunk lengths? %u bytes remaining, %u bytes read\n", len, bytes); + return 0; + } + return len - bytes; +} + +static inline HRESULT advance_stream(IStream *stream, ULONG bytes) +{ + LARGE_INTEGER move; + HRESULT ret; + + move.QuadPart = bytes; + + ret = IStream_Seek(stream, move, STREAM_SEEK_CUR, NULL); + if (FAILED(ret)) + WARN("IStream_Seek failed: %08x\n", ret); + + return ret; +} + +static HRESULT load_region(IDirectMusicInstrumentImpl *This, IStream *stream, instrument_region *region, ULONG length) +{ + HRESULT ret; + DMUS_PRIVATE_CHUNK chunk; + + TRACE("(%p, %p, %p, %u)\n", This, stream, region, length); + + while (length) + { + ret = read_from_stream(stream, &chunk, sizeof(chunk)); + if (FAILED(ret)) + return ret; + + length = subtract_bytes(length, sizeof(chunk)); + + switch (chunk.fccID) + { + case FOURCC_RGNH: + TRACE("RGNH chunk (region header): %u bytes\n", chunk.dwSize); + + ret = read_from_stream(stream, ®ion->header, sizeof(region->header)); + if (FAILED(ret)) + return ret; + + length = subtract_bytes(length, sizeof(region->header)); + break; + + case FOURCC_WSMP: + TRACE("WSMP chunk (wave sample): %u bytes\n", chunk.dwSize); + + ret = read_from_stream(stream, ®ion->wave_sample, sizeof(region->wave_sample)); + if (FAILED(ret)) + return ret; + length = subtract_bytes(length, sizeof(region->wave_sample)); + + if (!(region->loop_present = (chunk.dwSize != sizeof(region->wave_sample)))) + break; + + ret = read_from_stream(stream, ®ion->wave_loop, sizeof(region->wave_loop)); + if (FAILED(ret)) + return ret; + + length = subtract_bytes(length, sizeof(region->wave_loop)); + break; + + case FOURCC_WLNK: + TRACE("WLNK chunk (wave link): %u bytes\n", chunk.dwSize); + + ret = read_from_stream(stream, ®ion->wave_link, sizeof(region->wave_link)); + if (FAILED(ret)) + return ret; + + length = subtract_bytes(length, sizeof(region->wave_link)); + break; + + default: + TRACE("Unknown chunk %s (skipping): %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + + ret = advance_stream(stream, chunk.dwSize); + if (FAILED(ret)) + return ret; + + length = subtract_bytes(length, chunk.dwSize); + break; + } + } + + return S_OK; +} + +static HRESULT load_articulation(IDirectMusicInstrumentImpl *This, IStream *stream, ULONG length) +{ + HRESULT ret; + instrument_articulation *articulation; + + if (!This->articulations) + This->articulations = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->articulations)); + else + This->articulations = HeapReAlloc(GetProcessHeap(), 0, This->articulations, sizeof(*This->articulations) * (This->nb_articulations + 1)); + if (!This->articulations) + return E_OUTOFMEMORY; + + articulation = &This->articulations[This->nb_articulations]; + + ret = read_from_stream(stream, &articulation->connections_list, sizeof(CONNECTIONLIST)); + if (FAILED(ret)) + return ret; + + articulation->connections = HeapAlloc(GetProcessHeap(), 0, sizeof(CONNECTION) * articulation->connections_list.cConnections); + if (!articulation->connections) + return E_OUTOFMEMORY; + + ret = read_from_stream(stream, articulation->connections, sizeof(CONNECTION) * articulation->connections_list.cConnections); + if (FAILED(ret)) + { + HeapFree(GetProcessHeap(), 0, articulation->connections); + return ret; + } + + subtract_bytes(length, sizeof(CONNECTIONLIST) + sizeof(CONNECTION) * articulation->connections_list.cConnections); + + This->nb_articulations++; + + return S_OK; +} + +/* Function that loads all instrument data and which is called from IDirectMusicCollection_GetInstrument as in native */ +HRESULT IDirectMusicInstrumentImpl_CustomLoad(IDirectMusicInstrument *iface, IStream *stream) +{ + IDirectMusicInstrumentImpl *This = impl_from_IDirectMusicInstrument(iface); + HRESULT hr; + DMUS_PRIVATE_CHUNK chunk; + ULONG i = 0; + ULONG length = This->length; + + TRACE("(%p, %p): offset = 0x%s, length = %u)\n", This, stream, wine_dbgstr_longlong(This->liInstrumentPosition.QuadPart), This->length); + + if (This->loaded) + return S_OK; + + hr = IStream_Seek(stream, This->liInstrumentPosition, STREAM_SEEK_SET, NULL); + if (FAILED(hr)) + { + WARN("IStream_Seek failed: %08x\n", hr); + return DMUS_E_UNSUPPORTED_STREAM; + } + + This->regions = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->regions) * This->header.cRegions); + if (!This->regions) + return E_OUTOFMEMORY; + + while (length) + { + hr = read_from_stream(stream, &chunk, sizeof(chunk)); + if (FAILED(hr)) + goto error; + + length = subtract_bytes(length, sizeof(chunk) + chunk.dwSize); + + switch (chunk.fccID) + { + case FOURCC_INSH: + case FOURCC_DLID: + TRACE("Chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + + /* Instrument header and id are already set so just skip */ + hr = advance_stream(stream, chunk.dwSize); + if (FAILED(hr)) + goto error; + + break; + + case FOURCC_LIST: { + DWORD size = chunk.dwSize; + + TRACE("LIST chunk: %u bytes\n", chunk.dwSize); + + hr = read_from_stream(stream, &chunk.fccID, sizeof(chunk.fccID)); + if (FAILED(hr)) + goto error; + + size = subtract_bytes(size, sizeof(chunk.fccID)); + + switch (chunk.fccID) + { + case FOURCC_LRGN: + TRACE("LRGN chunk (regions list): %u bytes\n", size); + + while (size) + { + hr = read_from_stream(stream, &chunk, sizeof(chunk)); + if (FAILED(hr)) + goto error; + + if (chunk.fccID != FOURCC_LIST) + { + TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + goto error; + } + + hr = read_from_stream(stream, &chunk.fccID, sizeof(chunk.fccID)); + if (FAILED(hr)) + goto error; + + if (chunk.fccID == FOURCC_RGN) + { + TRACE("RGN chunk (region): %u bytes\n", chunk.dwSize); + hr = load_region(This, stream, &This->regions[i++], chunk.dwSize - sizeof(chunk.fccID)); + } + else + { + TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + hr = advance_stream(stream, chunk.dwSize - sizeof(chunk.fccID)); + } + if (FAILED(hr)) + goto error; + + size = subtract_bytes(size, chunk.dwSize + sizeof(chunk)); + } + break; + + case FOURCC_LART: + TRACE("LART chunk (articulations list): %u bytes\n", size); + + while (size) + { + hr = read_from_stream(stream, &chunk, sizeof(chunk)); + if (FAILED(hr)) + goto error; + + if (chunk.fccID == FOURCC_ART1) + { + TRACE("ART1 chunk (level 1 articulation): %u bytes\n", chunk.dwSize); + hr = load_articulation(This, stream, chunk.dwSize); + } + else + { + TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + hr = advance_stream(stream, chunk.dwSize); + } + if (FAILED(hr)) + goto error; + + size = subtract_bytes(size, chunk.dwSize + sizeof(chunk)); + } + break; + + default: + TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + + hr = advance_stream(stream, chunk.dwSize - sizeof(chunk.fccID)); + if (FAILED(hr)) + goto error; + + size = subtract_bytes(size, chunk.dwSize - sizeof(chunk.fccID)); + break; + } + break; + } + + default: + TRACE("Unknown chunk %s: %u bytes\n", debugstr_fourcc(chunk.fccID), chunk.dwSize); + + hr = advance_stream(stream, chunk.dwSize); + if (FAILED(hr)) + goto error; + + break; + } + } + + This->loaded = TRUE; + + return S_OK; + +error: + HeapFree(GetProcessHeap(), 0, This->regions); + This->regions = NULL; + + return DMUS_E_UNSUPPORTED_STREAM; } diff --git a/reactos/dll/directx/dmusic/port.c b/reactos/dll/directx/dmusic/port.c index c6281a47ca7..459fdb8cd5c 100644 --- a/reactos/dll/directx/dmusic/port.c +++ b/reactos/dll/directx/dmusic/port.c @@ -1,6 +1,8 @@ -/* IDirectMusicPort Implementation +/* + * IDirectMusicPort Implementation * * Copyright (C) 2003-2004 Rok Mandeljc + * Copyright (C) 2012 Christian Costa * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,178 +19,452 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include <assert.h> #include "dmusic_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dmusic); -/* IDirectMusicPortImpl IUnknown part: */ -static HRESULT WINAPI IDirectMusicPortImpl_QueryInterface (LPDIRECTMUSICPORT iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpVtbl, iface); - - TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj); - - if (IsEqualIID (riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IDirectMusicPort) || - IsEqualGUID(riid, &IID_IDirectMusicPort8)) { - *ppobj = &This->lpVtbl; - IDirectMusicPort_AddRef((LPDIRECTMUSICPORT)*ppobj); - return S_OK; - } else if (IsEqualGUID(riid, &IID_IDirectMusicPortDownload) || - IsEqualGUID(riid, &IID_IDirectMusicPortDownload8)) { - *ppobj = &This->lpDownloadVtbl; - IDirectMusicPortDownload_AddRef((LPDIRECTMUSICPORTDOWNLOAD)*ppobj); - return S_OK; - } else if (IsEqualGUID(riid, &IID_IDirectMusicThru) || - IsEqualGUID(riid, &IID_IDirectMusicThru8)) { - *ppobj = &This->lpThruVtbl; - IDirectMusicThru_AddRef((LPDIRECTMUSICTHRU)*ppobj); - return S_OK; - } - WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ppobj); - return E_NOINTERFACE; +static inline IDirectMusicDownloadedInstrumentImpl* impl_from_IDirectMusicDownloadedInstrument(IDirectMusicDownloadedInstrument *iface) +{ + return CONTAINING_RECORD(iface, IDirectMusicDownloadedInstrumentImpl, IDirectMusicDownloadedInstrument_iface); } -static ULONG WINAPI IDirectMusicPortImpl_AddRef (LPDIRECTMUSICPORT iface) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - TRACE("(%p)->(ref before=%u)\n", This, refCount - 1); - - DMUSIC_LockModule(); - - return refCount; +static inline SynthPortImpl *impl_from_SynthPortImpl_IDirectMusicPort(IDirectMusicPort *iface) +{ + return CONTAINING_RECORD(iface, SynthPortImpl, IDirectMusicPort_iface); } -static ULONG WINAPI IDirectMusicPortImpl_Release (LPDIRECTMUSICPORT iface) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE("(%p)->(ref before=%u)\n", This, refCount + 1); - - if (!refCount) { - HeapFree(GetProcessHeap(), 0, This); - } - - DMUSIC_UnlockModule(); - - return refCount; +static inline SynthPortImpl *impl_from_SynthPortImpl_IDirectMusicPortDownload(IDirectMusicPortDownload *iface) +{ + return CONTAINING_RECORD(iface, SynthPortImpl, IDirectMusicPortDownload_iface); } -/* IDirectMusicPortImpl IDirectMusicPort part: */ -static HRESULT WINAPI IDirectMusicPortImpl_PlayBuffer (LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER pBuffer) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p): stub\n", This, pBuffer); - return S_OK; +static inline SynthPortImpl *impl_from_SynthPortImpl_IDirectMusicThru(IDirectMusicThru *iface) +{ + return CONTAINING_RECORD(iface, SynthPortImpl, IDirectMusicThru_iface); } -static HRESULT WINAPI IDirectMusicPortImpl_SetReadNotificationHandle (LPDIRECTMUSICPORT iface, HANDLE hEvent) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p): stub\n", This, hEvent); - return S_OK; +/* IDirectMusicDownloadedInstrument IUnknown part follows: */ +static HRESULT WINAPI IDirectMusicDownloadedInstrumentImpl_QueryInterface(IDirectMusicDownloadedInstrument *iface, REFIID riid, VOID **ret_iface) +{ + TRACE("(%p, %s, %p)\n", iface, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDirectMusicDownloadedInstrument) || + IsEqualIID(riid, &IID_IDirectMusicDownloadedInstrument8)) + { + IDirectMusicDownloadedInstrument_AddRef(iface); + *ret_iface = iface; + return S_OK; + } + + WARN("(%p, %s, %p): not found\n", iface, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static HRESULT WINAPI IDirectMusicPortImpl_Read (LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER pBuffer) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p): stub\n", This, pBuffer); - return S_OK; +static ULONG WINAPI IDirectMusicDownloadedInstrumentImpl_AddRef(LPDIRECTMUSICDOWNLOADEDINSTRUMENT iface) +{ + IDirectMusicDownloadedInstrumentImpl *This = impl_from_IDirectMusicDownloadedInstrument(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(): new ref = %u\n", iface, ref); + + DMUSIC_LockModule(); + + return ref; } -static HRESULT WINAPI IDirectMusicPortImpl_DownloadInstrument (LPDIRECTMUSICPORT iface, IDirectMusicInstrument* pInstrument, IDirectMusicDownloadedInstrument** ppDownloadedInstrument, DMUS_NOTERANGE* pNoteRanges, DWORD dwNumNoteRanges) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; +static ULONG WINAPI IDirectMusicDownloadedInstrumentImpl_Release(LPDIRECTMUSICDOWNLOADEDINSTRUMENT iface) +{ + IDirectMusicDownloadedInstrumentImpl *This = impl_from_IDirectMusicDownloadedInstrument(iface); + ULONG ref = InterlockedDecrement(&This->ref); - FIXME("(%p, %p, %p, %p, %d): stub\n", This, pInstrument, ppDownloadedInstrument, pNoteRanges, dwNumNoteRanges); + TRACE("(%p)->(): new ref = %u\n", iface, ref); - if (!pInstrument || !ppDownloadedInstrument || (dwNumNoteRanges && !pNoteRanges)) - return E_POINTER; + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This->data); + HeapFree(GetProcessHeap(), 0, This); + } - return DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(&IID_IDirectMusicDownloadedInstrument, (LPVOID*)ppDownloadedInstrument, NULL); + DMUSIC_UnlockModule(); + + return ref; } -static HRESULT WINAPI IDirectMusicPortImpl_UnloadInstrument (LPDIRECTMUSICPORT iface, IDirectMusicDownloadedInstrument *pDownloadedInstrument) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p): stub\n", This, pDownloadedInstrument); - return S_OK; +static const IDirectMusicDownloadedInstrumentVtbl DirectMusicDownloadedInstrument_Vtbl = { + IDirectMusicDownloadedInstrumentImpl_QueryInterface, + IDirectMusicDownloadedInstrumentImpl_AddRef, + IDirectMusicDownloadedInstrumentImpl_Release +}; + +static inline IDirectMusicDownloadedInstrumentImpl* unsafe_impl_from_IDirectMusicDownloadedInstrument(IDirectMusicDownloadedInstrument *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &DirectMusicDownloadedInstrument_Vtbl); + + return impl_from_IDirectMusicDownloadedInstrument(iface); } -static HRESULT WINAPI IDirectMusicPortImpl_GetLatencyClock (LPDIRECTMUSICPORT iface, IReferenceClock** ppClock) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - TRACE("(%p, %p)\n", This, ppClock); - *ppClock = This->pLatencyClock; - IReferenceClock_AddRef (*ppClock); - return S_OK; +HRESULT DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(IDirectMusicDownloadedInstrument **instrument) +{ + IDirectMusicDownloadedInstrumentImpl *object; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + *instrument = NULL; + return E_OUTOFMEMORY; + } + + object->IDirectMusicDownloadedInstrument_iface.lpVtbl = &DirectMusicDownloadedInstrument_Vtbl; + object->ref = 1; + + *instrument = &object->IDirectMusicDownloadedInstrument_iface; + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortImpl_GetRunningStats (LPDIRECTMUSICPORT iface, LPDMUS_SYNTHSTATS pStats) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p): stub\n", This, pStats); - return S_OK; +/* SynthPortImpl IDirectMusicPort IUnknown part follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_QueryInterface(LPDIRECTMUSICPORT iface, REFIID riid, LPVOID *ret_iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface); + + if (IsEqualIID (riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IDirectMusicPort) || + IsEqualGUID(riid, &IID_IDirectMusicPort8)) { + *ret_iface = &This->IDirectMusicPort_iface; + IDirectMusicPort_AddRef((LPDIRECTMUSICPORT)*ret_iface); + return S_OK; + } else if (IsEqualGUID(riid, &IID_IDirectMusicPortDownload) || + IsEqualGUID(riid, &IID_IDirectMusicPortDownload8)) { + *ret_iface = &This->IDirectMusicPortDownload_iface; + IDirectMusicPortDownload_AddRef((LPDIRECTMUSICPORTDOWNLOAD)*ret_iface); + return S_OK; + } else if (IsEqualGUID(riid, &IID_IDirectMusicThru) || + IsEqualGUID(riid, &IID_IDirectMusicThru8)) { + *ret_iface = &This->IDirectMusicThru_iface; + IDirectMusicThru_AddRef((LPDIRECTMUSICTHRU)*ret_iface); + return S_OK; + } + + WARN("(%p, %s, %p): not found\n", This, debugstr_dmguid(riid), ret_iface); + + return E_NOINTERFACE; } -static HRESULT WINAPI IDirectMusicPortImpl_Compact (LPDIRECTMUSICPORT iface) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p): stub\n", This); - return S_OK; +static ULONG WINAPI SynthPortImpl_IDirectMusicPort_AddRef(LPDIRECTMUSICPORT iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(): new ref = %u\n", This, ref); + + DMUSIC_LockModule(); + + return ref; } -static HRESULT WINAPI IDirectMusicPortImpl_GetCaps (LPDIRECTMUSICPORT iface, LPDMUS_PORTCAPS pPortCaps) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - TRACE("(%p, %p)\n", This, pPortCaps); - *pPortCaps = This->caps; - return S_OK; +static ULONG WINAPI SynthPortImpl_IDirectMusicPort_Release(LPDIRECTMUSICPORT iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): new ref = %u\n", This, ref); + + if (!ref) + { + IDirectMusicSynth_Activate(This->synth, FALSE); + IDirectMusicSynth_Close(This->synth); + IDirectMusicSynth_Release(This->synth); + IDirectMusicSynthSink_Release(This->synth_sink); + IReferenceClock_Release(This->pLatencyClock); + HeapFree(GetProcessHeap(), 0, This); + } + + DMUSIC_UnlockModule(); + + return ref; } -static HRESULT WINAPI IDirectMusicPortImpl_DeviceIoControl (LPDIRECTMUSICPORT iface, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %d, %p, %d, %p, %d, %p, %p): stub\n", This, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned, lpOverlapped); - return S_OK; +/* SynthPortImpl IDirectMusicPort interface follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_PlayBuffer(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + HRESULT hr; + REFERENCE_TIME time; + LPBYTE data; + DWORD size; + + TRACE("(%p/%p)->(%p)\n", iface, This, buffer); + + if (!buffer) + return E_POINTER; + + hr = IDirectMusicBuffer_GetStartTime(buffer, &time); + + if (SUCCEEDED(hr)) + hr = IDirectMusicBuffer_GetRawBufferPtr(buffer, &data); + + if (SUCCEEDED(hr)) + hr = IDirectMusicBuffer_GetUsedBytes(buffer, &size); + + if (SUCCEEDED(hr)) + hr = IDirectMusicSynth_PlayBuffer(This->synth, time, data, size); + + return hr; } -static HRESULT WINAPI IDirectMusicPortImpl_SetNumChannelGroups (LPDIRECTMUSICPORT iface, DWORD dwChannelGroups) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %d): semi-stub\n", This, dwChannelGroups); - This->nrofgroups = dwChannelGroups; - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetReadNotificationHandle(LPDIRECTMUSICPORT iface, HANDLE event) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, event); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortImpl_GetNumChannelGroups (LPDIRECTMUSICPORT iface, LPDWORD pdwChannelGroups) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - TRACE("(%p, %p)\n", This, pdwChannelGroups); - *pdwChannelGroups = This->nrofgroups; - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Read(LPDIRECTMUSICPORT iface, LPDIRECTMUSICBUFFER buffer) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, buffer); + + return S_OK; } -HRESULT WINAPI IDirectMusicPortImpl_Activate (LPDIRECTMUSICPORT iface, BOOL fActive) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - TRACE("(%p, %d)\n", This, fActive); - This->fActive = fActive; - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_DownloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicInstrument* instrument, IDirectMusicDownloadedInstrument** downloaded_instrument, DMUS_NOTERANGE* note_ranges, DWORD num_note_ranges) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + IDirectMusicInstrumentImpl *instrument_object; + HRESULT ret; + BOOL free; + HANDLE download; + DMUS_DOWNLOADINFO *info; + DMUS_OFFSETTABLE *offset_table; + DMUS_INSTRUMENT *instrument_info; + BYTE *data; + ULONG offset; + ULONG nb_regions; + ULONG size; + ULONG i; + + TRACE("(%p/%p)->(%p, %p, %p, %d)\n", iface, This, instrument, downloaded_instrument, note_ranges, num_note_ranges); + + if (!instrument || !downloaded_instrument || (num_note_ranges && !note_ranges)) + return E_POINTER; + + instrument_object = impl_from_IDirectMusicInstrument(instrument); + + nb_regions = instrument_object->header.cRegions; + size = sizeof(DMUS_DOWNLOADINFO) + sizeof(ULONG) * (1 + nb_regions) + sizeof(DMUS_INSTRUMENT) + sizeof(DMUS_REGION) * nb_regions; + + data = (BYTE*)HeapAlloc(GetProcessHeap(), 0, size); + if (!data) + return E_OUTOFMEMORY; + + info = (DMUS_DOWNLOADINFO*)data; + offset_table = (DMUS_OFFSETTABLE*)(data + sizeof(DMUS_DOWNLOADINFO)); + offset = sizeof(DMUS_DOWNLOADINFO) + sizeof(ULONG) * (1 + nb_regions); + + info->dwDLType = DMUS_DOWNLOADINFO_INSTRUMENT2; + info->dwDLId = 0; + info->dwNumOffsetTableEntries = 1 + instrument_object->header.cRegions; + info->cbSize = size; + + offset_table->ulOffsetTable[0] = offset; + instrument_info = (DMUS_INSTRUMENT*)(data + offset); + offset += sizeof(DMUS_INSTRUMENT); + instrument_info->ulPatch = MIDILOCALE2Patch(&instrument_object->header.Locale); + instrument_info->ulFirstRegionIdx = 1; + instrument_info->ulGlobalArtIdx = 0; /* FIXME */ + instrument_info->ulFirstExtCkIdx = 0; /* FIXME */ + instrument_info->ulCopyrightIdx = 0; /* FIXME */ + instrument_info->ulFlags = 0; /* FIXME */ + + for (i = 0; i < nb_regions; i++) + { + DMUS_REGION *region = (DMUS_REGION*)(data + offset); + + offset_table->ulOffsetTable[1 + i] = offset; + offset += sizeof(DMUS_REGION); + region->RangeKey = instrument_object->regions[i].header.RangeKey; + region->RangeVelocity = instrument_object->regions[i].header.RangeVelocity; + region->fusOptions = instrument_object->regions[i].header.fusOptions; + region->usKeyGroup = instrument_object->regions[i].header.usKeyGroup; + region->ulRegionArtIdx = 0; /* FIXME */ + region->ulNextRegionIdx = i != (nb_regions - 1) ? (i + 2) : 0; + region->ulFirstExtCkIdx = 0; /* FIXME */ + region->WaveLink = instrument_object->regions[i].wave_link; + region->WSMP = instrument_object->regions[i].wave_sample; + region->WLOOP[0] = instrument_object->regions[i].wave_loop; + } + + ret = IDirectMusicSynth8_Download(This->synth, &download, (VOID*)data, &free); + + if (SUCCEEDED(ret)) + ret = DMUSIC_CreateDirectMusicDownloadedInstrumentImpl(downloaded_instrument); + + if (SUCCEEDED(ret)) + { + IDirectMusicDownloadedInstrumentImpl *downloaded_object = impl_from_IDirectMusicDownloadedInstrument(*downloaded_instrument); + + downloaded_object->data = data; + downloaded_object->downloaded = TRUE; + } + + *downloaded_instrument = NULL; + HeapFree(GetProcessHeap(), 0, data); + + return E_FAIL; } -static HRESULT WINAPI IDirectMusicPortImpl_SetChannelPriority (LPDIRECTMUSICPORT iface, DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %d, %d, %d): semi-stub\n", This, dwChannelGroup, dwChannel, dwPriority); - if (dwChannel > 16) { - WARN("isn't there supposed to be 16 channels (no. %d requested)?! (faking as it is ok)\n", dwChannel); - /*return E_INVALIDARG;*/ - } - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_UnloadInstrument(LPDIRECTMUSICPORT iface, IDirectMusicDownloadedInstrument *downloaded_instrument) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + IDirectMusicDownloadedInstrumentImpl *downloaded_object = unsafe_impl_from_IDirectMusicDownloadedInstrument(downloaded_instrument); + + TRACE("(%p/%p)->(%p)\n", iface, This, downloaded_instrument); + + if (!downloaded_instrument) + return E_POINTER; + + if (!downloaded_object->downloaded) + return DMUS_E_NOT_DOWNLOADED_TO_PORT; + + HeapFree(GetProcessHeap(), 0, downloaded_object->data); + downloaded_object->data = NULL; + downloaded_object->downloaded = FALSE; + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortImpl_GetChannelPriority (LPDIRECTMUSICPORT iface, DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - TRACE("(%p, %d, %d, %p)\n", This, dwChannelGroup, dwChannel, pdwPriority); - *pdwPriority = This->group[dwChannelGroup-1].channel[dwChannel].priority; - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetLatencyClock(LPDIRECTMUSICPORT iface, IReferenceClock** clock) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%p)\n", iface, This, clock); + + *clock = This->pLatencyClock; + IReferenceClock_AddRef(*clock); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortImpl_SetDirectSound (LPDIRECTMUSICPORT iface, LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p, %p, %p): stub\n", This, pDirectSound, pDirectSoundBuffer); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetRunningStats(LPDIRECTMUSICPORT iface, LPDMUS_SYNTHSTATS stats) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, stats); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortImpl_GetFormat (LPDIRECTMUSICPORT iface, LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Compact(LPDIRECTMUSICPORT iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(): stub\n", iface, This); + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetCaps(LPDIRECTMUSICPORT iface, LPDMUS_PORTCAPS port_caps) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%p)\n", iface, This, port_caps); + + *port_caps = This->caps; + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_DeviceIoControl(LPDIRECTMUSICPORT iface, DWORD io_control_code, LPVOID in_buffer, DWORD in_buffer_size, + LPVOID out_buffer, DWORD out_buffer_size, LPDWORD bytes_returned, LPOVERLAPPED overlapped) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%d, %p, %d, %p, %d, %p, %p): stub\n", iface, This, io_control_code, in_buffer, in_buffer_size, out_buffer, out_buffer_size, bytes_returned, overlapped); + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetNumChannelGroups(LPDIRECTMUSICPORT iface, DWORD channel_groups) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%d): semi-stub\n", iface, This, channel_groups); + + This->nrofgroups = channel_groups; + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetNumChannelGroups(LPDIRECTMUSICPORT iface, LPDWORD channel_groups) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%p)\n", iface, This, channel_groups); + + *channel_groups = This->nrofgroups; + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Activate(LPDIRECTMUSICPORT iface, BOOL active) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%d)\n", iface, This, active); + + This->fActive = active; + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, DWORD priority) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%d, %d, %d): semi-stub\n", iface, This, channel_group, channel, priority); + + if (channel > 16) + { + WARN("isn't there supposed to be 16 channels (no. %d requested)?! (faking as it is ok)\n", channel); + /*return E_INVALIDARG;*/ + } + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetChannelPriority(LPDIRECTMUSICPORT iface, DWORD channel_group, DWORD channel, LPDWORD priority) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + TRACE("(%p/%p)->(%u, %u, %p)\n", iface, This, channel_group, channel, priority); + + *priority = This->group[channel_group - 1].channel[channel].priority; + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetDirectSound(LPDIRECTMUSICPORT iface, LPDIRECTSOUND direct_sound, LPDIRECTSOUNDBUFFER direct_sound_buffer) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); + + FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, direct_sound, direct_sound_buffer); + + return S_OK; +} + +static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetFormat(LPDIRECTMUSICPORT iface, LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize, LPDWORD pdwBufferSize) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface); WAVEFORMATEX format; FIXME("(%p, %p, %p, %p): stub\n", This, pWaveFormatEx, pdwWaveFormatExSize, pdwBufferSize); @@ -231,181 +507,277 @@ static HRESULT WINAPI IDirectMusicPortImpl_GetFormat (LPDIRECTMUSICPORT iface, L return S_OK; } -static const IDirectMusicPortVtbl DirectMusicPort_Vtbl = { - IDirectMusicPortImpl_QueryInterface, - IDirectMusicPortImpl_AddRef, - IDirectMusicPortImpl_Release, - IDirectMusicPortImpl_PlayBuffer, - IDirectMusicPortImpl_SetReadNotificationHandle, - IDirectMusicPortImpl_Read, - IDirectMusicPortImpl_DownloadInstrument, - IDirectMusicPortImpl_UnloadInstrument, - IDirectMusicPortImpl_GetLatencyClock, - IDirectMusicPortImpl_GetRunningStats, - IDirectMusicPortImpl_Compact, - IDirectMusicPortImpl_GetCaps, - IDirectMusicPortImpl_DeviceIoControl, - IDirectMusicPortImpl_SetNumChannelGroups, - IDirectMusicPortImpl_GetNumChannelGroups, - IDirectMusicPortImpl_Activate, - IDirectMusicPortImpl_SetChannelPriority, - IDirectMusicPortImpl_GetChannelPriority, - IDirectMusicPortImpl_SetDirectSound, - IDirectMusicPortImpl_GetFormat +static const IDirectMusicPortVtbl SynthPortImpl_DirectMusicPort_Vtbl = { + /**** IDirectMusicPort IUnknown part methods ***/ + SynthPortImpl_IDirectMusicPort_QueryInterface, + SynthPortImpl_IDirectMusicPort_AddRef, + SynthPortImpl_IDirectMusicPort_Release, + /**** IDirectMusicPort methods ***/ + SynthPortImpl_IDirectMusicPort_PlayBuffer, + SynthPortImpl_IDirectMusicPort_SetReadNotificationHandle, + SynthPortImpl_IDirectMusicPort_Read, + SynthPortImpl_IDirectMusicPort_DownloadInstrument, + SynthPortImpl_IDirectMusicPort_UnloadInstrument, + SynthPortImpl_IDirectMusicPort_GetLatencyClock, + SynthPortImpl_IDirectMusicPort_GetRunningStats, + SynthPortImpl_IDirectMusicPort_Compact, + SynthPortImpl_IDirectMusicPort_GetCaps, + SynthPortImpl_IDirectMusicPort_DeviceIoControl, + SynthPortImpl_IDirectMusicPort_SetNumChannelGroups, + SynthPortImpl_IDirectMusicPort_GetNumChannelGroups, + SynthPortImpl_IDirectMusicPort_Activate, + SynthPortImpl_IDirectMusicPort_SetChannelPriority, + SynthPortImpl_IDirectMusicPort_GetChannelPriority, + SynthPortImpl_IDirectMusicPort_SetDirectSound, + SynthPortImpl_IDirectMusicPort_GetFormat }; -/* IDirectMusicPortDownload IUnknown parts follow: */ -static HRESULT WINAPI IDirectMusicPortDownloadImpl_QueryInterface (LPDIRECTMUSICPORTDOWNLOAD iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); - TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_dmguid(riid), ppobj); - return IUnknown_QueryInterface((IUnknown *)&(This->lpVtbl), riid, ppobj); +/* SynthPortImpl IDirectMusicPortDownload IUnknown part follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_QueryInterface(LPDIRECTMUSICPORTDOWNLOAD iface, REFIID riid, LPVOID *ret_iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface); + + return IDirectMusicPort_QueryInterface(&This->IDirectMusicPort_iface, riid, ret_iface); } -static ULONG WINAPI IDirectMusicPortDownloadImpl_AddRef (LPDIRECTMUSICPORTDOWNLOAD iface) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); - TRACE("(%p/%p)->()\n", This, iface); - return IUnknown_AddRef((IUnknown *)&(This->lpVtbl)); +static ULONG WINAPI SynthPortImpl_IDirectMusicPortDownload_AddRef (LPDIRECTMUSICPORTDOWNLOAD iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + TRACE("(%p/%p)->()\n", iface, This); + + return IDirectMusicPort_AddRef(&This->IDirectMusicPort_iface); } -static ULONG WINAPI IDirectMusicPortDownloadImpl_Release (LPDIRECTMUSICPORTDOWNLOAD iface) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); - TRACE("(%p/%p)->()\n", This, iface); - return IUnknown_Release((IUnknown *)&(This->lpVtbl)); +static ULONG WINAPI SynthPortImpl_IDirectMusicPortDownload_Release(LPDIRECTMUSICPORTDOWNLOAD iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + TRACE("(%p/%p)->()\n", iface, This); + + return IDirectMusicPort_Release(&This->IDirectMusicPort_iface); } -/* IDirectMusicPortDownload Interface follow: */ -static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetBuffer (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD dwDLId, IDirectMusicDownload** ppIDMDownload) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); +/* SynthPortImpl IDirectMusicPortDownload Interface follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_GetBuffer(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD DLId, IDirectMusicDownload** IDMDownload) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); - FIXME("(%p/%p)->(%d, %p): stub\n", This, iface, dwDLId, ppIDMDownload); + FIXME("(%p/%p)->(%u, %p): stub\n", iface, This, DLId, IDMDownload); - if (!ppIDMDownload) - return E_POINTER; + if (!IDMDownload) + return E_POINTER; - return DMUSIC_CreateDirectMusicDownloadImpl(&IID_IDirectMusicDownload, (LPVOID*)ppIDMDownload, NULL); + return DMUSIC_CreateDirectMusicDownloadImpl(&IID_IDirectMusicDownload, (LPVOID*)IDMDownload, NULL); } -static HRESULT WINAPI IDirectMusicPortDownloadImpl_AllocateBuffer (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD dwSize, IDirectMusicDownload** ppIDMDownload) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); - FIXME("(%p/%p)->(%d, %p): stub\n", This, iface, dwSize, ppIDMDownload); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_AllocateBuffer(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD size, IDirectMusicDownload** IDMDownload) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + FIXME("(%p/%p)->(%u, %p): stub\n", iface, This, size, IDMDownload); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetDLId (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* pdwStartDLId, DWORD dwCount) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpDownloadVtbl, iface); - FIXME("(%p/%p)->(%p, %d): stub\n", This, iface, pdwStartDLId, dwCount); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_GetDLId(LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* start_DLId, DWORD count) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + FIXME("(%p/%p)->(%p, %u): stub\n", iface, This, start_DLId, count); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortDownloadImpl_GetAppend (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* pdwAppend) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p/%p)->(%p): stub\n", This, iface, pdwAppend); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_GetAppend (LPDIRECTMUSICPORTDOWNLOAD iface, DWORD* append) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, append); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortDownloadImpl_Download (LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* pIDMDownload) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p/%p)->(%p): stub\n", This, iface, pIDMDownload); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_Download(LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* IDMDownload) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, IDMDownload); + + return S_OK; } -static HRESULT WINAPI IDirectMusicPortDownloadImpl_Unload (LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* pIDMDownload) { - IDirectMusicPortImpl *This = (IDirectMusicPortImpl *)iface; - FIXME("(%p/%p)->(%p): stub\n", This, iface, pIDMDownload); - return S_OK; +static HRESULT WINAPI SynthPortImpl_IDirectMusicPortDownload_Unload(LPDIRECTMUSICPORTDOWNLOAD iface, IDirectMusicDownload* IDMDownload) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPortDownload(iface); + + FIXME("(%p/%p)->(%p): stub\n", iface, This, IDMDownload); + + return S_OK; } -static const IDirectMusicPortDownloadVtbl DirectMusicPortDownload_Vtbl = { - IDirectMusicPortDownloadImpl_QueryInterface, - IDirectMusicPortDownloadImpl_AddRef, - IDirectMusicPortDownloadImpl_Release, - IDirectMusicPortDownloadImpl_GetBuffer, - IDirectMusicPortDownloadImpl_AllocateBuffer, - IDirectMusicPortDownloadImpl_GetDLId, - IDirectMusicPortDownloadImpl_GetAppend, - IDirectMusicPortDownloadImpl_Download, - IDirectMusicPortDownloadImpl_Unload +static const IDirectMusicPortDownloadVtbl SynthPortImpl_DirectMusicPortDownload_Vtbl = { + /*** IDirectMusicPortDownload IUnknown part methods ***/ + SynthPortImpl_IDirectMusicPortDownload_QueryInterface, + SynthPortImpl_IDirectMusicPortDownload_AddRef, + SynthPortImpl_IDirectMusicPortDownload_Release, + /*** IDirectMusicPortDownload methods ***/ + SynthPortImpl_IDirectMusicPortDownload_GetBuffer, + SynthPortImpl_IDirectMusicPortDownload_AllocateBuffer, + SynthPortImpl_IDirectMusicPortDownload_GetDLId, + SynthPortImpl_IDirectMusicPortDownload_GetAppend, + SynthPortImpl_IDirectMusicPortDownload_Download, + SynthPortImpl_IDirectMusicPortDownload_Unload }; -/* IDirectMusicThru IUnknown parts follow: */ -static HRESULT WINAPI IDirectMusicThruImpl_QueryInterface (LPDIRECTMUSICTHRU iface, REFIID riid, LPVOID *ppobj) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpThruVtbl, iface); - TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_dmguid(riid), ppobj); - return IUnknown_QueryInterface((IUnknown *)&(This->lpVtbl), riid, ppobj); +/* SynthPortImpl IDirectMusicThru IUnknown part follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicThru_QueryInterface(LPDIRECTMUSICTHRU iface, REFIID riid, LPVOID *ret_iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicThru(iface); + + TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_dmguid(riid), ret_iface); + + return IDirectMusicPort_QueryInterface(&This->IDirectMusicPort_iface, riid, ret_iface); } -static ULONG WINAPI IDirectMusicThruImpl_AddRef (LPDIRECTMUSICTHRU iface) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpThruVtbl, iface); - TRACE("(%p/%p)->()\n", This, iface); - return IUnknown_AddRef((IUnknown *)&(This->lpVtbl)); +static ULONG WINAPI SynthPortImpl_IDirectMusicThru_AddRef(LPDIRECTMUSICTHRU iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicThru(iface); + + TRACE("(%p/%p)->()\n", iface, This); + + return IDirectMusicPort_AddRef(&This->IDirectMusicPort_iface); } -static ULONG WINAPI IDirectMusicThruImpl_Release (LPDIRECTMUSICTHRU iface) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpThruVtbl, iface); - TRACE("(%p/%p)->()\n", This, iface); - return IUnknown_Release((IUnknown *)&(This->lpVtbl)); +static ULONG WINAPI SynthPortImpl_IDirectMusicThru_Release(LPDIRECTMUSICTHRU iface) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicThru(iface); + + TRACE("(%p/%p)->()\n", iface, This); + + return IDirectMusicPort_Release(&This->IDirectMusicPort_iface); } -/* IDirectMusicThru Interface follow: */ -static HRESULT WINAPI IDirectMusicThruImpl_ThruChannel (LPDIRECTMUSICTHRU iface, DWORD dwSourceChannelGroup, DWORD dwSourceChannel, DWORD dwDestinationChannelGroup, DWORD dwDestinationChannel, LPDIRECTMUSICPORT pDestinationPort) { - ICOM_THIS_MULTI(IDirectMusicPortImpl, lpThruVtbl, iface); - FIXME("(%p/%p)->(%d, %d, %d, %d, %p): stub\n", This, iface, dwSourceChannelGroup, dwSourceChannel, dwDestinationChannelGroup, dwDestinationChannel, pDestinationPort); - return S_OK; +/* SynthPortImpl IDirectMusicThru Interface follows: */ +static HRESULT WINAPI SynthPortImpl_IDirectMusicThru_ThruChannel(LPDIRECTMUSICTHRU iface, DWORD source_channel_group, DWORD source_channel, DWORD destination_channel_group, + DWORD destination_channel, LPDIRECTMUSICPORT destination_port) +{ + SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicThru(iface); + + FIXME("(%p/%p)->(%d, %d, %d, %d, %p): stub\n", iface, This, source_channel_group, source_channel, destination_channel_group, destination_channel, destination_port); + + return S_OK; } -static const IDirectMusicThruVtbl DirectMusicThru_Vtbl = { - IDirectMusicThruImpl_QueryInterface, - IDirectMusicThruImpl_AddRef, - IDirectMusicThruImpl_Release, - IDirectMusicThruImpl_ThruChannel +static const IDirectMusicThruVtbl SynthPortImpl_DirectMusicThru_Vtbl = { + /*** IDirectMusicThru IUnknown part methods */ + SynthPortImpl_IDirectMusicThru_QueryInterface, + SynthPortImpl_IDirectMusicThru_AddRef, + SynthPortImpl_IDirectMusicThru_Release, + /*** IDirectMusicThru methods ***/ + SynthPortImpl_IDirectMusicThru_ThruChannel }; -HRESULT WINAPI DMUSIC_CreateDirectMusicPortImpl (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter, LPDMUS_PORTPARAMS pPortParams, LPDMUS_PORTCAPS pPortCaps) { - IDirectMusicPortImpl *obj; +HRESULT DMUSIC_CreateSynthPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) +{ + SynthPortImpl *obj; + HRESULT hr = E_FAIL; + int i; - TRACE("(%p,%p,%p)\n", lpcGUID, ppobj, pUnkOuter); + TRACE("(%p,%p,%p,%p,%p%d)\n", guid, object, unkouter, port_params, port_caps, device); - obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicPortImpl)); - if (NULL == obj) { - *ppobj = NULL; - return E_OUTOFMEMORY; - } - obj->lpVtbl = &DirectMusicPort_Vtbl; - obj->lpDownloadVtbl = &DirectMusicPortDownload_Vtbl; - obj->lpThruVtbl = &DirectMusicThru_Vtbl; - obj->ref = 0; /* will be inited by QueryInterface */ - obj->fActive = FALSE; - obj->params = *pPortParams; - obj->caps = *pPortCaps; - obj->pDirectSound = NULL; - obj->pLatencyClock = NULL; - DMUSIC_CreateReferenceClockImpl(&IID_IReferenceClock, (LPVOID*)&obj->pLatencyClock, NULL); + *object = NULL; -#if 0 - if (pPortParams->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS) { - obj->nrofgroups = pPortParams->dwChannelGroups; - /* setting default priorities */ - for (j = 0; j < obj->nrofgroups; j++) { - TRACE ("Setting default channel priorities on channel group %i\n", j + 1); - obj->group[j].channel[0].priority = DAUD_CHAN1_DEF_VOICE_PRIORITY; - obj->group[j].channel[1].priority = DAUD_CHAN2_DEF_VOICE_PRIORITY; - obj->group[j].channel[2].priority = DAUD_CHAN3_DEF_VOICE_PRIORITY; - obj->group[j].channel[3].priority = DAUD_CHAN4_DEF_VOICE_PRIORITY; - obj->group[j].channel[4].priority = DAUD_CHAN5_DEF_VOICE_PRIORITY; - obj->group[j].channel[5].priority = DAUD_CHAN6_DEF_VOICE_PRIORITY; - obj->group[j].channel[6].priority = DAUD_CHAN7_DEF_VOICE_PRIORITY; - obj->group[j].channel[7].priority = DAUD_CHAN8_DEF_VOICE_PRIORITY; - obj->group[j].channel[8].priority = DAUD_CHAN9_DEF_VOICE_PRIORITY; - obj->group[j].channel[9].priority = DAUD_CHAN10_DEF_VOICE_PRIORITY; - obj->group[j].channel[10].priority = DAUD_CHAN11_DEF_VOICE_PRIORITY; - obj->group[j].channel[11].priority = DAUD_CHAN12_DEF_VOICE_PRIORITY; - obj->group[j].channel[12].priority = DAUD_CHAN13_DEF_VOICE_PRIORITY; - obj->group[j].channel[13].priority = DAUD_CHAN14_DEF_VOICE_PRIORITY; - obj->group[j].channel[14].priority = DAUD_CHAN15_DEF_VOICE_PRIORITY; - obj->group[j].channel[15].priority = DAUD_CHAN16_DEF_VOICE_PRIORITY; - } - } -#endif + obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SynthPortImpl)); + if (!obj) + return E_OUTOFMEMORY; - return IDirectMusicPortImpl_QueryInterface ((LPDIRECTMUSICPORT)obj, lpcGUID, ppobj); + obj->IDirectMusicPort_iface.lpVtbl = &SynthPortImpl_DirectMusicPort_Vtbl; + obj->IDirectMusicPortDownload_iface.lpVtbl = &SynthPortImpl_DirectMusicPortDownload_Vtbl; + obj->IDirectMusicThru_iface.lpVtbl = &SynthPortImpl_DirectMusicThru_Vtbl; + obj->ref = 0; /* Will be inited by QueryInterface */ + obj->fActive = FALSE; + obj->params = *port_params; + obj->caps = *port_caps; + + hr = DMUSIC_CreateReferenceClockImpl(&IID_IReferenceClock, (LPVOID*)&obj->pLatencyClock, NULL); + if (hr != S_OK) + { + HeapFree(GetProcessHeap(), 0, obj); + return hr; + } + + if (SUCCEEDED(hr)) + hr = CoCreateInstance(&CLSID_DirectMusicSynth, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynth, (void**)&obj->synth); + + if (SUCCEEDED(hr)) + hr = CoCreateInstance(&CLSID_DirectMusicSynthSink, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusicSynthSink, (void**)&obj->synth_sink); + + if (SUCCEEDED(hr)) + hr = IDirectMusicSynth_SetMasterClock(obj->synth, obj->pLatencyClock); + + if (SUCCEEDED(hr)) + hr = IDirectMusicSynthSink_SetMasterClock(obj->synth_sink, obj->pLatencyClock); + + if (SUCCEEDED(hr)) + hr = IDirectMusicSynth_SetSynthSink(obj->synth, obj->synth_sink); + + if (SUCCEEDED(hr)) + hr = IDirectMusicSynth_Open(obj->synth, port_params); + + if (0) + { + if (port_params->dwValidParams & DMUS_PORTPARAMS_CHANNELGROUPS) { + obj->nrofgroups = port_params->dwChannelGroups; + /* Setting default priorities */ + for (i = 0; i < obj->nrofgroups; i++) { + TRACE ("Setting default channel priorities on channel group %i\n", i + 1); + obj->group[i].channel[0].priority = DAUD_CHAN1_DEF_VOICE_PRIORITY; + obj->group[i].channel[1].priority = DAUD_CHAN2_DEF_VOICE_PRIORITY; + obj->group[i].channel[2].priority = DAUD_CHAN3_DEF_VOICE_PRIORITY; + obj->group[i].channel[3].priority = DAUD_CHAN4_DEF_VOICE_PRIORITY; + obj->group[i].channel[4].priority = DAUD_CHAN5_DEF_VOICE_PRIORITY; + obj->group[i].channel[5].priority = DAUD_CHAN6_DEF_VOICE_PRIORITY; + obj->group[i].channel[6].priority = DAUD_CHAN7_DEF_VOICE_PRIORITY; + obj->group[i].channel[7].priority = DAUD_CHAN8_DEF_VOICE_PRIORITY; + obj->group[i].channel[8].priority = DAUD_CHAN9_DEF_VOICE_PRIORITY; + obj->group[i].channel[9].priority = DAUD_CHAN10_DEF_VOICE_PRIORITY; + obj->group[i].channel[10].priority = DAUD_CHAN11_DEF_VOICE_PRIORITY; + obj->group[i].channel[11].priority = DAUD_CHAN12_DEF_VOICE_PRIORITY; + obj->group[i].channel[12].priority = DAUD_CHAN13_DEF_VOICE_PRIORITY; + obj->group[i].channel[13].priority = DAUD_CHAN14_DEF_VOICE_PRIORITY; + obj->group[i].channel[14].priority = DAUD_CHAN15_DEF_VOICE_PRIORITY; + obj->group[i].channel[15].priority = DAUD_CHAN16_DEF_VOICE_PRIORITY; + } + } + } + + if (SUCCEEDED(hr)) + return IDirectMusicPort_QueryInterface((LPDIRECTMUSICPORT)obj, guid, object); + + if (obj->synth) + IDirectMusicSynth_Release(obj->synth); + if (obj->synth_sink) + IDirectMusicSynthSink_Release(obj->synth_sink); + if (obj->pLatencyClock) + IReferenceClock_Release(obj->pLatencyClock); + HeapFree(GetProcessHeap(), 0, obj); + + return hr; +} + +HRESULT DMUSIC_CreateMidiOutPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) +{ + TRACE("(%p,%p,%p,%p,%p,%d): stub\n", guid, object, unkouter, port_params, port_caps, device); + + return E_NOTIMPL; +} + +HRESULT DMUSIC_CreateMidiInPortImpl(LPCGUID guid, LPVOID *object, LPUNKNOWN unkouter, LPDMUS_PORTPARAMS port_params, LPDMUS_PORTCAPS port_caps, DWORD device) +{ + TRACE("(%p,%p,%p,%p,%p,%d): stub\n", guid, object, unkouter, port_params, port_caps, device); + + return E_NOTIMPL; } diff --git a/reactos/dll/directx/dmusic/version.rc b/reactos/dll/directx/dmusic/version.rc index 86812fa80a1..f7cd58750c4 100644 --- a/reactos/dll/directx/dmusic/version.rc +++ b/reactos/dll/directx/dmusic/version.rc @@ -16,12 +16,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_OLESELFREGISTER +1 WINE_REGISTRY dmusic.rgs + #define WINE_FILEDESCRIPTION_STR "Wine DirectMusic" #define WINE_FILENAME_STR "dmusic.dll" #define WINE_FILEVERSION 5,3,1,904 #define WINE_FILEVERSION_STR "5.3.1.904" #define WINE_PRODUCTVERSION 5,3,1,904 #define WINE_PRODUCTVERSION_STR "5.3.1.904" +#define WINE_EXTRAVALUES VALUE "OLESelfRegister","" -#include "wine/wine_common_ver.rc" +#include <wine/wine_common_ver.rc> diff --git a/reactos/include/dxsdk/dmusicc.h b/reactos/include/dxsdk/dmusicc.h index 7aac00b177d..731b750e7e8 100644 --- a/reactos/include/dxsdk/dmusicc.h +++ b/reactos/include/dxsdk/dmusicc.h @@ -380,7 +380,7 @@ DECLARE_INTERFACE_(IDirectMusic,IUnknown) STDMETHOD_(ULONG,Release)(THIS) PURE; /*** IDirectMusic methods ***/ STDMETHOD(EnumPort)(THIS_ DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) PURE; - STDMETHOD(CreateMusicBuffer)(THIS_ LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER **ppBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(CreateMusicBuffer)(THIS_ LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER *ppBuffer, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(CreatePort)(THIS_ REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT *ppPort, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(EnumMasterClock)(THIS_ DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo) PURE; STDMETHOD(GetMasterClock)(THIS_ LPGUID pguidClock, struct IReferenceClock **ppReferenceClock) PURE; @@ -421,7 +421,7 @@ DECLARE_INTERFACE_(IDirectMusic8,IDirectMusic) STDMETHOD_(ULONG,Release)(THIS) PURE; /*** IDirectMusic methods ***/ STDMETHOD(EnumPort)(THIS_ DWORD dwIndex, LPDMUS_PORTCAPS pPortCaps) PURE; - STDMETHOD(CreateMusicBuffer)(THIS_ LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER **ppBuffer, LPUNKNOWN pUnkOuter) PURE; + STDMETHOD(CreateMusicBuffer)(THIS_ LPDMUS_BUFFERDESC pBufferDesc, LPDIRECTMUSICBUFFER *ppBuffer, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(CreatePort)(THIS_ REFCLSID rclsidPort, LPDMUS_PORTPARAMS pPortParams, LPDIRECTMUSICPORT *ppPort, LPUNKNOWN pUnkOuter) PURE; STDMETHOD(EnumMasterClock)(THIS_ DWORD dwIndex, LPDMUS_CLOCKINFO lpClockInfo) PURE; STDMETHOD(GetMasterClock)(THIS_ LPGUID pguidClock, struct IReferenceClock **ppReferenceClock) PURE; diff --git a/reactos/include/dxsdk/dmusics.h b/reactos/include/dxsdk/dmusics.h index 402707f2146..7d48e93dd01 100644 --- a/reactos/include/dxsdk/dmusics.h +++ b/reactos/include/dxsdk/dmusics.h @@ -1,157 +1,237 @@ +/* + * DirectMusic Software Synth Definitions + * + * Copyright (C) 2003-2004 Rok Mandeljc + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ -#ifndef _DMUSICS_ -#define _DMUSICS_ +#ifndef __WINE_DMUSIC_SOFTWARESYNTH_H +#define __WINE_DMUSIC_SOFTWARESYNTH_H -#include "dmusicc.h" +#include <dmusicc.h> -#define REGSTR_PATH_SOFTWARESYNTHS "Software\\Microsoft\\DirectMusic\\SoftwareSynths" +/***************************************************************************** + * Registry path + */ +#define REGSTR_PATH_SOFTWARESYNTHS "Software\\Microsoft\\DirectMusic\\SoftwareSynths" -interface IDirectMusicSynth; -interface IDirectMusicSynthSink; +/***************************************************************************** + * Predeclare the interfaces + */ +/* IIDs */ +DEFINE_GUID(IID_IDirectMusicSynth, 0x09823661,0x5c85,0x11d2,0xaf,0xa6,0x00,0xaa,0x00,0x24,0xd8,0xb6); +DEFINE_GUID(IID_IDirectMusicSynth8, 0x53cab625,0x2711,0x4c9f,0x9d,0xe7,0x1b,0x7f,0x92,0x5f,0x6f,0xc8); +DEFINE_GUID(IID_IDirectMusicSynthSink, 0x09823663,0x5c85,0x11d2,0xaf,0xa6,0x00,0xaa,0x00,0x24,0xd8,0xb6); + +/* typedef definitions */ +typedef struct IDirectMusicSynth *LPDIRECTMUSICSYNTH; +typedef struct IDirectMusicSynth8 *LPDIRECTMUSICSYNTH8; +typedef struct IDirectMusicSynthSink *LPDIRECTMUSICSYNTHSINK; + +/* GUIDs - property set */ +DEFINE_GUID(GUID_DMUS_PROP_SetSynthSink, 0x0a3a5ba5,0x37b6,0x11d2,0xb9,0xf9,0x00,0x00,0xf8,0x75,0xac,0x12); +DEFINE_GUID(GUID_DMUS_PROP_SinkUsesDSound, 0xbe208857,0x8952,0x11d2,0xba,0x1c,0x00,0x00,0xf8,0x75,0xac,0x12); + + +/***************************************************************************** + * Flags + */ +#define REFRESH_F_LASTBUFFER 0x1 + + +/***************************************************************************** + * Structures + */ #ifndef _DMUS_VOICE_STATE_DEFINED #define _DMUS_VOICE_STATE_DEFINED +/* typedef definition */ +typedef struct _DMUS_VOICE_STATE DMUS_VOICE_STATE, *LPDMUS_VOICE_STATE; -DEFINE_GUID(IID_IDirectMusicSynth, 0x9823661, 0x5C85, 0x11D2, 0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6); -DEFINE_GUID(IID_IDirectMusicSynth8, 0x53CAB625, 0x2711, 0x4C9F, 0x9D, 0xE7, 0x1B, 0x7F, 0x92, 0x5F, 0x6F, 0xC8); -DEFINE_GUID(IID_IDirectMusicSynthSink, 0x09823663, 0x5C85, 0x11D2, 0xAF, 0xA6, 0x00, 0xAA, 0x00, 0x24, 0xD8, 0xB6); -DEFINE_GUID(GUID_DMUS_PROP_SetSynthSink, 0x0A3A5BA5, 0x37B6, 0x11D2, 0xB9, 0xF9, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12); -DEFINE_GUID(GUID_DMUS_PROP_SinkUsesDSound, 0xBE208857, 0x8952, 0x11D2, 0xBA, 0x1C, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x12); +/* actual structure */ +struct _DMUS_VOICE_STATE { + BOOL bExists; + SAMPLE_POSITION spPosition; +}; +#endif /* _DMUS_VOICE_STATE_DEFINED */ -#define REFRESH_F_LASTBUFFER 0x00000001 -typedef struct _DMUS_VOICE_STATE +/***************************************************************************** + * IDirectMusicSynth interface + */ +#define INTERFACE IDirectMusicSynth +DECLARE_INTERFACE_(IDirectMusicSynth,IUnknown) { - BOOL bExists; - SAMPLE_POSITION spPosition; -} DMUS_VOICE_STATE; - -#endif - -#undef INTERFACE -#define INTERFACE IDirectMusicSynth -DECLARE_INTERFACE_(IDirectMusicSynth, IUnknown) -{ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(Open) (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(SetNumChannelGroups) (THIS_ DWORD dwGroups) PURE; - STDMETHOD(Download) (THIS_ LPHANDLE phDownload, LPVOID pvData, LPBOOL pbFree ) PURE; - STDMETHOD(Unload) (THIS_ HANDLE hDownload, HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), HANDLE hUserData ) PURE; - STDMETHOD(PlayBuffer) (THIS_ REFERENCE_TIME rt,LPBYTE pbBuffer, DWORD cbBuffer) PURE; - STDMETHOD(GetRunningStats) (THIS_ LPDMUS_SYNTHSTATS pStats) PURE; - STDMETHOD(GetPortCaps) (THIS_ LPDMUS_PORTCAPS pCaps) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SetSynthSink) (THIS_ struct IDirectMusicSynthSink *pSynthSink) PURE; - STDMETHOD(Render) (THIS_ short *pBuffer, DWORD dwLength, LONGLONG llPosition) PURE; - STDMETHOD(SetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) PURE; - STDMETHOD(GetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize) PURE; - STDMETHOD(GetAppend) (THIS_ DWORD* pdwAppend) PURE; + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectMusicSynth methods ***/ + STDMETHOD(Open)(THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; + STDMETHOD(Close)(THIS) PURE; + STDMETHOD(SetNumChannelGroups)(THIS_ DWORD dwGroups) PURE; + STDMETHOD(Download)(THIS_ LPHANDLE phDownload, LPVOID pvData, LPBOOL pbFree) PURE; + STDMETHOD(Unload)(THIS_ HANDLE hDownload, HRESULT (CALLBACK* lpFreeHandle)(HANDLE,HANDLE), HANDLE hUserData) PURE; + STDMETHOD(PlayBuffer)(THIS_ REFERENCE_TIME rt, LPBYTE pbBuffer, DWORD cbBuffer) PURE; + STDMETHOD(GetRunningStats)(THIS_ LPDMUS_SYNTHSTATS pStats) PURE; + STDMETHOD(GetPortCaps)(THIS_ LPDMUS_PORTCAPS pCaps) PURE; + STDMETHOD(SetMasterClock)(THIS_ IReferenceClock *pClock) PURE; + STDMETHOD(GetLatencyClock)(THIS_ IReferenceClock **ppClock) PURE; + STDMETHOD(Activate)(THIS_ BOOL fEnable) PURE; + STDMETHOD(SetSynthSink)(THIS_ struct IDirectMusicSynthSink *pSynthSink) PURE; + STDMETHOD(Render)(THIS_ short *pBuffer, DWORD dwLength, LONGLONG llPosition) PURE; + STDMETHOD(SetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) PURE; + STDMETHOD(GetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; + STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSiz) PURE; + STDMETHOD(GetAppend)(THIS_ DWORD *pdwAppend) PURE; }; -#undef INTERFACE +#undef INTERFACE #if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectMusicSynth_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectMusicSynth_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectMusicSynth_Release(p) (p)->lpVtbl->Release(p) -#define IDirectMusicSynth_Open(p, a) (p)->lpVtbl->Open(p, a) -#define IDirectMusicSynth_Close(p) (p)->lpVtbl->Close(p) -#define IDirectMusicSynth_SetNumChannelGroups(p, a) (p)->lpVtbl->SetNumChannelGroups(p, a) -#define IDirectMusicSynth_Download(p, a, b, c) (p)->lpVtbl->Download(p, a, b, c) -#define IDirectMusicSynth_Unload(p, a, b, c) (p)->lpVtbl->Unload(p, a, b, c) -#define IDirectMusicSynth_PlayBuffer(p, a, b, c) (p)->lpVtbl->PlayBuffer(p, a, b, c) -#define IDirectMusicSynth_GetRunningStats(p, a) (p)->lpVtbl->GetRunningStats(p, a) -#define IDirectMusicSynth_GetPortCaps(p, a) (p)->lpVtbl->GetPortCaps(p, a) -#define IDirectMusicSynth_SetMasterClock(p, a) (p)->lpVtbl->SetMasterClock((p, a) -#define IDirectMusicSynth_GetLatencyClock(p, a) (p)->lpVtbl->GetLatencyClock(p, a) -#define IDirectMusicSynth_Activate(p, a) (p)->lpVtbl->Activate((p, a) -#define IDirectMusicSynth_SetSynthSink(p, a) (p)->lpVtbl->SetSynthSink(p, a) -#define IDirectMusicSynth_Render(p, a, b, c) (p)->lpVtbl->Render(p, a, b, c) -#define IDirectMusicSynth_SetChannelPriority(p, a, b, c) (p)->lpVtbl->SetChannelPriority(p, a, b, c) -#define IDirectMusicSynth_GetChannelPriority(p, a, b, c) (p)->lpVtbl->GetChannelPriority(p, a, b, c) -#define IDirectMusicSynth_GetFormat(p, a, b) (p)->lpVtbl->GetFormat(p, a, b) -#define IDirectMusicSynth_GetAppend(p, a) (p)->lpVtbl->GetAppend(p, a) +/*** IUnknown methods ***/ +#define IDirectMusicSynth_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectMusicSynth_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectMusicSynth_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectMusicSynth methods ***/ +#define IDirectMusicSynth_Open(p,a) (p)->lpVtbl->Open(p,a) +#define IDirectMusicSynth_Close(p) (p)->lpVtbl->Close(p) +#define IDirectMusicSynth_SetNumChannelGroups(p,a) (p)->lpVtbl->SetNumChannelGroups(p,a) +#define IDirectMusicSynth_Download(p,a,b,c) (p)->lpVtbl->Download(p,a,b,c) +#define IDirectMusicSynth_Unload(p,a,b,c) (p)->lpVtbl->Unload(p,a,b,c) +#define IDirectMusicSynth_PlayBuffer(p,a,b,c) (p)->lpVtbl->PlayBuffer(p,a,b,c) +#define IDirectMusicSynth_GetRunningStats(p,a) (p)->lpVtbl->GetRunningStats(p,a) +#define IDirectMusicSynth_GetPortCaps(p,a) (p)->lpVtbl->GetPortCaps(p,a) +#define IDirectMusicSynth_SetMasterClock(p,a) (p)->lpVtbl->SetMasterClock(p,a) +#define IDirectMusicSynth_GetLatencyClock(p,a) (p)->lpVtbl->GetLatencyClock(p,a) +#define IDirectMusicSynth_Activate(p,a) (p)->lpVtbl->Activate(p,a) +#define IDirectMusicSynth_SetSynthSink(p,a) (p)->lpVtbl->SetSynthSink(p,a) +#define IDirectMusicSynth_Render(p,a,b,c) (p)->lpVtbl->Render(p,a,b,c) +#define IDirectMusicSynth_SetChannelPriority(p,a,b,c) (p)->lpVtbl->SetChannelPriority(p,a,b,c) +#define IDirectMusicSynth_GetChannelPriority(p,a,b,c) (p)->lpVtbl->GetChannelPriority(p,a,b,c) +#define IDirectMusicSynth_GetFormat(p,a,b) (p)->lpVtbl->GetFormat(p,a,b) +#define IDirectMusicSynth_GetAppend(p,a) (p)->lpVtbl->GetAppend(p,a) #endif -#define INTERFACE IDirectMusicSynth8 -DECLARE_INTERFACE_(IDirectMusicSynth8, IDirectMusicSynth) + +/***************************************************************************** + * IDirectMusicSynth8 interface + */ +#define INTERFACE IDirectMusicSynth8 +DECLARE_INTERFACE_(IDirectMusicSynth8,IDirectMusicSynth) { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(Open) (THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; - STDMETHOD(Close) (THIS) PURE; - STDMETHOD(SetNumChannelGroups) (THIS_ DWORD dwGroups) PURE; - STDMETHOD(Download) (THIS_ LPHANDLE phDownload, LPVOID pvData, LPBOOL pbFree ) PURE; - STDMETHOD(Unload) (THIS_ HANDLE hDownload, HRESULT ( CALLBACK *lpFreeHandle)(HANDLE,HANDLE), HANDLE hUserData ) PURE; - STDMETHOD(PlayBuffer) (THIS_ REFERENCE_TIME rt, LPBYTE pbBuffer, DWORD cbBuffer) PURE; - STDMETHOD(GetRunningStats) (THIS_ LPDMUS_SYNTHSTATS pStats) PURE; - STDMETHOD(GetPortCaps) (THIS_ LPDMUS_PORTCAPS pCaps) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SetSynthSink) (THIS_ struct IDirectMusicSynthSink *pSynthSink) PURE; - STDMETHOD(Render) (THIS_ short *pBuffer, DWORD dwLength, LONGLONG llPosition) PURE; - STDMETHOD(SetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) PURE; - STDMETHOD(GetChannelPriority) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSize) PURE; - STDMETHOD(GetAppend) (THIS_ DWORD* pdwAppend) PURE; - STDMETHOD(PlayVoice) (THIS_ REFERENCE_TIME rt, DWORD dwVoiceId, DWORD dwChannelGroup, DWORD dwChannel, DWORD dwDLId, long prPitch, long vrVolume, SAMPLE_TIME stVoiceStart, SAMPLE_TIME stLoopStart, SAMPLE_TIME stLoopEnd) PURE; - STDMETHOD(StopVoice) (THIS_ REFERENCE_TIME rt, DWORD dwVoiceId ) PURE; - STDMETHOD(GetVoiceState) (THIS_ DWORD dwVoice[], DWORD cbVoice, DMUS_VOICE_STATE dwVoiceState[] ) PURE; - STDMETHOD(Refresh) (THIS_ DWORD dwDownloadID, DWORD dwFlags) PURE; - STDMETHOD(AssignChannelToBuses) (THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwBuses, DWORD cBuses) PURE; + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectMusicSynth methods ***/ + STDMETHOD(Open)(THIS_ LPDMUS_PORTPARAMS pPortParams) PURE; + STDMETHOD(Close)(THIS) PURE; + STDMETHOD(SetNumChannelGroups)(THIS_ DWORD dwGroups) PURE; + STDMETHOD(Download)(THIS_ LPHANDLE phDownload, LPVOID pvData, LPBOOL pbFree) PURE; + STDMETHOD(Unload)(THIS_ HANDLE hDownload, HRESULT (CALLBACK* lpFreeHandle)(HANDLE,HANDLE), HANDLE hUserData) PURE; + STDMETHOD(PlayBuffer)(THIS_ REFERENCE_TIME rt, LPBYTE pbBuffer, DWORD cbBuffer) PURE; + STDMETHOD(GetRunningStats)(THIS_ LPDMUS_SYNTHSTATS pStats) PURE; + STDMETHOD(GetPortCaps)(THIS_ LPDMUS_PORTCAPS pCaps) PURE; + STDMETHOD(SetMasterClock)(THIS_ IReferenceClock *pClock) PURE; + STDMETHOD(GetLatencyClock)(THIS_ IReferenceClock **ppClock) PURE; + STDMETHOD(Activate)(THIS_ BOOL fEnable) PURE; + STDMETHOD(SetSynthSink)(THIS_ struct IDirectMusicSynthSink *pSynthSink) PURE; + STDMETHOD(Render)(THIS_ short *pBuffer, DWORD dwLength, LONGLONG llPosition) PURE; + STDMETHOD(SetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, DWORD dwPriority) PURE; + STDMETHOD(GetChannelPriority)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwPriority) PURE; + STDMETHOD(GetFormat)(THIS_ LPWAVEFORMATEX pWaveFormatEx, LPDWORD pdwWaveFormatExSiz) PURE; + STDMETHOD(GetAppend)(THIS_ DWORD *pdwAppend) PURE; + /*** IDirectMusicSynth8 methods ***/ + STDMETHOD(PlayVoice)(THIS_ REFERENCE_TIME rt, DWORD dwVoiceId, DWORD dwChannelGroup, DWORD dwChannel, DWORD dwDLId, LONG prPitch, LONG vrVolume, SAMPLE_TIME stVoiceStart, SAMPLE_TIME stLoopStart, SAMPLE_TIME stLoopEnd) PURE; + STDMETHOD(StopVoice)(THIS_ REFERENCE_TIME rt, DWORD dwVoiceId) PURE; + STDMETHOD(GetVoiceState)(THIS_ DWORD dwVoice[], DWORD cbVoice, DMUS_VOICE_STATE dwVoiceState[]) PURE; + STDMETHOD(Refresh)(THIS_ DWORD dwDownloadID, DWORD dwFlags) PURE; + STDMETHOD(AssignChannelToBuses)(THIS_ DWORD dwChannelGroup, DWORD dwChannel, LPDWORD pdwBuses, DWORD cBuses) PURE; }; -#undef INTERFACE +#undef INTERFACE #if !defined(__cplusplus) || defined(CINTERFACE) -#define IDirectMusicSynth8_QueryInterface(p, a, b) (p)->lpVtbl->QueryInterface(p, a, b) -#define IDirectMusicSynth8_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectMusicSynth8_Release(p) (p)->lpVtbl->Release(p) -#define IDirectMusicSynth8_Open(p, a) (p)->lpVtbl->Open(p, a) -#define IDirectMusicSynth8_Close(p) (p)->lpVtbl->Close(p) -#define IDirectMusicSynth8_SetNumChannelGroups(p, a) (p)->lpVtbl->SetNumChannelGroups(p, a) -#define IDirectMusicSynth8_Download(p, a, b, c) (p)->lpVtbl->Download(p, a, b, c) -#define IDirectMusicSynth8_Unload(p, a, b, c) (p)->lpVtbl->Unload(p, a, b, c) -#define IDirectMusicSynth8_PlayBuffer(p, a, b, c) (p)->lpVtbl->PlayBuffer(p, a, b, c) -#define IDirectMusicSynth8_GetRunningStats(p, a) (p)->lpVtbl->GetRunningStats(p, a) -#define IDirectMusicSynth8_GetPortCaps(p, a) (p)->lpVtbl->GetPortCaps(p, a) -#define IDirectMusicSynth8_SetMasterClock(p, a) (p)->lpVtbl->SetMasterClock((p, a) -#define IDirectMusicSynth8_GetLatencyClock(p, a) (p)->lpVtbl->GetLatencyClock(p, a) -#define IDirectMusicSynth8_Activate(p, a) (p)->lpVtbl->Activate((p, a) -#define IDirectMusicSynth8_SetSynthSink(p, a) (p)->lpVtbl->SetSynthSink(p, a) -#define IDirectMusicSynth8_Render(p, a, b, c) (p)->lpVtbl->Render(p, a, b, c) -#define IDirectMusicSynth8_SetChannelPriority(p, a, b, c) (p)->lpVtbl->SetChannelPriority(p, a, b, c) -#define IDirectMusicSynth8_GetChannelPriority(p, a, b, c) (p)->lpVtbl->GetChannelPriority(p, a, b, c) -#define IDirectMusicSynth8_GetFormat(p, a, b) (p)->lpVtbl->GetFormat(p, a, b) -#define IDirectMusicSynth8_GetAppend(p, a) (p)->lpVtbl->GetAppend(p, a) -#define IDirectMusicSynth8_PlayVoice(p, a, b, c, d, e, f, g, h, i, j) (p)->lpVtbl->PlayVoice(p, a, b, c, d, e, f, g, h, i, j) -#define IDirectMusicSynth8_StopVoice(p, a, b) (p)->lpVtbl->StopVoice(p, a, b) -#define IDirectMusicSynth8_GetVoiceState(p, a, b, c) (p)->lpVtbl->GetVoiceState(p, a, b, c) -#define IDirectMusicSynth8_Refresh(p, a, b) (p)->lpVtbl->Refresh(p, a, b) -#define IDirectMusicSynth8_AssignChannelToBuses(p, a, b, c, d) (p)->lpVtbl->AssignChannelToBuses(p, a, b, c, d) +/*** IUnknown methods ***/ +#define IDirectMusicSynth8_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectMusicSynth8_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectMusicSynth8_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectMusicSynth methods ***/ +#define IDirectMusicSynth8_Open(p,a) (p)->lpVtbl->Open(p,a) +#define IDirectMusicSynth8_Close(p) (p)->lpVtbl->Close(p) +#define IDirectMusicSynth8_SetNumChannelGroups(p,a) (p)->lpVtbl->SetNumChannelGroups(p,a) +#define IDirectMusicSynth8_Download(p,a,b,c) (p)->lpVtbl->Download(p,a,b,c) +#define IDirectMusicSynth8_Unload(p,a,b,c) (p)->lpVtbl->Unload(p,a,b,c) +#define IDirectMusicSynth8_PlayBuffer(p,a,b,c) (p)->lpVtbl->PlayBuffer(p,a,b,c) +#define IDirectMusicSynth8_GetRunningStats(p,a) (p)->lpVtbl->GetRunningStats(p,a) +#define IDirectMusicSynth8_GetPortCaps(p,a) (p)->lpVtbl->GetPortCaps(p,a) +#define IDirectMusicSynth8_SetMasterClock(p,a) (p)->lpVtbl->SetMasterClock(p,a) +#define IDirectMusicSynth8_GetLatencyClock(p,a) (p)->lpVtbl->GetLatencyClock(p,a) +#define IDirectMusicSynth8_Activate(p,a) (p)->lpVtbl->Activate(p,a) +#define IDirectMusicSynth8_SetSynthSink(p,a) (p)->lpVtbl->SetSynthSink(p,a) +#define IDirectMusicSynth8_Render(p,a,b,c) (p)->lpVtbl->Render(p,a,b,c) +#define IDirectMusicSynth8_SetChannelPriority(p,a,b,c) (p)->lpVtbl->SetChannelPriority(p,a,b,c) +#define IDirectMusicSynth8_GetChannelPriority(p,a,b,c) (p)->lpVtbl->GetChannelPriority(p,a,b,c) +#define IDirectMusicSynth8_GetFormat(p,a,b) (p)->lpVtbl->GetFormat(p,a,b) +#define IDirectMusicSynth8_GetAppend(p,a) (p)->lpVtbl->GetAppend(p,a) +/*** IDirectMusicSynth8 methods ***/ +#define IDirectMusicSynth8_PlayVoice(p,a,b,c,d,e,f,g,h,i,j) (p)->lpVtbl->PlayVoice(p,a,b,c,d,e,f,g,h,i,j) +#define IDirectMusicSynth8_StopVoice(p,a,b) (p)->lpVtbl->StopVoice(p,a,b) +#define IDirectMusicSynth8_GetVoiceState(p,a,b,c) (p)->lpVtbl->GetVoiceState(p,a,b,c) +#define IDirectMusicSynth8_Refresh(p,a,b) (p)->lpVtbl->Refresh(p,a,b) +#define IDirectMusicSynth8_AssignChannelToBuses(p,a,b,c,d) (p)->lpVtbl->AssignChannelToBuses(p,a,b,c,d) #endif -#define INTERFACE IDirectMusicSynthSink -DECLARE_INTERFACE_(IDirectMusicSynthSink, IUnknown) + +/***************************************************************************** + * IDirectMusicSynthSink interface + */ +#define INTERFACE IDirectMusicSynthSink +DECLARE_INTERFACE_(IDirectMusicSynthSink,IUnknown) { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(Init) (THIS_ IDirectMusicSynth *pSynth) PURE; - STDMETHOD(SetMasterClock) (THIS_ IReferenceClock *pClock) PURE; - STDMETHOD(GetLatencyClock) (THIS_ IReferenceClock **ppClock) PURE; - STDMETHOD(Activate) (THIS_ BOOL fEnable) PURE; - STDMETHOD(SampleToRefTime) (THIS_ LONGLONG llSampleTime, REFERENCE_TIME *prfTime) PURE; - STDMETHOD(RefTimeToSample) (THIS_ REFERENCE_TIME rfTime, LONGLONG *pllSampleTime) PURE; - STDMETHOD(SetDirectSound) (THIS_ LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; - STDMETHOD(GetDesiredBufferSize) (THIS_ LPDWORD pdwBufferSizeInSamples) PURE; + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IDirectMusicSynthSink methods ***/ + STDMETHOD(Init)(THIS_ IDirectMusicSynth *pSynth) PURE; + STDMETHOD(SetMasterClock)(THIS_ IReferenceClock *pClock) PURE; + STDMETHOD(GetLatencyClock)(THIS_ IReferenceClock **ppClock) PURE; + STDMETHOD(Activate)(THIS_ BOOL fEnable) PURE; + STDMETHOD(SampleToRefTime)(THIS_ LONGLONG llSampleTime, REFERENCE_TIME *prfTime) PURE; + STDMETHOD(RefTimeToSample)(THIS_ REFERENCE_TIME rfTime, LONGLONG *pllSampleTime) PURE; + STDMETHOD(SetDirectSound)(THIS_ LPDIRECTSOUND pDirectSound, LPDIRECTSOUNDBUFFER pDirectSoundBuffer) PURE; + STDMETHOD(GetDesiredBufferSize)(THIS_ LPDWORD pdwBufferSizeInSamples) PURE; }; +#undef INTERFACE +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDirectMusicSynthSink_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectMusicSynthSink_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectMusicSynthSink_Release(p) (p)->lpVtbl->Release(p) +/*** IDirectMusicSynth methods ***/ +#define IDirectMusicSynthSink_Init(p,a) (p)->lpVtbl->Init(p,a) +#define IDirectMusicSynthSink_SetMasterClock(p,a) (p)->lpVtbl->SetMasterClock(p,a) +#define IDirectMusicSynthSink_GetLatencyClock(p,a) (p)->lpVtbl->GetLatencyClock(p,a) +#define IDirectMusicSynthSink_Activate(p,a) (p)->lpVtbl->Activate(p,a) +#define IDirectMusicSynthSink_SampleToRefTime(p,a,b) (p)->lpVtbl->SampleToRefTime(p,a,b) +#define IDirectMusicSynthSink_RefTimeToSample(p,a,b) (p)->lpVtbl->RefTimeToSample(p,a,b) +#define IDirectMusicSynthSink_SetDirectSound(p,a,b) (p)->lpVtbl->SetDirectSound(p,a,b) +#define IDirectMusicSynthSink_GetDesiredBufferSize(p,a) (p)->lpVtbl->GetDesiredBufferSize(p,a) #endif + +#endif /* __WINE_DMUSIC_SOFTWARESYNTH_H */ diff --git a/reactos/include/psdk/dmksctrl.h b/reactos/include/psdk/dmksctrl.h index 0420d1baa45..a35afe3f9d3 100644 --- a/reactos/include/psdk/dmksctrl.h +++ b/reactos/include/psdk/dmksctrl.h @@ -1,58 +1,110 @@ /* - * dmksctrl.h + * Definition of IKsControl * - * Contributors: - * Created by Johannes Anderwald + * Copyright (C) 2012 Christian Costa * - * THIS SOFTWARE IS NOT COPYRIGHTED + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef _IKsControl_ -#define _IKsControl_ +#ifndef _DMKSCTRL_ +#define _DMKSCTRL_ + +#include <pshpack8.h> + +#include <objbase.h> + +#ifndef _KS_ +#define _KS_ + +typedef struct { + union { + struct { + GUID Set; + ULONG Id; + ULONG Flags; + } DUMMYSTRUCTNAME; + LONGLONG Alignment; + } DUMMYUNIONNAME; +} KSIDENTIFIER, *PKSIDENTIFIER; + +typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY, KSMETHOD, *PKSMETHOD, KSEVENT, *PKSEVENT; + +#define KSMETHOD_TYPE_NONE 0x00000000 +#define KSMETHOD_TYPE_READ 0x00000001 +#define KSMETHOD_TYPE_WRITE 0x00000002 +#define KSMETHOD_TYPE_MODIFY 0x00000003 +#define KSMETHOD_TYPE_SOURCE 0x00000004 + +#define KSMETHOD_TYPE_SEND 0x00000001 +#define KSMETHOD_TYPE_SETSUPPORT 0x00000100 +#define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 + +#define KSPROPERTY_TYPE_GET 0x00000001 +#define KSPROPERTY_TYPE_SET 0x00000002 +#define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 +#define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 +#define KSPROPERTY_TYPE_RELATIONS 0x00000400 +#define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 +#define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 +#define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 +#define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 +#define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 +#define KSPROPERTY_TYPE_DEFAULTVALUES 0x00010000 + +#define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 -#undef INTERFACE #define INTERFACE IKsControl -DECLARE_INTERFACE_(IKsControl, IUnknown) +DECLARE_INTERFACE_(IKsControl,IUnknown) { - /* IUnknown */ - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID FAR *) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /*IKsControl*/ - STDMETHOD(KsProperty)( - THIS_ - IN PKSPROPERTY Property, - IN ULONG PropertyLength, - IN OUT LPVOID PropertyData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsMethod)( - THIS_ - IN PKSMETHOD Method, - IN ULONG MethodLength, - IN OUT LPVOID MethodData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; - STDMETHOD(KsEvent)( - THIS_ - IN PKSEVENT Event OPTIONAL, - IN ULONG EventLength, - IN OUT LPVOID EventData, - IN ULONG DataLength, - OUT ULONG* BytesReturned - ) PURE; + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IKsControl methods ***/ + STDMETHOD(KsProperty)(THIS_ PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, + ULONG DataLength, ULONG* BytesReturned) PURE; + STDMETHOD(KsMethod)(THIS_ PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, + ULONG DataLength, ULONG* BytesReturned) PURE; + STDMETHOD(KsEvent)(THIS_ PKSEVENT Event, ULONG EventLength, LPVOID EventData, + ULONG DataLength, ULONG* BytesReturned) PURE; }; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IKsControl_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IKsControl_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IKsControl_Release(p) (p)->lpVtbl->Release(p) +/*** IKsControl methods ***/ +#define IKsControl_KsProperty(p,a,b,c,d,e) (p)->lpVtbl->KsProperty(p,a,b,c,d,e) +#define IKsControl_KsMethod(p,a,b,c,d,e) (p)->lpVtbl->KsMethod(p,a,b,c,d,e) +#define IKsControl_KsEvent(p,a,b,c,d,e) (p)->lpVtbl->KsEvent(p,a,b,c,d,e) +#endif + +#endif /* _KS_ */ + +#include <poppack.h> + + +DEFINE_GUID(IID_IKsControl, 0x28f54685, 0x06fd, 0x11d2, 0xb2, 0x7a, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96); + +#ifndef _KSMEDIA_ + +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_MIDI, 0x1d262760, 0xe957, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00); +DEFINE_GUID(KSDATAFORMAT_SUBTYPE_DIRECTMUSIC, 0x1a82f8bc, 0x3f8b, 0x11d2, 0xb7, 0x74, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1); #endif + +#endif /* _DMKSCTRL_ */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index bd09611dbb2..c733d295382 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -30,7 +30,7 @@ The following libraries are shared with Wine. reactos/dll/directx/amstream # Synced to Wine-1.3.37 reactos/dll/directx/dinput # Synced to Wine-20090208 reactos/dll/directx/dinput8 # Synced to Wine-20090208 -reactos/dll/directx/dmusic # Synced to Wine-1_1_23 +reactos/dll/directx/dmusic # Synced to Wine-1.5.26 reactos/dll/directx/dplay # Synced to Wine-1.5.26 reactos/dll/directx/dplayx # Synced to Wine-1.5.26 reactos/dll/directx/dxdiagn # Synced to Wine-0_9_5