mirror of
https://github.com/jakcron/nstool.git
synced 2024-12-22 18:55:29 +00:00
[fnd] Added IFile interface and SimpleFile implementation.
This commit is contained in:
parent
cca4a29fd6
commit
8a8fe7b0e8
14
lib/libfnd/include/fnd/IFile.h
Normal file
14
lib/libfnd/include/fnd/IFile.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
#pragma once
|
||||
#include <fnd/types.h>
|
||||
|
||||
namespace fnd
|
||||
{
|
||||
class IFile
|
||||
{
|
||||
public:
|
||||
virtual size_t size() = 0;
|
||||
virtual void seek(size_t offset) = 0;
|
||||
virtual void read(byte_t* out, size_t offset, size_t len) = 0;
|
||||
virtual void write(const byte_t* out, size_t offset, size_t len) = 0;
|
||||
};
|
||||
}
|
40
lib/libfnd/include/fnd/SimpleFile.h
Normal file
40
lib/libfnd/include/fnd/SimpleFile.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
#pragma once
|
||||
#include <fnd/IFile.h>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
|
||||
namespace fnd
|
||||
{
|
||||
class SimpleFile : public IFile
|
||||
{
|
||||
public:
|
||||
enum OpenMode
|
||||
{
|
||||
Read,
|
||||
Edit,
|
||||
Create
|
||||
};
|
||||
|
||||
SimpleFile();
|
||||
~SimpleFile();
|
||||
|
||||
void open(const std::string& path, OpenMode mode);
|
||||
bool isOpen() const;
|
||||
void close();
|
||||
size_t size();
|
||||
void seek(size_t offset);
|
||||
size_t pos();
|
||||
void read(byte_t* out, size_t offset, size_t len);
|
||||
void write(const byte_t* out, size_t offset, size_t len);
|
||||
|
||||
private:
|
||||
const std::string kModuleName = "SimpleFile";
|
||||
|
||||
bool mOpen;
|
||||
OpenMode mMode;
|
||||
FILE* mFp;
|
||||
|
||||
const char* getOpenModeStr(OpenMode mMode);
|
||||
};
|
||||
}
|
||||
|
93
lib/libfnd/source/SimpleFile.cpp
Normal file
93
lib/libfnd/source/SimpleFile.cpp
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include <fnd/SimpleFile.h>
|
||||
|
||||
using namespace fnd;
|
||||
|
||||
SimpleFile::SimpleFile() :
|
||||
mOpen(false),
|
||||
mMode(Read),
|
||||
mFp(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
SimpleFile::~SimpleFile()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void SimpleFile::open(const std::string& path, OpenMode mode)
|
||||
{
|
||||
//close();
|
||||
mMode = mode;
|
||||
//printf("fopen(%s,%s);\n", path.c_str(), getOpenModeStr(mMode));
|
||||
mFp = fopen(path.c_str(), getOpenModeStr(mMode));
|
||||
if (mFp == nullptr)
|
||||
throw fnd::Exception(kModuleName, "Failed to open file.");
|
||||
mOpen = true;
|
||||
seek(0);
|
||||
}
|
||||
|
||||
bool SimpleFile::isOpen() const
|
||||
{
|
||||
return mOpen == true && mFp != nullptr;
|
||||
}
|
||||
|
||||
void SimpleFile::close()
|
||||
{
|
||||
if (isOpen())
|
||||
{
|
||||
fclose(mFp);
|
||||
}
|
||||
mFp = nullptr;
|
||||
mOpen = false;
|
||||
}
|
||||
|
||||
size_t SimpleFile::size()
|
||||
{
|
||||
size_t cur_pos = pos();
|
||||
fseek(mFp, 0, SEEK_END);
|
||||
size_t fsize = pos();
|
||||
seek(cur_pos);
|
||||
return fsize;
|
||||
}
|
||||
|
||||
void SimpleFile::seek(size_t offset)
|
||||
{
|
||||
fseek(mFp, offset, SEEK_SET);
|
||||
}
|
||||
|
||||
size_t SimpleFile::pos()
|
||||
{
|
||||
return ftell(mFp);
|
||||
}
|
||||
|
||||
void SimpleFile::read(byte_t* out, size_t offset, size_t len)
|
||||
{
|
||||
seek(offset);
|
||||
fread(out, len, 1, mFp);
|
||||
}
|
||||
|
||||
void SimpleFile::write(const byte_t* out, size_t offset, size_t len)
|
||||
{
|
||||
seek(offset);
|
||||
fwrite(out, len, 1, mFp);
|
||||
}
|
||||
|
||||
const char* SimpleFile::getOpenModeStr(OpenMode mode)
|
||||
{
|
||||
const char* str = "";
|
||||
switch(mode)
|
||||
{
|
||||
case (Read):
|
||||
str = "rb";
|
||||
break;
|
||||
case (Edit):
|
||||
str = "rb+";
|
||||
break;
|
||||
case (Create):
|
||||
str = "wb";
|
||||
break;
|
||||
default:
|
||||
throw fnd::Exception(kModuleName, "Unknown open mode");
|
||||
}
|
||||
return str;
|
||||
}
|
Loading…
Reference in a new issue