[8423] Fixed typo in mangos.sql.
[getmangos.git] / contrib / vmap_extractor_v2 / vmapextract / mpq.cpp
blob0d72f06a7da8588c3b4ab1ae3c8ee1731a72d18b
1 #include "mpq.h"
2 //#include <vector>
3 #include "Stormlib.h"
4 #define __STORMLIB_SELF__
6 MPQArchiveSet gOpenArchives;
8 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9 MPQArchive::MPQArchive(const char* filename)
11 BOOL succ = SFileOpenArchive(filename, 0, 0,&hMPQ);
12 if (succ)
13 printf("Opening %s\n", filename);
14 else
15 printf("Error!!!Not open archive %s\n", filename);
18 void MPQArchive::close()
20 SFileCloseArchive(hMPQ);
23 bool MPQArchiveSet::Open( std::vector<std::string> const& archiveNames )
25 for (size_t i=0; i < archiveNames.size(); ++i)
27 MPQArchive mpqarch(archiveNames[i].c_str());
28 if(mpqarch.isOpen())
29 archives.push_back(mpqarch);
32 return !archives.empty();
35 MPQArchiveSet::~MPQArchiveSet()
37 // close archives
38 for (ArchiveSet::iterator ar_itr = archives.begin(); ar_itr != archives.end(); ++ar_itr)
39 ar_itr->close();
42 MPQFile::MPQFile(const char* filename):
43 eof(false),
44 buffer(0),
45 pointer(0),
46 size(0)
48 for(ArchiveSet::const_iterator i=gOpenArchives.archives.begin(); i!=gOpenArchives.archives.end();++i)
50 HANDLE hFile = "";
51 hMPQ = i->hMPQ;
52 BOOL succ = SFileOpenFileEx(hMPQ,filename,0, &hFile);
53 if (succ)
55 DWORD s = SFileGetFileSize(hFile, 0);
56 if (!s)
58 eof = true;
59 buffer = 0;
60 return;
62 size = (size_t)s;
63 buffer = new char[s];
64 SFileReadFile(hFile, buffer, s, 0, 0);
65 SFileCloseFile(hFile);
67 eof = false;
68 return;
72 eof = true;
73 buffer = 0;
76 MPQFile::~MPQFile()
78 close();
81 size_t MPQFile::read(void* dest, size_t bytes)
83 if (eof)
84 return 0;
86 size_t rpos = pointer + bytes;
87 if (rpos > size)
89 bytes = size - pointer;
90 eof = true;
93 memcpy(dest, &(buffer[pointer]), bytes);
95 pointer = rpos;
97 return bytes;
100 bool MPQFile::isEof()
102 return eof;
105 void MPQFile::seek(int offset)
107 pointer = offset;
108 eof = (pointer >= size);
111 void MPQFile::seekRelative(int offset)
113 pointer += offset;
114 eof = (pointer >= size);
117 void MPQFile::close()
119 if (buffer)
120 delete[] buffer;
121 buffer = 0;
122 eof = true;
125 size_t MPQFile::getSize()
127 return size;
130 size_t MPQFile::getPos()
132 return pointer;
135 char* MPQFile::getBuffer()
137 return buffer;
140 char* MPQFile::getPointer()
142 return buffer + pointer;