Files
LifeProject/LifeCore/vfs/fs_win/IFSStream.h
T
2025-05-13 02:46:21 +03:00

86 lines
1.8 KiB
C++

#ifndef IFSSTREAM_H__
#define IFSSTREAM_H__
#include "../../IDataStream.h"
#include "../../LString.h"
#include <assert.h>
#include <windows.h>
namespace LifeCore
{
class IFSStream : public IDataStream
{
private:
int openMode;
size_t stmLength;
HANDLE pFile;
public:
~IFSStream()
{
//printf("DESTRUCTING WIN FILE STREAM\n");
Close();
}
void Close()
{
//printf("CLOSING WIN FILE STREAM\n");
if(pFile)
CloseHandle(pFile);
pFile = (HANDLE)0;
}
IFSStream(String& path, int fileAccessMode, size_t size)
{
UNREFERENCED_PARAMETER(size);
this->stmLength = 0;
openMode = fileAccessMode;
if (fileAccessMode == FA_READ)
{
pFile = CreateFileA(path.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
else
{
pFile = CreateFileA(path.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
this->stmLength = SetFilePointer(pFile, 0, NULL, FILE_END);
SetFilePointer(pFile, 0, NULL, FILE_BEGIN);
}
size_t Read(void* pBuffer, size_t countBytes)
{
DWORD numBytes = 0;
ReadFile(pFile,pBuffer,countBytes, &numBytes, NULL);
return numBytes;
}
size_t Write(const void* pBuffer, size_t countBytes)
{
DWORD numBytes = 0;
WriteFile(pFile,pBuffer,countBytes,&numBytes, NULL);
return numBytes;
}
void Seek(size_t position)
{
SetFilePointer(pFile, position, NULL, FILE_BEGIN);
}
size_t Tell()
{
return SetFilePointer(pFile, 0, NULL, FILE_CURRENT);
}
size_t Length()
{
int pos = Tell();
int length = SetFilePointer(pFile, 0, NULL, SEEK_END);
SetFilePointer(pFile, pos, NULL, SEEK_SET);
return length;
}
bool CanRead()
{
return true;
}
bool CanWrite()
{
return true;
}
};
}
#endif