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;
}