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.
 
 
 
 
 
 

198 lines
5.9 KiB

//===== Copyright Valve Corporation, All rights reserved. ======//
//
// Helper class to manager clients making requests for published file information and polling the results at a later time
//
//==============================================================//
#ifndef UGC_FILE_INFO_MANAGER
#define UGC_FILE_INFO_MANAGER
#ifdef _WIN32
#pragma once
#endif
#include "ugc_utils.h"
#if !defined( NO_STEAM ) && !defined( _PS3 )
class IWorkshopFileInfoManagerCallbackInterface
{
public:
// File requests
virtual void OnFileRequestFinished( UGCHandle_t hFileHandle ) = 0;
virtual void OnFileRequestError( UGCHandle_t hFileHandle ) = 0;
};
//
// Holds information about published files on the Workshop
//
class CWorkshopFileInfoManager;
struct PublishedFileInfo_t
{
PublishedFileInfo_t( PublishedFileId_t nID = 0 ) :
m_nPublishedFileId( nID ),
m_hFile( k_UGCHandleInvalid ),
m_hPreviewFile( k_UGCHandleInvalid ),
m_ulSteamIDOwner( 0 ),
m_rtimeCreated( 0 ),
m_rtimeUpdated( 0 ),
m_eVisibility( k_ERemoteStoragePublishedFileVisibilityPublic ),
m_rtimeSubscribed( 0 ),
m_rtimeLastPlayed( 0 ),
m_rtimeCompleted( 0 ),
m_unUpVotes( 0 ),
m_unDownVotes( 0 ),
m_flVotingScore( 0.0f ),
m_bVotingDataValid( false ),
m_unNumReports( 0 )
{
memset( m_rgchTitle, 0, ARRAYSIZE( m_rgchTitle ) );
memset( m_rgchDescription, 0, ARRAYSIZE( m_rgchDescription ) );
memset( m_pchFileName, 0, ARRAYSIZE( m_pchFileName ) );
}
friend class CWorkshopFileInfoManager;
// Basic info
PublishedFileId_t m_nPublishedFileId;
char m_rgchTitle[k_cchPublishedDocumentTitleMax];
UGCHandle_t m_hFile;
UGCHandle_t m_hPreviewFile;
uint64 m_ulSteamIDOwner;
uint32 m_rtimeCreated;
uint32 m_rtimeUpdated;
ERemoteStoragePublishedFileVisibility m_eVisibility;
uint32 m_rtimeSubscribed;
uint32 m_rtimeLastPlayed;
uint32 m_rtimeCompleted;
char m_rgchDescription[k_cchPublishedDocumentDescriptionMax];
char m_pchFileName[k_cchFilenameMax];
char m_rgchTags[k_cchTagListMax];
bool m_bTagsTruncated;
CCopyableUtlVector<char *> m_vTags;
// Whether or not the voting data has been properly collected for this item
bool HasVoteData( void ) const { return m_bVotingDataValid; }
// Get the vote information for this item
// NOTE: Because this isn't native to the published file, it must be requested separately.
// This function protects from the case where the data is not valid when requested (returns false)
bool GetVoteData( float *pScore, uint32 *pUpVotes, uint32 *pDownVotes ) const
{
// We must have real data here to allow a query for it
if ( HasVoteData() == false )
return false;
if ( pScore != NULL )
{
*pScore = m_flVotingScore;
}
if ( pUpVotes != NULL )
{
*pUpVotes = m_unUpVotes;
}
if ( pDownVotes != NULL )
{
*pDownVotes = m_unDownVotes;
}
return true;
}
bool HasTag( const char *pszTag ) const
{
for ( int i = 0; i < m_vTags.Count(); ++i )
{
if ( !V_stricmp( m_vTags[i], pszTag ) )
{
return true;
}
}
return false;
}
private:
// Voting info
bool m_bVotingDataValid; // If this isn't true, then no request has been done to retrieve it
uint32 m_unUpVotes;
uint32 m_unDownVotes;
float m_flVotingScore;
uint32 m_unNumReports; // FIXME: This isn't exposed anywhere, currently
};
//
// Class which packages up info requests and how to deal with errors and completion
// FIXME: May be easier to switch some of these over to callback instead of this system
//
class CBasePublishedFileRequest
{
public:
CBasePublishedFileRequest( PublishedFileId_t targetID ) :
m_nTargetID( targetID )
{}
virtual void OnError( EResult nErrorCode ) { /* Do nothing */ }
virtual void OnLoaded( PublishedFileInfo_t &info ) { /* Do nothing */ }
PublishedFileId_t GetTargetID( void ) const { return m_nTargetID; }
private:
PublishedFileId_t m_nTargetID; // File ID to get information about
};
//
//
// Workshop file info manager
//
//
class CWorkshopFileInfoManager
{
public:
CWorkshopFileInfoManager( IWorkshopFileInfoManagerCallbackInterface *pCallbackInterface );
~CWorkshopFileInfoManager( void );
// Add a query for a published file's information
bool AddFileInfoQuery( CBasePublishedFileRequest *pRequest, bool bAllowUpdate = false );
bool AddFileVoteInfoRequest( const PublishedFileInfo_t *pInfo, bool bForceUpdate = false );
bool RemovePublishedFileInfo( PublishedFileId_t nID );
void Update( void );
const PublishedFileInfo_t *GetPublishedFileInfoByID( PublishedFileId_t nID ) const;
// Check if an info request hasn't been sent off yet
bool IsInfoRequestStillPending( PublishedFileId_t id ) const;
private:
void UpdatePublishedFileInfoQueries( void );
void UpdatePublishedFileVotingInfoQueries( void );
#if !defined( _GAMECONSOLE )
CCallResult<CWorkshopFileInfoManager, RemoteStorageGetPublishedFileDetailsResult_t> m_callbackGetPublishedFileDetails;
void Steam_OnGetPublishedFileDetails( RemoteStorageGetPublishedFileDetailsResult_t *pResult, bool bError );
CCallResult<CWorkshopFileInfoManager, RemoteStorageGetPublishedItemVoteDetailsResult_t> m_callbackGetPublishedItemVoteDetails;
void Steam_OnGetPublishedItemVoteDetails( RemoteStorageGetPublishedItemVoteDetailsResult_t *pResult, bool bError );
#endif // !_GAMECONSOLE
CUtlMap< PublishedFileId_t, PublishedFileInfo_t > m_mapPublishedFileInfoDepot; // Master list of all published file information we've queried for
CUtlQueue< CBasePublishedFileRequest * > m_vecPublishedFileInfoQueryList; // List of file IDs that need to be queried for information
CBasePublishedFileRequest *m_pActivePublishedFileRequest; // Currently active request query (used as a mutex)
CUtlQueue< PublishedFileId_t > m_vecVotingInfoRequests; // List of published file IDs we'd like voting information on
bool m_bActiveVotingRequest; // Whether or not there's a voting request already pending
IWorkshopFileInfoManagerCallbackInterface *m_pCallbackInterface; // User-supplied callback interface
};
#endif // !NO_STEAM
#endif // UGC_FILE_INFO_MANAGER