MCPcopy Create free account
hub / github.com/ddnet/ddnet / UnpackDelta

Method UnpackDelta

src/engine/shared/snapshot.cpp:513–629  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

511}
512
513int CSnapshotDelta::UnpackDelta(const CSnapshot *pFrom, CSnapshot *pTo, const void *pSrcData, int DataSize, bool Sixup)
514{
515 CData *pDelta = (CData *)pSrcData;
516 int *pData = (int *)pDelta->m_aData;
517 int *pEnd = (int *)(((char *)pSrcData + DataSize));
518
519 CSnapshotBuilder Builder;
520 Builder.Init();
521
522 // unpack deleted stuff
523 int *pDeleted = pData;
524 if(pDelta->m_NumDeletedItems < 0)
525 return -201;
526 pData += pDelta->m_NumDeletedItems;
527 if(pData > pEnd)
528 return -101;
529
530 // copy all non deleted stuff
531 for(int i = 0; i < pFrom->NumItems(); i++)
532 {
533 const CSnapshotItem *pFromItem = pFrom->GetItem(i);
534 const int ItemSize = pFrom->GetItemSize(i);
535 bool Keep = true;
536 for(int d = 0; d < pDelta->m_NumDeletedItems; d++)
537 {
538 if(pDeleted[d] == pFromItem->Key())
539 {
540 Keep = false;
541 break;
542 }
543 }
544
545 if(Keep)
546 {
547 void *pObj = Builder.NewItem(pFromItem->Type(), pFromItem->Id(), ItemSize);
548 if(!pObj)
549 return -301;
550
551 // keep it
552 mem_copy(pObj, pFromItem->Data(), ItemSize);
553 }
554 }
555
556 // unpack updated stuff
557 for(int i = 0; i < pDelta->m_NumUpdateItems; i++)
558 {
559 if(pData + 2 > pEnd)
560 return -102;
561
562 const int Type = *pData++;
563 if(Type < 0 || Type > CSnapshot::MAX_TYPE)
564 return -202;
565
566 const int Id = *pData++;
567 if(Id < 0 || Id > CSnapshot::MAX_ID)
568 return -203;
569
570 int ItemSize;

Callers 2

ProcessServerPacketMethod · 0.80
DoTickMethod · 0.80

Calls 15

mem_copyFunction · 0.85
UndiffItemFunction · 0.85
KeyMethod · 0.80
NewItemMethod · 0.80
FindItemIndexByKeyMethod · 0.80
GetItemDataMethod · 0.80
GetItemIndexMethod · 0.80
InitMethod · 0.45
NumItemsMethod · 0.45
GetItemMethod · 0.45
GetItemSizeMethod · 0.45
TypeMethod · 0.45

Tested by

no test coverage detected