Subversion Repositories spacemission

Rev

Rev 1 | Rev 10 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 4
1
unit DXPlay;
1
unit DXPlay;
2
 
2
 
3
interface
3
interface
4
 
4
 
5
{$INCLUDE DelphiXcfg.inc}
5
{$INCLUDE DelphiXcfg.inc}
6
 
6
 
7
uses
7
uses
8
  Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DirectX, DXETable;
8
  Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DXETable,  
-
 
9
{$IfDef StandardDX}
-
 
10
  DirectDraw,
-
 
11
// Delphi 2010 cannot be use DirectPlay8 because structure was not rewriten
-
 
12
//  {$IfDef DX9}
-
 
13
//  DirectPlay8, DX7toDX8;
-
 
14
//  {$Else}
-
 
15
  DirectPlay; //old wersion, current in directory
-
 
16
//  {$EndIf}
-
 
17
{$Else}
-
 
18
  DirectX;
-
 
19
{$EndIf}
9
                                                                       
20
 
10
type
21
type
-
 
22
  {$IfDef DX9}
-
 
23
  TDPID = DWORD;
-
 
24
  {$EndIf}
11
 
25
 
12
  {  TDXPlayPlayer  }
26
  {  TDXPlayPlayer  }
13
 
27
 
14
  TDXPlayPlayer = class(TCollectionItem)
28
  TDXPlayPlayer = class(TCollectionItem)
15
  private
29
  private
16
    FData: Pointer;
30
    FData: Pointer;
17
    FID: TDPID;
31
    FID: TDPID;
18
    FName: string;
32
    FName: string;
19
    FRemotePlayer: Boolean;
33
    FRemotePlayer: Boolean;
20
  public
34
  public
21
    property Data: Pointer read FData write FData;
35
    property Data: Pointer read FData write FData;
22
    property ID: TDPID read FID;
36
    property ID: TDPID read FID;
23
    property Name: string read FName;
37
    property Name: string read FName;
24
    property RemotePlayer: Boolean read FRemotePlayer;
38
    property RemotePlayer: Boolean read FRemotePlayer;
25
  end;
39
  end;
26
 
40
 
27
  {  TDXPlayPlayers  }
41
  {  TDXPlayPlayers  }
28
 
42
 
29
  TDXPlayPlayers = class(TCollection)
43
  TDXPlayPlayers = class(TCollection)
30
  private
44
  private
31
    function GetPlayer(Index: Integer): TDXPlayPlayer;
45
    function GetPlayer(Index: Integer): TDXPlayPlayer;
32
  public
46
  public
33
    constructor Create;
47
    constructor Create;
34
    function Find(ID: TDPID): TDXPlayPlayer;
48
    function Find(ID: TDPID): TDXPlayPlayer;
35
    function IndexOf(ID: TDPID): Integer;
49
    function IndexOf(ID: TDPID): Integer;
36
    property Players[Index: Integer]: TDXPlayPlayer read GetPlayer; default;
50
    property Players[Index: Integer]: TDXPlayPlayer read GetPlayer; default;
37
  end;
51
  end;
38
 
52
 
39
  {  TDXPlayModemSetting  }
53
  {  TDXPlayModemSetting  }
40
 
54
 
41
  TDXPlayModemSetting = class(TPersistent)
55
  TDXPlayModemSetting = class(TPersistent)
42
  private
56
  private
43
    FEnabled: Boolean;
57
    FEnabled: Boolean;
44
    FPhoneNumber: string;
58
    FPhoneNumber: string;
45
    FModemName: string;
59
    FModemName: string;
46
    FModemNames: TStrings;
60
    FModemNames: TStrings;
47
    function GetModemNames: TStrings;
61
    function GetModemNames: TStrings;
48
  public
62
  public
49
    destructor Destroy; override;
63
    destructor Destroy; override;
50
    procedure Assign(Source: TPersistent); override;
64
    procedure Assign(Source: TPersistent); override;
51
    property ModemName: string read FModemName write FModemName;
65
    property ModemName: string read FModemName write FModemName;
52
    property ModemNames: TStrings read GetModemNames;
66
    property ModemNames: TStrings read GetModemNames;
53
  published
67
  published
54
    property Enabled: Boolean read FEnabled write FEnabled;
68
    property Enabled: Boolean read FEnabled write FEnabled;
55
    property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
69
    property PhoneNumber: string read FPhoneNumber write FPhoneNumber;
56
  end;
70
  end;
57
 
71
 
58
  {  TDXPlayTCPIPSetting  }
72
  {  TDXPlayTCPIPSetting  }
59
 
73
 
60
  TDXPlayTCPIPSetting = class(TPersistent)
74
  TDXPlayTCPIPSetting = class(TPersistent)
61
  private
75
  private
62
    FEnabled: Boolean;
76
    FEnabled: Boolean;
63
    FHostName: string;
77
    FHostName: string;
64
    FPort: Word;
78
    FPort: Word;
65
  public
79
  public
66
    procedure Assign(Source: TPersistent); override;
80
    procedure Assign(Source: TPersistent); override;
67
  published
81
  published
68
    property Enabled: Boolean read FEnabled write FEnabled;
82
    property Enabled: Boolean read FEnabled write FEnabled;
69
    property HostName: string read FHostName write FHostName;
83
    property HostName: string read FHostName write FHostName;
70
    property Port: Word read FPort write FPort;
84
    property Port: Word read FPort write FPort;
71
  end;
85
  end;
72
 
86
 
73
  {  EDXPlayError  }
87
  {  EDXPlayError  }
74
 
88
 
75
  EDXPlayError = class(Exception);
89
  EDXPlayError = class(Exception);
76
 
90
 
77
  {  TCustomDXPlay  }
91
  {  TCustomDXPlay  }
78
 
92
 
79
  TDXPlayEvent = procedure(Sender: TObject; Player: TDXPlayPlayer) of object;
93
  TDXPlayEvent = procedure(Sender: TObject; Player: TDXPlayPlayer) of object;
80
 
94
 
81
  TDXPlayMessageEvent = procedure(Sender: TObject; From: TDXPlayPlayer;
95
  TDXPlayMessageEvent = procedure(Sender: TObject; From: TDXPlayPlayer;
82
    Data: Pointer; DataSize: Integer) of object;
96
    Data: Pointer; DataSize: Integer) of object;
83
 
97
 
84
  TDXPlaySendCompleteResult = (crOk, crAbort, crGeneric);
98
  TDXPlaySendCompleteResult = (crOk, crAbort, crGeneric);
85
 
99
 
86
  TDXPlaySendCompleteEvent = procedure(Sender: TObject; MessageID: DWORD;
100
  TDXPlaySendCompleteEvent = procedure(Sender: TObject; MessageID: DWORD;
87
    Result: TDXPlaySendCompleteResult; SendTime: Integer) of object;
101
    Result: TDXPlaySendCompleteResult; SendTime: Integer) of object;
88
 
102
 
89
  TCustomDXPlay = class(TComponent)
103
  TCustomDXPlay = class(TComponent)
90
  private
104
  private
91
    FDPlay: IDirectPlay4A;
105
    FDPlay: //{$IfDef DX7}
-
 
106
      IDirectPlay4A;//{$Else}IDirectPlay8Address{$EndIf};
92
    FGUID: string;
107
    FGUID: string;
93
    FIsHost: Boolean;
108
    FIsHost: Boolean;
94
    FLocalPlayer: TDXPlayPlayer;
109
    FLocalPlayer: TDXPlayPlayer;
95
    FMaxPlayers: Integer;
110
    FMaxPlayers: Integer;
96
    FPlayers: TDXPlayPlayers;
111
    FPlayers: TDXPlayPlayers;
97
    FCalledDoOpen: Boolean;
112
    FCalledDoOpen: Boolean;
98
    FOnAddPlayer: TDXPlayEvent;
113
    FOnAddPlayer: TDXPlayEvent;
99
    FOnClose: TNotifyEvent;
114
    FOnClose: TNotifyEvent;
100
    FOnDeletePlayer: TDXPlayEvent;
115
    FOnDeletePlayer: TDXPlayEvent;
101
    FOnMessage: TDXPlayMessageEvent;
116
    FOnMessage: TDXPlayMessageEvent;
102
    FOnOpen: TNotifyEvent;
117
    FOnOpen: TNotifyEvent;
103
    FOnSendComplete: TDXPlaySendCompleteEvent;
118
    FOnSendComplete: TDXPlaySendCompleteEvent;
104
    FOnSessionLost: TNotifyEvent;
119
    FOnSessionLost: TNotifyEvent;
105
    FOpened: Boolean;
120
    FOpened: Boolean;
106
    FRecvEvent: array[0..1] of THandle;
121
    FRecvEvent: array[0..1] of THandle;
107
    FRecvThread: TThread;
122
    FRecvThread: TThread;
108
    FInThread: Boolean;
123
    FInThread: Boolean;
109
    FProviderName: string;
124
    FProviderName: string;
110
    FProviders: TStrings;
125
    FProviders: TStrings;
111
    FSessionName: string;
126
    FSessionName: string;
112
    FSessions: TStrings;
127
    FSessions: TStrings;
113
    FReadSessioned: Boolean;
128
    FReadSessioned: Boolean;
114
    FModemSetting: TDXPlayModemSetting;
129
    FModemSetting: TDXPlayModemSetting;
115
    FTCPIPSetting: TDXPlayTCPIPSetting;
130
    FTCPIPSetting: TDXPlayTCPIPSetting;
116
    FAsync: Boolean;
131
    FAsync: Boolean;
117
    FAsyncSupported: Boolean;
132
    FAsyncSupported: Boolean;
118
    procedure ChangeDPlay;
133
    procedure ChangeDPlay;
119
    procedure CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string);
134
    procedure CreateDPlayWithoutDialog(out DPlay:
-
 
135
     //{$IfDef DX7}
-
 
136
     IDirectPlay4A;
-
 
137
     //{$Else}IDirectPlay8Address{$EndIf};
-
 
138
      const ProviderName: string);
120
    function OpenDPlayWithLobby(out Name: string): Boolean;
139
    function OpenDPlayWithLobby(out Name: string): Boolean;
121
    function OpenDPlayWithoutLobby(out Name: string): Boolean;
140
    function OpenDPlayWithoutLobby(out Name: string): Boolean;
122
    function OpenDPlayWithoutLobby2(const NewSession: Boolean; const ProviderName, SessionName, PlayerName: string): Boolean;
141
    function OpenDPlayWithoutLobby2(const NewSession: Boolean; const ProviderName, SessionName, PlayerName: string): Boolean;
123
    procedure Open_(NameS: string);
142
    procedure Open_(NameS: string);
124
    procedure ReceiveMessage;
143
    procedure ReceiveMessage;
125
    function GetProviders: TStrings;
144
    function GetProviders: TStrings;
126
    function GetSessionsPty: TStrings;
145
    function GetSessionsPty: TStrings;
127
    procedure ClearSessionList;
146
    procedure ClearSessionList;
128
    procedure SetGUID(const Value: string);
147
    procedure SetGUID(const Value: string);
