root/src/kits/package/hpkg/DataReader.cpp
/*
 * Copyright 2009-2014, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include <package/hpkg/DataReader.h>

#include <DataIO.h>

#include <string.h>

#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE)
// for user_memcpy() and IS_USER_ADDRESS()
#include <KernelExport.h>

#include <kernel.h>
#endif


namespace BPackageKit {

namespace BHPKG {


// #pragma mark - BDataReader


BDataReader::~BDataReader()
{
}


// #pragma mark - BAbstractBufferedDataReader


BAbstractBufferedDataReader::~BAbstractBufferedDataReader()
{
}


status_t
BAbstractBufferedDataReader::ReadData(off_t offset, void* buffer, size_t size)
{
        BMemoryIO output(buffer, size);
        return ReadDataToOutput(offset, size, &output);
}


// #pragma mark - BBufferDataReader


BBufferDataReader::BBufferDataReader(const void* data, size_t size)
        :
        fData(data),
        fSize(size)
{
}


status_t
BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size)
{
        if (size == 0)
                return B_OK;

        if (offset < 0)
                return B_BAD_VALUE;

        if (size > fSize || offset > (off_t)fSize - (off_t)size)
                return B_ERROR;

#if defined(_KERNEL_MODE) && !defined(_BOOT_MODE)
        if (IS_USER_ADDRESS(buffer)) {
                if (user_memcpy(buffer, (const uint8*)fData + offset, size) != B_OK)
                        return B_BAD_ADDRESS;
        } else
#endif
        memcpy(buffer, (const uint8*)fData + offset, size);
        return B_OK;
}


status_t
BBufferDataReader::ReadDataToOutput(off_t offset, size_t size, BDataIO* output)
{
        if (size == 0)
                return B_OK;

        if (offset < 0)
                return B_BAD_VALUE;

        if (size > fSize || offset > (off_t)fSize - (off_t)size)
                return B_ERROR;

        return output->WriteExactly((const uint8*)fData + offset, size);
}


}       // namespace BHPKG

}       // namespace BPackageKit