Project SkyFire Core
SkyFire 5.4.8 server core API documentation
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
11MPQFile::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
58size_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
75void MPQFile::seek(int offset)
76{
77 pointer = offset;
78 eof = (pointer >= size);
79}
80
81void MPQFile::seekRelative(int offset)
82{
83 pointer += offset;
84 eof = (pointer >= size);
85}
86
88{
89 if (buffer) delete[] buffer;
90 buffer = 0;
91 eof = true;
92}
std::uint32_t uint32
Definition Define.h:77
size_t read(void *dest, size_t bytes)
Definition mpqfile.cpp:58
MPQFile(const MPQFile &f)
char * buffer
Definition mpqfile.h:54
size_t pointer
Definition mpqfile.h:55
size_t size
Definition mpqfile.h:55
void close()
Definition mpqfile.cpp:87
void seek(int offset)
Definition mpqfile.cpp:75
void seekRelative(int offset)
Definition mpqfile.cpp:81
bool eof
Definition mpqfile.h:53