X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_res_downloader.pas;h=b2844c651539202b622fdcdea8e46fd063b60652;hb=651f063582ce4ebc8eb1b36025d7553675005995;hp=ae645a1196677443c505ee10f75dcd0e16f63193;hpb=8fdd9fdbead9da51719657ba98fab3ad9c83903b;p=d2df-sdl.git diff --git a/src/game/g_res_downloader.pas b/src/game/g_res_downloader.pas index ae645a1..b2844c6 100644 --- a/src/game/g_res_downloader.pas +++ b/src/game/g_res_downloader.pas @@ -161,6 +161,7 @@ var strm: TStream; fname: AnsiString; wadname: AnsiString; + md5: TMD5Digest; begin //SetLength(mapData.ExternalResources, 0); result := ''; @@ -199,7 +200,7 @@ begin end; fname := GameDir+'/maps/downloads/'+FileName; try - strm := createDiskFile(fname); + strm := openDiskFileRW(fname); except e_WriteLog('cannot create map file `'+FileName+'`', TMsgType.Fatal); result := ''; @@ -221,6 +222,39 @@ begin result := ''; exit; end; + // if it was resumed, check md5 and initiate full download if necessary + if tf.resumed then + begin + md5 := MD5File(fname); + // sorry for pasta, i am asshole + if not MD5Match(md5, tf.hash) then + begin + e_LogWritefln('resuming failed; downloading map `%s` from scratch...', [fname]); + try + DeleteFile(fname); + strm := createDiskFile(fname); + except + 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); + strm.Free; + result := ''; + exit; + end; + strm.Free; + if (res <> 0) then + begin + e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + result := ''; + exit; + end; + end; + end; result := fname; end; @@ -245,7 +279,7 @@ begin fname := GameDir+'/wads/downloads/'+tf.diskName; e_LogWritefln('downloading resource `%s` to `%s`...', [tf.diskName, fname]); try - strm := createDiskFile(fname); + strm := openDiskFileRW(fname); except e_WriteLog('cannot create resource file `'+fname+'`', TMsgType.Fatal); result := ''; @@ -266,6 +300,39 @@ begin result := ''; exit; end; + // if it was resumed, check md5 and initiate full download if necessary + if tf.resumed then + begin + md5 := MD5File(fname); + // sorry for pasta, i am asshole + if not MD5Match(md5, tf.hash) then + begin + e_LogWritefln('resuming failed; downloading resource `%s` to `%s` from scratch...', [tf.diskName, fname]); + try + DeleteFile(fname); + strm := createDiskFile(fname); + except + e_WriteLog('cannot create resource file `'+fname+'`', TMsgType.Fatal); + result := ''; + exit; + end; + try + res := g_Net_ReceiveResourceFile(f, tf, strm); + except + e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + strm.Free; + result := ''; + exit; + end; + strm.Free; + if (res <> 0) then + begin + e_WriteLog('error downloading map file `'+FileName+'`', TMsgType.Fatal); + result := ''; + exit; + end; + end; + end; g_Res_PutReplacementWad(tf.diskName, fname); end; end;