2
* Copyright 2013 Arx Libertatis Team (see the AUTHORS file)
4
* This file is part of Arx Libertatis.
6
* Arx Libertatis is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* Arx Libertatis is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with Arx Libertatis. If not, see <http://www.gnu.org/licenses/>.
20
#include "lib/ArxIO.h"
29
#include "io/log/Logger.h"
30
#include "io/log/ConsoleLogger.h"
34
class MemoryLogger : public Backend {
37
void log(const Source & file, int line, Logger::LogLevel level, const std::string & str) {
42
if(level == Logger::Error) {
46
std::string levelName;
48
case Logger::Debug: levelName = "Debug"; break;
49
case Logger::Info: levelName = "Info"; break;
50
case Logger::Warning: levelName = "Warning"; break;
51
case Logger::Error: levelName = "Error"; break;
52
case Logger::Critical: levelName = "Critical"; break;
53
case Logger::None: ARX_DEAD_CODE(); return;
56
m_Lines.push_back(levelName + ": " + str);
61
std::string m_lastError;
62
std::deque<std::string> m_Lines;
67
static logger::MemoryLogger memLogger;
70
Logger::add(&memLogger);
71
Logger::set("*", Logger::Debug);
73
LogInfo << "Arx Io library initialized";
76
void ArxIO_getError(char * outMessage, int size) {
77
if(!memLogger.m_lastError.empty()) {
78
memLogger.m_lastError.copy(outMessage, size);
79
memLogger.m_lastError.clear();
83
int ArxIO_getLogLine(char * outMessage, int size) {
84
if(memLogger.m_Lines.empty()) {
88
memLogger.m_Lines.front().copy(outMessage, size);
89
memLogger.m_Lines.pop_front();
91
return memLogger.m_Lines.size();
94
static size_t loadedFtlBufferSize = 0;
95
static char * loadedFtlBuffer = NULL;
97
int ArxIO_ftlLoad(char * filePath) {
101
std::ifstream is(filePath, std::ifstream::binary);
104
LogError << "Opening file failed: " << filePath;
108
// get length of file:
110
size_t compressedSize = is.tellg();
113
char * compressedData = new char[compressedSize];
115
LogInfo << "Reading " << compressedSize << " uncompressed bytes";
116
is.read(compressedData, compressedSize);
119
LogInfo << "File read successfully";
121
LogError << "Full read failed " << (compressedSize - is.gcount()) << " bytes left";
128
char * dat = blastMemAlloc(compressedData, compressedSize, allocsize);
130
LogError << "Decompressing failed " << filePath;
134
LogInfo << "Uncompressed size: " << allocsize;
136
loadedFtlBufferSize = allocsize;
137
loadedFtlBuffer = dat;
142
int ArxIO_ftlRelease() {
143
if(!loadedFtlBuffer) {
147
LogInfo << "Releasing loaded ftl data";
149
loadedFtlBufferSize = 0;
150
free(loadedFtlBuffer);
151
loadedFtlBuffer = NULL;
156
int ArxIO_ftlGetRawDataSize() {
157
return loadedFtlBufferSize;
160
int ArxIO_ftlGetRawData(char * outData, int size) {
161
if(!loadedFtlBuffer || loadedFtlBufferSize == 0) {
162
LogError << "No buffer loaded";
166
if(size < loadedFtlBufferSize) {
167
LogError << "Supplied buffer too small for data";
171
memcpy(outData, loadedFtlBuffer, size);