root/trunk/contrib/vmap_extractor_v2/vmapextract/mpq.cpp

Revision 2, 1.9 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

Original author: Neo2003
Date: 2008-10-02 16:23:55-05:00

Line 
1#include "mpq.h"
2//#include <vector>
3#include "Stormlib.h"
4#define __STORMLIB_SELF__
5
6typedef std::vector<MPQArchive*> ArchiveSet;
7ArchiveSet gOpenArchives;
8//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
9MPQArchive::MPQArchive(const char* filename)
10{
11        BOOL succ = SFileOpenArchive(filename, 0, 0,&hMPQ);
12        if (succ) 
13        {
14                MPQArchive*ar = (MPQArchive*)(hMPQ);
15                printf("Opening %s\n", filename);
16                gOpenArchives.push_back(ar);
17        succ = true;
18               
19        } 
20        else 
21        {
22                printf("Error!!!Not open archive %s\n", filename);
23        }
24}
25
26void MPQArchive::close()
27{
28        SFileCloseArchive(hMPQ);
29}
30
31//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
32MPQFile::MPQFile(const char* filename):
33        eof(false),
34        buffer(0),
35        pointer(0),
36        size(0)
37{
38        for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i)
39        { 
40               
41         HANDLE hFile = "";
42         MPQArchive*(hMPQ) = *i;
43         BOOL succ = SFileOpenFileEx(hMPQ,filename,0, &hFile);
44           if (succ) 
45           {
46                 DWORD s = SFileGetFileSize(hFile, 0);
47                 if (!s)
48                 {
49                        eof = true;
50                        buffer = 0;
51                        return;
52                 }
53         size = (size_t)s;
54                 buffer = new char[s];
55                 SFileReadFile(hFile, buffer, s, 0, 0);
56                 SFileCloseFile(hFile);
57                 
58                 eof = false;
59                 return;
60           }
61        }   
62     
63        eof = true;
64        buffer = 0;
65         
66}
67
68MPQFile::~MPQFile()
69{
70        close();
71}
72
73size_t MPQFile::read(void* dest, size_t bytes)
74{
75        if (eof) 
76        return 0;
77
78        size_t rpos = pointer + bytes;
79        if (rpos > size) 
80        {
81                bytes = size - pointer;
82                eof = true;
83        }
84
85        memcpy(dest, &(buffer[pointer]), bytes);
86
87        pointer = rpos;
88
89        return bytes;
90}
91
92bool MPQFile::isEof()
93{
94    return eof;
95}
96
97void MPQFile::seek(int offset)
98{
99        pointer = offset;
100        eof = (pointer >= size);
101}
102
103void MPQFile::seekRelative(int offset)
104{
105        pointer += offset;
106        eof = (pointer >= size);
107}
108
109void MPQFile::close()
110{
111        if (buffer) 
112        delete[] buffer;
113        buffer = 0;
114        eof = true;
115}
116
117size_t MPQFile::getSize()
118{
119        return size;
120}
121
122size_t MPQFile::getPos()
123{
124        return pointer;
125}
126
127char* MPQFile::getBuffer()
128{
129        return buffer;
130}
131
132char* MPQFile::getPointer()
133{
134        return buffer + pointer;
135}
136
Note: See TracBrowser for help on using the browser.