diff --git a/src/game/g_net.pas b/src/game/g_net.pas
index 251e06bb213071c07a958e9d2f0a4741b3b4cedd..8f8488f904fad54e4e014f62db6a1afd15de329c 100644 (file)
--- a/src/game/g_net.pas
+++ b/src/game/g_net.pas
lastAckTime: Int64; // msecs; if not "in progress", we're waiting for the first ack
inProgress: Boolean;
diskBuffer: PChar; // of `chunkSize` bytes
+ resumed: Boolean;
end;
TNetClient = record
NetDumpFile: TStream;
- g_Res_received_map_start: Boolean = false; // set if we received "map change" event
+ g_Res_received_map_start: Integer = 0; // set if we received "map change" event
function g_Net_Init(): Boolean;
e_KeyPressed(JOY3_JUMP)
end;
-{
-function g_Net_Wait_Event(msgId: Word): TMemoryStream;
- var
- ev: ENetEvent;
- rMsgId: Byte;
- Ptr: Pointer;
- stream: TMemoryStream;
- status: cint;
-begin
- FillChar(ev, SizeOf(ev), 0);
- stream := nil;
- repeat
- status := enet_host_service(NetHost, @ev, Trunc(g_Net_DownloadTimeout * 1000));
- if status > 0 then
- begin
- case ev.kind of
- ENET_EVENT_TYPE_RECEIVE:
- begin
- Ptr := ev.packet^.data;
- rMsgId := Byte(Ptr^);
- if rMsgId = msgId then
- begin
- stream := TMemoryStream.Create;
- stream.SetSize(ev.packet^.dataLength);
- stream.WriteBuffer(Ptr^, ev.packet^.dataLength);
- stream.Seek(0, soFromBeginning);
- status := 1 (* received *)
- end
- else
- begin
- (* looks that game state always received, so ignore it *)
- e_LogWritefln('g_Net_Wait_Event(%s): skip message %s', [msgId, rMsgId]);
- status := 2 (* continue *)
- end
- end;
- ENET_EVENT_TYPE_DISCONNECT:
- begin
- if (ev.data <= NET_DISC_MAX) then
- g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' ' + _lc[TStrings_Locale(Cardinal(I_NET_DISC_NONE) + ev.data)], True);
- status := -2 (* error: disconnected *)
- end;
- else
- g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' unknown ENet event ' + IntToStr(Ord(ev.kind)), True);
- status := -3 (* error: unknown event *)
- end;
- enet_packet_destroy(ev.packet)
- end
- else
- begin
- g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' timeout reached', True);
- status := 0 (* error: timeout *)
- end;
- ProcessLoading(true);
- until (status <> 2) or g_Net_UserRequestExit();
- Result := stream
-end;
-}
-
function getNewTimeoutEnd (): Int64;
begin
//e_LogWritefln('g_Net_Wait_MapInfo: skip message from non-transfer channel', []);
freePacket := false;
g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
- if (g_Res_received_map_start) then begin result := -666; exit; end;
+ if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
end
else
begin
//e_LogWriteln('g_Net_Wait_Event: skip message from non-transfer channel');
freePacket := false;
g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
- if (g_Res_received_map_start) then begin result := -666; exit; end;
+ if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
end
else
begin
chunk: Integer;
csize: Integer;
buf: PChar = nil;
+ resumed: Boolean;
//stx: Int64;
begin
+ tf.resumed := false;
+ e_LogWritefln('file `%s`, size=%d (%d)', [tf.diskName, Integer(strm.size), tf.size], TMsgType.Notify);
+ // check if we should resume downloading
+ resumed := (strm.size > tf.chunkSize) and (strm.size < tf.size);
// send request
trans_omsg.Clear();
trans_omsg.Write(Byte(NTF_CLIENT_START));
- trans_omsg.Write(LongInt(0));
+ if resumed then chunk := strm.size div tf.chunkSize else chunk := 0;
+ trans_omsg.Write(LongInt(chunk));
if not ftransSendClientMsg(trans_omsg) then begin result := -1; exit; end;
+ strm.Seek(chunk*tf.chunkSize, soFromBeginning);
chunkTotal := (tf.size+tf.chunkSize-1) div tf.chunkSize;
e_LogWritefln('receiving file `%s` (%d chunks)', [tf.diskName, chunkTotal], TMsgType.Notify);
g_Game_SetLoadingText('downloading "'+ExtractFileName(tf.diskName)+'"', chunkTotal, False);
+ tf.resumed := resumed;
+
+ if (chunk > 0) then g_Game_StepLoading(chunk);
+ nextChunk := chunk;
// wait for reply data
FillChar(ev, SizeOf(ev), 0);
//e_LogWritefln('g_Net_Wait_Event: skip message from non-transfer channel', []);
freePacket := false;
g_Net_Client_HandlePacket(ev.packet, g_Net_ClientLightMsgHandler);
- if (g_Res_received_map_start) then begin result := -666; exit; end;
+ if (g_Res_received_map_start < 0) then begin result := -666; exit; end;
end
else
begin