Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
mpqfile.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
mpqfile.h
"
7
#include <deque>
8
#include <cstdio>
9
#include "StormLib.h"
10
11
MPQFile::MPQFile
(HANDLE mpq,
const
char
* filename,
bool
warnNoExist
/*= true*/
) :
12
eof
(false),
13
buffer
(0),
14
pointer
(0),
15
size
(0)
16
{
17
HANDLE file;
18
if
(!SFileOpenFileEx(mpq, filename, SFILE_OPEN_FROM_MPQ, &file))
19
{
20
if
(warnNoExist || GetLastError() != ERROR_FILE_NOT_FOUND)
21
fprintf(stderr,
"Can't open %s, err=%u!\n"
, filename, GetLastError());
22
eof
=
true
;
23
return
;
24
}
25
26
DWORD hi = 0;
27
size
= SFileGetFileSize(file, &hi);
28
29
if
(hi)
30
{
31
fprintf(stderr,
"Can't open %s, size[hi] = %u!\n"
, filename,
uint32
(hi));
32
SFileCloseFile(file);
33
eof
=
true
;
34
return
;
35
}
36
37
if
(
size
<= 1)
38
{
39
fprintf(stderr,
"Can't open %s, size = %u!\n"
, filename,
uint32
(
size
));
40
SFileCloseFile(file);
41
eof
=
true
;
42
return
;
43
}
44
45
DWORD
read
= 0;
46
buffer
=
new
char
[
size
];
47
if
(!SFileReadFile(file,
buffer
,
size
, &
read
, NULL) ||
size
!=
read
)
48
{
49
fprintf(stderr,
"Can't read %s, size=%u read=%u!\n"
, filename,
uint32
(
size
),
uint32
(
read
));
50
SFileCloseFile(file);
51
eof
=
true
;
52
return
;
53
}
54
55
SFileCloseFile(file);
56
}
57
58
size_t
MPQFile::read
(
void
* dest,
size_t
bytes)
59
{
60
if
(
eof
)
return
0;
61
62
size_t
rpos =
pointer
+ bytes;
63
if
(rpos >
size
) {
64
bytes =
size
-
pointer
;
65
eof
=
true
;
66
}
67
68
memcpy(dest, &(
buffer
[
pointer
]), bytes);
69
70
pointer
= rpos;
71
72
return
bytes;
73
}
74
75
void
MPQFile::seek
(
int
offset)
76
{
77
pointer
= offset;
78
eof
= (
pointer
>=
size
);
79
}
80
81
void
MPQFile::seekRelative
(
int
offset)
82
{
83
pointer
+= offset;
84
eof
= (
pointer
>=
size
);
85
}
86
87
void
MPQFile::close
()
88
{
89
if
(
buffer
)
delete
[]
buffer
;
90
buffer
= 0;
91
eof
=
true
;
92
}
uint32
std::uint32_t uint32
Definition
Define.h:77
MPQFile::read
size_t read(void *dest, size_t bytes)
Definition
mpqfile.cpp:58
MPQFile::MPQFile
MPQFile(const MPQFile &f)
MPQFile::buffer
char * buffer
Definition
mpqfile.h:54
MPQFile::pointer
size_t pointer
Definition
mpqfile.h:55
MPQFile::size
size_t size
Definition
mpqfile.h:55
MPQFile::close
void close()
Definition
mpqfile.cpp:87
MPQFile::seek
void seek(int offset)
Definition
mpqfile.cpp:75
MPQFile::seekRelative
void seekRelative(int offset)
Definition
mpqfile.cpp:81
MPQFile::eof
bool eof
Definition
mpqfile.h:53
mpqfile.h
src
tools
vmap4_extractor
mpqfile.cpp
Generated on
for Project SkyFire Core by
1.17.0