129
    procedure SetModemSetting(Value: TDXPlayModemSetting);
148
    procedure SetModemSetting(Value: TDXPlayModemSetting);
130
    procedure SetProviderName(const Value: string);
149
    procedure SetProviderName(const Value: string);
131
    procedure SetTCPIPSetting(Value: TDXPlayTCPIPSetting);
150
    procedure SetTCPIPSetting(Value: TDXPlayTCPIPSetting);
132
  protected
151
  protected
133
    procedure DoAddPlayer(Player: TDXPlayPlayer); virtual;
152
    procedure DoAddPlayer(Player: TDXPlayPlayer); virtual;
134
    procedure DoClose; virtual;
153
    procedure DoClose; virtual;
135
    procedure DoDeletePlayer(Player: TDXPlayPlayer); virtual;
154
    procedure DoDeletePlayer(Player: TDXPlayPlayer); virtual;
136
    procedure DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); virtual;
155
    procedure DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer); virtual;
137
    procedure DoOpen; virtual;
156
    procedure DoOpen; virtual;
138
    procedure DoSessionLost; virtual;
157
    procedure DoSessionLost; virtual;
139
    procedure DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult;
158
    procedure DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult;
140
      SendTime: Integer); virtual;
159
      SendTime: Integer); virtual;
141
  public
160
  public
142
    constructor Create(AOwner: TComponent); override;
161
    constructor Create(AOwner: TComponent); override;
143
    destructor Destroy; override;
162
    destructor Destroy; override;
144
    procedure Close;
163
    procedure Close;
145
    procedure Open;
164
    procedure Open;
146
    procedure Open2(NewSession: Boolean; const SessionName, PlayerName: string);
165
    procedure Open2(NewSession: Boolean; const SessionName, PlayerName: string);
147
    function GetProviderNameFromGUID(const ProviderGUID: TGUID): string;
166
    function GetProviderNameFromGUID(const ProviderGUID: TGUID): string;
148
    procedure GetSessions;
167
    procedure GetSessions;
149
    procedure SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer);
168
    procedure SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer);
150
    function SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer;
169
    function SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer;
151
      dwFlags: DWORD): DWORD;
170
      dwFlags: DWORD): DWORD;
152
    property GUID: string read FGUID write SetGUID;
171
    property GUID: string read FGUID write SetGUID;
153
    property IsHost: Boolean read FIsHost;
172
    property IsHost: Boolean read FIsHost;
154
    property LocalPlayer: TDXPlayPlayer read FLocalPlayer;
173
    property LocalPlayer: TDXPlayPlayer read FLocalPlayer;
155
    property MaxPlayers: Integer read FMaxPlayers write FMaxPlayers;
174
    property MaxPlayers: Integer read FMaxPlayers write FMaxPlayers;
156
    property OnAddPlayer: TDXPlayEvent read FOnAddPlayer write FOnAddPlayer;
175
    property OnAddPlayer: TDXPlayEvent read FOnAddPlayer write FOnAddPlayer;
157
    property OnClose: TNotifyEvent read FOnClose write FOnClose;
176
    property OnClose: TNotifyEvent read FOnClose write FOnClose;
158
    property OnDeletePlayer: TDXPlayEvent read FOnDeletePlayer write FOnDeletePlayer;
177
    property OnDeletePlayer: TDXPlayEvent read FOnDeletePlayer write FOnDeletePlayer;
159
    property OnMessage: TDXPlayMessageEvent read FOnMessage write FOnMessage;
178
    property OnMessage: TDXPlayMessageEvent read FOnMessage write FOnMessage;
160
    property OnOpen: TNotifyEvent read FOnOpen write FOnOpen;
179
    property OnOpen: TNotifyEvent read FOnOpen write FOnOpen;
161
    property OnSendComplete: TDXPlaySendCompleteEvent read FOnSendComplete write FOnSendComplete;
180
    property OnSendComplete: TDXPlaySendCompleteEvent read FOnSendComplete write FOnSendComplete;
162
    property OnSessionLost: TNotifyEvent read FOnSessionLost write FOnSessionLost;
181
    property OnSessionLost: TNotifyEvent read FOnSessionLost write FOnSessionLost;
163
    property Opened: Boolean read FOpened;
182
    property Opened: Boolean read FOpened;
164
    property Players: TDXPlayPlayers read FPlayers;
183
    property Players: TDXPlayPlayers read FPlayers;
165
    property ProviderName: string read FProviderName write SetProviderName;
184
    property ProviderName: string read FProviderName write SetProviderName;
166
    property Providers: TStrings read GetProviders;
185
    property Providers: TStrings read GetProviders;
167
    property SessionName: string read FSessionName;
186
    property SessionName: string read FSessionName;
168
    property Sessions: TStrings read GetSessionsPty;
187
    property Sessions: TStrings read GetSessionsPty;
169
    property ModemSetting: TDXPlayModemSetting read FModemSetting write SetModemSetting;
188
    property ModemSetting: TDXPlayModemSetting read FModemSetting write SetModemSetting;
170
    property TCPIPSetting: TDXPlayTCPIPSetting read FTCPIPSetting write SetTCPIPSetting;
189
    property TCPIPSetting: TDXPlayTCPIPSetting read FTCPIPSetting write SetTCPIPSetting;
171
    property Async: Boolean read FAsync write FAsync;
190
    property Async: Boolean read FAsync write FAsync;
172
    property AsyncSupported: Boolean read FAsyncSupported;
191
    property AsyncSupported: Boolean read FAsyncSupported;
173
  end;
192
  end;
174
 
193
 
175
  TDXPlay = class(TCustomDXPlay)
194
  TDXPlay = class(TCustomDXPlay)
176
  published
195
  published
177
    property Async;
196
    property Async;
178
    property GUID;
197
    property GUID;
179
    property MaxPlayers;
198
    property MaxPlayers;
180
    property ModemSetting;
199
    property ModemSetting;
181
    property TCPIPSetting;
200
    property TCPIPSetting;
182
    property OnAddPlayer;
201
    property OnAddPlayer;
183
    property OnClose;
202
    property OnClose;
184
    property OnDeletePlayer;
203
    property OnDeletePlayer;
185
    property OnMessage;
204
    property OnMessage;
186
    property OnOpen;
205
    property OnOpen;
187
    property OnSendComplete;
206
    property OnSendComplete;
188
    property OnSessionLost;
207
    property OnSessionLost;
189
  end;
208
  end;
190
 
209
 
191
function DXPlayMessageType(P: Pointer): DWORD;
210
function DXPlayMessageType(P: Pointer): DWORD;
192
 
211
 
193
function DXPlayStringToGUID(const S: string): TGUID;
212
function DXPlayStringToGUID(const S: string): TGUID;
194
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay;
213
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP:
-
 
214
  //{$IfDef DX7}
-
 
215
  IDirectPlay;
-
 
216
  //{$Else}IDirectPlay8Server{$EndIf};
195
  pUnk: IUnknown): HRESULT;
217
  pUnk: IUnknown): HRESULT;
196
 
218
 
197
implementation
219
implementation
198
 
220
 
199
uses DXPlayFm, DXConsts;
221
uses DXPlayFm, DXConsts;
200
 
222
 
201
function DXPlayMessageType(P: Pointer): DWORD;
223
function DXPlayMessageType(P: Pointer): DWORD;
202
begin
224
begin
203
  Result := PDPMSG_GENERIC(P)^.dwType;
225
  Result := PDPMSG_GENERIC(P)^.dwType;
204
end;
226
end;
205
 
227
 
206
function DXPlayStringToGUID(const S: string): TGUID;
228
function DXPlayStringToGUID(const S: string): TGUID;
207
var
229
var
208
  ErrorCode: Integer;
230
  ErrorCode: Integer;
209
begin
231
begin
210
  ErrorCode := CLSIDFromString(PWideChar(WideString(S)), Result);
232
  ErrorCode := CLSIDFromString(PWideChar(WideString(S)), Result);
211
  if ErrorCode<0 then
233
  if ErrorCode<0 then
212
    raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode));
234
    raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode));
213
end;
235
end;
214
 
236
 
215
function GUIDToString(const ClassID: TGUID): string;
237
function GUIDToString(const ClassID: TGUID): string;
216
var
238
var
217
  ErrorCode: Integer;
239
  ErrorCode: Integer;
218
  P: PWideChar;
240
  P: PWideChar;
219
begin
241
begin
220
  ErrorCode := StringFromCLSID(ClassID, P);
242
  ErrorCode := StringFromCLSID(ClassID, P);
221
  if ErrorCode<0 then
243
  if ErrorCode<0 then
222
    raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode));
244
    raise EDXPlayError.Create(WindowsErrorMsg(ErrorCode));
223
  Result := P;
245
  Result := P;
224
  CoTaskMemFree(P);
246
  CoTaskMemFree(P);
225
end;
247
end;
226
 
248
 
227
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay;
249
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP:
-
 
250
  //{$IfDef DX7}
-
 
251
  IDirectPlay;
-
 
252
  //{$Else}IDirectPlay8Server{$EndIf};
228
  pUnk: IUnknown): HRESULT;
253
  pUnk: IUnknown): HRESULT;
229
type
254
type
230
  TDirectPlayCreate= function(const lpGUID: TGUID; out lplpDP: IDirectPlay; pUnk: IUnknown): HRESULT; stdcall;
255
  TDirectPlayCreate= function(const lpGUID: TGUID; out lplpDP: IDirectPlay; pUnk: IUnknown): HRESULT; stdcall;
231
begin
256
begin
232
  Result := TDirectPlayCreate(DXLoadLibrary('DPlayX.dll', 'DirectPlayCreate'))
257
  Result := TDirectPlayCreate(DXLoadLibrary('DPlayX.dll', 'DirectPlayCreate'))
233
    (lpGUID, lplpDP, pUnk);
258
    (lpGUID, lplpDP, pUnk);
234
end;
259
end;
-
 
260
{$IFDEF UNICODE}
-
 
261
function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT;
-
 
262
type
-
 
