directplay 8 KB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
1
This file contains information on the implementation of the direct play
2 3
and direct play lobby features. There's lots to do and I'm not exactly
implementing it overnight! Please lend a hand.
Alexandre Julliard's avatar
Alexandre Julliard committed
4

5 6 7
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.
Alexandre Julliard's avatar
Alexandre Julliard committed
8

Peter Hunnisett's avatar
Peter Hunnisett committed
9
Associated DirectX user header files are include/dplay.h, include/dplobby.h.
10 11

Implementation of the DPLAY and DPLAYX dlls are both in the dlls/dplayx
12 13
directory. Here's a brief description of the function of each of the files in that
directory:
14 15

dplay.c: Implementation of all the direct play object interfaces.
16

17
dplobby.c: Implementation of all the direct play lobby interfaces.
18

19 20
dpclassfactory.c: Implementation of the COM class factory which can create either
                  direct play lobby or direct play lobby interfaces.
21 22 23 24 25

dpinit.h: Header file so that dpclassfactory.c can access dplay and dplobby query 
          functions. Shouldn't be included by anything else.

dplayx_global.h,
26 27
dplayx_global.c: Implementation of all things which are associated with dplay on
                 the computer - ie shared resources and such. Methods in this
28 29 30 31 32
                 compilation unit should not call anything out side this unit
                 excepting base windows services and an interface to start the
                 messaging thread.

name_server.h,
33 34
name_server.c: Implementation of all things which are associated with the name
               server functionality
35

36 37 38 39
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.

40 41 42 43 44 45 46
dplayx_queue.h: Linked list implementation for dplay/dplobby. Based off of the BSD
                version found in <sys/queue.h>

dplayx_messages.h,
dplayx_messages.c: Messaging interface required for both DirectPlay and 
                   DirectPlayLobby.

47 48 49 50 51 52
dplaysp.c,
dplaysp.h: COM interface between DPLAYX and the service provider dlls. dplaysp.h is
           something that should be included into any service provider. Basically 
           the COM interface is partially documented but is generally lacking in the
           finer points.

53 54 55
Presently the architectural relationship between this files is a little shakey, but
isn't so sufficiently bad that it needs fixing yet.

Alexandre Julliard's avatar
Alexandre Julliard committed
56 57
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
58 59
examples from the sdk running. Once they're at least partially working, I can
get down to trying to get some of the games working.
Alexandre Julliard's avatar
Alexandre Julliard committed
60

61 62 63 64
However, now that address separation is a reality, all binary samples provided 
in the sdk can be used. I have had success spawning processes and one
directx7 example will allow creation of an app and allow another to join it.
Unfortunately, there isn't much for it to be able to do give the state of
65 66 67 68 69 70 71 72 73 74 75
inter directlobby or directplay messaging.

Messages which work:

For session enumeration: DPMSGCMD_ENUMSESSIONSREPLY & DPMSGCMD_ENUMSESSIONSREQUEST
                         have most fields understood, but not all. Everything _seems_
                         to work.

For playerid requesting: DPMSGCMD_REQUESTNEWPLAYERID & DPMSGCMD_NEWPLAYERIDREPLY
                         barely work. This needs to be completed for sessions to be
                         able to actually start.
76

77 78 79 80 81 82 83
A small issue will be the fact that DirectX 6.1(ie. DirectPlay4) 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 final implementation.
Alexandre Julliard's avatar
Alexandre Julliard committed
84 85 86


TODO:
87 88 89 90 91 92 93 94
  - (done) Header files for DP4 and DPL3 
  - (done) Add stub functions for all DP4 and DPL3 interfaces
  - (done) Correct naming of the parameters for DP3 and DPL2
  - (done) Seperate out DP and DPL into multiple .c files
  - (done) Allow CoCreateInstance to create the new interfaces
  - (started)Implement mutual exclusion on object data for existing functions
  - (done) Create and move to correct dll directories (dplay and dplayx)
  - (done) Implement dplay in terms of dplayx
