DEADSOFTWARE

net: nuked old commented out downloader code
[d2df-sdl.git] / src / game / g_net.pas
index 251e06bb213071c07a958e9d2f0a4741b3b4cedd..8f8488f904fad54e4e014f62db6a1afd15de329c 100644 (file)
@@ -90,6 +90,7 @@ type
     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
@@ -181,7 +182,7 @@ var
 
   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;
@@ -1458,64 +1459,6 @@ begin
             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
@@ -1602,7 +1545,7 @@ 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
@@ -1767,7 +1710,7 @@ 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
@@ -1885,17 +1828,28 @@ var
   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);
@@ -1935,7 +1889,7 @@ begin
                 //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