/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
using System;
using System.Collections.Generic;
using System.IO;
namespace HH.WMS.Utils.NPOI.POIFS.Storage
{
public class BlockListImpl:BlockList
{
private ListManagedBlock[] _blocks;
private BlockAllocationTableReader _bat;
///
/// Initializes a new instance of the class.
///
public BlockListImpl()
{
_blocks = new ListManagedBlock[ 0 ];
_bat = null;
}
///
/// provide blocks to manage
///
/// blocks to be managed
public virtual void SetBlocks(ListManagedBlock[] blocks)
{
_blocks = blocks;
}
///
/// remove the specified block from the list
///
/// the index of the specified block; if the index is
/// out of range, that's ok
public virtual void Zap(int index)
{
if ((index >= 0) && (index < _blocks.Length))
{
_blocks[ index ] = null;
}
}
protected ListManagedBlock Get(int index)
{
return _blocks[index];
}
///
/// Remove and return the specified block from the list
///
/// the index of the specified block
/// the specified block
public virtual ListManagedBlock Remove(int index)
{
ListManagedBlock result = null;
try
{
result = _blocks[ index ];
if (result == null)
{
throw new IOException("block[ " + index
+ " ] already removed");
}
_blocks[ index ] = null;
}
catch (IndexOutOfRangeException)
{
throw new IOException("Cannot remove block[ " + index
+ " ]; out of range[ 0 - " +
(_blocks.Length-1) + " ]");
}
return result;
}
///
/// get the blocks making up a particular stream in the list. The
/// blocks are removed from the list.
///
/// the index of the first block in the stream
///
///
/// the stream as an array of correctly ordered blocks
///
public virtual ListManagedBlock[] FetchBlocks(int startBlock, int headerPropertiesStartBlock)
{
if (_bat == null)
{
throw new IOException(
"Improperly initialized list: no block allocation table provided");
}
return _bat.FetchBlocks(startBlock,headerPropertiesStartBlock, this);
}
///
/// set the associated BlockAllocationTable
///
/// the associated BlockAllocationTable
public virtual BlockAllocationTableReader BAT
{
set
{
if (_bat != null)
{
throw new IOException(
"Attempt to replace existing BlockAllocationTable");
}
_bat = value;
}
}
public virtual int BlockCount()
{
return _blocks.Length;
}
protected int RemainingBlocks()
{
int c = 0;
for (int i = 0; i < _blocks.Length; i++)
{
if (_blocks[i] != null)
c++;
}
return c;
}
}
}