/*
 * Copyright 2015, Dario Casalinuovo. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
 
#include <MediaConnection.h>
 
#include <string.h>
 
#include "MediaClientNode.h"
 
#include "MediaDebug.h"
 
 
BMediaConnection::BMediaConnection(media_connection_kinds kinds,
	const char* name)
	:
	fOwner(NULL),
	fBind(NULL)
{
	CALLED();
 
	fConnection.kinds = kinds;
	fConnection.id = -1;
	//fConnection.client = media_client::null;
	if (name != NULL)
		strcpy(fConnection.name, name);
}
 
 
BMediaConnection::~BMediaConnection()
{
	CALLED();
 
}
 
 
const media_connection&
BMediaConnection::Connection() const
{
	return fConnection;
}
 
 
BMediaClient*
BMediaConnection::Client() const
{
	return fOwner;
}
 
 
const char*
BMediaConnection::Name() const
{
	return fConnection.name;
}
 
 
bool
BMediaConnection::HasBinding() const
{
	CALLED();
 
	return fBind != NULL;
}
 
 
BMediaConnection*
BMediaConnection::Binding() const
{
	CALLED();
 
	return fBind;
}
 
 
bool
BMediaConnection::IsConnected() const
{
	CALLED();
 
	return fConnected;
}
 
 
status_t
BMediaConnection::Disconnect()
{
	CALLED();
 
	return fOwner->_DisconnectConnection(this);
}
 
 
status_t
BMediaConnection::Release()
{
	CALLED();
 
	status_t ret = fOwner->_ReleaseConnection(this);
	if (ret != B_OK)
		return ret;
 
	delete this;
	return ret;
}
 
 
void
BMediaConnection::Connected(const media_format& format)
{
	// Update the status of our connection format.
	fConnection.format = format;
 
	fConnected = true;
}
 
 
void
BMediaConnection::Disconnected()
{
	CALLED();
 
	fConnected = false;
}
 
 
void
BMediaConnection::_ConnectionRegistered(BMediaClient* owner,
	media_connection_id id)
{
	fOwner = owner;
	fConnection.id = id;
	fConnection.client = fOwner->Client();
 
	if (fConnection.IsOutput()) {
		fConnection.source.port = fOwner->fNode->ControlPort();
		fConnection.source.id = fConnection.id;
 
		fConnection.destination = media_destination::null;
	} else {
		fConnection.destination.port = fOwner->fNode->ControlPort();
		fConnection.destination.id = fConnection.id;
 
		fConnection.source = media_source::null;
	}
}
 
 
const media_source&
BMediaConnection::_Source() const
{
	return fConnection.source;
}
 
 
const media_destination&
BMediaConnection::_Destination() const
{
	return fConnection.destination;
}
 
 
void BMediaConnection::_ReservedMediaConnection0() {}
void BMediaConnection::_ReservedMediaConnection1() {}
void BMediaConnection::_ReservedMediaConnection2() {}
void BMediaConnection::_ReservedMediaConnection3() {}
void BMediaConnection::_ReservedMediaConnection4() {}
void BMediaConnection::_ReservedMediaConnection5() {}
void BMediaConnection::_ReservedMediaConnection6() {}
void BMediaConnection::_ReservedMediaConnection7() {}
void BMediaConnection::_ReservedMediaConnection8() {}
void BMediaConnection::_ReservedMediaConnection9() {}
void BMediaConnection::_ReservedMediaConnection10() {}
 
 
BMediaInput::BMediaInput(const char* name)
	:
	BMediaConnection(B_MEDIA_INPUT, name)
{
}
 
 
BMediaInput::~BMediaInput()
{
	CALLED();
}
 
 
void
BMediaInput::HandleBuffer(BBuffer* buffer)
{
	CALLED();
}
 
 
void
BMediaInput::Connected(const media_format& format)
{
	BMediaConnection::Connected(format);
}
 
 
void
BMediaInput::Disconnected()
{
	BMediaConnection::Disconnected();
}
 
 
void BMediaInput::_ReservedMediaInput0() {}
void BMediaInput::_ReservedMediaInput1() {}
void BMediaInput::_ReservedMediaInput2() {}
void BMediaInput::_ReservedMediaInput3() {}
void BMediaInput::_ReservedMediaInput4() {}
void BMediaInput::_ReservedMediaInput5() {}
void BMediaInput::_ReservedMediaInput6() {}
void BMediaInput::_ReservedMediaInput7() {}
void BMediaInput::_ReservedMediaInput8() {}
void BMediaInput::_ReservedMediaInput9() {}
void BMediaInput::_ReservedMediaInput10() {}
 
 
BMediaOutput::BMediaOutput(const char* name)
	:
	BMediaConnection(B_MEDIA_OUTPUT, name),
	fBufferGroup(NULL)
{
}
 
 
BMediaOutput::~BMediaOutput()
{
	CALLED();
}
 
 
status_t
BMediaOutput::SendBuffer(BBuffer* buffer)
{
	CALLED();
 
	if (!IsConnected())
		return B_ERROR;
 
	return fOwner->fNode->SendBuffer(buffer, this);
}
 
 
void
BMediaOutput::Connected(const media_format& format)
{
	BMediaConnection::Connected(format);
}
 
 
void
BMediaOutput::Disconnected()
{
	BMediaConnection::Disconnected();
}
 
 
bool
BMediaOutput::_IsEnabled() const
{
	CALLED();
 
	return fEnabled;
}
 
 
void
BMediaOutput::_SetEnabled(bool enabled)
{
	fEnabled = enabled;
}
 
 
void BMediaOutput::_ReservedMediaOutput0() {}
void BMediaOutput::_ReservedMediaOutput1() {}
void BMediaOutput::_ReservedMediaOutput2() {}
void BMediaOutput::_ReservedMediaOutput3() {}
void BMediaOutput::_ReservedMediaOutput4() {}
void BMediaOutput::_ReservedMediaOutput5() {}
void BMediaOutput::_ReservedMediaOutput6() {}
void BMediaOutput::_ReservedMediaOutput7() {}
void BMediaOutput::_ReservedMediaOutput8() {}
void BMediaOutput::_ReservedMediaOutput9() {}
void BMediaOutput::_ReservedMediaOutput10() {}

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fConnected, fPadding.