3636#include " Common/Snapshot.h"
3737#include " Utility/endian_compat.h"
3838
39+ #if DEEP_CRC_TO_MEMORY
40+ #include " GameLogic/GameLogic.h"
41+ #endif
42+
3943// -------------------------------------------------------------------------------------------------
4044// -------------------------------------------------------------------------------------------------
4145XferCRC::XferCRC ()
@@ -175,8 +179,14 @@ UnsignedInt XferCRC::getCRC()
175179XferDeepCRC::XferDeepCRC ()
176180{
177181
182+ #if DEEP_CRC_TO_MEMORY
183+ m_xferMode = XFER_CRC;
184+ m_buffer = nullptr ;
185+ m_bufferIndex = 0 ;
186+ #else
178187 m_xferMode = XFER_SAVE;
179188 m_fileFP = nullptr ;
189+ #endif
180190
181191}
182192
@@ -185,6 +195,7 @@ XferDeepCRC::XferDeepCRC()
185195XferDeepCRC::~XferDeepCRC ()
186196{
187197
198+ #if !DEEP_CRC_TO_MEMORY
188199 // warn the user if a file was left open
189200 if ( m_fileFP != nullptr )
190201 {
@@ -193,6 +204,7 @@ XferDeepCRC::~XferDeepCRC()
193204 close ();
194205
195206 }
207+ #endif
196208
197209}
198210
@@ -202,8 +214,13 @@ XferDeepCRC::~XferDeepCRC()
202214void XferDeepCRC::open ( AsciiString identifier )
203215{
204216
217+ #if DEEP_CRC_TO_MEMORY
218+ m_xferMode = XFER_CRC;
219+ #else
205220 m_xferMode = XFER_SAVE;
221+ #endif
206222
223+ #if !DEEP_CRC_TO_MEMORY
207224 // sanity, check to see if we're already open
208225 if ( m_fileFP != nullptr )
209226 {
@@ -213,10 +230,26 @@ void XferDeepCRC::open( AsciiString identifier )
213230 throw XFER_FILE_ALREADY_OPEN;
214231
215232 }
233+ #endif
216234
217235 // call base class
218236 Xfer::open ( identifier );
219237
238+ #if DEEP_CRC_TO_MEMORY
239+ m_buffer = &TheGameLogic->getCRCBuffer ();
240+
241+ AsciiString str;
242+ str.format (" [ START OF DEEP CRC FRAME %d ]" , TheGameLogic->getFrame ());
243+ const UnsignedInt length = str.getLength ();
244+
245+ while (m_bufferIndex + length >= m_buffer->size ())
246+ {
247+ m_buffer->resize (m_buffer->size () * 2 );
248+ }
249+
250+ memcpy (&(*m_buffer)[m_bufferIndex], str.str (), length);
251+ m_bufferIndex += length;
252+ #else
220253 // open the file
221254 m_fileFP = fopen ( identifier.str (), " w+b" );
222255 if ( m_fileFP == nullptr )
@@ -226,6 +259,7 @@ void XferDeepCRC::open( AsciiString identifier )
226259 throw XFER_FILE_NOT_FOUND;
227260
228261 }
262+ #endif
229263
230264 // initialize CRC to brand new one at zero
231265 m_crc = 0 ;
@@ -238,6 +272,21 @@ void XferDeepCRC::open( AsciiString identifier )
238272void XferDeepCRC::close ()
239273{
240274
275+ #if DEEP_CRC_TO_MEMORY
276+ AsciiString str;
277+ str.format (" [ END OF DEEP CRC FRAME %d ]" , TheGameLogic->getFrame ());
278+ const UnsignedInt length = str.getLength ();
279+
280+ while (m_bufferIndex + length >= m_buffer->size ())
281+ {
282+ m_buffer->resize (m_buffer->size () * 2 );
283+ }
284+
285+ memcpy (&(*m_buffer)[m_bufferIndex], str.str (), length);
286+ m_bufferIndex += length;
287+
288+ TheGameLogic->storeCRCBuffer (m_bufferIndex);
289+ #else
241290 // sanity, if we don't have an open file we can do nothing
242291 if ( m_fileFP == nullptr )
243292 {
@@ -246,10 +295,15 @@ void XferDeepCRC::close()
246295 throw XFER_FILE_NOT_OPEN;
247296
248297 }
298+ #endif
249299
300+ #if DEEP_CRC_TO_MEMORY
301+ m_buffer = nullptr ;
302+ #else
250303 // close the file
251304 fclose ( m_fileFP );
252305 m_fileFP = nullptr ;
306+ #endif
253307
254308 // erase the filename
255309 m_identifier.clear ();
@@ -267,6 +321,15 @@ void XferDeepCRC::xferImplementation( void *data, Int dataSize )
267321 return ;
268322 }
269323
324+ #if DEEP_CRC_TO_MEMORY
325+ while (m_bufferIndex + dataSize >= m_buffer->size ())
326+ {
327+ m_buffer->resize (m_buffer->size () * 2 );
328+ }
329+
330+ memcpy (&(*m_buffer)[m_bufferIndex], data, dataSize);
331+ m_bufferIndex += dataSize;
332+ #else
270333 // sanity
271334 DEBUG_ASSERTCRASH ( m_fileFP != nullptr , (" XferSave - file pointer for '%s' is null" ,
272335 m_identifier.str ()) );
@@ -279,6 +342,7 @@ void XferDeepCRC::xferImplementation( void *data, Int dataSize )
279342 throw XFER_WRITE_ERROR;
280343
281344 }
345+ #endif
282346
283347 XferCRC::xferImplementation ( data, dataSize );
284348
@@ -290,6 +354,11 @@ void XferDeepCRC::xferImplementation( void *data, Int dataSize )
290354void XferDeepCRC::xferMarkerLabel ( AsciiString asciiStringData )
291355{
292356
357+ #if DEEP_CRC_TO_MEMORY
358+ XferCRC::xferMarkerLabel (asciiStringData);
359+ return ;
360+ #endif
361+
293362}
294363
295364// ------------------------------------------------------------------------------------------------
@@ -298,6 +367,11 @@ void XferDeepCRC::xferMarkerLabel( AsciiString asciiStringData )
298367void XferDeepCRC::xferAsciiString ( AsciiString *asciiStringData )
299368{
300369
370+ #if DEEP_CRC_TO_MEMORY
371+ XferCRC::xferAsciiString (asciiStringData);
372+ return ;
373+ #endif
374+
301375 // sanity
302376 if ( asciiStringData->getLength () > 16385 )
303377 {
@@ -323,6 +397,11 @@ void XferDeepCRC::xferAsciiString( AsciiString *asciiStringData )
323397void XferDeepCRC::xferUnicodeString ( UnicodeString *unicodeStringData )
324398{
325399
400+ #if DEEP_CRC_TO_MEMORY
401+ XferCRC::xferUnicodeString (unicodeStringData);
402+ return ;
403+ #endif
404+
326405 // sanity
327406 if ( unicodeStringData->getLength () > 255 )
328407 {
@@ -341,3 +420,23 @@ void XferDeepCRC::xferUnicodeString( UnicodeString *unicodeStringData )
341420 xferUser ( (void *)unicodeStringData->str (), sizeof ( WideChar ) * len );
342421
343422}
423+
424+ #if DEEP_CRC_TO_MEMORY
425+ void XferDeepCRC::xferLogString (const AsciiString& str)
426+ {
427+ const UnsignedInt length = str.getLength ();
428+
429+ while (m_bufferIndex + length >= m_buffer->size ())
430+ {
431+ m_buffer->resize (m_buffer->size () * 2 );
432+ }
433+
434+ memcpy (&(*m_buffer)[m_bufferIndex], str.str (), length);
435+ m_bufferIndex += length;
436+ }
437+
438+ void XferDeepCRC::changeXferMode (XferMode xferMode)
439+ {
440+ m_xferMode = xferMode;
441+ }
442+ #endif
0 commit comments