/*  XMMS2 - X Music Multiplexer System
 *  Copyright (C) 2003-2007 XMMS2 Team and Ma Xuan
 *
 *  PLUGINS ARE NOT CONSIDERED TO BE DERIVED WORK !!!
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 */

#include "source_adapter.h"

CSourceAdapter::CSourceAdapter (xmms_xform_t *xform)
{
	this->xform = xform;
}

int
CSourceAdapter::Read (void * pBuffer, unsigned int nBytesToRead,
                      unsigned int * pBytesRead)
{
	int ret = 0;
	xmms_error_t error;

	xmms_error_reset (&error);

	ret = xmms_xform_read (xform,
	                       (gchar *)pBuffer,
	                       nBytesToRead,
	                       &error);
	*pBytesRead = ret;

	return (error.code == XMMS_ERROR_NONE) ? ERROR_SUCCESS : ERROR_IO_READ;
}

int
CSourceAdapter::Seek (int nDistance, unsigned int nMoveMode)
{
	xmms_xform_seek_mode_t whence;
	xmms_error_t error;
	gint pos;

	xmms_error_reset (&error);

	switch (nMoveMode)
	{
	case FILE_BEGIN:
		whence = XMMS_XFORM_SEEK_SET;
		break;
	case FILE_CURRENT:
		whence = XMMS_XFORM_SEEK_CUR;
		break;
	case FILE_END:
		whence = XMMS_XFORM_SEEK_END;
		break;
	}

	pos = xmms_xform_seek (xform, nDistance, whence, &error);

	return (error.code == XMMS_ERROR_NONE) ? ERROR_SUCCESS : -1;
}

int
CSourceAdapter::GetPosition ()
{
	gint pos;
	xmms_error_t error;

	xmms_error_reset (&error);

	pos = xmms_xform_seek (xform, 0, XMMS_XFORM_SEEK_CUR, &error);

	return (error.code == XMMS_ERROR_NONE) ? pos : -1;
}

int
CSourceAdapter::GetSize ()
{
	return xmms_xform_metadata_get_int (xform,
	                                    XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE);
}
