BitMiracle.LibTiff.Classic.Tiff.linkDirectory C# (CSharp) Method

linkDirectory() private method

Link the current directory into the directory chain for the file.
private linkDirectory ( ) : bool
return bool
        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;
        }
Tiff