263
  TDirectPlayEnumerateW= function(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT; stdcall;
-
 
264
begin
-
 
265
  Result := TDirectPlayEnumerateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateW'))
-
 
266
    (lpEnumDPCallback, lpContext);
-
 
267
end;
235
 
268
 
-
 
269
function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW;
-
 
270
  lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT;
-
 
271
type
-
 
272
  TDirectPlayLobbyCreateW = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW;
-
 
273
    lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall;
-
 
274
begin
-
 
275
  Result := TDirectPlayLobbyCreateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateW'))
-
 
276
    (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize);
-
 
277
end;
-
 
278
{$ELSE}
236
function DXDirectPlayEnumerateA(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT;
279
function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT;
237
type
280
type
238
  TDirectPlayEnumerateA= function(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; stdcall;
281
  TDirectPlayEnumerateA= function(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; stdcall;
239
begin
282
begin
240
  Result := TDirectPlayEnumerateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateA'))
283
  Result := TDirectPlayEnumerateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateA'))
241
    (lpEnumDPCallback, lpContext);
284
    (lpEnumDPCallback, lpContext);
242
end;
285
end;
243
 
286
 
244
function DXDirectPlayLobbyCreateA(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
287
function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
245
  lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT;
288
  lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT;
246
type
289
type
247
  TDirectPlayLobbyCreateA = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
290
  TDirectPlayLobbyCreateA = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
248
    lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall;
291
    lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall;
249
begin
292
begin
250
  Result := TDirectPlayLobbyCreateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateA'))
293
  Result := TDirectPlayLobbyCreateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateA'))
251
    (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize);
294
    (lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize);
252
end;
295
end;
253
 
296
{$ENDIF}
254
{  TDXPlayPlayers  }
297
{  TDXPlayPlayers  }
255
 
298
 
256
constructor TDXPlayPlayers.Create;
299
constructor TDXPlayPlayers.Create;
257
begin
300
begin
258
  inherited Create(TDXPlayPlayer);
301
  inherited Create(TDXPlayPlayer);
259
end;
302
end;
260
 
303
 
261
function TDXPlayPlayers.Find(ID: TDPID): TDXPlayPlayer;
304
function TDXPlayPlayers.Find(ID: TDPID): TDXPlayPlayer;
262
var
305
var
263
  i: Integer;
306
  i: Integer;
264
begin
307
begin
265
  i := IndexOf(ID);
308
  i := IndexOf(ID);
266
  if i=-1 then
309
  if i=-1 then
267
    raise EDXPlayError.Create(SDXPlayPlayerNotFound);
310
    raise EDXPlayError.Create(SDXPlayPlayerNotFound);
268
  Result := Players[i];
311
  Result := Players[i];
269
end;
312
end;
270
 
313
 
271
function TDXPlayPlayers.IndexOf(ID: TDPID): Integer;
314
function TDXPlayPlayers.IndexOf(ID: TDPID): Integer;
272
var
315
var
273
  i: Integer;
316
  i: Integer;
274
begin
317
begin
275
  for i:=0 to Count-1 do
318
  for i:=0 to Count-1 do
276
    if Players[i].FID=ID then
319
    if Players[i].FID=ID then
277
    begin
320
    begin
278
      Result := i;
321
      Result := i;
279
      Exit;
322
      Exit;
280
    end;
323
    end;
281
  Result := -1;
324
  Result := -1;
282
end;
325
end;
283
 
326
 
284
function TDXPlayPlayers.GetPlayer(Index: Integer): TDXPlayPlayer;
327
function TDXPlayPlayers.GetPlayer(Index: Integer): TDXPlayPlayer;
285
begin
328
begin
286
  Result := TDXPlayPlayer(Items[Index]);
329
  Result := TDXPlayPlayer(Items[Index]);
287
end;
330
end;
288
 
331
 
289
{  TDXPlayModemSetting  }
332
{  TDXPlayModemSetting  }
290
 
333
 
291
destructor TDXPlayModemSetting.Destroy;
334
destructor TDXPlayModemSetting.Destroy;
292
begin
335
begin
293
  FModemNames.Free;
336
  FModemNames.Free;
294
  inherited Destroy;
337
  inherited Destroy;
295
end;
338
end;
296
 
339
 
297
procedure TDXPlayModemSetting.Assign(Source: TPersistent);
340
procedure TDXPlayModemSetting.Assign(Source: TPersistent);
298
begin
341
begin
299
  if Source is TDXPlayModemSetting then
342
  if Source is TDXPlayModemSetting then
300
  begin
343
  begin
301
    FEnabled := TDXPlayModemSetting(Source).FEnabled;
344
    FEnabled := TDXPlayModemSetting(Source).FEnabled;
302
    FPhoneNumber := TDXPlayModemSetting(Source).FPhoneNumber;
345
    FPhoneNumber := TDXPlayModemSetting(Source).FPhoneNumber;
303
    FModemName := TDXPlayModemSetting(Source).FModemName;
346
    FModemName := TDXPlayModemSetting(Source).FModemName;
304
  end else
347
  end else
305
    inherited Assign(Source);
348
    inherited Assign(Source);
306
end;
349
end;
307
 
350
 
308
function TDXPlayModemSetting.GetModemNames: TStrings;
351
function TDXPlayModemSetting.GetModemNames: TStrings;
309
 
352
 
310
  function EnumModemAddress(const guidDataType: TGUID;
353
  function EnumModemAddress(const guidDataType: TGUID;
311
    dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer): BOOL; stdcall;
354
    dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer): BOOL; stdcall;
312
  begin
355
  begin
313
    if CompareMem(@guidDataType, @DPAID_Modem, SizeOf(TGUID)) then
356
    if CompareMem(@guidDataType, @DPAID_Modem, SizeOf(TGUID)) then
314
      TStrings(lpContext).Add( PChar(lpData));
357
      TStrings(lpContext).Add( PChar(lpData));
315
    Result := True;
358
    Result := True;
316
  end;
359
  end;
317
 
360
 
318
var
361
var
-
 
362
  {$IFDEF UNICODE}
-
 
363
  Lobby1: IDirectPlayLobbyW;
-
 
364
  Lobby: IDirectPlayLobby2W;
-
 
365
  DPlay: IDirectPlay4W;
-
 
366
  {$ELSE}
319
  Lobby1: IDirectPlayLobbyA;
367
  Lobby1: IDirectPlayLobbyA;
320
  Lobby: IDirectPlayLobby2A;
368
  Lobby: IDirectPlayLobby2A;
321
  DPlay1: IDirectPlay;
-
 
322
  DPlay: IDirectPlay4A;
369
  DPlay: IDirectPlay4A;
-
 
370
  {$ENDIF}
-
 
371
  DPlay1: IDirectPlay;
323
  lpAddress: Pointer;
372
  lpAddress: Pointer;
324
  dwAddressSize: DWORD;
373
  dwAddressSize: DWORD;
325
begin
374
begin
326
  if FModemNames=nil then
375
  if FModemNames=nil then
327
  begin
376
  begin
328
    FModemNames := TStringList.Create;
377
    FModemNames := TStringList.Create;
329
    try
378
    try
330
      if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
379
      if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
331
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
380
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
332
      Lobby := Lobby1 as IDirectPlayLobby2A;
381
      Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF};
333
 
382
 
334
      if DXDirectPlayCreate(DPSPGUID_MODEM, DPlay1, nil)<>0 then
383
      if DXDirectPlayCreate(DPSPGUID_MODEM, DPlay1, nil)<>0 then
335
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
384
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
336
      DPlay := DPlay1 as IDirectPlay4A;
385
      DPlay := DPlay1 as {$IFDEF UNICODE}IDirectPlay4W{$ELSE}IDirectPlay4A{$ENDIF};
337
 
386
 
338
      {  get size of player address for all players  }
387
      {  get size of player address for all players  }
339
      if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
388
      if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
340
        raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
389
        raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
341
 
390
 
342
      GetMem(lpAddress, dwAddressSize);
391
      GetMem(lpAddress, dwAddressSize);
343
      try
392
      try
344
        FillChar(lpAddress^, dwAddressSize, 0);
393
        FillChar(lpAddress^, dwAddressSize, 0);
345
 
394
 
346
        {  get the address  }
395
        {  get the address  }
347
        if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress^, dwAddressSize)<>0 then
396
        if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress, dwAddressSize)<>0 then
348
          raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
397
          raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
349
 
398
 
350
        {  get modem strings from address and put them in the combo box  }
399
        {  get modem strings from address and put them in the combo box  }
351
        if Lobby.EnumAddress(@EnumModemAddress, lpAddress^, dwAddressSize, FModemNames)<>0 then
400
        if Lobby.EnumAddress(@EnumModemAddress, lpAddress^, dwAddressSize, FModemNames)<>0 then
352
          raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
401
          raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
353
      finally
402
      finally
354
        FreeMem(lpAddress);
403
        FreeMem(lpAddress);
355
      end;
404
      end;
356
    except
405
    except
357
      FModemNames.Free; FModemNames := nil;
406
      FModemNames.Free; FModemNames := nil;
358
      raise;
407
      raise;
359
    end;
408
    end;
360
  end;
409
  end;
361
 
410
 
362
  Result := FModemNames;
411
  Result := FModemNames;
363
end;
412
end;
364
 
413
 
365
{  TDXPlayTCPIPSetting  }
414
{  TDXPlayTCPIPSetting  }
366
 
415
 
367
procedure TDXPlayTCPIPSetting.Assign(Source: TPersistent);
416
procedure TDXPlayTCPIPSetting.Assign(Source: TPersistent);
368
begin
417
begin
369
  if Source is TDXPlayTCPIPSetting then
418
  if Source is TDXPlayTCPIPSetting then
370
  begin
419
  begin
371
    FEnabled := TDXPlayTCPIPSetting(Source).FEnabled;
420
    FEnabled := TDXPlayTCPIPSetting(Source).FEnabled;
372
    FHostName := TDXPlayTCPIPSetting(Source).FHostName;
421
    FHostName := TDXPlayTCPIPSetting(Source).FHostName;
373
  end else
422
  end else
374
    inherited Assign(Source);
423
    inherited Assign(Source);
375
end;
424
end;
376
 
425
 
377
{  TCustomDXPlay  }
426
{  TCustomDXPlay  }
378
 
427
 
379
constructor TCustomDXPlay.Create(AOwner: TComponent);
428
constructor TCustomDXPlay.Create(AOwner: TComponent);
380
begin
429
begin
381
  inherited Create(AOwner);
430
  inherited Create(AOwner);
382
  FPlayers := TDXPlayPlayers.Create;
431
  FPlayers := TDXPlayPlayers.Create;
383
  FModemSetting := TDXPlayModemSetting.Create;
432
  FModemSetting := TDXPlayModemSetting.Create;
384
  FTCPIPSetting := TDXPlayTCPIPSetting.Create;
433
  FTCPIPSetting := TDXPlayTCPIPSetting.Create;
385
  FSessions := TStringList.Create;
434
  FSessions := TStringList.Create;
386
 
435
 
387
  FGUID := GUIDToString(GUID_NULL);
436
  FGUID := GUIDToString(GUID_NULL);
388
  FMaxPlayers := 0;
437
  FMaxPlayers := 0;
389
end;
438
end;
390
 
439
 
391
destructor TCustomDXPlay.Destroy;
440
destructor TCustomDXPlay.Destroy;
392
var
441
var
393
  i: Integer;
442
  i: Integer;
394
begin
443
begin
395
  Close;
444
  Close;
396
 
445
 
397
  FPlayers.Free;
446
  FPlayers.Free;
398
 
447
 
399
  if FProviders<>nil then
448
  if FProviders<>nil then
400
  begin
449
  begin
401
    for i:=0 to FProviders.Count-1 do
450
    for i:=0 to FProviders.Count-1 do
402
      Dispose(PGUID(FProviders.Objects[i]));
451
      Dispose(PGUID(FProviders.Objects[i]));
403
  end;
452
  end;
404
  FProviders.Free;
453
  FProviders.Free;
405
  FModemSetting.Free;
454
  FModemSetting.Free;
406
  FTCPIPSetting.Free;
455
  FTCPIPSetting.Free;
407
  ClearSessionList;
456
  ClearSessionList;
408
  FSessions.Free;
457
  FSessions.Free;
409
  inherited Destroy;
458
  inherited Destroy;
410
end;
459
end;
411
 
460
 
412
type
461
type
413
  TDXPlayRecvThread = class(TThread)
462
  TDXPlayRecvThread = class(TThread)
414
  private
463
  private
415
    FDXPlay: TCustomDXPlay;
464
    FDXPlay: TCustomDXPlay;
416
    constructor Create(DXPlay: TCustomDXPlay);
465
    constructor Create(DXPlay: TCustomDXPlay);
417
    destructor Destroy; override;
466
    destructor Destroy; override;
418
    procedure Execute; override;
467
    procedure Execute; override;
419
  end;
468
  end;
420
 
469
 
421
constructor TDXPlayRecvThread.Create(DXPlay: TCustomDXPlay);
470
constructor TDXPlayRecvThread.Create(DXPlay: TCustomDXPlay);
422
begin
471
begin
423
  FDXPlay := DXPlay;
472
  FDXPlay := DXPlay;
424
 
473
 
425
  FDXPlay.FRecvEvent[1] := CreateEvent(nil, False, False, nil);
474
  FDXPlay.FRecvEvent[1] := CreateEvent(nil, False, False, nil);
426
 
475
 
427
  FreeOnTerminate := True;
476
  FreeOnTerminate := True;
428
  inherited Create(True);
477
  inherited Create(True);
429
end;
478
end;
430
 
479
 
431
destructor TDXPlayRecvThread.Destroy;
480
destructor TDXPlayRecvThread.Destroy;
432
begin
481
begin
433
  FreeOnTerminate := False;
482
  FreeOnTerminate := False;
434
  SetEvent(FDXPlay.FRecvEvent[1]);
483
  SetEvent(FDXPlay.FRecvEvent[1]);
435
 
484
 
436
  inherited Destroy;
485
  inherited Destroy;
437
 
486
 
438
  CloseHandle(FDXPlay.FRecvEvent[1]);
487
  CloseHandle(FDXPlay.FRecvEvent[1]);
439
 
488
 
440
  FDXPlay.FRecvThread := nil;
489
  FDXPlay.FRecvThread := nil;
441
  FDXPlay.Close;
490
  FDXPlay.Close;
442
end;
491
end;
443
 
492
 
444
procedure TDXPlayRecvThread.Execute;
493
procedure TDXPlayRecvThread.Execute;
445
begin
494
begin
446
  while WaitForMultipleObjects(2, @FDXPlay.FRecvEvent, False, INFINITE)=WAIT_OBJECT_0 do
495
  while WaitForMultipleObjects(2, @FDXPlay.FRecvEvent, False, INFINITE)=WAIT_OBJECT_0 do
447
  begin
496
  begin
448
    Synchronize(FDXPlay.ReceiveMessage);
497
    Synchronize(FDXPlay.ReceiveMessage);
449
  end;
498
  end;
450
end;
499
end;
451
 
500
 
452
procedure TCustomDXPlay.ReceiveMessage;
501
procedure TCustomDXPlay.ReceiveMessage;
453
var
502
var
454
  idFrom, idTo: DWORD;
503
  idFrom, idTo: DWORD;
455
  hr: HRESULT;
504
  hr: HRESULT;
456
  lpvMsgBuffer: Pointer;
505
  lpvMsgBuffer: Pointer;
457
  dwMsgBufferSize: DWORD;
506
  dwMsgBufferSize: DWORD;
458
  Msg_CreatePlayerOrGroup: PDPMSG_CREATEPLAYERORGROUP;
507
  Msg_CreatePlayerOrGroup: PDPMSG_CREATEPLAYERORGROUP;
459
  Msg_DeletePlayerOrGroup: PDPMSG_DESTROYPLAYERORGROUP;
508
  Msg_DeletePlayerOrGroup: PDPMSG_DESTROYPLAYERORGROUP;
460
  Msg_SendComplete: PDPMsg_SendComplete;
509
  Msg_SendComplete: PDPMsg_SendComplete;
461
  SendCompleteResult: TDXPlaySendCompleteResult;
510
  SendCompleteResult: TDXPlaySendCompleteResult;
462
  Player: TDXPlayPlayer;
511
  Player: TDXPlayPlayer;
463
  i: Integer;
512
  i: Integer;
464
begin
513
begin
465
  FInThread := True;
514
  FInThread := True;
466
  try
515
  try
467
    try
516
    try
468
      lpvMsgBuffer := nil;
517
      lpvMsgBuffer := nil;
469
      dwMsgBufferSize := 0;
518
      dwMsgBufferSize := 0;
470
 
519
 
471
      try
520
      try
472
        repeat
521
        repeat
473
          hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize);
522
          hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize);
