Added VS2012 solution and extractor code tidy up
[getmangos.git] / contrib / extractor / loadlib / loadlib.cpp
blob5ac28aa0dbaee481df15df158418861e3783ba11
1 /*
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
21 #include "loadlib.h"
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*/)
33 HANDLE mpqHandle;
35 if (!SFileOpenArchive(mpqFileName, 0, MPQ_OPEN_READ_ONLY, &mpqHandle))
36 return false;
38 gOpenArchives.push_back(mpqHandle);
40 if (mpqHandlePtr)
41 *mpqHandlePtr = mpqHandle;
43 return true;
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))
52 return true;
55 return false;
58 bool ExtractFile( char const* mpq_name, std::string const& filename )
60 for(ArchiveSet::const_reverse_iterator i=gOpenArchives.rbegin(); i!=gOpenArchives.rend();++i)
62 HANDLE fileHandle;
63 if (!SFileOpenFileEx(*i, mpq_name, SFILE_OPEN_PATCHED_FILE, &fileHandle))
64 continue;
66 if (SFileGetFileSize(fileHandle, NULL) == 0) // some files removed in next updates and its reported size 0
68 SFileCloseFile(fileHandle);
69 return true;
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);
77 return false;
80 return true;
83 printf("Extracting file not found: %s\n", filename.c_str());
84 return false;
88 void CloseArchives()
90 for(ArchiveSet::const_iterator i = gOpenArchives.begin(); i != gOpenArchives.end();++i)
91 SFileCloseArchive(*i);
92 gOpenArchives.clear();
95 FileLoader::FileLoader()
97 data = 0;
98 data_size = 0;
99 version = 0;
102 FileLoader::~FileLoader()
104 free();
107 bool FileLoader::loadFile(char *filename, bool log)
109 free();
111 HANDLE fileHandle = 0;
113 if (!OpenNewestFile(filename, &fileHandle))
115 if (log)
116 printf("No such file %s\n", filename);
117 return false;
120 data_size = SFileGetFileSize(fileHandle, NULL);
122 data = new uint8 [data_size];
123 if (!data)
125 SFileCloseFile(fileHandle);
126 return false;
129 if (!SFileReadFile(fileHandle, data, data_size, NULL, NULL))
131 if (log)
132 printf("Can't read file %s\n", filename);
133 SFileCloseFile(fileHandle);
134 return false;
137 SFileCloseFile(fileHandle);
139 // ToDo: Fix WDT errors...
140 if (!prepareLoadedData())
142 //printf("Error loading %s\n\n", filename);
143 //free();
144 return true;
147 return true;
150 bool FileLoader::prepareLoadedData()
152 // Check version
153 version = (file_MVER *) data;
155 if (version->fcc != 'MVER')
156 return false;
158 if (version->ver != FILE_FORMAT_VERSION)
159 return false;
160 return true;
163 void FileLoader::free()
165 if (data) delete[] data;
166 data = 0;
167 data_size = 0;
168 version = 0;