/*
 * Copyright (c) 1999-2000, Eric Moon.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions, and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 
// Connection.cpp
// e.moon 25jun99
 
#include "Connection.h"
#include "NodeManager.h"
#include "NodeRef.h"
 
#if CORTEX_XML
	#include "ExportContext.h"
	#include "MediaFormatIO.h"
	#include "xml_export_utils.h"
#endif /*CORTEX_XML*/
 
#include <Debug.h>
 
// -------------------------------------------------------- //
 
__USE_CORTEX_NAMESPACE
	
// -------------------------------------------------------- //
// ctor/dtor
// -------------------------------------------------------- //
 
Connection::~Connection() {
 
//	PRINT(("~Connection(): '%s'->'%s'\n",
//		outputName(), inputName()));
//	
	// deallocate hints	
	if(m_outputHint) delete m_outputHint;
	if(m_inputHint) delete m_inputHint;
}
 
Connection::Connection() :
	m_disconnected(true),
	m_id(0),
	m_outputHint(0),
	m_inputHint(0) {}
 
Connection::Connection(
	uint32										id,
	media_node								srcNode,
	const media_source&				src,
	const char*								outputName,
	media_node								destNode,
	const media_destination&	dest,
	const char*								inputName,
	const media_format&				format,
	uint32										flags) :
 
	m_disconnected(false),
	m_id(id),
	m_sourceNode(srcNode),
	m_source(src),
	m_outputName(outputName),
	m_outputHint(0),
	m_destinationNode(destNode),
	m_destination(dest),
	m_inputName(inputName),
	m_inputHint(0),
	m_format(format),
	m_flags(flags) {
 
	ASSERT(id);
	m_requestedFormat.type = B_MEDIA_NO_TYPE;
}
 
Connection::Connection(
	const Connection&					clone) {
	operator=(clone);
}
	
Connection& Connection::operator=(
	const Connection&					clone) {
 
	m_disconnected = clone.m_disconnected;
	m_id = clone.m_id;
	m_sourceNode = clone.m_sourceNode;
	m_source = clone.m_source;
	m_outputName = clone.m_outputName;
	m_outputHint = (clone.m_outputHint ?
		new endpoint_hint(
			clone.m_outputHint->name.String(),
			clone.m_outputHint->format) :
		0);
	m_destinationNode = clone.m_destinationNode;
	m_destination = clone.m_destination;
	m_inputName = clone.m_inputName;
	m_inputHint = (clone.m_inputHint ?
		new endpoint_hint(
			clone.m_inputHint->name.String(),
			clone.m_inputHint->format) :
		0);
	m_format = clone.m_format;
	m_flags = clone.m_flags;
	m_requestedFormat = clone.m_requestedFormat;
 
	return *this;
}
 
// input/output access [e.moon 14oct99]
 
status_t Connection::getInput(
	media_input*							outInput) const {
	
	if(!isValid())
		return B_ERROR;
 
	outInput->node = m_destinationNode;
	strcpy(outInput->name, m_inputName.String());
	outInput->format = format();
	outInput->source = m_source;
	outInput->destination = m_destination;
	return B_OK;
}
 
 
status_t Connection::getOutput(
	media_output*							outOutput) const {
	
	if(!isValid())
		return B_ERROR;
 
	outOutput->node = m_sourceNode;
	strcpy(outOutput->name, m_outputName.String());
	outOutput->format = format();
	outOutput->source = m_source;
	outOutput->destination = m_destination;
	return B_OK;
}
 
// hint access
 
status_t Connection::getOutputHint(
	const char**							outName,
	media_format*							outFormat) const {
 
	if(!m_outputHint)
		return B_NOT_ALLOWED;
	*outName = m_outputHint->name.String();
	*outFormat = m_outputHint->format;
	return B_OK;	
}
 
status_t Connection::getInputHint(
	const char**							outName,
	media_format*							outFormat) const {
 
	if(!m_inputHint)
		return B_NOT_ALLOWED;
	*outName = m_inputHint->name.String();
	*outFormat = m_inputHint->format;
	return B_OK;	
}
 
	
void Connection::setOutputHint(
	const char*									origName,
	const media_format&				origFormat) {
 
	if(m_outputHint) delete m_outputHint;
	m_outputHint = new endpoint_hint(origName, origFormat);
}
 
void Connection::setInputHint(
	const char*									origName,
	const media_format&				origFormat) {
 
	if(m_inputHint) delete m_inputHint;
	m_inputHint = new endpoint_hint(origName, origFormat);
}
 
// [e.moon 8dec99]
void Connection::setRequestedFormat(
	const media_format&				reqFormat) {
	m_requestedFormat = reqFormat;
}
 
// END -- Connection.cpp --

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