root/src/add-ons/media/plugins/ape_reader/LibMonkeysAudio/PositionBridgeIO.cpp
/*==============================================================================
        Bridge class for passing BPositionIO to functions who need CIO in MACLib
        Ver 1.01
        Copyright (C) 2005-2008 by SHINTA
==============================================================================*/

/*==============================================================================
BPositionIO* passed to SetPositionIO() must not be released before rleasing this class.
==============================================================================*/

//------------------------------------------------------------------------------
#include "PositionBridgeIO.h"
//------------------------------------------------------------------------------
// BeOS
// C++
// Proj
#include "All.h"
//------------------------------------------------------------------------------
//==============================================================================
TPositionBridgeIO::TPositionBridgeIO()
                : CIO()
{
        mPositionIO = NULL;
}
//------------------------------------------------------------------------------
TPositionBridgeIO::~TPositionBridgeIO()
{
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Close()
{
        return B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Create(const char* oName)
{
        return B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Delete()
{
        return B_ERROR;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::GetName(char* oBuffer)
{
        strcpy(oBuffer, "<TPositionBridgeIO>");
        return B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::GetPosition()
{
        if ( mPositionIO == NULL )
                return 0;
        return mPositionIO->Position();
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::GetSize()
{
        if ( mPositionIO == NULL )
                return 0;

        off_t aSize;
        status_t err = mPositionIO->GetSize(&aSize);
        if (err != B_OK)
                return -1;

        return aSize;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Open(const char* oName)
{
        return B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Read(void* oBuf, unsigned int oBytesToRead, unsigned int* oBytesRead)
{
        if ( mPositionIO == NULL )
                return ERROR_IO_READ;
        *oBytesRead = mPositionIO->Read(oBuf, oBytesToRead);
        return *oBytesRead == 0 ? ERROR_IO_READ : B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::Seek(int oDistance, unsigned int oMoveMode)
{
        if ( mPositionIO == NULL )
                return B_ERROR;
        return mPositionIO->Seek(oDistance, oMoveMode) < B_OK ? B_ERROR : B_OK;
}
//------------------------------------------------------------------------------
int     TPositionBridgeIO::SetEOF()
{
        if ( mPositionIO == NULL )
                return B_ERROR;
        mPositionIO->SetSize(mPositionIO->Position());
        return B_OK;
}
//------------------------------------------------------------------------------
status_t        TPositionBridgeIO::SetPositionIO(BPositionIO* oPositionIO)
{
        mPositionIO = oPositionIO;
        return B_OK;
}
//------------------------------------------------------------------------------
/* ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
untested function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' */
int     TPositionBridgeIO::Write(const void* oBuf, unsigned int oBytesToWrite, unsigned int* oBytesWritten)
{
        if ( mPositionIO == NULL )
                return ERROR_IO_WRITE;
        *oBytesWritten = mPositionIO->Write(oBuf, oBytesToWrite);
        return *oBytesWritten != oBytesToWrite ? ERROR_IO_WRITE : B_OK;
}
//------------------------------------------------------------------------------
//==============================================================================