DEADSOFTWARE

net: some cosmetic logging in resource downloader
[d2df-sdl.git] / src / game / g_res_downloader.pas
index 098e0dd706313aa02bc4a6037541bd241f66f21b..d67dc4c52db84c01abb20d58eb8f3ccae120908b 100644 (file)
@@ -30,7 +30,7 @@ function g_Res_DownloadMapWAD (FileName: AnsiString; const mapHash: TMD5Digest):
 function g_Res_FindReplacementWad (oldname: AnsiString): AnsiString;
 
 // call this somewhere in startup sequence
-procedure g_Res_CreateDatabases ();
+procedure g_Res_CreateDatabases (allowRescan: Boolean=false);
 
 
 implementation
@@ -97,40 +97,52 @@ end;
 //  g_Res_CreateDatabases
 //
 //==========================================================================
-procedure g_Res_CreateDatabases ();
+procedure g_Res_CreateDatabases (allowRescan: Boolean=false);
 var
   st: TStream;
+  upmap: Boolean;
+  upres: Boolean;
+  forcesave: Boolean;
 begin
-  // create and load a know map database, if necessary
-  knownMaps.Free;
-  knownMaps := TFileHashDB.Create(GameDir+'/maps/');
-  knownRes := TFileHashDB.Create(GameDir+'/wads/');
-  saveDBsToDiskEnabled := true;
-  // load map database
-  st := nil;
-  try
-    st := openDiskFileRO(GameDir+'/data/maphash.db');
-    knownMaps.loadFrom(st);
-    e_LogWriteln('loaded map database');
-  except
-  end;
-  st.Free;
-  // load resource database
-  st := nil;
-  try
-    st := openDiskFileRO(GameDir+'/data/reshash.db');
-    knownRes.loadFrom(st);
-    e_LogWriteln('loaded resource database');
-  except
+  if not assigned(knownMaps) then
+  begin
+    // create and load a know map database, if necessary
+    knownMaps := TFileHashDB.Create(GameDir+'/maps/');
+    knownRes := TFileHashDB.Create(GameDir+'/wads/');
+    saveDBsToDiskEnabled := true;
+    // load map database
+    st := nil;
+    try
+      st := openDiskFileRO(GameDir+'/data/maphash.db');
+      knownMaps.loadFrom(st);
+      e_LogWriteln('loaded map database');
+    except
+    end;
+    st.Free;
+    // load resource database
+    st := nil;
+    try
+      st := openDiskFileRO(GameDir+'/data/reshash.db');
+      knownRes.loadFrom(st);
+      e_LogWriteln('loaded resource database');
+    except
+    end;
+    st.Free;
+    forcesave := true;
+  end
+  else
+  begin
+    if (not allowRescan) then exit;
+    forcesave := false;
   end;
-  st.Free;
   // rescan dirs
   e_LogWriteln('refreshing map database');
-  knownMaps.scanFiles();
+  upmap := knownMaps.scanFiles();
   e_LogWriteln('refreshing resource database');
-  knownRes.scanFiles();
+  upres := knownRes.scanFiles();
   // save databases
-  saveDatabases(true, true);
+  if (forcesave) then begin upmap := true; upres := true; end;
+  if upmap or upres then saveDatabases(upmap, upres);
 end;
 
 
@@ -242,80 +254,6 @@ begin
 end;
 
 
-//==========================================================================
-//
-//  scanDir
-//
-//  look for a wad to match the hash
-//  scans subdirs, ignores known wad extensions
-//
-//  returns found wad disk name, or empty string
-//
-//==========================================================================
-(*
-function scanDir (dirName: AnsiString; baseName: AnsiString; const resMd5: TMD5Digest): AnsiString;
-var
-  searchResult: TSearchRec;
-  dfn: AnsiString;
-  md5: TMD5Digest;
-  dirs: array of AnsiString;
-  f: Integer;
-begin
-  result := '';
-  SetLength(dirs, 0);
-  if (length(baseName) = 0) then exit;
-  dirName := IncludeTrailingPathDelimiter(dirName);
-  e_LogWritefln('scanning dir `%s` for file `%s`...', [dirName, baseName]);
-
-  // scan files
-  if (FindFirst(dirName+'*', faAnyFile, searchResult) <> 0) then exit;
-  try
-    repeat
-      if ((searchResult.Attr and faDirectory) = 0) then
-      begin
-        if (isWadNamesEqu(searchResult.Name, baseName)) then
-        begin
-          dfn := dirName+searchResult.Name;
-          if FileExists(dfn) then
-          begin
-            e_LogWritefln('  found `%s`...', [dfn]);
-            md5 := MD5File(dfn);
-            if MD5Match(md5, resMd5) then
-            begin
-              e_LogWritefln('    MATCH `%s`...', [dfn]);
-              SetLength(dirs, 0);
-              result := dfn;
-              exit;
-            end;
-          end;
-        end;
-      end
-      else
-      begin
-        if (searchResult.Name <> '.') and (searchResult.Name <> '..') then
-        begin
-          dfn := dirName+searchResult.Name;
-          SetLength(dirs, Length(dirs)+1);
-          dirs[length(dirs)-1] := dfn;
-        end;
-      end;
-    until (FindNext(searchResult) <> 0);
-  finally
-    FindClose(searchResult);
-  end;
-
-  // scan subdirs
-  for f := 0 to High(dirs) do
-  begin
-    dfn := dirs[f];
-    result := scanDir(dfn, baseName, resMd5);
-    if (length(result) <> 0) then begin SetLength(dirs, 0); exit; end;
-  end;
-  SetLength(dirs, 0);
-end;
-*)
-
-
 //==========================================================================
 //
 //  findExistingMapWadWithHash