474
 
523
 
475
          if hr=DPERR_BUFFERTOOSMALL then
524
          if hr=DPERR_BUFFERTOOSMALL then
476
          begin
525
          begin
477
            ReAllocMem(lpvMsgBuffer, dwMsgBufferSize);
526
            ReAllocMem(lpvMsgBuffer, dwMsgBufferSize);
478
            hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize);
527
            hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize);
479
          end;
528
          end;
480
 
529
 
481
          if (hr=0) and (dwMsgBufferSize>=SizeOf(TDPMSG_GENERIC)) then
530
          if (hr=0) and (dwMsgBufferSize>=SizeOf(TDPMSG_GENERIC)) then
482
          begin
531
          begin
483
            if idFrom=DPID_SYSMSG then
532
            if idFrom=DPID_SYSMSG then
484
            begin
533
            begin
485
              {  System message  }
534
              {  System message  }
486
              case PDPMSG_GENERIC(lpvMsgBuffer)^.dwType of
535
              case PDPMSG_GENERIC(lpvMsgBuffer)^.dwType of
487
                DPSYS_CREATEPLAYERORGROUP:
536
                DPSYS_CREATEPLAYERORGROUP:
488
                  begin
537
                  begin
489
                    {  New player  }
538
                    {  New player  }
490
                    Msg_CreatePlayerOrGroup := lpvMsgBuffer;
539
                    Msg_CreatePlayerOrGroup := lpvMsgBuffer;
491
 
540
 
492
                    if Msg_CreatePlayerOrGroup.DPID<>FLocalPlayer.FID then
541
                    if Msg_CreatePlayerOrGroup.DPID<>FLocalPlayer.FID then
493
                    begin
542
                    begin
494
                      Player := TDXPlayPlayer.Create(Players);
543
                      Player := TDXPlayPlayer.Create(Players);
495
                      Player.FID := Msg_CreatePlayerOrGroup.DPID;
544
                      Player.FID := Msg_CreatePlayerOrGroup.DPID;
496
                      Player.FRemotePlayer := True;
545
                      Player.FRemotePlayer := True;
497
 
546
 
498
                      with Msg_CreatePlayerOrGroup.dpnName do
547
                      with Msg_CreatePlayerOrGroup.dpnName do
499
                      begin
548
                      begin
-
 
549
                        {$IFDEF UNICODE}
-
 
550
                        if lpszShortNameW<>nil then
-
 
551
                          Player.FName := lpszShortNameW;
-
 
552
                        {$ELSE}
500
                        if lpszShortNameA<>nil then
553
                        if lpszShortNameA<>nil then
501
                          Player.FName := lpszShortNameA;
554
                          Player.FName := lpszShortNameA;
-
 
555
                        {$ENDIF}
502
                      end;
556
                      end;
503
 
557
 
504
                      DoAddPlayer(Player);
558
                      DoAddPlayer(Player);
505
                    end;
559
                    end;
506
                  end;
560
                  end;
507
                DPSYS_DESTROYPLAYERORGROUP:
561
                DPSYS_DESTROYPLAYERORGROUP:
508
                  begin
562
                  begin
509
                    {  Player deletion  }
563
                    {  Player deletion  }
510
                    Msg_DeletePlayerOrGroup := lpvMsgBuffer;
564
                    Msg_DeletePlayerOrGroup := lpvMsgBuffer;
511
 
565
 
512
                    if Msg_DeletePlayerOrGroup.DPID<>FLocalPlayer.FID then
566
                    if Msg_DeletePlayerOrGroup.DPID<>FLocalPlayer.FID then
513
                    begin
567
                    begin
514
                      i := Players.IndexOf(Msg_DeletePlayerOrGroup.DPID);
568
                      i := Players.IndexOf(Msg_DeletePlayerOrGroup.DPID);
515
                      if i<>-1 then
569
                      if i<>-1 then
516
                      begin  
570
                      begin
517
                        Player := Players[i];
571
                        Player := Players[i];
518
                        DoDeletePlayer(Player);
572
                        DoDeletePlayer(Player);
519
                        Player.Free;
573
                        Player.Free;
520
                      end;
574
                      end;
521
                    end;
575
                    end;
522
                  end;
576
                  end;
523
                DPSYS_SESSIONLOST:
577
                DPSYS_SESSIONLOST:
524
                  begin
578
                  begin
525
                    {  The session was lost.  }
579
                    {  The session was lost.  }
526
                    DoSessionLost;
580
                    DoSessionLost;
527
                    Close;
581
                    Close;
528
                  end;
582
                  end;
529
                DPSYS_HOST:
583
                DPSYS_HOST:
530
                  begin
584
                  begin
531
                    {  Here became a host.  }
585
                    {  Here became a host.  }
532
                    FIsHost := True;
586
                    FIsHost := True;
533
                  end;
587
                  end;
534
                DPSYS_SENDCOMPLETE:
588
                DPSYS_SENDCOMPLETE:
535
                   begin
589
                   begin
536
                     { Send complete  }
590
                     { Send complete  }
537
                     Msg_SendComplete := lpvMsgBuffer;
591
                     Msg_SendComplete := lpvMsgBuffer;
538
                     if Msg_SendComplete.idFrom=FLocalPlayer.FID then
592
                     if Msg_SendComplete.idFrom=FLocalPlayer.FID then
539
                     begin
593
                     begin
540
                       case Msg_SendComplete.hr of
594
                       case Msg_SendComplete.hr of
541
                         DP_OK        : SendCompleteResult := crOk;
595
                         DP_OK        : SendCompleteResult := crOk;
542
                         DPERR_ABORTED: SendCompleteResult := crAbort;
596
                         DPERR_ABORTED: SendCompleteResult := crAbort;
543
                         else           SendCompleteResult := crGeneric;
597
                         else           SendCompleteResult := crGeneric;
544
                       end;
598
                       end;
545
 
599
 
546
                       DoSendComplete(Msg_SendComplete^.dwMsgID, SendCompleteResult, Msg_SendComplete^.dwSendTime);
600
                       DoSendComplete(Msg_SendComplete^.dwMsgID, SendCompleteResult, Msg_SendComplete^.dwSendTime);
547
                     end;
