When writing the ReferenceMaker::Load()
and ReferenceMaker::Save()
methods of a controller it is important that the before you read or write any custom data (i.e. chunks) that you call the Control::Load()
and Control::Save()
functions.
The following code demonstrates how this works:
#define LOCK_CHUNK 0x2535 //the lock value
IOResult IndePosition::Save(ISave *isave)
{
Control::Save(isave);
ULONG nb;
int on = (mLocked==true) ? 1 :0;
isave->BeginChunk(LOCK_CHUNK);
isave->Write(&on, sizeof(on), &nb);
isave->EndChunk();
return IO_OK;
}
IOResult IndePosition::Load(ILoad *iload)
{
ULONG nb;
IOResult res;
res = Control::Load(iload);
if (res!=IO_OK) return res;
while (IO_OK==(res=iload->OpenChunk()))
{
ULONG curID = iload->CurChunkID();
if (curID==LOCK_CHUNK)
{
int on;
res=iload->Read(&on, sizeof(on), &nb);
mLocked = on ? true : false;
}
iload->CloseChunk();
if (res!=IO_OK) return res;
}
return IO_OK;
}
This is necessary so that the Control
base clas is given a chance to serialize the before and after out of range type (ORT) values.