You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.6 KiB
139 lines
4.6 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Utility helper functions for dealing with UGC files
|
||
|
//
|
||
|
//==========================================================================//
|
||
|
|
||
|
#ifndef UGC_UTILS_H
|
||
|
#define UGC_UTILS_H
|
||
|
|
||
|
#include "utlbuffer.h"
|
||
|
#include "filesystem.h"
|
||
|
#include "steam/steam_api.h"
|
||
|
|
||
|
#include "dbg.h"
|
||
|
|
||
|
// All UGC files are assumed to be on this path by default
|
||
|
#define UGC_PATHID "DEFAULT_WRITE_PATH"
|
||
|
|
||
|
// This will log the UGC file requests as they're serviced
|
||
|
// #define LOG_FILEREQUEST_PROGRESS
|
||
|
|
||
|
// Enable verbose debug spew to DevMsg
|
||
|
// #define UGC_DEBUG
|
||
|
|
||
|
#define UGCMsg(...) Msg("[UGC] " __VA_ARGS__)
|
||
|
#define UGCWarning(...) Warning("[UGC] " __VA_ARGS__)
|
||
|
|
||
|
#ifdef UGC_DEBUG
|
||
|
#define UGCDebug(...) DevMsg("[UGC Debug] " __VA_ARGS__)
|
||
|
#else // UGC_DEBUG
|
||
|
#define UGCDebug(...)
|
||
|
#endif // UGC_DEBUG
|
||
|
|
||
|
ISteamUGC *GetSteamUGC();
|
||
|
ISteamRemoteStorage *GetSteamRemoteStorage();
|
||
|
|
||
|
// Consistently set/get modified/access timestamps for UGC files.
|
||
|
bool UGC_SetFileTime( const char *pFileRelativePath, RTime32 uTimestamp );
|
||
|
|
||
|
// Simulates stalling of the file IO for testing
|
||
|
// #define FILEREQUEST_IO_STALL
|
||
|
#define FILEREQUEST_IO_STALL_DELAY 1.0f // Seconds
|
||
|
|
||
|
enum UGCFileRequestStatus_t
|
||
|
{
|
||
|
UGCFILEREQUEST_ERROR = -1, // An error occurred while processing the file operation
|
||
|
UGCFILEREQUEST_READY, // File request is ready to do work
|
||
|
UGCFILEREQUEST_DOWNLOADING, // Currently downloading a file
|
||
|
UGCFILEREQUEST_DOWNLOAD_WRITING, // Async write of the downloaded file to the disc
|
||
|
UGCFILEREQUEST_UPLOADING, // Currently uploading a file
|
||
|
UGCFILEREQUEST_FINISHED // Operation complete, no work waiting
|
||
|
};
|
||
|
|
||
|
#ifdef FILEREQUEST_IO_STALL
|
||
|
enum
|
||
|
{
|
||
|
FILEREQUEST_STALL_NONE,
|
||
|
FILEREQUEST_STALL_DOWNLOAD, // Download from UGC server
|
||
|
FILEREQUEST_STALL_WRITE, // Write to disc
|
||
|
};
|
||
|
#endif // FILEREQUEST_IO_STALL
|
||
|
|
||
|
|
||
|
// FIXME(johns): This is superseded by the newer CUGCSyncedFile. Once the
|
||
|
// remaining users of this are migrated it should be nuked.
|
||
|
class CUGCFileRequest
|
||
|
{
|
||
|
public:
|
||
|
CUGCFileRequest( void );
|
||
|
~CUGCFileRequest( void );
|
||
|
|
||
|
UGCFileRequestStatus_t StartDownload( UGCHandle_t hFileHandle, const char *lpszTargetDirectory = NULL, const char *lpszTargetFilename = NULL );
|
||
|
UGCFileRequestStatus_t StartUpload( CUtlBuffer &buffer, const char *lpszFilename );
|
||
|
UGCFileRequestStatus_t Update( void );
|
||
|
UGCFileRequestStatus_t GetStatus( void ) const { return m_UGCStatus; }
|
||
|
|
||
|
// Accessors
|
||
|
const char *GetFileName( void ) { return ( m_szTargetFilename[0] == '\0' ) ? m_szFileName : m_szTargetFilename; }
|
||
|
const char *GetLastError( void ) const { return m_szErrorText; }
|
||
|
UGCHandle_t GetCloudHandle( void ) const { return m_hCloudID; }
|
||
|
|
||
|
void GetLocalFileName( char *pDest, size_t strSize );
|
||
|
void GetLocalDirectory( char *pDest, size_t strSize );
|
||
|
|
||
|
private:
|
||
|
|
||
|
CCallResult<CUGCFileRequest, RemoteStorageDownloadUGCResult_t> m_callbackUGCDownload;
|
||
|
void Steam_OnUGCDownload( RemoteStorageDownloadUGCResult_t *pResult, bool bError );
|
||
|
|
||
|
CCallResult<CUGCFileRequest, RemoteStorageFileShareResult_t> m_callbackFileShare;
|
||
|
void Steam_OnFileShare( RemoteStorageFileShareResult_t *pResult, bool bError );
|
||
|
|
||
|
//
|
||
|
// Marks the file request as complete and frees its internal buffers
|
||
|
//
|
||
|
|
||
|
void MarkCompleteAndFree( void )
|
||
|
{
|
||
|
m_bufContents.Clear();
|
||
|
m_UGCStatus = UGCFILEREQUEST_FINISHED;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Sets the file request into an error state
|
||
|
//
|
||
|
|
||
|
UGCFileRequestStatus_t ThrowError( const char *lpszDesc )
|
||
|
{
|
||
|
V_strncpy( m_szErrorText, lpszDesc, ARRAYSIZE(m_szErrorText) );
|
||
|
Warning( "%s", m_szErrorText );
|
||
|
Assert(0);
|
||
|
m_UGCStatus = UGCFILEREQUEST_ERROR;
|
||
|
|
||
|
return m_UGCStatus;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
char m_szTargetDirectory[MAX_PATH]; // If specified, the directory the file will be placed in
|
||
|
char m_szTargetFilename[MAX_PATH]; // If specified, this name overrides the UGC filename
|
||
|
char m_szFileName[MAX_PATH]; // Filename of in the cloud structure
|
||
|
|
||
|
SteamAPICall_t m_hSteamAPICall; // Used to track Steam API calls which are non-blocking
|
||
|
CUtlBuffer m_bufContents; // Contents of the file once read from the cloud
|
||
|
UGCHandle_t m_hCloudID; // Cloud handle of this request
|
||
|
FSAsyncControl_t m_AsyncControl; // Handle for the async requests this class can initiate
|
||
|
|
||
|
UGCFileRequestStatus_t m_UGCStatus; // The current status of this request
|
||
|
char m_szErrorText[512]; // Holds information if an error occurred
|
||
|
|
||
|
#ifdef FILEREQUEST_IO_STALL
|
||
|
// Debug data
|
||
|
float m_flIOStallDuration; // Amount of time (in seconds) to stall all IO operations
|
||
|
int m_nIOStallType; // Type of stall (0 - none, 1 - download, 2 - write )
|
||
|
float m_flIOStallStart;
|
||
|
#endif // FILEREQUEST_IO_STALL
|
||
|
};
|
||
|
|
||
|
#endif //UGC_UTILS_H
|