diff --git a/dlls/dplayx/Makefile.in b/dlls/dplayx/Makefile.in index a1dcc1d6b8499d450f58710821c1b750295a37f6..dfa01a8b17d735a058915706e2c9541730376a84 100644 --- a/dlls/dplayx/Makefile.in +++ b/dlls/dplayx/Makefile.in @@ -13,7 +13,8 @@ C_SRCS = dplay.c \ dplobby.c \ dpclassfactory.c \ dplayx_main.c \ - dplayx_global.c + dplayx_global.c \ + name_server.c @MAKE_DLL_RULES@ diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 3dfb0c4543c0c8f55e3bd310a6481bbc2661ae33..26f0473689ba7fbf9df33e61bc8b66087e2da4b0 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -1,6 +1,6 @@ /* Direct Play 2,3,4 Implementation * - * Copyright 1998,1999 - Peter Hunnisett + * Copyright 1998,1999,2000 - Peter Hunnisett * * <presently under construction - contact hunnise@nortelnetworks.com> * @@ -8,6 +8,7 @@ #include <string.h> #include "winerror.h" +#include "winbase.h" #include "winnt.h" #include "winreg.h" #include "dplay.h" @@ -16,6 +17,7 @@ #include "dpinit.h" #include "dplayx_global.h" +#include "name_server.h" /* FIXME: This stuff shouldn't really be here. It indicates a poor architectural coupling */ #include "dplobby.h" @@ -54,15 +56,26 @@ typedef struct tagDirectPlayIUnknownData CRITICAL_SECTION DP_lock; } DirectPlayIUnknownData; +typedef struct _enumSessionAsyncCallbackData +{ + LPDPENUMSESSIONSCALLBACK2 cb; + LPVOID lpContext; + DWORD dwTimeout; +} EnumSessionAsyncCallbackData; + /* Contains all dp1 and dp2 data members */ typedef struct tagDirectPlay2Data { - BOOL dummy; + BOOL bConnectionOpen; + + HANDLE hEnumSessionThread; + + EnumSessionAsyncCallbackData enumSessionAsyncCallbackData; } DirectPlay2Data; typedef struct tagDirectPlay3Data { - BOOL connectionInitialized; + BOOL bConnectionInitialized; } DirectPlay3Data; typedef struct tagDirectPlay4Data @@ -142,6 +155,14 @@ BOOL DP_CreateDirectPlay2( LPVOID lpDP ) return FALSE; } + This->dp2->bConnectionOpen = FALSE; + + This->dp2->hEnumSessionThread = INVALID_HANDLE_VALUE; + + This->dp2->enumSessionAsyncCallbackData.cb = NULL; + This->dp2->enumSessionAsyncCallbackData.lpContext = NULL; + This->dp2->enumSessionAsyncCallbackData.dwTimeout = INFINITE; + return TRUE; } @@ -149,6 +170,12 @@ BOOL DP_DestroyDirectPlay2( LPVOID lpDP ) { ICOM_THIS(IDirectPlay2AImpl,lpDP); + if( This->dp2->hEnumSessionThread != INVALID_HANDLE_VALUE ) + { + TerminateThread( This->dp2->hEnumSessionThread, 0 ); + CloseHandle( This->dp2->hEnumSessionThread ); + } + /* Delete the contents */ HeapFree( GetProcessHeap(), 0, This->dp2 ); @@ -166,7 +193,7 @@ BOOL DP_CreateDirectPlay3( LPVOID lpDP ) return FALSE; } - This->dp3->connectionInitialized = FALSE; + This->dp3->bConnectionInitialized = FALSE; return TRUE; } @@ -608,7 +635,12 @@ static HRESULT WINAPI DirectPlay2AImpl_CreatePlayer ( LPDIRECTPLAY2A iface, LPDPID lpidPlayer, LPDPNAME lpPlayerName, HANDLE hEvent, LPVOID lpData, DWORD dwDataSize, DWORD dwFlags ) { ICOM_THIS(IDirectPlay2Impl,iface); + FIXME("(%p)->(%p,%p,%d,%p,0x%08lx,0x%08lx): stub\n", This, lpidPlayer, lpPlayerName, hEvent, lpData, dwDataSize, dwFlags ); + + /* FIXME: Should send DPMSG_CREATEPLAYERORGROUP message to everyone, local and remote, that + belongs to this session */ + return DP_OK; } @@ -718,12 +750,113 @@ static HRESULT WINAPI DirectPlay2WImpl_EnumPlayers return DP_OK; } +void DP_SendSessionRequestBroadcast() +{ + FIXME( ": stub\n" ); +} + +void DP_InvokeEnumSessionCallbacksA( LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, + LPVOID lpContext ) +{ + FIXME( ": stub\n" ); +} + +static DWORD CALLBACK DP_EnumSessionsSpwanThreadA( LPVOID lpContext ) +{ + ICOM_THIS(IDirectPlay2Impl,lpContext); + DWORD dwTimeout = This->dp2->enumSessionAsyncCallbackData.dwTimeout; + + TRACE( "->(%p)->(0x%08lx)\n", This, dwTimeout ); + + /* FIXME: Don't think this is exactly right. It'll do for now */ + for( ;; ) + { + /* 2: Send the broadcast for session enumeration */ + DP_SendSessionRequestBroadcast( NULL, 0 ); /* Should pass lpsd */ + + SleepEx( dwTimeout, FALSE ); + + DP_InvokeEnumSessionCallbacksA( This->dp2->enumSessionAsyncCallbackData.cb, + This->dp2->enumSessionAsyncCallbackData.lpContext ); + } + + return 0; +} + static HRESULT WINAPI DirectPlay2AImpl_EnumSessions ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwTimeout, LPDPENUMSESSIONSCALLBACK2 lpEnumSessionsCallback2, LPVOID lpContext, DWORD dwFlags ) { ICOM_THIS(IDirectPlay2Impl,iface); - FIXME("(%p)->(%p,0x%08lx,%p,%p,0x%08lx): stub\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags ); + + TRACE("(%p)->(%p,0x%08lx,%p,%p,0x%08lx)\n", This, lpsd, dwTimeout, lpEnumSessionsCallback2, lpContext, dwFlags ); + + if( dwTimeout == 0 ) + { + FIXME( ": should provide a dependent dwTimeout\n" ); + dwTimeout = 5 * 1000; /* 5 seconds */ + } + + if( dwFlags & DPENUMSESSIONS_STOPASYNC ) + { + /* Does a thread exist? If so we were doing an async enum session */ + if( This->dp2->hEnumSessionThread != INVALID_HANDLE_VALUE ) + { + /* FIXME: This needs to be send an event to the thread to clean itself up */ + TerminateThread( This->dp2->hEnumSessionThread, 0 ); + CloseHandle( This->dp2->hEnumSessionThread ); + + This->dp2->hEnumSessionThread = INVALID_HANDLE_VALUE; + + This->dp2->enumSessionAsyncCallbackData.cb = NULL; + This->dp2->enumSessionAsyncCallbackData.lpContext = NULL; + This->dp2->enumSessionAsyncCallbackData.dwTimeout = INFINITE; + + return DP_OK; + } + + /* Indicate some sort of error... */ + WARN( "STOPASYNC attempted when no async running\n" ); + return DP_OK; + } + + /* FIXME: Interface locking sucks in this method */ + + if( ( dwFlags & DPENUMSESSIONS_ASYNC ) ) + { + DWORD dwThreadId; + + /* See if we've already created a thread to service this interface */ + if( This->dp2->hEnumSessionThread == INVALID_HANDLE_VALUE ) + { + + This->dp2->enumSessionAsyncCallbackData.cb = lpEnumSessionsCallback2; + This->dp2->enumSessionAsyncCallbackData.lpContext = lpContext; + This->dp2->enumSessionAsyncCallbackData.dwTimeout = dwTimeout; + + TRACE( ": creating EnumSessions thread\n" ); + + This->dp2->hEnumSessionThread = CreateThread( NULL, + 0, + DP_EnumSessionsSpwanThreadA, + This, + 0, + &dwThreadId ); + } + + DP_InvokeEnumSessionCallbacksA( lpEnumSessionsCallback2, lpContext ); + } + else + { + /* Send the broadcast for session enumeration */ + /* FIXME: How to handle the replies? Queue? */ + DP_SendSessionRequestBroadcast( lpsd, dwFlags ); + + SleepEx( dwTimeout, FALSE ); + + DP_InvokeEnumSessionCallbacksA( lpEnumSessionsCallback2, lpContext ); + } + return DP_OK; } @@ -903,7 +1036,33 @@ static HRESULT WINAPI DirectPlay2AImpl_Open ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpsd, DWORD dwFlags ) { ICOM_THIS(IDirectPlay2Impl,iface); + FIXME("(%p)->(%p,0x%08lx): stub\n", This, lpsd, dwFlags ); + + if( This->dp2->bConnectionOpen ) + { + TRACE( ": rejecting already open connection.\n" ); + return DPERR_ALREADYINITIALIZED; + } + + /* When we open we need to stop any EnumSession activity */ + IDirectPlayX_EnumSessions( iface, NULL, 0, NULL, NULL, DPENUMSESSIONS_STOPASYNC ); + + if( dwFlags & DPOPEN_CREATE ) + { + dwFlags &= ~DPOPEN_CREATE; + + /* Rightoo - this computer is the host and the local computer needs to be + the name server so that others can join this session */ + DPLAYX_NS_SetLocalComputerAsNameServer( lpsd ); + + } + + if( dwFlags ) + { + ERR( ": ignored dwFlags 0x%08lx\n", dwFlags ); + } + return DP_OK; } @@ -1105,12 +1264,13 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections HKEY hkResult; LPCSTR searchSubKey = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers"; LPSTR guidDataSubKey = "Guid"; - DWORD dwIndex, sizeOfSubKeyName=50; char subKeyName[51]; + DWORD dwIndex, sizeOfSubKeyName=50; + FILETIME filetime; /* Need to loop over the service providers in the registry */ if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey, - 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS ) + 0, KEY_READ, &hkResult ) != ERROR_SUCCESS ) { /* Hmmm. Does this mean that there are no service providers? */ ERR(": no service providers?\n"); @@ -1120,8 +1280,9 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections /* Traverse all the service providers we have available */ for( dwIndex=0; - RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS; - ++dwIndex ) + RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, + NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS; + ++dwIndex, sizeOfSubKeyName=51 ) { HKEY hkServiceProvider; @@ -1139,7 +1300,7 @@ static HRESULT WINAPI DirectPlay3AImpl_EnumConnections TRACE(" this time through: %s\n", subKeyName ); /* Get a handle for this particular service provider */ - if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE, + if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ, &hkServiceProvider ) != ERROR_SUCCESS ) { ERR(": what the heck is going on?\n" ); @@ -1269,7 +1430,7 @@ static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection return DPERR_INVALIDFLAGS; } - if( This->dp3->connectionInitialized == TRUE ) + if( This->dp3->bConnectionInitialized == TRUE ) { return DPERR_ALREADYINITIALIZED; } @@ -1303,7 +1464,7 @@ static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection #endif /* This interface is now initialized */ - This->dp3->connectionInitialized = TRUE; + This->dp3->bConnectionInitialized = TRUE; return DP_OK; } @@ -1320,7 +1481,11 @@ static HRESULT WINAPI DirectPlay3AImpl_SecureOpen ( LPDIRECTPLAY3A iface, LPCDPSESSIONDESC2 lpsd, DWORD dwFlags, LPCDPSECURITYDESC lpSecurity, LPCDPCREDENTIALS lpCredentials ) { ICOM_THIS(IDirectPlay3Impl,iface); + FIXME("(%p)->(%p,0x%08lx,%p,%p): stub\n", This, lpsd, dwFlags, lpSecurity, lpCredentials ); + + IDirectPlayX_EnumSessions( iface, NULL, 0, NULL, NULL, DPENUMSESSIONS_STOPASYNC ); + return DP_OK; } @@ -1928,6 +2093,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback, DWORD dwIndex; DWORD sizeOfSubKeyName=50; char subKeyName[51]; + FILETIME filetime; TRACE(": lpEnumCallback=%p lpContext=%p\n", lpEnumCallback, lpContext ); @@ -1938,7 +2104,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback, /* Need to loop over the service providers in the registry */ if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey, - 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS ) + 0, KEY_READ, &hkResult ) != ERROR_SUCCESS ) { /* Hmmm. Does this mean that there are no service providers? */ ERR(": no service providers?\n"); @@ -1947,8 +2113,9 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback, /* Traverse all the service providers we have available */ for( dwIndex=0; - RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS; - ++dwIndex ) + RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, + NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS; + ++dwIndex, sizeOfSubKeyName=50 ) { LPSTR majVerDataSubKey = "dwReserved1"; LPSTR minVerDataSubKey = "dwReserved2"; @@ -1963,7 +2130,7 @@ HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA lpEnumCallback, TRACE(" this time through: %s\n", subKeyName ); /* Get a handle for this particular service provider */ - if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE, + if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ, &hkServiceProvider ) != ERROR_SUCCESS ) { ERR(": what the heck is going on?\n" ); diff --git a/dlls/dplayx/dplobby.c b/dlls/dplayx/dplobby.c index 3c6b9c7c5bc12534c90bb73592fc460582e01d20..805bb0000a9690294c71109cf4600bb79f71b4fe 100644 --- a/dlls/dplayx/dplobby.c +++ b/dlls/dplayx/dplobby.c @@ -1,6 +1,6 @@ /* Direct Play Lobby 2 & 3 Implementation * - * Copyright 1998,1999 - Peter Hunnisett + * Copyright 1998,1999,2000 - Peter Hunnisett * * <presently under construction - contact hunnise@nortelnetworks.com> * @@ -843,6 +843,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes LPCSTR searchSubKey = "SOFTWARE\\Microsoft\\DirectPlay\\Service Providers"; DWORD dwIndex, sizeOfSubKeyName=50; char subKeyName[51]; + FILETIME filetime; TRACE(" (%p)->(%p,%p,%p,0x%08lx)\n", This, lpEnumAddressTypeCallback, guidSP, lpContext, dwFlags ); @@ -863,7 +864,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes /* Need to loop over the service providers in the registry */ if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey, - 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS ) + 0, KEY_READ, &hkResult ) != ERROR_SUCCESS ) { /* Hmmm. Does this mean that there are no service providers? */ ERR(": no service providers?\n"); @@ -872,8 +873,9 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes /* Traverse all the service providers we have available */ for( dwIndex=0; - RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS; - ++dwIndex ) + RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, + NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS; + ++dwIndex, sizeOfSubKeyName=50 ) { HKEY hkServiceProvider, hkServiceProviderAt; @@ -885,12 +887,13 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes DWORD dwAtIndex; LPSTR atKey = "Address Types"; LPSTR guidDataSubKey = "Guid"; + FILETIME filetime; TRACE(" this time through: %s\n", subKeyName ); /* Get a handle for this particular service provider */ - if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE, + if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ, &hkServiceProvider ) != ERROR_SUCCESS ) { ERR(": what the heck is going on?\n" ); @@ -918,17 +921,18 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumAddressTypes } /* Get a handle for this particular service provider */ - if( RegOpenKeyExA( hkServiceProvider, atKey, 0, KEY_QUERY_VALUE, + if( RegOpenKeyExA( hkServiceProvider, atKey, 0, KEY_READ, &hkServiceProviderAt ) != ERROR_SUCCESS ) { - WARN(": No Address Types registry data sub key/members\n" ); + TRACE(": No Address Types registry data sub key/members\n" ); break; } /* Traverse all the address type we have available */ for( dwAtIndex=0; - RegEnumKeyA( hkServiceProviderAt, dwAtIndex, atSubKey, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS; - ++dwAtIndex ) + RegEnumKeyExA( hkServiceProviderAt, dwAtIndex, atSubKey, &sizeOfSubKeyName, + NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS; + ++dwAtIndex, sizeOfSubKeyName=50 ) { TRACE( "Found Address Type GUID %s\n", atSubKey ); @@ -997,6 +1001,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications LPSTR guidDataSubKey = "Guid"; DWORD dwIndex, sizeOfSubKeyName=50; char subKeyName[51]; + FILETIME filetime; TRACE("(%p)->(%p,%p,0x%08lx)\n", This, lpEnumLocalAppCallback, lpContext, dwFlags ); @@ -1012,7 +1017,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications /* Need to loop over the service providers in the registry */ if( RegOpenKeyExA( HKEY_LOCAL_MACHINE, searchSubKey, - 0, KEY_ENUMERATE_SUB_KEYS, &hkResult ) != ERROR_SUCCESS ) + 0, KEY_READ, &hkResult ) != ERROR_SUCCESS ) { /* Hmmm. Does this mean that there are no service providers? */ ERR(": no service providers?\n"); @@ -1021,8 +1026,8 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications /* Traverse all registered applications */ for( dwIndex=0; - RegEnumKeyA( hkResult, dwIndex, subKeyName, sizeOfSubKeyName ) != ERROR_NO_MORE_ITEMS; - ++dwIndex ) + RegEnumKeyExA( hkResult, dwIndex, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, &filetime ) != ERROR_NO_MORE_ITEMS; + ++dwIndex, sizeOfSubKeyName=50 ) { HKEY hkServiceProvider; @@ -1035,7 +1040,7 @@ static HRESULT WINAPI IDirectPlayLobbyAImpl_EnumLocalApplications TRACE(" this time through: %s\n", subKeyName ); /* Get a handle for this particular service provider */ - if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_QUERY_VALUE, + if( RegOpenKeyExA( hkResult, subKeyName, 0, KEY_READ, &hkServiceProvider ) != ERROR_SUCCESS ) { ERR(": what the heck is going on?\n" ); diff --git a/dlls/dplayx/name_server.c b/dlls/dplayx/name_server.c new file mode 100644 index 0000000000000000000000000000000000000000..57188aab5dbe6a1fcba955eea5f9ff9c57389a7e --- /dev/null +++ b/dlls/dplayx/name_server.c @@ -0,0 +1,22 @@ +/* DPLAYX.DLL name server implementation + * + * Copyright 2000 - Peter Hunnisett + * + * <presently under construction - contact hunnise@nortelnetworks.com> + * + */ + +/* NOTE: Methods with the NS_ prefix are name server methods */ + + +#include "debugtools.h" +#include "name_server.h" + +DEFAULT_DEBUG_CHANNEL(dplay); + + +void DPLAYX_NS_SetLocalComputerAsNameServer( LPDPSESSIONDESC2 lpsd ) +{ + FIXME( ": (%p) stub\n", lpsd ); +} + diff --git a/dlls/dplayx/name_server.h b/dlls/dplayx/name_server.h new file mode 100644 index 0000000000000000000000000000000000000000..b0404d6f9d3ae296787b61353161f71acceffbe1 --- /dev/null +++ b/dlls/dplayx/name_server.h @@ -0,0 +1,9 @@ + +#ifndef __WINE_DPLAYX_NAMESERVER +#define __WINE_DPLAYX_NAMESERVER + +#include "dplay.h" + +void DPLAYX_NS_SetLocalComputerAsNameServer( LPDPSESSIONDESC2 lpsd ); + +#endif /* __WINE_DPLAYX_NAMESERVER */ diff --git a/documentation/status/directplay b/documentation/status/directplay index b3ad62ac44c93c894f9f03b61676b7cc71d954d8..13f5703222ec0b85bbf66e38cf84a97e5decb17e 100644 --- a/documentation/status/directplay +++ b/documentation/status/directplay @@ -1,12 +1,35 @@ This file contains information on the implementation of the direct play -and direct play lobby features. +and direct play lobby features. There's lots to do and I'm not exactly +implementing it overnight! Please lend a hand. -Most methods and APIs are not implemented at this point. Examine the code -to see what has been implemented. Stay tuned for some information here once -there is more implementation (and I figure out what the heck I'm doing). +Most methods and APIs are but stubs at this point. Examine the code +to see what has been implemented. Use -debugmsg +dplay to get a +reasonably thourough description of what's going on. -The files are include/dplay.h, include/dplobby.h, multimedia/dplobby.c and multimedia/dplay.c. -The .c files will be moved to appropriate dll directories at some later time. +Associated header files are include/dplay.h, include/dplobby.h. + +Implementation of the DPLAY and DPLAYX dlls are both in the dlls/dplayx +directory. + +dplay.c: Implementation of all the direct play object interfaces. +dplobby.c: Implementation of all the direct play lobby interfaces. +dpclassfactory.c: Implementation of the COM class factory which can create either + direct play lobby or direct play lobby interfaces. +dplayx_global.c: 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. +name_server.c: Implementation of all things which are associated with the name + server functionality +dplayx_main.c: LibMain executed for loading and unloading the dll. This will make + the call to dplayx_global.c to request initialization and destruction + of any global data. + +Presently the architectural relationship between this files is a little shakey, but +isn't so sufficiently bad that it needs fixing yet. + +Everything right now will run in the context of the calling thread, but at some +point in the future the code will actually be far enough along to create a thread +for session management. I think I can safely say that any application which requires direct play or direct play lobby will not work at this point. Priority will be to get @@ -42,12 +65,16 @@ TODO: - (done) Implement a lib main for the dplayx dll (required for RunApplication, etc.) - Figure out how to share the global memory correctly - Ensure that all dll stubs are present and the ordinals are correct - - (started)Implementation of functionality + - (started) Implementation of functionality - Addition of DirectX 7.0 functionality for direct play (try to catch that moving train) - bug fixes ;) - Implement some WineLib test programs using sdk programs as a skeleton - - Change all RegEnumKey calls to RegEnumKeyEx and change enumeration pattern to allow - error handling. + - (done) Change all RegEnumKey calls to RegEnumKeyEx. + - Change RegEnumKeyEx enumeration pattern to allow error handling. + - 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 - but in a safe direction. + - Find out how to call the service provider dlls - they don't have a published interface! + - Fix race condition on interface destruction Programs to make work: - lserver.exe (from sdk)