Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

150 lines
5.6 KiB

//========= Copyright © Valve Corporation, All rights reserved. ============//
//
// Utility helper functions for dealing with UGC files
//
//==========================================================================//
#ifndef UGC_UTILS_H
#define UGC_UTILS_H
#ifdef _WIN32
#pragma once
#endif
#include "steam/isteamremotestorage.h"
// Version of V_ComposeFilename which can account for NULL path or filename
void V_SafeComposeFilename( const char *pPathIn, const char *pFilenameIn, char *pDest, size_t nDestSize );
// Unzip a file. If output dir is omitted, unzips to zip file's directory.
// Use paths relative to GetCurrentDirectory, or absolute paths.
bool UnzipFile( const char* szPathToZipFile, const char* szOutputDir = NULL );
bool UGCUtil_IsOfficialMap( PublishedFileId_t id );
#if !defined( NO_STEAM ) && !defined ( _PS3 )
#include "steam/steam_api.h"
#include "filesystem.h"
DECLARE_LOGGING_CHANNEL( LOG_WORKSHOP );
// This will log the UGC file requests as they're serviced
#define LOG_FILEREQUEST_PROGRESS
// Simulates stalling of the file IO for testing
//#define FILEREQUEST_IO_STALL
class CUGCFileRequestManager;
extern ISteamRemoteStorage *GetISteamRemoteStorage();
PublishedFileId_t GetMapIDFromMapPath( const char *pMapPath ); // get the map workshop ID by passing the full map path
bool UGCUtil_TimestampFile( const char *pFileRelativePath, uint32 uTimestamp );
void UGCUtil_Init();
void UGCUtil_Shutdown();
enum UGCFileRequestStatus_t
{
UGCFILEREQUEST_INVALID = -2, // This was an invalid request for some reason
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_UNZIPPING, // Threaded unzipping
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
class CUGCUnzipJob;
class CUGCFileRequest
{
public:
CUGCFileRequest( void );
~CUGCFileRequest( void );
UGCFileRequestStatus_t StartDownload( UGCHandle_t hFileHandle, const char *lpszTargetDirectory = NULL, const char *lpszTargetFilename = NULL, uint32 timeUpdated = 0, bool bForceUpdate = false );
UGCFileRequestStatus_t StartUpload( CUtlBuffer &buffer, const char *lpszFilename );
UGCFileRequestStatus_t Update( void );
UGCFileRequestStatus_t GetStatus( void ) const { return m_UGCStatus; }
// Accessors
const char *GetLastError( void ) const { return m_szErrorText; }
UGCHandle_t GetCloudHandle( void ) const { return m_hCloudID; }
void GetFullPath( char *pDest, size_t nSize ) const; // Filename on disk (including relative path)
const char *GetFilename( void ) const; // Name on disk if not the same as in the cloud
const char *GetDirectory( void ) const; // File directory on disk
float GetDownloadProgress( void ) const { return m_flDownloadProgress; }
void GetLocalFileName( char *pDest, size_t strSize );
void GetLocalDirectory( char *pDest, size_t strSize );
private:
void MarkCompleteAndFree( bool bUpdated = true );
#ifdef CLIENT_DLL
void CreateSmallThumbNail( bool bForce );
bool ResizeRGBAImage( const unsigned char *pData, unsigned int nDataSize, unsigned int nWidth, unsigned int nHeight,
unsigned char **pDataOut, unsigned int nNewWidth, unsigned int nNewHeight );
#endif
bool FileInSync( const char *lpszTargetDirectory, const char *lpszTargetFilename, uint32 timeUpdated );
void UpdateUnzip();
UGCFileRequestStatus_t ThrowError( const char *lpszFormat, ... );
void Steam_OnUGCDownload( RemoteStorageDownloadUGCResult_t *pResult, bool bError );
CCallResult<CUGCFileRequest, RemoteStorageDownloadUGCResult_t> m_callbackUGCDownload;
void Steam_OnFileShare( RemoteStorageFileShareResult_t *pResult, bool bError );
CCallResult<CUGCFileRequest, RemoteStorageFileShareResult_t> m_callbackFileShare;
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
char m_szErrorText[512]; // Holds information if an error occurred
UGCFileRequestStatus_t m_UGCStatus; // The current status of this request
uint32 m_tFileUpdateTime; // The update timestamp of the workshop file, 0 if not available
// Timing information for logging purposes
float m_flIOStartTime; // Time when the current request was initiated
float m_flDownloadProgress; // Progress (only valid for downloads)
friend class CUGCFileRequestManager;
CUGCUnzipJob* m_pUnzipJob; // Pointer to threaded unzip job.
#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 //!NO_STEAM
#endif //UGC_UTILS_H