@@ -408,7 +346,7 @@ end;
 function g_Res_DownloadMapWAD (FileName: AnsiString; const mapHash: TMD5Digest): AnsiString;
 var
   tf: TNetFileTransfer;
-  resList: TStringList;
+  resList: array of TNetMapResourceInfo = nil;
   f, res: Integer;
   strm: TStream;
   fname: AnsiString;
@@ -416,21 +354,22 @@ var
   md5: TMD5Digest;
   mapdbUpdated: Boolean = false;
   resdbUpdated: Boolean = false;
+  transStarted: Boolean;
 begin
   result := '';
   clearReplacementWads();
-
-  resList := TStringList.Create();
+  g_Res_CreateDatabases();
 
   try
     g_Res_received_map_start := 1;
     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;
 
@@ -452,17 +391,18 @@ begin
       end;
       fname := GameDir+'/maps/downloads/'+generateFileName(FileName, mapHash);
       tf.diskName := fname;
+      e_LogWritefln('map disk file for `%s` is `%s`', [FileName, fname], TMsgType.Fatal);
       try
         strm := openDiskFileRW(fname);
       except
-        e_WriteLog('cannot create map file `'+FileName+'`', TMsgType.Fatal);
+        e_WriteLog('cannot create map file `'+fname+'`', TMsgType.Fatal);
         result := '';
         exit;
       end;
       try
         res := g_Net_ReceiveResourceFile(-1{map}, tf, strm);
       except
-        e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal);
+        e_WriteLog('error downloading map file (exception) `'+FileName+'`', TMsgType.Fatal);
         strm.Free;
         result := '';
         exit;
@@ -470,7 +410,7 @@ begin
       strm.Free;
       if (res <> 0) then
       begin
-        e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal);
+        e_LogWritefln('error downloading map `%s` (res=%d)', [FileName, res], TMsgType.Fatal);
         result := '';
         exit;
       end;
@@ -486,7 +426,7 @@ begin
             DeleteFile(fname);
             strm := createDiskFile(fname);
           except
-            e_WriteLog('cannot create map file `'+fname+'`', TMsgType.Fatal);
+            e_WriteLog('cannot create map file `'+fname+'` (exception)', TMsgType.Fatal);
             result := '';
             exit;
           end;
@@ -501,7 +441,7 @@ begin
           strm.Free;
           if (res <> 0) then
           begin
-            e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal);
+            e_LogWritefln('error downloading map `%s` (res=%d)', [FileName, res], TMsgType.Fatal);
             result := '';
             exit;
           end;
@@ -512,14 +452,28 @@ begin
     end;
 
     // download resources
-    for f := 0 to resList.Count-1 do
+    for f := 0 to High(resList) do
     begin
-      res := g_Net_RequestResFileInfo(f, tf);
-      if (res <> 0) then begin result := ''; exit; end;
+      // if we got a new-style reslist packet, use received data to check for resource files
+      if (resList[f].size < 0) then
+      begin
+        // old-style packet
+        transStarted := true;
+        res := g_Net_RequestResFileInfo(f, tf);
+        if (res <> 0) then begin result := ''; exit; end;
+      end
+      else
+      begin
+        // new-style packet
+        transStarted := false;
+        tf.diskName := resList[f].wadName;
+        tf.hash := resList[f].hash;
+        tf.size := resList[f].size;
+      end;
       if (isIgnoredResWad(tf.diskName)) then
       begin
         // ignored file, abort download
-        g_Net_AbortResTransfer(tf);
+        if (transStarted) then g_Net_AbortResTransfer(tf);
         e_LogWritefln('ignoring wad resource `%s` by user request', [tf.diskName]);
         continue;
       end;
@@ -527,11 +481,16 @@ begin
       if (length(wadname) <> 0) then
       begin
         // already here
-        g_Net_AbortResTransfer(tf);
+        if (transStarted) then g_Net_AbortResTransfer(tf);
         addReplacementWad(tf.diskName, wadname);
       end
       else
       begin
+        if (not transStarted) then
+        begin
+          res := g_Net_RequestResFileInfo(f, tf);
+          if (res <> 0) then begin result := ''; exit; end;
+        end;
         try
           CreateDir(GameDir+'/wads/downloads');
         except
@@ -598,7 +557,7 @@ begin
       end;
     end;
   finally
-    resList.Free;
+    SetLength(resList, 0);
     g_Res_received_map_start := 0;
   end;