05dfc24941c070fa76adb7d9db2ee5b84a74932d
6 uses sysutils
, Classes
, md5
, g_net
, g_netmsg
, g_console
, g_main
, e_log
;
8 function g_Res_SearchSameWAD(const path
, filename
: string; const resMd5
: TMD5Digest
): string;
9 function g_Res_DownloadWAD(const FileName
: string): string;
13 uses g_language
, sfs
, utils
, wadreader
;
15 const DOWNLOAD_DIR
= 'downloads';
17 procedure FindFiles(const dirName
, filename
: string; var files
: TStringList
);
19 searchResult
: TSearchRec
;
21 if FindFirst(dirName
+'/*', faAnyFile
, searchResult
) = 0 then
25 if (searchResult
.Attr
and faDirectory
) = 0 then
27 if StrEquCI1251(searchResult
.Name
, filename
) then
29 files
.Add(dirName
+'/'+filename
);
33 else if (searchResult
.Name
<> '.') and (searchResult
.Name
<> '..') then
34 FindFiles(IncludeTrailingPathDelimiter(dirName
)+searchResult
.Name
, filename
, files
);
35 until FindNext(searchResult
) <> 0;
37 FindClose(searchResult
);
42 function CompareFileHash(const filename
: string; const resMd5
: TMD5Digest
): Boolean;
47 fname
:= findDiskWad(filename
);
48 if length(fname
) = 0 then begin result
:= false; exit
; end;
49 gResHash
:= MD5File(fname
);
50 Result
:= MD5Match(gResHash
, resMd5
);
53 function CheckFileHash(const path
, filename
: string; const resMd5
: TMD5Digest
): Boolean;
57 fname
:= findDiskWad(path
+filename
);
58 if length(fname
) = 0 then begin result
:= false; exit
; end;
59 Result
:= FileExists(fname
) and CompareFileHash(fname
, resMd5
);
62 function g_Res_SearchSameWAD(const path
, filename
: string; const resMd5
: TMD5Digest
): string;
70 if CheckFileHash(path
, filename
, resMd5
) then
72 Result
:= path
+ filename
;
76 files
:= TStringList
.Create
;
78 FindFiles(path
, filename
, files
);
79 for i
:= 0 to files
.Count
- 1 do
81 res
:= files
.Strings
[i
];
82 if CompareFileHash(res
, resMd5
) then
92 function SaveWAD(const path
, filename
: string; const data
: array of Byte): string;
98 result
:= path
+DOWNLOAD_DIR
+'/'+filename
;
99 dpt
:= path
+DOWNLOAD_DIR
;
100 if not findFileCI(dpt
, true) then CreateDir(dpt
);
101 resFile
:= createDiskFile(result
);
102 resFile
.WriteBuffer(data
[0], Length(data
));
109 function g_Res_DownloadWAD(const FileName
: string): string;
111 msgStream
: TMemoryStream
;
113 mapData
: TMapDataMsg
;
115 resData
: TResDataMsg
;
117 SetLength(mapData
.ExternalResources
, 0);
118 g_Console_Add(Format(_lc
[I_NET_MAP_DL
], [FileName
]));
119 e_WriteLog('Downloading map `' + FileName
+ '` from server', MSG_NOTIFY
);
120 MC_SEND_MapRequest();
122 msgStream
:= g_Net_Wait_Event(NET_MSG_MAP_RESPONSE
);
123 if msgStream
<> nil then
125 mapData
:= MapDataFromMsgStream(msgStream
);
129 for i
:= 0 to High(mapData
.ExternalResources
) do
131 if not CheckFileHash(GameDir
+ '/wads/',
132 mapData
.ExternalResources
[i
].Name
,
133 mapData
.ExternalResources
[i
].md5
) then
135 g_Console_Add(Format(_lc
[I_NET_WAD_DL
],
136 [mapData
.ExternalResources
[i
].Name
]));
137 e_WriteLog('Downloading Wad `' + mapData
.ExternalResources
[i
].Name
+
138 '` from server', MSG_NOTIFY
);
139 MC_SEND_ResRequest(mapData
.ExternalResources
[i
].Name
);
141 msgStream
:= g_Net_Wait_Event(NET_MSG_RES_RESPONSE
);
142 resData
:= ResDataFromMsgStream(msgStream
);
144 resStream
:= createDiskFile(GameDir
+'/wads/'+mapData
.ExternalResources
[i
].Name
);
145 resStream
.WriteBuffer(resData
.FileData
[0], resData
.FileSize
);
147 resData
.FileData
:= nil;
153 Result
:= SaveWAD(MapsDir
, ExtractFileName(FileName
), mapData
.FileData
);