root/src/add-ons/kernel/file_systems/udf/SparablePartition.cpp
/*
 * Copyright 2003, Tyler Dauwalder, tyler@dauwalder.net.
 * Distributed under the terms of the MIT License.
 */

#include "SparablePartition.h"

#define B_NOT_IMPLEMENTED B_ERROR


/*! \brief Creates a new SparablePartition object. */
SparablePartition::SparablePartition(uint16 number, uint32 start, uint32 length,
        uint16 packetLength, uint8 tableCount, uint32 *tableLocations)
        :
        fNumber(number),
        fStart(start),
        fLength(length),
        fPacketLength(packetLength),
        fTableCount(tableCount),
        fInitStatus(B_NO_INIT)
{
        TRACE(("SparablePartition::SparablePartition: number = %d, start = %"
                B_PRIu32 ",length = %" B_PRIu32 ", packetLength = %d\n", number, start,
                length, packetLength));

        status_t status = (0 < TableCount() && TableCount() <= kMaxSparingTableCount)
                ? B_OK : B_BAD_VALUE;
        if (status != B_OK)
                return;

        for (uint8 i = 0; i < TableCount(); i++)
                fTableLocations[i] = tableLocations[i];
        fInitStatus = B_OK;     
}


/*! \brief Destroys the SparablePartition object. */
SparablePartition::~SparablePartition()
{
}


/*! \brief Maps the given logical block to a physical block on disc.

        The sparing tables are first checked to see if the logical block has
        been remapped from a defective location to a non-defective one. If
        not, the given logical block is then simply treated as an offset from
        the     start of the physical partition.
*/
status_t
SparablePartition::MapBlock(uint32 logicalBlock, off_t &physicalBlock)
{
        status_t status = InitCheck();

        if (status != B_OK)
                return status;

        if (logicalBlock >= fLength)
                return B_BAD_ADDRESS;
        else {
                // Check for the logical block in the sparing tables. If not
                // found, map directly to physical space.

                //physicalBlock = fStart + logicalBlock;
                //return B_OK;
                status = B_ERROR;
        }
        return status;
}


/*! Returns the initialization status of the object. */
status_t
SparablePartition::InitCheck()
{
        return fInitStatus;
}