public byte[] makeHeader() throws Exception { byte[] result = new byte[this.headersize]; // HEADERPREFIX.CopyTo(result, 0); for (int i = 0; i < HEADERPREFIX.length; i++) { result[i] = HEADERPREFIX[i]; } result[HEADERPREFIX.length] = VERSION; int index = HEADERPREFIX.length + 1; BufferFile.Store(this.buffersize, result, index); index += BufferFile.INTSTORAGE; BufferFile.Store(this.FreeListHead, result, index); return result; }
public long StoreNewChunk(byte[] fromArray, int startingAt, int length) throws Exception { // 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); for (int i = 0; i < firstLength; i++) { buffer[BufferFile.INTSTORAGE + i] = fromArray[i]; } 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); for (int i = 0; i < nextLength; i++) { buffer[i] = fromArray[fromIndex + i]; } stored += nextLength; fromIndex += nextLength; } // store final buffer this.SetBuffer( currentBufferNumber, CurrentBufferType, buffer, 0, buffer.length, NULLBUFFERPOINTER); return result; }
void SetBuffer( long buffernumber, byte type, byte[] thebuffer, int start, int length, long NextBufferNumber) throws Exception { // System.Diagnostics.Debug.WriteLine(" storing chunk type "+type+" at "+buffernumber); if (this.buffersize < length) { throw new LinkedFileException("buffer size too small " + this.buffersize + "<" + length); } byte[] fullbuffer = new byte[length + BUFFEROVERHEAD]; fullbuffer[0] = type; BufferFile.Store(NextBufferNumber, fullbuffer, 1); if (thebuffer != null) { // Array.Copy(thebuffer, start, fullbuffer, BUFFEROVERHEAD, length); for (int i = 0; i < length; i++) { fullbuffer[BUFFEROVERHEAD + i] = thebuffer[i]; } } this.buffers.setBuffer(buffernumber, fullbuffer, 0, fullbuffer.length); }