private void WriteTo(Stream os)
{
MessageDigest foot = Constants.newMessageDigest();
var dos = new DigestOutputStream(os, foot);
// Write the header.
//
var tmp = new byte[128];
Array.Copy(SigDirc, 0, tmp, 0, SigDirc.Length);
NB.encodeInt32(tmp, 4, /* version */2);
NB.encodeInt32(tmp, 8, _entryCnt);
dos.Write(tmp, 0, 12);
// Write the individual file entries.
//
if (_lastModified == DateTime.MinValue)
{
// Write a new index, as no entries require smudging.
//
for (int i = 0; i < _entryCnt; i++)
{
_sortedEntries[i].write(dos);
}
}
else
{
var smudge_s = _lastModified.ToUnixTime();
var smudge_ns = _lastModified.Millisecond * 1000000; // [henon] <--- this could be done with much more precision in C# since DateTime has 100 nanosec ticks
for (int i = 0; i < _entryCnt; i++)
{
DirCacheEntry e = _sortedEntries[i];
if (e.mightBeRacilyClean(smudge_s, smudge_ns))
e.smudgeRacilyClean();
e.write(dos);
}
}
if (_cacheTree != null)
{
var bb = new TemporaryBuffer();
_cacheTree.write(tmp, bb);
bb.close();
NB.encodeInt32(tmp, 0, ExtTree);
NB.encodeInt32(tmp, 4, (int)bb.Length);
dos.Write(tmp, 0, 8);
bb.writeTo(dos, null);
}
var hash = foot.Digest();
os.Write(hash, 0, hash.Length);
os.Close();
}