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;
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 searchResult
.Name
= filename
then
28 files
.Add(dirName
+'/'+filename
);
32 else if (searchResult
.Name
<> '.') and (searchResult
.Name
<> '..') then
33 FindFiles(IncludeTrailingPathDelimiter(dirName
)+searchResult
.Name
,
35 until FindNext(searchResult
) <> 0;
37 FindClose(searchResult
);
42 function CompareFileHash(const filename
: string; const resMd5
: TMD5Digest
): Boolean;
46 gResHash
:= MD5File(filename
);
47 Result
:= MD5Match(gResHash
, resMd5
);
50 function CheckFileHash(const path
, filename
: string; const resMd5
: TMD5Digest
): Boolean;
52 Result
:= FileExists(path
+ filename
) and CompareFileHash(path
+ filename
, resMd5
);
55 function g_Res_SearchSameWAD(const path
, filename
: string; const resMd5
: TMD5Digest
): string;
63 if CheckFileHash(path
, filename
, resMd5
) then
65 Result
:= path
+ filename
;
69 files
:= TStringList
.Create
;
71 FindFiles(path
, filename
, files
);
72 for i
:= 0 to files
.Count
- 1 do
74 res
:= files
.Strings
[i
];
75 if CompareFileHash(res
, resMd5
) then
85 function SaveWAD(const path
, filename
: string; const data
: array of Byte): string;
90 Result
:= path
+ DOWNLOAD_DIR
+ '/' + filename
;
91 if not DirectoryExists(path
+ DOWNLOAD_DIR
) then
93 CreateDir(path
+ DOWNLOAD_DIR
);
95 resFile
:= TFileStream
.Create(Result
, fmCreate
);
96 resFile
.WriteBuffer(data
[0], Length(data
));
103 function g_Res_DownloadWAD(const FileName
: string): string;
105 msgStream
: TMemoryStream
;
106 resStream
: TFileStream
;
107 mapData
: TMapDataMsg
;
109 resData
: TResDataMsg
;
111 SetLength(mapData
.ExternalResources
, 0);
112 g_Console_Add(Format(_lc
[I_NET_MAP_DL
], [FileName
]));
113 e_WriteLog('Downloading map `' + FileName
+ '` from server', MSG_NOTIFY
);
114 MC_SEND_MapRequest();
116 msgStream
:= g_Net_Wait_Event(NET_MSG_MAP_RESPONSE
);
117 if msgStream
<> nil then
119 mapData
:= MapDataFromMsgStream(msgStream
);
123 for i
:= 0 to High(mapData
.ExternalResources
) do
125 if not CheckFileHash(GameDir
+ '/wads/',
126 mapData
.ExternalResources
[i
].Name
,
127 mapData
.ExternalResources
[i
].md5
) then
129 g_Console_Add(Format(_lc
[I_NET_WAD_DL
],
130 [mapData
.ExternalResources
[i
].Name
]));
131 e_WriteLog('Downloading Wad `' + mapData
.ExternalResources
[i
].Name
+
132 '` from server', MSG_NOTIFY
);
133 MC_SEND_ResRequest(mapData
.ExternalResources
[i
].Name
);
135 msgStream
:= g_Net_Wait_Event(NET_MSG_RES_RESPONSE
);
136 resData
:= ResDataFromMsgStream(msgStream
);
138 resStream
:= TFileStream
.Create(GameDir
+'/wads/'+
139 mapData
.ExternalResources
[i
].Name
,
141 resStream
.WriteBuffer(resData
.FileData
[0], resData
.FileSize
);
143 resData
.FileData
:= nil;
149 Result
:= SaveWAD(MapsDir
, ExtractFileName(FileName
), mapData
.FileData
);