2 * Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define _CRT_SECURE_NO_DEPRECATE
23 // list of mpq files for lookup most recent file version
24 ArchiveSet gOpenArchives
;
26 ArchiveSetBounds
GetArchivesBounds()
28 return ArchiveSetBounds(gOpenArchives
.begin(), gOpenArchives
.end());
31 bool OpenArchive(char const* mpqFileName
, HANDLE
* mpqHandlePtr
/*= NULL*/)
35 if (!SFileOpenArchive(mpqFileName
, 0, MPQ_OPEN_READ_ONLY
, &mpqHandle
))
38 gOpenArchives
.push_back(mpqHandle
);
41 *mpqHandlePtr
= mpqHandle
;
46 bool OpenNewestFile(char const* filename
, HANDLE
* fileHandlerPtr
)
48 for(ArchiveSet::const_reverse_iterator i
=gOpenArchives
.rbegin(); i
!=gOpenArchives
.rend();++i
)
50 // always prefer get updated file version
51 if (SFileOpenFileEx(*i
, filename
, SFILE_OPEN_PATCHED_FILE
, fileHandlerPtr
))
58 bool ExtractFile( char const* mpq_name
, std::string
const& filename
)
60 for(ArchiveSet::const_reverse_iterator i
=gOpenArchives
.rbegin(); i
!=gOpenArchives
.rend();++i
)
63 if (!SFileOpenFileEx(*i
, mpq_name
, SFILE_OPEN_PATCHED_FILE
, &fileHandle
))
66 if (SFileGetFileSize(fileHandle
, NULL
) == 0) // some files removed in next updates and its reported size 0
68 SFileCloseFile(fileHandle
);
72 SFileCloseFile(fileHandle
);
74 if (!SFileExtractFile(*i
, mpq_name
, filename
.c_str(), SFILE_OPEN_PATCHED_FILE
))
76 printf("Can't extract file: %s\n", mpq_name
);
83 printf("Extracting file not found: %s\n", filename
.c_str());
90 for(ArchiveSet::const_iterator i
= gOpenArchives
.begin(); i
!= gOpenArchives
.end();++i
)
91 SFileCloseArchive(*i
);
92 gOpenArchives
.clear();
95 FileLoader::FileLoader()
102 FileLoader::~FileLoader()
107 bool FileLoader::loadFile(char *filename
, bool log
)
111 HANDLE fileHandle
= 0;
113 if (!OpenNewestFile(filename
, &fileHandle
))
116 printf("No such file %s\n", filename
);
120 data_size
= SFileGetFileSize(fileHandle
, NULL
);
122 data
= new uint8
[data_size
];
125 SFileCloseFile(fileHandle
);
129 if (!SFileReadFile(fileHandle
, data
, data_size
, NULL
, NULL
))
132 printf("Can't read file %s\n", filename
);
133 SFileCloseFile(fileHandle
);
137 SFileCloseFile(fileHandle
);
139 // ToDo: Fix WDT errors...
140 if (!prepareLoadedData())
142 //printf("Error loading %s\n\n", filename);
150 bool FileLoader::prepareLoadedData()
153 version
= (file_MVER
*) data
;
155 if (version
->fcc
!= 'MVER')
158 if (version
->ver
!= FILE_FORMAT_VERSION
)
163 void FileLoader::free()
165 if (data
) delete[] data
;