mirror of
https://github.com/thunderbrewhq/bc.git
synced 2025-12-12 01:52:30 +00:00
67 lines
No EOL
2 KiB
C++
67 lines
No EOL
2 KiB
C++
#include "bc/os/file/CreateFile.hpp"
|
|
#include "bc/os/file/SetFileAttributes.hpp"
|
|
#include "bc/Debug.hpp"
|
|
#include "bc/file/Open.hpp"
|
|
#include "bc/os/file/Types.hpp"
|
|
|
|
int32_t OsCreateFileMode(uint32_t desiredAccess, uint32_t shareMode, uint32_t createDisposition) {
|
|
using Mode = Blizzard::File::Mode;
|
|
|
|
int32_t mode;
|
|
|
|
if (desiredAccess & OS_GENERIC_READ) {
|
|
mode |= Mode::read;
|
|
}
|
|
if (desiredAccess & OS_GENERIC_WRITE) {
|
|
mode |= Mode::write;
|
|
}
|
|
|
|
if (shareMode & OS_FILE_SHARE_READ) {
|
|
mode |= Mode::shareread;
|
|
}
|
|
if (shareMode & OS_FILE_SHARE_WRITE) {
|
|
mode |= Mode::sharewrite;
|
|
}
|
|
|
|
switch (createDisposition) {
|
|
case OS_CREATE_NEW:
|
|
// mode |= 0xC00;
|
|
mode |= (Mode::create|Mode::mustnotexist);
|
|
break;
|
|
case OS_CREATE_ALWAYS:
|
|
// mode |= 0x400;
|
|
mode |= Mode::create;
|
|
break;
|
|
case OS_OPEN_EXISTING:
|
|
// mode |= 0x1000
|
|
mode |= Mode::mustexist;
|
|
break;
|
|
case OS_OPEN_ALWAYS:
|
|
// mode |= 0x200;
|
|
mode |= Mode::append;
|
|
break;
|
|
case OS_TRUNCATE_EXISTING:
|
|
// mode |= 0x100;
|
|
mode |= Mode::truncate;
|
|
break;
|
|
}
|
|
|
|
return mode;
|
|
}
|
|
|
|
HOSFILE OsCreateFile(const char* fileName, uint32_t desiredAccess, uint32_t shareMode, uint32_t createDisposition, uint32_t flagsAndAttributes, uint32_t extendedFileType) {
|
|
BLIZZARD_VALIDATE(fileName, "invalid filename", HOSFILE_INVALID);
|
|
BLIZZARD_VALIDATE(desiredAccess != 0, "invalid desired access", HOSFILE_INVALID);
|
|
BLIZZARD_VALIDATE(createDisposition <= OS_TRUNCATE_EXISTING, "invalid create disposition", HOSFILE_INVALID);
|
|
|
|
Blizzard::File::StreamRecord* file;
|
|
if (!Blizzard::File::Open(fileName, OsCreateFileMode(desiredAccess, shareMode, createDisposition), file)) {
|
|
return HOSFILE_INVALID;
|
|
}
|
|
|
|
if ((flagsAndAttributes & OS_FILE_ATTRIBUTE_NORMAL) == 0) {
|
|
OsSetFileAttributes(fileName, flagsAndAttributes);
|
|
}
|
|
|
|
return reinterpret_cast<HOSFILE>(file);
|
|
} |