public long StoreNewChunk(byte[] fromArray, int startingAt, int length)
{
// get the first buffer as result value
long currentBufferNumber = this.AllocateBuffer();
//System.Diagnostics.Debug.WriteLine(" allocating chunk starting at "+currentBufferNumber);
long result = currentBufferNumber;
if (length < 0 || startingAt < 0)
{
throw new LinkedFileException("cannot store negative length chunk (" + startingAt + "," + length + ")");
}
int endingAt = startingAt + length;
// special case: zero length chunk
if (endingAt > fromArray.Length)
{
throw new LinkedFileException("array doesn't have this much data: " + endingAt);
}
int index = startingAt;
// store header with length information
byte[] buffer = new byte[this.buffersize];
BufferFile.Store(length, buffer, 0);
int fromIndex = startingAt;
int firstLength = this.buffersize - BufferFile.INTSTORAGE;
int stored = 0;
if (firstLength > length)
{
firstLength = length;
}
Array.Copy(fromArray, fromIndex, buffer, BufferFile.INTSTORAGE, firstLength);
stored += firstLength;
fromIndex += firstLength;
byte CurrentBufferType = HEAD;
// store any remaining buffers (no length info)
while (stored < length)
{
// store current buffer and get next block number
long nextBufferNumber = this.AllocateBuffer();
this.SetBuffer(currentBufferNumber, CurrentBufferType, buffer, 0, buffer.Length, nextBufferNumber);
currentBufferNumber = nextBufferNumber;
CurrentBufferType = BODY;
int nextLength = this.buffersize;
if (stored + nextLength > length)
{
nextLength = length - stored;
}
Array.Copy(fromArray, fromIndex, buffer, 0, nextLength);
stored += nextLength;
fromIndex += nextLength;
}
// store final buffer
this.SetBuffer(currentBufferNumber, CurrentBufferType, buffer, 0, buffer.Length, NULLBUFFERPOINTER);
return(result);
}