601
                     end;
548
                   end;
602
                   end;
549
              end;
603
              end;
550
            end else
604
            end else
551
            begin
605
            begin
552
              {  Application definition message  }
606
              {  Application definition message  }
553
              DoMessage(Players.Find(idFrom), lpvMsgBuffer, dwMsgBufferSize);
607
              DoMessage(Players.Find(idFrom), lpvMsgBuffer, dwMsgBufferSize);
554
            end;
608
            end;
555
          end;
609
          end;
556
        until hr<>0;
610
        until hr<>0;
557
      finally
611
      finally
558
        FreeMem(lpvMsgBuffer);
612
        FreeMem(lpvMsgBuffer);
559
      end;
613
      end;
560
    except
614
    except
561
      on E: Exception do
615
      on E: Exception do
562
        Application.HandleException(E);
616
        Application.HandleException(E);
563
    end;
617
    end;
564
  finally
618
  finally
565
    FInThread := False;
619
    FInThread := False;
566
  end;
620
  end;
567
end;
621
end;
568
 
622
 
569
procedure TCustomDXPlay.DoAddPlayer(Player: TDXPlayPlayer);
623
procedure TCustomDXPlay.DoAddPlayer(Player: TDXPlayPlayer);
570
begin
624
begin
571
  if Assigned(FOnAddPlayer) then FOnAddPlayer(Self, Player)
625
  if Assigned(FOnAddPlayer) then FOnAddPlayer(Self, Player)
572
end;
626
end;
573
 
627
 
574
procedure TCustomDXPlay.DoClose;
628
procedure TCustomDXPlay.DoClose;
575
begin
629
begin
576
  if Assigned(FOnClose) then FOnClose(Self);
630
  if Assigned(FOnClose) then FOnClose(Self);
577
end;
631
end;
578
 
632
 
579
procedure TCustomDXPlay.DoDeletePlayer(Player: TDXPlayPlayer);
633
procedure TCustomDXPlay.DoDeletePlayer(Player: TDXPlayPlayer);
580
begin
634
begin
581
  if Assigned(FOnDeletePlayer) then FOnDeletePlayer(Self, Player)
635
  if Assigned(FOnDeletePlayer) then FOnDeletePlayer(Self, Player)
582
end;
636
end;
583
 
637
 
584
procedure TCustomDXPlay.DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer);
638
procedure TCustomDXPlay.DoMessage(From: TDXPlayPlayer; Data: Pointer; DataSize: Integer);
585
begin
639
begin
586
  if Assigned(FOnMessage) then FOnMessage(Self, From, Data, DataSize);
640
  if Assigned(FOnMessage) then FOnMessage(Self, From, Data, DataSize);
587
end;
641
end;
588
 
642
 
589
procedure TCustomDXPlay.DoOpen;
643
procedure TCustomDXPlay.DoOpen;
590
begin
644
begin
591
  if Assigned(FOnOpen) then FOnOpen(Self);
645
  if Assigned(FOnOpen) then FOnOpen(Self);
592
end;
646
end;
593
 
647
 
594
procedure TCustomDXPlay.DoSessionLost;
648
procedure TCustomDXPlay.DoSessionLost;
595
begin
649
begin
596
  if Assigned(FOnSessionLost) then FOnSessionLost(Self);
650
  if Assigned(FOnSessionLost) then FOnSessionLost(Self);
597
end;
651
end;
598
 
652
 
599
procedure TCustomDXPlay.DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult;
653
procedure TCustomDXPlay.DoSendComplete(MessageID: DWORD; Result: TDXPlaySendCompleteResult;
600
  SendTime: Integer);
654
  SendTime: Integer);
601
begin
655
begin
602
  if Assigned(FOnSendComplete) then FOnSendComplete(Self, MessageID, Result, SendTime);
656
  if Assigned(FOnSendComplete) then FOnSendComplete(Self, MessageID, Result, SendTime);
603
end;
657
end;
604
 
658
 
605
function TCustomDXPlay.GetProviders: TStrings;
659
function TCustomDXPlay.GetProviders: TStrings;
606
 
660
 
607
  function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: LPSTR;
661
  function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPSTR{$ENDIF};
608
      dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer):
662
      dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer):
609
      BOOL; stdcall;
663
      BOOL; stdcall;
610
  var
664
  var
611
    GUID: PGUID;
665
    GUID: PGUID;
612
  begin
666
  begin
613
    GUID := New(PGUID);
667
    GUID := New(PGUID);
614
    Move(lpguidSP, GUID^, SizeOf(TGUID));
668
    Move(lpguidSP, GUID^, SizeOf(TGUID));
615
    TStrings(lpContext).AddObject(lpSPName, TObject(GUID));
669
    TStrings(lpContext).AddObject(lpSPName, TObject(GUID));
616
    Result := True;
670
    Result := True;
617
  end;
671
  end;
618
 
672
 
619
begin
673
begin
620
  if FProviders=nil then
674
  if FProviders=nil then
621
  begin
675
  begin
622
    FProviders := TStringList.Create;
676
    FProviders := TStringList.Create;
623
    try
677
    try
624
      DXDirectPlayEnumerateA(@EnumProviderCallback, FProviders);
678
      DXDirectPlayEnumerate(@EnumProviderCallback, FProviders);
625
    except
679
    except
626
      FProviders.Free; FProviders := nil;
680
      FProviders.Free; FProviders := nil;
627
      raise;
681
      raise;
628
    end;
682
    end;
629
  end;
683
  end;
630
 
684
 
631
  Result := FProviders;
685
  Result := FProviders;
632
end;
686
end;
633
 
687
 
634
procedure TCustomDXPlay.GetSessions;
688
procedure TCustomDXPlay.GetSessions;
635
 
689
 
636
  function EnumSessionsCallback(const lpThisSD: TDPSessionDesc2;
690
  function EnumSessionsCallback(const lpThisSD: TDPSessionDesc2;
637
    var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
691
    var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
638
  var
692
  var
639
    Guid: PGUID;
693
    Guid: PGUID;
640
  begin
694
  begin
641
    if dwFlags and DPESC_TIMEDOUT<>0 then
695
    if dwFlags and DPESC_TIMEDOUT<>0 then
642
    begin
696
    begin
643
      Result := False;
697
      Result := False;
644
      Exit;
698
      Exit;
645
    end;
699
    end;
646
 
700
 
647
    Guid := New(PGUID);
701
    Guid := New(PGUID);
648
    Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID));
702
    Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID));
-
 
703
    {$IFDEF UNICODE}
-
 
704
    TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameW, TObject(Guid));
-
 
705
    {$ELSE}
649
    TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameA, TObject(Guid));
706
    TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameA, TObject(Guid));
650
 
707
    {$ENDIF}
651
    Result := True;
708
    Result := True;
652
  end;
709
  end;
653
 
710
 
654
var
711
var
655
  dpDesc: TDPSessionDesc2;
712
  dpDesc: TDPSessionDesc2;
656
  hr: HRESULT;
713
  hr: HRESULT;
657
begin
714
begin
658
  if FDPlay=nil then
715
  if FDPlay=nil then
659
    raise EDXPlayError.Create(SDXPlayNotConnectedNow);
716
    raise EDXPlayError.Create(SDXPlayNotConnectedNow);
660
 
717
 
661
  ClearSessionList;
718
  ClearSessionList;
662
 
719
 
663
  FillChar(dpDesc, SizeOf(dpDesc), 0);
720
  FillChar(dpDesc, SizeOf(dpDesc), 0);
664
  dpDesc.dwSize := SizeOf(dpDesc);
721
  dpDesc.dwSize := SizeOf(dpDesc);
665
  dpDesc.guidApplication := DXPlayStringToGUID(FGUID);
722
  dpDesc.guidApplication := DXPlayStringToGUID(FGUID);
666
 
723
 
667
  hr := FDPlay.EnumSessions(dpDesc, 0, @EnumSessionsCallback, FSessions, DPENUMSESSIONS_AVAILABLE);
724
  hr := FDPlay.EnumSessions(dpDesc, 0, @EnumSessionsCallback, FSessions, DPENUMSESSIONS_AVAILABLE);
668
  if hr=DPERR_USERCANCEL then Abort;
725
  if hr=DPERR_USERCANCEL then Abort;
669
  if hr<>0 then
726
  if hr<>0 then
670
    raise EDXPlayError.Create(SDXPlaySessionListCannotBeAcquired);
727
    raise EDXPlayError.Create(SDXPlaySessionListCannotBeAcquired);
671
 
728
 
672
  FReadSessioned := True;
729
  FReadSessioned := True;
673
end;
730
end;
674
 
731
 
675
function TCustomDXPlay.GetSessionsPty: TStrings;
732
function TCustomDXPlay.GetSessionsPty: TStrings;
676
begin
733
begin
677
  if not FReadSessioned then GetSessions;
734
  if not FReadSessioned then GetSessions;
678
  Result := FSessions;
735
  Result := FSessions;
679
end;
736
end;
680
 
737
 
681
function TCustomDXPlay.GetProviderNameFromGUID(const ProviderGUID: TGUID): string;
738
function TCustomDXPlay.GetProviderNameFromGUID(const ProviderGUID: TGUID): string;
682
var
739
var
683
  i: Integer;
740
  i: Integer;
684
begin
741
begin
685
  for i:=0 to Providers.Count-1 do
742
  for i:=0 to Providers.Count-1 do
686
    if CompareMem(PGUID(Providers.Objects[i]), @ProviderGUID, SizeOf(TGUID)) then
743
    if CompareMem(PGUID(Providers.Objects[i]), @ProviderGUID, SizeOf(TGUID)) then
687
    begin
744
    begin
688
      Result := Providers[i];
745
      Result := Providers[i];
689
      Exit;
746
      Exit;
690
    end;
747
    end;
691
 
748
 
692
  raise EDXPlayError.Create(SDXPlayProviderSpecifiedGUIDNotFound);
749
  raise EDXPlayError.Create(SDXPlayProviderSpecifiedGUIDNotFound);
693
end;
750
end;
694
 
751
 
695
procedure TCustomDXPlay.CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string);
752
procedure TCustomDXPlay.CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string);
696
var
753
var
697
  i: Integer;
754
  i: Integer;
698
  ProviderGUID: TGUID;
755
  ProviderGUID: TGUID;
699
  addressElements: array[0..15] of TDPCompoundAddressElement;
756
  addressElements: array[0..15] of TDPCompoundAddressElement;
700
  dwElementCount: Integer;
757
  dwElementCount: Integer;
-
 
758
  {$IFDEF UNICODE}
-
 
759
  Lobby1: IDirectPlayLobbyW;
-
 
760
  Lobby: IDirectPlayLobby2W;
-
 
761
  {$ELSE}
701
  Lobby1: IDirectPlayLobbyA;
762
  Lobby1: IDirectPlayLobbyA;
702
  Lobby: IDirectPlayLobby2A;
763
  Lobby: IDirectPlayLobby2A;
-
 
764
  {$ENDIF}
703
  lpAddress: Pointer;
765
  lpAddress: Pointer;
