5 uses sysutils
, Classes
, md5
, g_net
, g_netmsg
, g_console
, g_main
, e_log
;
7 function g_Res_SearchSameWAD(const path
, filename
: string; const resMd5
: TMD5Digest
): string;
8 function g_Res_DownloadWAD(const FileName
: string): string;
12 uses g_language
, sfs
, utils
, wadreader
;
14 const DOWNLOAD_DIR
= 'downloads';
16 procedure FindFiles(const dirName
, filename
: string; var files
: TStringList
);
18 searchResult
: TSearchRec
;
20 if FindFirst(dirName
+'/*', faAnyFile
, searchResult
) = 0 then
24 if (searchResult
.Attr
and faDirectory
) = 0 then
26 if StrEquCI1251(searchResult
.Name
, filename
) then
28 files
.Add(dirName
+'/'+filename
);
32 else if (searchResult
.Name
<> '.') and (searchResult
.Name
<> '..') then
33 FindFiles(IncludeTrailingPathDelimiter(dirName
)+searchResult
.Name
, filename
, files
);
34 until FindNext(searchResult
) <> 0;
36 FindClose(searchResult
);
41 function CompareFileHash(const filename
: string; const resMd5
: TMD5Digest
): Boolean;
46 fname
:= findDiskWad(filename
);
47 if length(fname
) = 0 then begin result
:= false; exit
; end;
48 gResHash
:= MD5File(fname
);
49 Result
:= MD5Match(gResHash
, resMd5
);
52 function CheckFileHash(const path
, filename
: string; const resMd5
: TMD5Digest
): Boolean;
56 fname
:= findDiskWad(path
+filename
);
57 if length(fname
) = 0 then begin result
:= false; exit
; end;
58 Result
:= FileExists(fname
) and CompareFileHash(fname
, resMd5
);
61 function g_Res_SearchSameWAD(const path
, filename
: string; const resMd5
: TMD5Digest
): string;
69 if CheckFileHash(path
, filename
, resMd5
) then
71 Result
:= path
+ filename
;
75 files
:= TStringList
.Create
;
77 FindFiles(path
, filename
, files
);
78 for i
:= 0 to files
.Count
- 1 do
80 res
:= files
.Strings
[i
];
81 if CompareFileHash(res
, resMd5
) then
91 function SaveWAD(const path
, filename
: string; const data
: array of Byte): string;
96 Result
:= path
+ DOWNLOAD_DIR
+ '/' + filename
;
97 if not DirectoryExists(path
+ DOWNLOAD_DIR
) then
99 CreateDir(path
+ DOWNLOAD_DIR
);
101 resFile
:= TFileStream
.Create(Result
, fmCreate
);
102 resFile
.WriteBuffer(data
[0], Length(data
));
109 function g_Res_DownloadWAD(const FileName
: string): string;
111 msgStream
: TMemoryStream
;
112 resStream
: TFileStream
;
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
:= TFileStream
.Create(GameDir
+'/wads/'+
145 mapData
.ExternalResources
[i
].Name
,
147 resStream
.WriteBuffer(resData
.FileData
[0], resData
.FileSize
);
149 resData
.FileData
:= nil;
155 Result
:= SaveWAD(MapsDir
, ExtractFileName(FileName
), mapData
.FileData
);