private bool linkDirectory()
{
const string module = "linkDirectory";
m_diroff = (uint)((seekFile(0, SeekOrigin.End) + 1) & ~1);
uint diroff = m_diroff;
if ((m_flags & TiffFlags.SWAB) == TiffFlags.SWAB)
SwabUInt(ref diroff);
// Handle SubIFDs
if ((m_flags & TiffFlags.INSUBIFD) == TiffFlags.INSUBIFD)
{
seekFile(m_subifdoff, SeekOrigin.Begin);
if (!writeIntOK((int)diroff))
{
ErrorExt(this, m_clientdata, module,
"{0}: Error writing SubIFD directory link", m_name);
return false;
}
// Advance to the next SubIFD or, if this is the last one
// configured, revert back to the normal directory linkage.
--m_nsubifd;
if (m_nsubifd != 0)
m_subifdoff += sizeof(int);
else
m_flags &= ~TiffFlags.INSUBIFD;
return true;
}
if (m_header.tiff_diroff == 0)
{
// First directory, overwrite offset in header.
m_header.tiff_diroff = m_diroff;
seekFile(TiffHeader.TIFF_MAGIC_SIZE + TiffHeader.TIFF_VERSION_SIZE, SeekOrigin.Begin);
if (!writeIntOK((int)diroff))
{
ErrorExt(this, m_clientdata, m_name, "Error writing TIFF header");
return false;
}
return true;
}
// Not the first directory, search to the last and append.
uint nextdir = m_header.tiff_diroff;
do
{
short dircount;
if (!seekOK(nextdir) || !readShortOK(out dircount))
{
ErrorExt(this, m_clientdata, module, "Error fetching directory count");
return false;
}
if ((m_flags & TiffFlags.SWAB) == TiffFlags.SWAB)
SwabShort(ref dircount);
seekFile(dircount * TiffDirEntry.SizeInBytes, SeekOrigin.Current);
if (!readUIntOK(out nextdir))
{
ErrorExt(this, m_clientdata, module, "Error fetching directory link");
return false;
}
if ((m_flags & TiffFlags.SWAB) == TiffFlags.SWAB)
SwabUInt(ref nextdir);
}
while (nextdir != 0);
// get current offset
long off = seekFile(0, SeekOrigin.Current);
seekFile(off - sizeof(int), SeekOrigin.Begin);
if (!writeIntOK((int)diroff))
{
ErrorExt(this, m_clientdata, module, "Error writing directory link");
return false;
}
return true;
}