704
  dwAddressSize: DWORD;
766
  dwAddressSize: DWORD;
705
begin
767
begin
706
  i := Providers.IndexOf(ProviderName);
768
  i := Providers.IndexOf(ProviderName);
707
  if i=-1 then
769
  if i=-1 then
708
    raise EDXPlayError.CreateFmt(SDXPlayProviderNotFound, [ProviderName]);
770
    raise EDXPlayError.CreateFmt(SDXPlayProviderNotFound, [ProviderName]);
709
  ProviderGUID := PGUID(Providers.Objects[i])^;
771
  ProviderGUID := PGUID(Providers.Objects[i])^;
710
 
772
 
711
  {  DirectPlay address making  }
773
  {  DirectPlay address making  }
712
  if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
774
  if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
713
    raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
775
    raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
714
  Lobby := Lobby1 as IDirectPlayLobby2A;
776
  Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF};
715
 
777
 
716
  FillChar(addressElements, SizeOf(addressElements), 0);
778
  FillChar(addressElements, SizeOf(addressElements), 0);
717
  dwElementCount := 0;
779
  dwElementCount := 0;
718
 
780
 
719
  addressElements[dwElementCount].guidDataType := DPAID_ServiceProvider;
781
  addressElements[dwElementCount].guidDataType := DPAID_ServiceProvider;
720
  addressElements[dwElementCount].dwDataSize := SizeOf(TGUID);
782
  addressElements[dwElementCount].dwDataSize := SizeOf(TGUID);
721
  addressElements[dwElementCount].lpData := @ProviderGUID;
783
  addressElements[dwElementCount].lpData := @ProviderGUID;
722
  Inc(dwElementCount);
784
  Inc(dwElementCount);
723
 
785
 
724
  if CompareMem(@ProviderGUID, @DPSPGUID_MODEM, SizeOf(TGUID)) and ModemSetting.Enabled then
786
  if CompareMem(@ProviderGUID, @DPSPGUID_MODEM, SizeOf(TGUID)) and ModemSetting.Enabled then
725
  begin
787
  begin
726
    {  Modem  }
788
    {  Modem  }
727
    if ModemSetting.FModemName<>'' then
789
    if ModemSetting.FModemName<>'' then
728
    begin
790
    begin
729
      addressElements[dwElementCount].guidDataType := DPAID_Modem;
791
      addressElements[dwElementCount].guidDataType := DPAID_Modem;
730
      addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FModemName)+1;
792
      addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FModemName)+1;
731
      addressElements[dwElementCount].lpData := PChar(ModemSetting.FModemName);
793
      addressElements[dwElementCount].lpData := PChar(ModemSetting.FModemName);
732
      Inc(dwElementCount);
794
      Inc(dwElementCount);
733
    end;
795
    end;
734
 
796
 
735
    if ModemSetting.FPhoneNumber<>'' then
797
    if ModemSetting.FPhoneNumber<>'' then
736
    begin
798
    begin
737
      addressElements[dwElementCount].guidDataType := DPAID_Phone;
799
      addressElements[dwElementCount].guidDataType := DPAID_Phone;
738
      addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FPhoneNumber)+1;
800
      addressElements[dwElementCount].dwDataSize := Length(ModemSetting.FPhoneNumber)+1;
739
      addressElements[dwElementCount].lpData := PChar(ModemSetting.FPhoneNumber);
801
      addressElements[dwElementCount].lpData := PChar(ModemSetting.FPhoneNumber);
740
      Inc(dwElementCount);
802
      Inc(dwElementCount);
741
    end;
803
    end;
742
  end else
804
  end else
743
  if CompareMem(@ProviderGUID, @DPSPGUID_TCPIP, SizeOf(TGUID)) and TCPIPSetting.Enabled then
805
  if CompareMem(@ProviderGUID, @DPSPGUID_TCPIP, SizeOf(TGUID)) and TCPIPSetting.Enabled then
744
  begin
806
  begin
745
    {  TCP/IP  }
807
    {  TCP/IP  }
746
    if TCPIPSetting.FHostName<>'' then
808
    if TCPIPSetting.FHostName<>'' then
747
    begin
809
    begin
748
      addressElements[dwElementCount].guidDataType := DPAID_INet;
810
      addressElements[dwElementCount].guidDataType := DPAID_INet;
749
      addressElements[dwElementCount].dwDataSize := Length(TCPIPSetting.FHostName)+1;
811
      addressElements[dwElementCount].dwDataSize := Length(TCPIPSetting.FHostName)+1;
750
      addressElements[dwElementCount].lpData := PChar(TCPIPSetting.FHostName);
812
      addressElements[dwElementCount].lpData := PChar(TCPIPSetting.FHostName);
751
      Inc(dwElementCount);
813
      Inc(dwElementCount);
752
    end;
814
    end;
753
 
815
 
754
    if TCPIPSetting.Port<>0 then
816
    if TCPIPSetting.Port<>0 then
755
    begin                                                          
817
    begin
756
      addressElements[dwElementCount].guidDataType := DPAID_INetPort;
818
      addressElements[dwElementCount].guidDataType := DPAID_INetPort;
757
      addressElements[dwElementCount].dwDataSize := SizeOf(TCPIPSetting.FPort);
819
      addressElements[dwElementCount].dwDataSize := SizeOf(TCPIPSetting.FPort);
758
      addressElements[dwElementCount].lpData := @TCPIPSetting.FPort;
820
      addressElements[dwElementCount].lpData := @TCPIPSetting.FPort;
759
      Inc(dwElementCount);                                        
821
      Inc(dwElementCount);
760
    end;
822
    end;
761
  end;
823
  end;
762
 
824
 
763
  if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
825
  if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
764
    raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
826
    raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
765
 
827
 
766
  GetMem(lpAddress, dwAddressSize);
828
  GetMem(lpAddress, dwAddressSize);
767
  try
829
  try
768
    FillChar(lpAddress^, dwAddressSize, 0);
830
    FillChar(lpAddress^, dwAddressSize, 0);
769
 
831
 
770
    if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress^, dwAddressSize)<>0 then
832
    if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress, dwAddressSize)<>0 then
771
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
833
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
772
 
834
 
773
    {  DirectPlay initialization  }
835
    {  DirectPlay initialization  }
774
    if CoCreateInstance(CLSID_DirectPlay, nil, CLSCTX_INPROC_SERVER, IID_IDirectPlay4A, DPlay)<>0 then
836
    if CoCreateInstance(CLSID_DirectPlay, nil, CLSCTX_INPROC_SERVER, IID_IDirectPlay4A, DPlay)<>0 then
775
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
837
      raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
776
    try
838
    try
777
      {  DirectPlay address initialization  }
839
      {  DirectPlay address initialization  }
778
      if DPlay.InitializeConnection(lpAddress, 0)<>0 then
840
      if DPlay.InitializeConnection(lpAddress, 0)<>0 then
779
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
841
        raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
780
    except
842
    except
781
      DPlay := nil;
843
      DPlay := nil;
782
      raise;
844
      raise;
783
    end;
845
    end;
784
  finally
846
  finally
785
    FreeMem(lpAddress);
847
    FreeMem(lpAddress);
786
  end;
848
  end;
787
end;
849
end;
788
 
850
 
789
procedure TCustomDXPlay.ClearSessionList;
851
procedure TCustomDXPlay.ClearSessionList;
790
var
852
var
791
  i: Integer;
853
  i: Integer;
792
begin
854
begin
793
  FReadSessioned := False;
855
  FReadSessioned := False;
794
  for i:=0 to FSessions.Count-1 do
856
  for i:=0 to FSessions.Count-1 do
795
    Dispose(PGUID(FSessions.Objects[i]));
857
    Dispose(PGUID(FSessions.Objects[i]));
796
  FSessions.Clear;
858
  FSessions.Clear;
797
end;
859
end;
798
 
860
 
799
procedure TCustomDXPlay.Open;
861
procedure TCustomDXPlay.Open;
800
var
862
var
801
  PlayerName: string;
863
  PlayerName: string;
802
begin
864
begin
803
  Close;
865
  Close;
804
  try
866
  try
805
    if not OpenDPlayWithLobby(PlayerName) then
867
    if not OpenDPlayWithLobby(PlayerName) then
806
    begin
868
    begin
807
      if not OpenDPlayWithoutLobby(PlayerName) then
869
      if not OpenDPlayWithoutLobby(PlayerName) then
808
        Abort;
870
        Abort;
809
    end;
871
    end;
810
 
872
 
811
    Open_(PlayerName);
873
    Open_(PlayerName);
812
  except
874
  except
813
    Close;
875
    Close;
814
    raise;
876
    raise;
815
  end;
877
  end;
816
end;
878
end;
817
 
879
 
818
procedure TCustomDXPlay.Open2(NewSession: Boolean; const SessionName, PlayerName: string);
880
procedure TCustomDXPlay.Open2(NewSession: Boolean; const SessionName, PlayerName: string);
819
begin
881
begin
820
  if not OpenDPlayWithoutLobby2(NewSession, ProviderName, SessionName, PlayerName) then
882
  if not OpenDPlayWithoutLobby2(NewSession, ProviderName, SessionName, PlayerName) then
821
    Abort;
883
    Abort;
822
 
884
 
823
  Open_(PlayerName);
885
  Open_(PlayerName);
824
end;
886
end;
825
 
887
 
826
procedure TCustomDXPlay.Open_(NameS: string);
888
procedure TCustomDXPlay.Open_(NameS: string);
827
 
889
 
828
  function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD;
890
  function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD;
829
    const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL;
891
    const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL;
830
    stdcall;
892
    stdcall;
831
  var                  
893
  var
832
    Player: TDXPlayPlayer;
894
    Player: TDXPlayPlayer;
833
  begin
895
  begin
834
    Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players);
896
    Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players);
835
    Player.FID := TDPID;
897
    Player.FID := TDPID;
836
    Player.FRemotePlayer := True;
898
    Player.FRemotePlayer := True;
837
 
899
 
838
    with lpName do
900
    with lpName do
839
    begin
901
    begin
-
 
902
      {$IFDEF UNICODE}
-
 
903
      if lpszShortNameW<>nil then
-
 
904
        Player.FName := lpszShortNameW;
-
 
905
      {$ELSE}
840
      if lpszShortNameA<>nil then
906
      if lpszShortNameA<>nil then
841
        Player.FName := lpszShortNameA;
907
        Player.FName := lpszShortNameA;
-
 
908
      {$ENDIF}
842
    end;
909
    end;
843
 
910
 
844
    Result := True;
911
    Result := True;
845
  end;
912
  end;
846
 
913
 
847
var
914
var
848
  Name2: array[0..1023] of Char;
915
  Name2: array[0..1023] of Char;
849
  Name: TDPName;
916
  Name: TDPName;
850
begin
917
begin
851
  if FOpened then Close;
918
  if FOpened then Close;
852
  FOpened := True;
919
  FOpened := True;
853
  try
920
  try
854
    {  Player making  }
921
    {  Player making  }
