You're breathtaking!
This commit is contained in:
110
Source/Engine/Visject/VisjectMeta.cpp
Normal file
110
Source/Engine/Visject/VisjectMeta.cpp
Normal file
@@ -0,0 +1,110 @@
|
||||
// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
||||
|
||||
#include "VisjectMeta.h"
|
||||
#include "Engine/Core/Types/DateTime.h"
|
||||
#include "Engine/Serialization/ReadStream.h"
|
||||
#include "Engine/Serialization/WriteStream.h"
|
||||
|
||||
VisjectMeta::VisjectMeta()
|
||||
{
|
||||
}
|
||||
|
||||
bool VisjectMeta::Load(ReadStream* stream, bool loadData)
|
||||
{
|
||||
Release();
|
||||
|
||||
int32 entries;
|
||||
stream->ReadInt32(&entries);
|
||||
Entries.Resize(entries);
|
||||
|
||||
for (int32 i = 0; i < entries; i++)
|
||||
{
|
||||
Entry& e = Entries[i];
|
||||
|
||||
stream->ReadInt32(&e.TypeID);
|
||||
DateTime creationTime;
|
||||
stream->Read(&creationTime);
|
||||
|
||||
uint32 dataSize;
|
||||
stream->ReadUint32(&dataSize);
|
||||
e.IsLoaded = loadData;
|
||||
if (loadData)
|
||||
{
|
||||
e.Data.Resize(dataSize, false);
|
||||
if (dataSize > 0)
|
||||
{
|
||||
stream->ReadBytes(e.Data.Get(), dataSize);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
e.Data.SetCapacity(0);
|
||||
stream->SetPosition(stream->GetPosition() + dataSize);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool VisjectMeta::Save(WriteStream* stream, bool saveData) const
|
||||
{
|
||||
stream->WriteInt32(Entries.Count());
|
||||
|
||||
for (int32 i = 0; i < Entries.Count(); i++)
|
||||
{
|
||||
const Entry& e = Entries[i];
|
||||
|
||||
stream->WriteInt32(e.TypeID);
|
||||
stream->WriteInt64(0); // unused creation time
|
||||
|
||||
const uint32 dataSize = e.IsLoaded && saveData ? e.Data.Count() : 0;
|
||||
stream->WriteUint32(dataSize);
|
||||
if (dataSize > 0)
|
||||
{
|
||||
stream->WriteBytes(e.Data.Get(), dataSize);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void VisjectMeta::Release()
|
||||
{
|
||||
Entries.Clear();
|
||||
}
|
||||
|
||||
const VisjectMeta::Entry* VisjectMeta::GetEntry(int32 typeID) const
|
||||
{
|
||||
const Entry* result = nullptr;
|
||||
for (const Entry& e : Entries)
|
||||
{
|
||||
if (e.TypeID == typeID)
|
||||
{
|
||||
result = &e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
VisjectMeta::Entry* VisjectMeta::GetEntry(int32 typeID)
|
||||
{
|
||||
Entry* result = nullptr;
|
||||
for (Entry& e : Entries)
|
||||
{
|
||||
if (e.TypeID == typeID)
|
||||
{
|
||||
result = &e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void VisjectMeta::AddEntry(int32 typeID, byte* data, int32 size)
|
||||
{
|
||||
auto& e = Entries.AddOne();
|
||||
e.IsLoaded = true;
|
||||
e.TypeID = typeID;
|
||||
e.Data.Set(data, size);
|
||||
}
|
||||
Reference in New Issue
Block a user