mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
130 lines
4.0 KiB
C++
130 lines
4.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef VMPI_FILESYSTEM_INTERNAL_H
|
|
#define VMPI_FILESYSTEM_INTERNAL_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
#include "vmpi_filesystem.h"
|
|
#include "filesystem.h"
|
|
#include "messbuf.h"
|
|
#include "iphelpers.h"
|
|
#include "vmpi.h"
|
|
#include "utlvector.h"
|
|
#include "utllinkedlist.h"
|
|
#include "filesystem_passthru.h"
|
|
|
|
|
|
// Sub packet IDs specific to the VMPI file system.
|
|
#define VMPI_FSPACKETID_FILE_REQUEST 1 // Sent by the worker to request a file.
|
|
#define VMPI_FSPACKETID_FILE_RESPONSE 2 // Master's response to a file request.
|
|
#define VMPI_FSPACKETID_CHUNK_RECEIVED 3 // Sent by workers to tell the master they received a chunk.
|
|
#define VMPI_FSPACKETID_FILE_RECEIVED 4 // Sent by workers to tell the master they received the whole file.
|
|
#define VMPI_FSPACKETID_MULTICAST_ADDR 5
|
|
#define VMPI_FSPACKETID_FILE_CHUNK 6 // Used to send file data when using TCP.
|
|
|
|
|
|
// In TCP mode, we send larger chunks in a sliding window.
|
|
#define TCP_CHUNK_QUEUE_LEN 16
|
|
|
|
#define TCP_CHUNK_PAYLOAD_SIZE (16*1024)
|
|
#define MULTICAST_CHUNK_PAYLOAD_SIZE (1024*1)
|
|
#define MAX_CHUNK_PAYLOAD_SIZE MAX( TCP_CHUNK_PAYLOAD_SIZE, MULTICAST_CHUNK_PAYLOAD_SIZE )
|
|
|
|
|
|
class CMulticastFileInfo
|
|
{
|
|
public:
|
|
unsigned long m_CompressedSize;
|
|
unsigned long m_UncompressedSize;
|
|
unsigned short m_FileID;
|
|
unsigned short m_nChunks;
|
|
};
|
|
|
|
|
|
class CBaseVMPIFileSystem : public CFileSystemPassThru
|
|
{
|
|
public:
|
|
virtual ~CBaseVMPIFileSystem();
|
|
virtual void Release();
|
|
|
|
virtual void CreateVirtualFile( const char *pFilename, const void *pData, int fileLength ) = 0;
|
|
virtual bool HandleFileSystemPacket( MessageBuffer *pBuf, int iSource, int iPacketID ) = 0;
|
|
|
|
virtual void Close( FileHandle_t file );
|
|
virtual int Read( void* pOutput, int size, FileHandle_t file );
|
|
virtual int Write( void const* pInput, int size, FileHandle_t file );
|
|
virtual void Seek( FileHandle_t file, int pos, FileSystemSeek_t seekType );
|
|
virtual unsigned int Tell( FileHandle_t file );
|
|
virtual unsigned int Size( FileHandle_t file );
|
|
virtual unsigned int Size( const char *pFilename, const char *pathID );
|
|
virtual bool FileExists( const char *pFileName, const char *pPathID );
|
|
virtual void Flush( FileHandle_t file );
|
|
virtual bool Precache( const char* pFileName, const char *pPathID );
|
|
virtual bool ReadFile( const char *pFileName, const char *pPath, CUtlBuffer &buf, int nMaxBytes = 0, int nStartingByte = 0, FSAllocFunc_t pfnAlloc = 0 );
|
|
virtual bool WriteFile( const char *pFileName, const char *pPath, CUtlBuffer &buf );
|
|
|
|
// All the IFileSystem-specific ones pass the calls through.
|
|
// The worker opens its own filesystem_stdio fthrough.
|
|
|
|
protected:
|
|
CIPAddr m_MulticastIP;
|
|
};
|
|
|
|
|
|
class IVMPIFile
|
|
{
|
|
public:
|
|
virtual void Close() = 0;
|
|
virtual void Seek( int pos, FileSystemSeek_t seekType ) = 0;
|
|
virtual unsigned int Tell() = 0;
|
|
virtual unsigned int Size() = 0;
|
|
virtual void Flush() = 0;
|
|
virtual int Read( void* pOutput, int size ) = 0;
|
|
virtual int Write( void const* pInput, int size ) = 0;
|
|
};
|
|
|
|
|
|
// Both the workers and masters use this to hand out the file data.
|
|
class CVMPIFile_Memory : public IVMPIFile
|
|
{
|
|
public:
|
|
void Init( const char *pData, long len, char chMode = 'b' );
|
|
virtual void Close();
|
|
virtual void Seek( int pos, FileSystemSeek_t seekType );
|
|
virtual unsigned int Tell();
|
|
virtual unsigned int Size();
|
|
virtual void Flush();
|
|
virtual int Read( void* pOutput, int size ) ;
|
|
virtual int Write( void const* pInput, int size );
|
|
|
|
private:
|
|
const char *m_pData;
|
|
long m_DataLen;
|
|
int m_iCurPos;
|
|
char m_chMode; // 'b' or 't'
|
|
};
|
|
|
|
|
|
// We use different payload sizes if we're using TCP mode vs. multicast/broadcast mode.
|
|
inline int VMPI_GetChunkPayloadSize()
|
|
{
|
|
if ( VMPI_GetFileSystemMode() == VMPI_FILESYSTEM_TCP )
|
|
return TCP_CHUNK_PAYLOAD_SIZE;
|
|
else
|
|
return MULTICAST_CHUNK_PAYLOAD_SIZE;
|
|
}
|
|
|
|
|
|
extern bool g_bDisableFileAccess;
|
|
extern CBaseVMPIFileSystem *g_pBaseVMPIFileSystem;
|
|
|
|
|
|
#endif // VMPI_FILESYSTEM_INTERNAL_H
|