855
    StrLCopy(@Name2, PChar(NameS), SizeOf(Name2));
922
    StrLCopy(@Name2, PChar(NameS), SizeOf(Name2));
856
 
923
 
857
    Name.lpszShortNameA := @Name2;
924
    Name.lpszShortNameA := @Name2;
858
    Name.lpszLongNameA := nil;
925
    Name.lpszLongNameA := nil;
859
 
926
 
860
    FRecvEvent[0] := CreateEvent(nil, False, False, nil);
927
    FRecvEvent[0] := CreateEvent(nil, False, False, nil);
861
 
928
 
862
    FLocalPlayer := TDXPlayPlayer.Create(FPlayers);
929
    FLocalPlayer := TDXPlayPlayer.Create(FPlayers);
863
    FLocalPlayer.FName := NameS;
930
    FLocalPlayer.FName := NameS;
864
 
931
 
865
    if FDPlay.CreatePlayer(FLocalPlayer.FID, Name, FRecvEvent[0], nil^, 0, 0)<>DP_OK then
932
    if FDPlay.CreatePlayer(FLocalPlayer.FID, @Name, FRecvEvent[0], nil, 0, 0)<>DP_OK then
866
      raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]);
933
      raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]);
867
 
934
 
868
    {  Player enumeration  }
935
    {  Player enumeration  }
869
    FDPlay.EnumPlayers(PGUID(nil)^, @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
936
    FDPlay.EnumPlayers(PGUID(nil), @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
870
 
937
 
871
    FIsHost := FPlayers.Count=1;
938
    FIsHost := FPlayers.Count=1;
872
 
939
 
873
    FCalledDoOpen := True; DoOpen;
940
    FCalledDoOpen := True; DoOpen;
874
    DoAddPlayer(FLocalPlayer);
941
    DoAddPlayer(FLocalPlayer);
875
 
942
 
876
    {  Thread start  }
943
    {  Thread start  }
877
    FRecvThread := TDXPlayRecvThread.Create(Self);
944
    FRecvThread := TDXPlayRecvThread.Create(Self);
878
    FRecvThread.Resume;
945
    FRecvThread.Resume;
879
  except
946
  except
880
    Close;
947
    Close;
881
    raise;
948
    raise;
882
  end;
949
  end;
883
end;
950
end;
884
 
951
 
885
procedure TCustomDXPlay.ChangeDPlay;
952
procedure TCustomDXPlay.ChangeDPlay;
886
var
953
var
887
  caps: TDPCAPS;
954
  caps: TDPCAPS;
888
begin
955
begin
889
  FAsyncSupported := False;
956
  FAsyncSupported := False;
890
  if FDPlay<>nil then
957
  if FDPlay<>nil then
891
  begin
958
  begin
892
    FillChar(caps, SizeOf(caps), 0);
959
    FillChar(caps, SizeOf(caps), 0);
893
    caps.dwSize := SizeOf(caps);
960
    caps.dwSize := SizeOf(caps);
894
    FDPlay.GetCaps(caps, 0);
961
    FDPlay.GetCaps(caps, 0);
895
 
962
 
896
    FAsyncSupported := caps.dwFlags and DPCAPS_ASYNCSUPPORTED<>0;
963
    FAsyncSupported := caps.dwFlags and DPCAPS_ASYNCSUPPORTED<>0;
897
  end;
964
  end;
898
end;
965
end;
899
 
966
 
900
function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean;
967
function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean;
901
var
968
var
902
  DPlay1: IDirectPlay2;
969
  DPlay1: IDirectPlay2;
-
 
970
  {$IFDEF UNICODE}
-
 
971
  Lobby: IDirectPlayLobbyW;
-
 
972
  {$ELSE}
903
  Lobby: IDirectPlayLobbyA;
973
  Lobby: IDirectPlayLobbyA;
-
 
974
  {$ENDIF}
904
  dwSize: DWORD;
975
  dwSize: DWORD;
905
  ConnectionSettings: PDPLConnection;
976
  ConnectionSettings: PDPLConnection;
906
begin
977
begin
907
  Result := False;
978
  Result := False;
908
 
979
 
909
  if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then
980
  if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then
910
    Exit;
981
    Exit;
911
 
982
 
912
  if Lobby.GetConnectionSettings(0, PDPLConnection(nil)^, dwSize)<>DPERR_BUFFERTOOSMALL then
983
  if Lobby.GetConnectionSettings(0, PDPLConnection(nil), dwSize)<>DPERR_BUFFERTOOSMALL then
913
    Exit;
984
    Exit;
914
 
985
 
915
  GetMem(ConnectionSettings, dwSize);
986
  GetMem(ConnectionSettings, dwSize);
916
  try
987
  try
917
    if Lobby.GetConnectionSettings(0, ConnectionSettings^, dwSize)<>0 then
988
    if Lobby.GetConnectionSettings(0, ConnectionSettings, dwSize)<>0 then
918
      Exit;
989
      Exit;
919
 
990
 
920
    with ConnectionSettings^.lpSessionDesc^ do
991
    with ConnectionSettings^.lpSessionDesc^ do
921
    begin
992
    begin
922
      dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE or DPSESSION_DIRECTPLAYPROTOCOL;
993
      dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE or DPSESSION_DIRECTPLAYPROTOCOL;
923
      dwMaxPlayers := FMaxPlayers;
994
      dwMaxPlayers := FMaxPlayers;
924
    end;
995
    end;
925
 
996
 
926
    if Lobby.SetConnectionSettings(0, 0, ConnectionSettings^)<>0 then
997
    if Lobby.SetConnectionSettings(0, 0, ConnectionSettings^)<>0 then
927
      Exit;
998
      Exit;
928
 
999
 
929
    if Lobby.Connect(0, DPlay1, nil)<>0 then
1000
    if Lobby.Connect(0, DPlay1, nil)<>0 then
930
      Exit;
1001
      Exit;
931
    FDPlay := DPlay1 as IDirectPlay4A;
1002
    FDPlay := DPlay1 as IDirectPlay4A;
932
    ChangeDPlay;
1003
    ChangeDPlay;
933
 
1004
 
934
    with ConnectionSettings.lpSessionDesc^ do
1005
    with ConnectionSettings.lpSessionDesc^ do
935
    begin
1006
    begin
-
 
1007
      {$IFDEF UNICODE}
-
 
1008
      if lpszSessionNameW<>nil then
-
 
1009
        FSessionName := lpszSessionNameW;
-
 
1010
      {$ELSE}
936
      if lpszSessionNameA<>nil then
1011
      if lpszSessionNameA<>nil then
937
        FSessionName := lpszSessionNameA;
1012
        FSessionName := lpszSessionNameA;
-
 
1013
      {$ENDIF}
938
    end;
1014
    end;
939
 
1015
 
940
    with ConnectionSettings.lpPlayerName^ do
1016
    with ConnectionSettings.lpPlayerName^ do
941
    begin
1017
    begin
-
 
1018
      {$IFDEF UNICODE}
-
 
1019
      if lpszShortNameW<>nil then
-
 
1020
        Name := lpszShortNameW;
-
 
1021
      {$ELSE}
942
      if lpszShortNameA<>nil then
1022
      if lpszShortNameA<>nil then
943
        Name := lpszShortNameA;
1023
        Name := lpszShortNameA;
-
 
1024
      {$ENDIF}
944
    end;
1025
    end;
945
  finally
1026
  finally
946
    FreeMem(ConnectionSettings);
1027
    FreeMem(ConnectionSettings);
947
  end;
1028
  end;
948
 
1029
 
949
  Result := True;
1030
  Result := True;
950
end;
1031
end;
951
 
1032
 
952
function TCustomDXPlay.OpenDPlayWithoutLobby(out Name: string): Boolean;
1033
function TCustomDXPlay.OpenDPlayWithoutLobby(out Name: string): Boolean;
953
var
1034
var
954
  Form: TDelphiXDXPlayForm;
1035
  Form: TDelphiXDXPlayForm;
955
begin
1036
begin
956
  Form := TDelphiXDXPlayForm.Create(Application);
1037
  Form := TDelphiXDXPlayForm.Create(Application);
957
  try
1038
  try
958
    Form.DXPlay := Self;
1039
    Form.DXPlay := Self;
959
    Form.ShowModal;
1040
    Form.ShowModal;
960
 
1041
 
961
    Result := Form.Tag<>0;
1042
    Result := Form.Tag<>0;
962
 
1043
 
963
    FDPlay := Form.DPlay;
1044
    FDPlay := Form.DPlay;
964
    ChangeDPlay;
1045
    ChangeDPlay;
965
 
1046
 
966
    Name := Form.PlayerName;
1047
    Name := Form.PlayerName;
967
    FProviderName := Form.ProviderName;
1048
    FProviderName := Form.ProviderName;
968
    FSessionName := Form.SessionName;
1049
    FSessionName := Form.SessionName;
969
  finally
1050
  finally
970
    Form.Free;
1051
    Form.Free;
971
  end;
1052
  end;
972
end;
1053
end;
973
 
1054
 
974
function TCustomDXPlay.OpenDPlayWithoutLobby2(const NewSession: Boolean;
1055
function TCustomDXPlay.OpenDPlayWithoutLobby2(const NewSession: Boolean;
975
  const ProviderName, SessionName, PlayerName: string): Boolean;
1056
  const ProviderName, SessionName, PlayerName: string): Boolean;
976
var
1057
var
977
  dpDesc: TDPSessionDesc2;
1058
  dpDesc: TDPSessionDesc2;
978
  i: Integer;
1059
  i: Integer;
979
  hr: HRESULT;
1060
  hr: HRESULT;
980
begin
1061
begin
981
  Result := False;
1062
  Result := False;
982
 
1063
 
983
  if FDPlay=nil then
1064
  if FDPlay=nil then
984
    raise EDXPlayError.Create(SDXPlayNotConnectedNow);
1065
    raise EDXPlayError.Create(SDXPlayNotConnectedNow);
985
 
1066
 
986
  if SessionName='' then
1067
  if SessionName='' then
987
    raise EDXPlayError.Create(SDXPlaySessionNameIsNotSpecified);
1068
    raise EDXPlayError.Create(SDXPlaySessionNameIsNotSpecified);
988
 
1069
 
989
  if PlayerName='' then
1070
  if PlayerName='' then
990
    raise EDXPlayError.Create(SDXPlayPlayerNameIsNotSpecified);
1071
    raise EDXPlayError.Create(SDXPlayPlayerNameIsNotSpecified);
991
 
1072
 
992
  if NewSession then
1073
  if NewSession then
993
  begin
1074
  begin
994
    {  Session connection  }
1075
    {  Session connection  }
995
    FillChar(dpDesc, SizeOf(dpDesc), 0);
1076
    FillChar(dpDesc, SizeOf(dpDesc), 0);
996
    dpDesc.dwSize := SizeOf(dpDesc);
1077
    dpDesc.dwSize := SizeOf(dpDesc);
997
    dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE;
1078
    dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE;
-
 
1079
    {$IFDEF UNICODE}
-
 
1080
    dpDesc.lpszSessionNameW := {$IFDEF VER12UP}PChar{$ELSE}PWideChar{$ENDIF}(SessionName);
-
 
1081
    {$ELSE}
998
    dpDesc.lpszSessionNameA := PChar(SessionName);
1082
    dpDesc.lpszSessionNameA := PAnsiChar(SessionName);
-
 
1083
    {$ENDIF}
999
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);
1084
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);
1000
    dpDesc.dwMaxPlayers := MaxPlayers;
