2
#include "FileManager.h"
6
inline u32 swapEndianness32(u32 value)
8
return ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | ((value & 0xFF000000) >> 24);
11
inline u16 swapEndianness16(u16 value)
13
return ((value & 0xFF) << 8) | ((value & 0xFF00) >> 8);
17
GenericAssemblerFile::GenericAssemblerFile(const std::wstring& fileName, u32 headerSize, bool overwrite)
19
this->fileName = fileName;
20
this->headerSize = headerSize;
21
this->originalHeaderSize = headerSize;
22
this->virtualAddress = headerSize;
23
mode = overwrite == true ? Create : Open;
26
GenericAssemblerFile::GenericAssemblerFile(const std::wstring& fileName, const std::wstring& originalFileName, u32 headerSize)
28
this->fileName = fileName;
29
this->originalName = originalFileName;
30
this->headerSize = headerSize;
31
this->virtualAddress = headerSize;
32
originalHeaderSize = headerSize;
36
bool GenericAssemblerFile::open(bool onlyCheck)
38
headerSize = originalHeaderSize;
39
virtualAddress = headerSize;
41
if (onlyCheck == false)
43
// actually open the file
48
success = handle.open(fileName,BinaryFile::ReadWrite);
51
Logger::printError(Logger::FatalError,L"Could not open file %s",fileName);
57
success = handle.open(fileName,BinaryFile::Write);
60
Logger::printError(Logger::FatalError,L"Could not create file %s",fileName);
66
success = copyFile(originalName,fileName);
69
Logger::printError(Logger::FatalError,L"Could not copy file %s",originalName);
73
success = handle.open(fileName,BinaryFile::ReadWrite);
76
Logger::printError(Logger::FatalError,L"Could not open file %s",fileName);
86
// else only check if it can be done, don't actually do it permanently
92
success = temp.open(fileName,BinaryFile::ReadWrite);
95
Logger::queueError(Logger::FatalError,L"Could not open file %s",fileName);
102
// if it exists, check if you can open it with read/write access
103
// otherwise open it with write access and remove it afterwards
104
exists = fileExists(fileName);
105
success = temp.open(fileName,exists ? BinaryFile::ReadWrite : BinaryFile::Write);
106
if (success == false)
108
Logger::queueError(Logger::FatalError,L"Could not create file %s",fileName);
114
deleteFile(fileName);
119
// check original file
120
success = temp.open(originalName,BinaryFile::ReadWrite);
121
if (success == false)
123
Logger::queueError(Logger::FatalError,L"Could not open file %s",originalName);
128
// check new file, same as create
129
exists = fileExists(fileName);
130
success = temp.open(fileName,exists ? BinaryFile::ReadWrite : BinaryFile::Write);
131
if (success == false)
133
Logger::queueError(Logger::FatalError,L"Could not open file %s",fileName);
139
deleteFile(fileName);
150
bool GenericAssemblerFile::write(void* data, size_t length)
152
if (isOpen() == false)
155
size_t len = handle.write(data,length);
156
virtualAddress += len;
157
return len == length;
160
bool GenericAssemblerFile::seekVirtual(u64 virtualAddress)
162
if (virtualAddress < headerSize)
164
Logger::queueError(Logger::Error,L"Seeking to invalid address");
168
this->virtualAddress = virtualAddress;
169
u64 physicalAddress = virtualAddress-headerSize;
172
handle.setPos((long)physicalAddress);
177
bool GenericAssemblerFile::seekPhysical(u64 physicalAddress)
179
if ((signed)physicalAddress < 0)
181
Logger::queueError(Logger::Error,L"Seeking to invalid address");
185
virtualAddress = physicalAddress+headerSize;
188
handle.setPos((long)physicalAddress);
195
FileManager::FileManager()
197
// detect own endianness
208
if (u.i == 0xDDCCBBAA)
209
ownEndianness = Endianness::Big;
210
else if (u.i == 0xAABBCCDD)
211
ownEndianness = Endianness::Little;
213
Logger::printError(Logger::Error,L"Running on unknown endianness");
218
FileManager::~FileManager()
223
void FileManager::reset()
226
setEndianness(Endianness::Little);
229
bool FileManager::checkActiveFile()
231
if (activeFile == NULL)
233
Logger::queueError(Logger::Error,L"No file opened");
239
bool FileManager::openFile(AssemblerFile* file, bool onlyCheck)
241
if (activeFile != NULL)
243
Logger::queueError(Logger::Warning,L"File not closed before opening a new one");
248
return activeFile->open(onlyCheck);
251
void FileManager::addFile(AssemblerFile* file)
253
files.push_back(file);
257
void FileManager::closeFile()
259
if (activeFile == NULL)
261
Logger::queueError(Logger::Warning,L"No file opened");
269
bool FileManager::write(void* data, size_t length)
271
if (checkActiveFile() == false)
274
if (activeFile->isOpen() == false)
276
Logger::queueError(Logger::Error,L"No file opened");
280
return activeFile->write(data,length);
283
bool FileManager::writeU8(u8 data)
285
return write(&data,1);
288
bool FileManager::writeU16(u16 data)
290
if (endianness != ownEndianness)
291
data = swapEndianness16(data);
293
return write(&data,2);
296
bool FileManager::writeU32(u32 data)
298
if (endianness != ownEndianness)
299
data = swapEndianness32(data);
301
return write(&data,4);
304
u64 FileManager::getVirtualAddress()
306
if (activeFile == NULL)
308
return activeFile->getVirtualAddress();
311
u64 FileManager::getPhysicalAddress()
313
if (activeFile == NULL)
315
return activeFile->getPhysicalAddress();
318
bool FileManager::seekVirtual(u64 virtualAddress)
320
if (checkActiveFile() == false)
323
bool result = activeFile->seekVirtual(virtualAddress);
324
if (result && Global.memoryMode)
326
int sec = Global.symbolTable.findSection(virtualAddress);
328
Global.Section = sec;
334
bool FileManager::seekPhysical(u64 virtualAddress)
336
if (checkActiveFile() == false)
338
return activeFile->seekPhysical(virtualAddress);
341
bool FileManager::advanceMemory(size_t bytes)
343
if (checkActiveFile() == false)
346
u64 pos = activeFile->getVirtualAddress();
347
return activeFile->seekVirtual(pos+bytes);
b'\\ No newline at end of file'