diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/workshop/ugc_utils.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/workshop/ugc_utils.h')
| -rw-r--r-- | game/shared/workshop/ugc_utils.h | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/game/shared/workshop/ugc_utils.h b/game/shared/workshop/ugc_utils.h new file mode 100644 index 0000000..1e24bb3 --- /dev/null +++ b/game/shared/workshop/ugc_utils.h @@ -0,0 +1,138 @@ +//========= 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 |