/***************************************************************************
 *   Copyright (C) 2005 by Will Entriken                                   *
 *   william.entriken@villanova.edu                                        *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include "processcontroller.h"
#include "processlistviewitem.h"

ProcessController::ProcessController(ProcessListViewItem * parent)
  : TQObject(parent), myParent(parent), myStatus(false), myAutomatic(false), myUnicodeEnabled(false),
	  myProcess(new TQProcess(this))
{
	connect (myProcess, TQ_SIGNAL( readyReadStdout() ), (ProcessController *) this, TQ_SLOT( readStdout()) );
	connect (myProcess, TQ_SIGNAL(processExited() ), (ProcessController *) this, TQ_SLOT( processExited()) );
	// connect (myProcess, TQ_SIGNAL( destroyed() ), myProcess, TQ_SLOT( kill()) );
	// this should work, according to http://doc.trolltech.com/3.2/qobject.html#~TQObject but it doesn't
}

ProcessController::~ProcessController()
{
	myProcess->kill();
}

void ProcessController::readStdout()
{
	TQString tempOutput;
	if (myUnicodeEnabled)
	{
		tempOutput = TQString::fromUtf8(myProcess->readStdout());
	}
	else
	{
		tempOutput = TQString::fromLocal8Bit(myProcess->readStdout());
	}
	
	if( tempOutput.contains( "ripping..." ))
	{
		TQString songname = tempOutput.mid( tempOutput.find( "]" )+1, tempOutput.findRev( "[" ) - tempOutput.find( "]" ) - 1);
		myParent->setText( 1, songname.stripWhiteSpace() );
		
		TQString bytesR = tempOutput.mid( tempOutput.findRev( "[" )+1, tempOutput.findRev( "]" ) - tempOutput.findRev( "[" ) - 1);
		myParent->setText( 2, bytesR.stripWhiteSpace() );
	}
		
	if( tempOutput.contains( "Connecting..." ))
	{
		myParent->setText( 1, "Connecting..." );
		myParent->setText( 2, "" );
	}
		
	if( tempOutput.contains( "buffering" ))
	{
		myParent->setText( 1, "Buffering..." );
		myParent->setText( 2, "" );
	}
		
	if( tempOutput.contains( "Time to stop is here" ))
	{
		myParent->setText( 1, "Complete" );
		myParent->setText( 2, "" );
		//TQTimer::singleShot( 1500, myParent, TQ_SLOT( setEmptyText(3) ));
	}
}

void ProcessController::processExited()
{
	myStatus = false;
	myParent->setText( 1, "" );
	myParent->setText( 2, "" );
	emit stopRipSignal(this);
}

void ProcessController::startRip(TQString destination, TQString time, bool isUnicode)
{
	myUnicodeEnabled = isUnicode;
	myStatus = true;
	myParent->setText( 1, "Ripping" );
	
	myProcess->clearArguments();
	myProcess->addArgument( "streamripper" );
	myProcess->addArgument( myUrl );
	if( isUnicode )
	{
		myProcess->addArgument( "--codeset-filesys=UTF-8 " );
		myProcess->addArgument( "--codeset-metadata=UTF-8 " );
	}
	myProcess->addArgument( "-d " );
	myProcess->addArgument( destination );
	if( time.toInt() )
	{
		myProcess->addArgument( "-l " );
		myProcess->addArgument( time );
	}

	myProcess->setCommunication( TQProcess::Stdout | TQProcess::Stderr | TQProcess::DupStderr );
	myProcess->start();
}


void ProcessController::stopRip()
{
	myStatus = false;
	myParent->setText( 1, "" );
	myParent->setText( 2, "" );

	myProcess->tryTerminate();
	TQTimer::singleShot( 2000, myProcess, TQ_SLOT( kill() ) );
}


bool ProcessController::getStatus()
{
	return myStatus;
}

TQString ProcessController::getUrl()
{
	return myUrl;
}

void ProcessController::setAutomatic(bool a)
{
	myAutomatic = a;
}

bool ProcessController::getAutomatic()
{
	return myAutomatic;
}
void ProcessController::setService(DNSSD::RemoteService::Ptr service)
{
	myService = service;
}

DNSSD::RemoteService::Ptr ProcessController::getService()
{
	return myService;
}

TQString ProcessController::getDescription()
{
	return myDescription;
}

void ProcessController::setUrl(TQString Url)
{
	myUrl = Url;
}

void ProcessController::setDescription(TQString Description)
{
	myDescription = Description;
}

#include "processcontroller.moc"
