Initial commit.
This commit is contained in:
171
code/win32/win_file_xbox.cpp
Normal file
171
code/win32/win_file_xbox.cpp
Normal file
@@ -0,0 +1,171 @@
|
||||
|
||||
/*
|
||||
* UNPUBLISHED -- Rights reserved under the copyright laws of the
|
||||
* United States. Use of a copyright notice is precautionary only and
|
||||
* does not imply publication or disclosure.
|
||||
*
|
||||
* THIS DOCUMENTATION CONTAINS CONFIDENTIAL AND PROPRIETARY INFORMATION
|
||||
* OF VICARIOUS VISIONS, INC. ANY DUPLICATION, MODIFICATION,
|
||||
* DISTRIBUTION, OR DISCLOSURE IS STRICTLY PROHIBITED WITHOUT THE PRIOR
|
||||
* EXPRESS WRITTEN PERMISSION OF VICARIOUS VISIONS, INC.
|
||||
*/
|
||||
|
||||
#include "../game/q_shared.h"
|
||||
#include "win_file.h"
|
||||
#include "../qcommon/qcommon.h"
|
||||
|
||||
#ifdef _XBOX
|
||||
#include <Xtl.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
|
||||
struct FileTable
|
||||
{
|
||||
bool m_bUsed;
|
||||
bool m_bErrorsFatal;
|
||||
HANDLE m_Handle;
|
||||
};
|
||||
|
||||
FileTable* s_FileTable = NULL;
|
||||
const int WF_MAX_OPEN_FILES = 8;
|
||||
|
||||
void WF_Init(void)
|
||||
{
|
||||
assert(!s_FileTable);
|
||||
|
||||
s_FileTable = new FileTable[WF_MAX_OPEN_FILES];
|
||||
|
||||
for (wfhandle_t i = 0; i < WF_MAX_OPEN_FILES; ++i)
|
||||
{
|
||||
s_FileTable[i].m_bUsed = false;
|
||||
}
|
||||
}
|
||||
|
||||
void WF_Shutdown(void)
|
||||
{
|
||||
assert(s_FileTable);
|
||||
|
||||
for (wfhandle_t i = 0; i < WF_MAX_OPEN_FILES; ++i)
|
||||
{
|
||||
if (s_FileTable[i].m_bUsed)
|
||||
{
|
||||
WF_Close(i);
|
||||
}
|
||||
}
|
||||
|
||||
delete [] s_FileTable;
|
||||
s_FileTable = NULL;
|
||||
}
|
||||
|
||||
static wfhandle_t WF_GetFreeHandle(void)
|
||||
{
|
||||
for (int i = 0; i < WF_MAX_OPEN_FILES; ++i)
|
||||
{
|
||||
if (!s_FileTable[i].m_bUsed)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int WF_Open(const char* name, bool read, bool aligned)
|
||||
{
|
||||
wfhandle_t handle = WF_GetFreeHandle();
|
||||
if (handle == -1) return -1;
|
||||
|
||||
s_FileTable[handle].m_Handle =
|
||||
CreateFile(name, read ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ, 0,
|
||||
read ? OPEN_EXISTING : OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL |(aligned ? FILE_FLAG_NO_BUFFERING : 0) , 0);
|
||||
|
||||
if (s_FileTable[handle].m_Handle != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
s_FileTable[handle].m_bUsed = true;
|
||||
|
||||
// errors are fatal on game partition
|
||||
s_FileTable[handle].m_bErrorsFatal = (name[0] == 'D' || name[0] == 'd');
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void WF_Close(wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
CloseHandle(s_FileTable[handle].m_Handle);
|
||||
s_FileTable[handle].m_bUsed = false;
|
||||
}
|
||||
|
||||
int WF_Read(void* buffer, int len, wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
DWORD bytes;
|
||||
if (!ReadFile(s_FileTable[handle].m_Handle, buffer, len, &bytes, 0) &&
|
||||
s_FileTable[handle].m_bErrorsFatal)
|
||||
{
|
||||
#if defined(FINAL_BUILD)
|
||||
extern void ERR_DiscFail(bool);
|
||||
ERR_DiscFail(false);
|
||||
#else
|
||||
assert(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
int WF_Write(const void* buffer, int len, wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
DWORD bytes;
|
||||
WriteFile(s_FileTable[handle].m_Handle, buffer, len, &bytes, 0);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
int WF_Seek(int offset, int origin, wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
switch (origin)
|
||||
{
|
||||
case SEEK_CUR: origin = FILE_CURRENT; break;
|
||||
case SEEK_END: origin = FILE_END; break;
|
||||
case SEEK_SET: origin = FILE_BEGIN; break;
|
||||
default: assert(false);
|
||||
}
|
||||
|
||||
return SetFilePointer(s_FileTable[handle].m_Handle, offset, 0, origin) < 0;
|
||||
}
|
||||
|
||||
int WF_Tell(wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
return SetFilePointer(s_FileTable[handle].m_Handle, 0, 0, FILE_CURRENT);
|
||||
}
|
||||
|
||||
int WF_Resize(int size, wfhandle_t handle)
|
||||
{
|
||||
assert(handle >= 0 && handle < WF_MAX_OPEN_FILES &&
|
||||
s_FileTable[handle].m_bUsed);
|
||||
|
||||
SetFilePointer(s_FileTable[handle].m_Handle, size, NULL, FILE_BEGIN);
|
||||
return SetEndOfFile(s_FileTable[handle].m_Handle);
|
||||
}
|
||||
Reference in New Issue
Block a user