Peter Hunnisett's avatar
Peter Hunnisett committed
95 96 97 98 99
  - (done) Need a better internal implementation for the objects which scales and 
    preferably doesn't involve casting structures. Solution is a crude ctor/dtor
    which can actually trap some runtime errors.
  - (done) More generic initialization and destruction helper methods based off
    the chosen internal implementation. Solution is a crude ctor/dtor.
100 101 102 103
  - Use only windows routines where an equivalent is available
  - (done) Fix wine dplay.h and dplobby.h header files to allow apps to create the ansi versions
  - (started) Port some WineLib test programs using sdk programs (both C and C++ progs)  
  - (done) Implement a lib main for the dplayx dll (required for RunApplication, etc.)
104
  - (done)Figure out how to share the global memory correctly
105
  - Ensure that all dll stubs are present and the ordinals are correct
106
  - (started) Implementation of functionality
107
  - Addition of DirectX 7.0 functionality for direct play (try to catch that moving train)
108
  - bug fixes ;)
109
  - Implement some WineLib test programs using sdk programs as a skeleton
110
  - (done) Change all RegEnumKey calls to RegEnumKeyEx.
Peter Hunnisett's avatar
Peter Hunnisett committed
111 112
  - Change RegEnumKeyEx enumeration pattern to allow error handling and to
    share registry implementation (or at least simplify).
113 114
  - 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.
115
  - (done) Find out how to call the service provider dlls - they don't have a published interface!
116
  - Fix race condition on interface destruction
117 118 119
  - Handles need to be correctly reference counted
  - Need to check if we need to deallocate any list objects when destroying 
    dplay interface
120 121
  - RunApplication process spawning needs to have correct syncronization.
  - Need to get inter lobby messages working.
122 123
  - Decypher dplay messages between applications and implement...
  - Need to implement lobby session spawning.
124 125 126 127

ENHANCEMENTS:
  - Improve footprint and realtime blocking by setting up a seperate data share
    between lobby application and client since there can be multiple apps per 
128 129
    client. Also get rid of offset dependency by making data offset independent 
    somehow.
130 131 132 133 134 135
  - Handle everything in UNICODE (as server does) and do conversions for ANSI 
    interfaces. Should cut down on dplayx code base and maintanability (marginally)
    and could be used to improve efficiency of dialog with the server (it wouldn't
    have to do ANSI<->UNICODE transformations).


Alexandre Julliard's avatar
Alexandre Julliard committed
136

137 138 139 140 141
Programs to make work:
  - lserver.exe (from sdk)
  - override.exe (from sdk)
  - dpchat.exe (from sdk)
  - duel.exe (from sdk)
142
  - dplaunch.exe (from sdk)
Alexandre Julliard's avatar
Alexandre Julliard committed
143

Peter Hunnisett's avatar
Peter Hunnisett committed
144
Next API to implement on a per SDK program basis:
145
  override.exe
146 147
  - (calls dpserial so basic problems with that remain)
  - after that ?
148 149

  dplaunch.exe
150 151
  - I think that everything is basically working. The launched app may not
    work on the other hand.
152 153

  lserver.exe
154
  - Missing messaging portion. Everything else works.
155 156
 
  bellhop.exe
157
  - Need to implement lobby server support.
158 159 160
  - ?

  dpslots.exe
161 162
  - Works as host except for message stuff
  - Missing correct handling of receipt of playerid
Peter Hunnisett's avatar
Peter Hunnisett committed
163

164 165 166 167 168 169 170
Other TODO:

- look at problem with parsing the resource file for dplaunch. wrc problem?
- I should be getting the dialog box to come up for dpchat when something is selected
Call OLE32.7: CoCreateInstance(010017f0,00000000,00000001,010017e0,010094b4) ret=01002f38 fs=0237
Call ADVAPI32.188: RegOpenKeyExA(80000002,5e08dd90 "Software\\Microsoft\\DirectPlay\\Compatibility",00000000,00020019,40e7f49c) ret=5e0b6e5a fs=0237

171 172
   
Peter Hunnisett  -  hunnise@nortelnetworks.com