MCPcopy Create free account
hub / github.com/Panzerschrek/Chasm-Reverse / LoadData

Function LoadData

PanzerChasm/save_load.cpp:90–153  ·  view source on GitHub ↗

Returns true, if all ok

Source from the content-addressed store, hash-verified

88
89// Returns true, if all ok
90bool LoadData(
91 const char* file_name,
92 SaveLoadBuffer& out_data )
93{
94 FILE* const f= std::fopen( file_name, "rb" );
95 if( f == nullptr )
96 {
97 Log::Warning( "Can not read save \"", file_name, "\"." );
98 return false;
99 }
100
101 std::fseek( f, 0, SEEK_END );
102 const unsigned int file_size= std::ftell( f );
103 std::fseek( f, 0, SEEK_SET );
104
105 if( file_size < sizeof(SaveHeader) + sizeof(SaveComment) )
106 {
107 Log::Warning( "Save file is broken - it is too small." );
108 std::fclose(f);
109 return false;
110 }
111
112 SaveHeader header;
113 FileRead( f, &header, sizeof(SaveHeader) );
114
115 if( std::memcmp( header.id, header.c_expected_id, sizeof(header.id) ) != 0 )
116 {
117 Log::Warning( "Save file is not a PanzerChasm save." );
118 std::fclose(f);
119 return false;
120 }
121 if( header.version != SaveHeader::c_expected_version )
122 {
123 Log::Warning( "Save file has different version." );
124 std::fclose(f);
125 return false;
126 }
127
128 const unsigned int content_size= file_size - ( sizeof(SaveHeader) + sizeof(SaveComment) );
129 if( header.content_size != content_size )
130 {
131 Log::Warning( "Save file has content size, different from actual file size." );
132 std::fclose(f);
133 return false;
134 }
135
136 SaveComment save_comment;
137 FileRead( f, save_comment.data(), sizeof(SaveComment) );
138
139 out_data.resize( content_size );
140 FileRead( f, out_data.data(), out_data.size() );
141
142 if( header.content_hash != SaveHeader::CalculateHash( out_data.data(), out_data.size() ) )
143 {
144 out_data.clear();
145
146 Log::Warning( "Save file is broken - saved content hash is different from actual content hash." );
147 std::fclose(f);

Callers 1

DoLoadMethod · 0.85

Calls 1

FileReadFunction · 0.85

Tested by

no test coverage detected