1085
    dpDesc.dwMaxPlayers := MaxPlayers;
1001
 
1086
 
1002
    hr := FDPlay.Open(dpDesc, DPOPEN_CREATE);
1087
    hr := FDPlay.Open(dpDesc, DPOPEN_CREATE);
1003
    if hr=DPERR_USERCANCEL then Exit;
1088
    if hr=DPERR_USERCANCEL then Exit;
1004
    if hr<>0 then
1089
    if hr<>0 then
1005
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
1090
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
1006
  end else
1091
  end else
1007
  begin
1092
  begin
1008
    {  Session connection  }
1093
    {  Session connection  }
1009
    {  Enum session  }
1094
    {  Enum session  }
1010
    i := Sessions.IndexOf(SessionName);
1095
    i := Sessions.IndexOf(SessionName);
1011
    if i=-1 then raise EDXPlayError.CreateFmt(SDXPlaySessionNotFound, [SessionName]);
1096
    if i=-1 then raise EDXPlayError.CreateFmt(SDXPlaySessionNotFound, [SessionName]);
1012
 
1097
 
1013
    FillChar(dpDesc, SizeOf(dpDesc), 0);
1098
    FillChar(dpDesc, SizeOf(dpDesc), 0);
1014
    dpDesc.dwSize := SizeOf(dpDesc);
1099
    dpDesc.dwSize := SizeOf(dpDesc);
1015
    dpDesc.guidInstance := PGUID(Sessions.Objects[i])^;
1100
    dpDesc.guidInstance := PGUID(Sessions.Objects[i])^;
1016
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);
1101
    dpDesc.guidApplication := DXPlayStringToGUID(GUID);
1017
 
1102
 
1018
    hr := FDPlay.Open(dpDesc, DPOPEN_JOIN);
1103
    hr := FDPlay.Open(dpDesc, DPOPEN_JOIN);
1019
    if hr=DPERR_USERCANCEL then Exit;
1104
    if hr=DPERR_USERCANCEL then Exit;
1020
    if hr<>0 then
1105
    if hr<>0 then
1021
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
1106
      raise EDXPlayError.CreateFmt(SDXPlaySessionCannotOpened, [FSessionName]);
1022
  end;
1107
  end;
1023
 
1108
 
1024
  Result := True;
1109
  Result := True;
1025
 
1110
 
1026
  FSessionName := SessionName;
1111
  FSessionName := SessionName;
1027
end;
1112
end;
1028
 
1113
 
1029
procedure TCustomDXPlay.Close;
1114
procedure TCustomDXPlay.Close;
1030
begin
1115
begin
1031
  FOpened := False;
1116
  FOpened := False;
1032
  FReadSessioned := False;
1117
  FReadSessioned := False;
1033
 
1118
 
1034
  try
1119
  try
1035
    if FCalledDoOpen then
1120
    if FCalledDoOpen then
1036
    begin
1121
    begin
1037
      FCalledDoOpen := False;
1122
      FCalledDoOpen := False;
1038
      DoClose;
1123
      DoClose;
1039
    end;
1124
    end;
1040
  finally
1125
  finally
1041
    if FDPlay<>nil then
1126
    if FDPlay<>nil then
1042
    begin
1127
    begin
1043
      if FLocalPlayer<>nil then FDPlay.DestroyPlayer(FLocalPlayer.FID);
1128
      if FLocalPlayer<>nil then FDPlay.DestroyPlayer(FLocalPlayer.FID);
1044
      FDPlay.Close;
1129
      FDPlay.Close;
1045
    end;
1130
    end;
1046
 
1131
 
1047
    FProviderName := '';
1132
    FProviderName := '';
1048
    FSessionName := '';
1133
    FSessionName := '';
1049
    FAsyncSupported := False;
1134
    FAsyncSupported := False;
1050
   
1135
 
1051
    ClearSessionList;
1136
    ClearSessionList;
1052
 
1137
 
1053
    FDPlay := nil;
1138
    FDPlay := nil;
1054
    ChangeDPlay;
1139
    ChangeDPlay;
1055
 
1140
 
1056
    if FInThread then
1141
    if FInThread then
1057
      SetEvent(FRecvEvent[1])
1142
      SetEvent(FRecvEvent[1])
1058
    else
1143
    else
1059
      FRecvThread.Free;
1144
      FRecvThread.Free;
1060
   
1145
 
1061
    CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0;
1146
    CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0;
1062
 
1147
 
1063
    FPlayers.Clear;
1148
    FPlayers.Clear;
1064
 
1149
 
1065
    FLocalPlayer := nil;
1150
    FLocalPlayer := nil;
1066
  end;
1151
  end;
1067
end;
1152
end;
1068
 
1153
 
1069
procedure TCustomDXPlay.SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer);
1154
procedure TCustomDXPlay.SendMessage(ToID: TDPID; Data: Pointer; DataSize: Integer);
1070
begin
1155
begin
1071
  if not Opened then Exit;
1156
  if not Opened then Exit;
1072
 
1157
 
1073
  if DataSize<SizeOf(TDPMSG_GENERIC) then
1158
  if DataSize<SizeOf(TDPMSG_GENERIC) then
1074
    raise EDXPlayError.Create(SDXPlayMessageIllegal);
1159
    raise EDXPlayError.Create(SDXPlayMessageIllegal);
1075
 
1160
 
1076
  if ToID=FLocalPlayer.ID then
1161
  if ToID=FLocalPlayer.ID then
1077
  begin
1162
  begin
1078
    {  Message to me  }
1163
    {  Message to me  }
1079
    DoMessage(FLocalPlayer, Data, DataSize);
1164
    DoMessage(FLocalPlayer, Data, DataSize);
1080
  end else
1165
  end else
1081
  if FAsync and FAsyncSupported then
1166
  if FAsync and FAsyncSupported then
1082
    FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data^, DataSize, 0, 0, nil, nil)
1167
    FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data, DataSize, 0, 0, nil, nil)
1083
  else
1168
  else
1084
    FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize);
1169
    FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize);
1085
end;
1170
end;
1086
 
1171
 
1087
function TCustomDXPlay.SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer;
1172
function TCustomDXPlay.SendMessageEx(ToID: TDPID; Data: Pointer; DataSize: Integer;
1088
  dwFlags: DWORD): DWORD;
1173
  dwFlags: DWORD): DWORD;
1089
begin
1174
begin
1090
  if not Opened then Exit;
1175
  if not Opened then Exit;
1091
 
1176
 
1092
  if DataSize<SizeOf(TDPMSG_GENERIC) then
1177
  if DataSize<SizeOf(TDPMSG_GENERIC) then
1093
    raise EDXPlayError.Create(SDXPlayMessageIllegal);
1178
    raise EDXPlayError.Create(SDXPlayMessageIllegal);
1094
 
1179
 
1095
  Result := 0;
1180
  Result := 0;
1096
  if ToID=FLocalPlayer.ID then
1181
  if ToID=FLocalPlayer.ID then
1097
  begin
1182
  begin
1098
    {  Ž©•ªˆ¶‚̃ƒbƒZ[ƒW  }
1183
    {  Ž©•ªˆ¶‚̃ƒbƒZ[ƒW  }
1099
    DoMessage(FLocalPlayer, Data, DataSize);
1184
    DoMessage(FLocalPlayer, Data, DataSize);
1100
  end else
1185
  end else
1101
    FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data^, DataSize,
1186
    FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data, DataSize,
1102
      0, 0, nil, @Result); // 0 ˆÈŠO‚̓Tƒ|[ƒg‚µ‚È‚¢ƒfƒoƒCƒX‚ ‚é‚Ì‚ÅŽg‚í‚È‚¢
1187
      0, 0, nil, @Result); // 0 ˆÈŠO‚̓Tƒ|[ƒg‚µ‚È‚¢ƒfƒoƒCƒX‚ ‚é‚Ì‚ÅŽg‚í‚È‚¢
1103
end;
1188
end;
1104
 
1189
 
1105
procedure TCustomDXPlay.SetGUID(const Value: string);
1190
procedure TCustomDXPlay.SetGUID(const Value: string);
1106
begin
1191
begin
1107
  if Value<>FGUID then
1192
  if Value<>FGUID then
1108
  begin
1193
  begin
1109
    if Value='' then
1194
    if Value='' then
1110
    begin
1195
    begin
1111
      FGUID := GUIDToString(GUID_NULL);
1196
      FGUID := GUIDToString(GUID_NULL);
1112
    end else
1197
    end else
1113
    begin
1198
    begin
1114
      FGUID := GUIDToString(DXPlayStringToGUID(Value));
1199
      FGUID := GUIDToString(DXPlayStringToGUID(Value));
1115
    end;
1200
    end;
1116
  end;
1201
  end;
1117
end;
1202
end;
1118
 
1203
 
1119
procedure TCustomDXPlay.SetModemSetting(Value: TDXPlayModemSetting);
1204
procedure TCustomDXPlay.SetModemSetting(Value: TDXPlayModemSetting);
1120
begin
1205
begin
1121
  FModemSetting.Assign(Value);
1206
  FModemSetting.Assign(Value);
1122
end;
1207
end;
1123
 
1208
 
1124
procedure TCustomDXPlay.SetProviderName(const Value: string);
1209
procedure TCustomDXPlay.SetProviderName(const Value: string);
1125
begin
1210
begin
1126
  Close;
1211
  Close;
1127
  FProviderName := Value;
1212
  FProviderName := Value;
1128
  if FProviderName='' then Exit;
1213
  if FProviderName='' then Exit;
1129
  try
1214
  try
1130
    CreateDPlayWithoutDialog(FDPlay, Value);
1215
    CreateDPlayWithoutDialog(FDPlay, Value);
1131
  except
1216
  except
1132
    FProviderName := '';
1217
    FProviderName := '';
1133
    raise;
1218
    raise;
1134
  end;
1219
  end;
1135
end;
1220
end;
1136
 
1221
 
1137
procedure TCustomDXPlay.SetTCPIPSetting(Value: TDXPlayTCPIPSetting);
1222
procedure TCustomDXPlay.SetTCPIPSetting(Value: TDXPlayTCPIPSetting);
1138
begin
1223
begin
1139
  FTCPIPSetting.Assign(Value);
1224
  FTCPIPSetting.Assign(Value);
1140
end;
1225
end;
1141
 
1226
 
1142
initialization
1227
initialization
1143
  CoInitialize(nil);
1228
  CoInitialize(nil);
1144
finalization
1229
finalization
1145
  CoUninitialize;
1230
  CoUninitialize;
1146
end.
1231
end.
1147
 
-