DEADSOFTWARE

net: some useless code motion and small cleanups in file transfers
[d2df-sdl.git] / src / game / g_res_downloader.pas
index 961a84c99260bfac880e028fde712135fc07435d..68ceb0a71aa8be99baf763cbf8d98ba5b8ad366c 100644 (file)
@@ -366,6 +366,34 @@ begin
 end;
 
 
+//==========================================================================
+//
+//  generateFileName
+//
+//  generate new file name based on the given one and the hash
+//  you can pass files with pathes here too
+//
+//==========================================================================
+function generateFileName (fname: AnsiString; const hash: TMD5Digest): AnsiString;
+var
+  mds: AnsiString;
+  path: AnsiString;
+  base: AnsiString;
+  ext: AnsiString;
+begin
+  mds := MD5Print(hash);
+  if (length(mds) > 16) then mds := Copy(mds, 1, 16);
+  mds := '_'+mds;
+  if (length(fname) = 0) then begin result := mds; exit; end;
+  path := ExtractFilePath(fname);
+  base := ExtractFileName(fname);
+  ext := getFilenameExt(base);
+  base := forceFilenameExt(base, '');
+  if (length(path) > 0) then result := IncludeTrailingPathDelimiter(path) else result := '';
+  result := result+base+mds+ext;
+end;
+
+
 //==========================================================================
 //
 //  g_Res_DownloadMapWAD
@@ -399,10 +427,11 @@ begin
     g_Console_Add(Format(_lc[I_NET_MAP_DL], [FileName]));
     e_WriteLog('Downloading map `' + FileName + '` from server', TMsgType.Notify);
     g_Game_SetLoadingText(FileName + '...', 0, False);
-    if (not g_Net_SendMapRequest()) then exit;
 
     FileName := ExtractFileName(FileName);
     if (length(FileName) = 0) then FileName := 'fucked_map_wad.wad';
+
+    // this also sends map request
     res := g_Net_Wait_MapInfo(tf, resList);
     if (res <> 0) then exit;
 
@@ -422,7 +451,8 @@ begin
         CreateDir(GameDir+'/maps/downloads');
       except
       end;
-      fname := GameDir+'/maps/downloads/'+FileName;
+      fname := GameDir+'/maps/downloads/'+generateFileName(FileName, mapHash);
+      tf.diskName := fname;
       try
         strm := openDiskFileRW(fname);
       except
@@ -430,7 +460,6 @@ begin
         result := '';
         exit;
       end;
-      tf.diskName := fname;
       try
         res := g_Net_ReceiveResourceFile(-1{map}, tf, strm);
       except
@@ -508,7 +537,7 @@ begin
           CreateDir(GameDir+'/wads/downloads');
         except
         end;
-        fname := GameDir+'/wads/downloads/'+tf.diskName;
+        fname := GameDir+'/wads/downloads/'+generateFileName(tf.diskName, tf.hash);
         e_LogWritefln('downloading resource `%s` to `%s`...', [tf.diskName, fname]);
         try
           strm := openDiskFileRW(fname);