Team Fortress 2 Source Code as on 22/4/2020
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.

196 lines
5.4 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. //=============================================================================//
  6. #include "quakedef.h"
  7. #include "logofile_shared.h"
  8. #include "filesystem_engine.h"
  9. #include "vtf/vtf.h"
  10. // ------------------------------------------------------------------------------------ //
  11. // CLogoFilename implementation.
  12. // ------------------------------------------------------------------------------------ //
  13. CLogoFilename::CLogoFilename( CRC32_t value, bool bInDownloadsDirectory )
  14. {
  15. char hex[16];
  16. Q_binarytohex( (byte *)&value, sizeof( value ), hex, sizeof( hex ) );
  17. if ( bInDownloadsDirectory )
  18. {
  19. Q_snprintf( m_Filename, sizeof( m_Filename ), "materials/decals/downloads/%s.vtf", hex );
  20. }
  21. else
  22. {
  23. Q_strncpy( m_Filename, hex, sizeof( m_Filename ) );
  24. }
  25. }
  26. // ------------------------------------------------------------------------------------ //
  27. // SVC_LogoFileData.
  28. // ------------------------------------------------------------------------------------ //
  29. bool SVC_LogoFileData::ReadFromBuffer( bf_read &buffer )
  30. {
  31. m_Data.SetSize( buffer.ReadShort() );
  32. buffer.ReadBytes( m_Data.Base(), m_Data.Count() );
  33. return !buffer.IsOverflowed();
  34. }
  35. bool SVC_LogoFileData::WriteToBuffer( bf_write &buffer )
  36. {
  37. buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
  38. buffer.WriteShort( m_Data.Count() );
  39. buffer.WriteBytes( m_Data.Base(), m_Data.Count() );
  40. return !buffer.IsOverflowed();
  41. }
  42. const char* SVC_LogoFileData::ToString() const
  43. {
  44. return "SVC_LogoFileData";
  45. }
  46. // ------------------------------------------------------------------------------------ //
  47. // CLC_LogoFileData.
  48. // ------------------------------------------------------------------------------------ //
  49. bool CLC_LogoFileData::ReadFromBuffer( bf_read &buffer )
  50. {
  51. m_Data.SetSize( buffer.ReadShort() );
  52. buffer.ReadBytes( m_Data.Base(), m_Data.Count() );
  53. return !buffer.IsOverflowed();
  54. }
  55. bool CLC_LogoFileData::WriteToBuffer( bf_write &buffer )
  56. {
  57. buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
  58. buffer.WriteShort( m_Data.Count() );
  59. buffer.WriteBytes( m_Data.Base(), m_Data.Count() );
  60. return !buffer.IsOverflowed();
  61. }
  62. const char* CLC_LogoFileData::ToString() const
  63. {
  64. return "CLC_LogoFileData";
  65. }
  66. // ------------------------------------------------------------------------------------ //
  67. // SVC_LogoFileCRC.
  68. // ------------------------------------------------------------------------------------ //
  69. bool SVC_LogoFileCRC::ReadFromBuffer( bf_read &buffer )
  70. {
  71. m_nLogoFileCRC = buffer.ReadLong();
  72. return !buffer.IsOverflowed();
  73. }
  74. bool SVC_LogoFileCRC::WriteToBuffer( bf_write &buffer )
  75. {
  76. buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
  77. buffer.WriteLong( m_nLogoFileCRC );
  78. return !buffer.IsOverflowed();
  79. }
  80. const char* SVC_LogoFileCRC::ToString() const
  81. {
  82. return "LogoFileCRC";
  83. }
  84. // ------------------------------------------------------------------------------------ //
  85. // CLC_LogoFileRequest.
  86. // ------------------------------------------------------------------------------------ //
  87. bool CLC_LogoFileRequest::ReadFromBuffer( bf_read &buffer )
  88. {
  89. m_nLogoFileCRC = buffer.ReadLong();
  90. return !buffer.IsOverflowed();
  91. }
  92. bool CLC_LogoFileRequest::WriteToBuffer( bf_write &buffer )
  93. {
  94. buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
  95. buffer.WriteLong( m_nLogoFileCRC );
  96. return !buffer.IsOverflowed();
  97. }
  98. const char* CLC_LogoFileRequest::ToString() const
  99. {
  100. return "LogoFileRequest";
  101. }
  102. // ------------------------------------------------------------------------------------ //
  103. // CLC_LogoFileRequest.
  104. // ------------------------------------------------------------------------------------ //
  105. bool SVC_LogoFileRequest::ReadFromBuffer( bf_read &buffer )
  106. {
  107. m_nLogoFileCRC = buffer.ReadLong();
  108. return !buffer.IsOverflowed();
  109. }
  110. bool SVC_LogoFileRequest::WriteToBuffer( bf_write &buffer )
  111. {
  112. buffer.WriteUBitLong( GetType(), NETMSG_TYPE_BITS );
  113. buffer.WriteLong( m_nLogoFileCRC );
  114. return !buffer.IsOverflowed();
  115. }
  116. const char* SVC_LogoFileRequest::ToString() const
  117. {
  118. return "LogoFileRequest";
  119. }
  120. // ------------------------------------------------------------------------------------ //
  121. // Other functions.
  122. // ------------------------------------------------------------------------------------ //
  123. bool LogoFile_IsValidVTFFile( const void *pData, int len )
  124. {
  125. CUtlBuffer buf( pData, len, CUtlBuffer::READ_ONLY );
  126. IVTFTexture *pTex = CreateVTFTexture();
  127. bool bUnserialized = pTex->Unserialize( buf );
  128. DestroyVTFTexture( pTex );
  129. return bUnserialized;
  130. }
  131. bool LogoFile_ReadFile( CRC32_t crcValue, CUtlVector<char> &fileData )
  132. {
  133. CLogoFilename filename( crcValue, true );
  134. FileHandle_t hFile = g_pFileSystem->Open( filename.m_Filename, "rb" );
  135. if ( hFile == FILESYSTEM_INVALID_HANDLE )
  136. {
  137. Warning( "LogoFile_ReadFile: can't open file '%s'.\n", filename.m_Filename );
  138. return false;
  139. }
  140. fileData.SetSize( g_pFileSystem->Size( hFile ) );
  141. int amtRead = g_pFileSystem->Read( fileData.Base(), fileData.Count(), hFile );
  142. g_pFileSystem->Close( hFile );
  143. if ( fileData.Count() == 0 || amtRead != fileData.Count() )
  144. {
  145. Warning( "LogoFile_ReadFile: error reading file '%s'.\n", filename.m_Filename );
  146. return false;
  147. }
  148. // Validate it one last time.
  149. if ( !LogoFile_IsValidVTFFile( fileData.Base(), fileData.Count() ) )
  150. {
  151. g_pFileSystem->RemoveFile( filename.m_Filename );
  152. Warning( "LogoFile_ReadFile: !IsValidVTFFile for '%s'.\n", filename.m_Filename );
  153. return false;
  154. }
  155. return true;
  156. }