/***************************************************************************
 *   Copyright (C) 2008 by normal   *
 *   normal@Desktop2   *
 *                                                                         *
 *   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 "FileTransferSend.h"
#include "gui/form_fileSend.h"
#include "Core.h"

cFileTransferSend::cFileTransferSend(cCore * Core, QString FilePath,QString Destination)
:FilePath(FilePath),Destination(Destination)
{
	this->Core=Core;
	StreamID=Core->StreamConnect(Destination);
	Core->removeUnknownID(StreamID);
	
	sendFirstPaket=true;
	FileName=FilePath.mid(FilePath.lastIndexOf("/")+1);
	FileTransferAccepted=false;
	FileForSend  = new QFile(FilePath);
	FileSize=FileForSend->size();

	Dialog=new form_fileSend(this);
	Dialog->show();
}

void cFileTransferSend::abbortFileSend()
{
	FileForSend->close();
	Core->StreamClose(StreamID);
}

void cFileTransferSend::StreamStatus(const SAM_Message_Types::RESULT result, const qint32 ID, QString Message)
{
	using namespace FileTransferProtocol;	

	if(result==SAM_Message_Types::OK)
	{
		if(sendFirstPaket==true)
		{
			QString StringFileSize;
			StringFileSize.setNum(FileSize);

			Core->StreamSendData(StreamID,FIRSTPAKET+StringFileSize+"\n"+FileName);
			sendFirstPaket=false;
		}

	}
	else
	{
		FileForSend->close();
		emit event_FileTransferError();
	}


}

void cFileTransferSend::StreamClosed(const SAM_Message_Types::RESULT result, qint32 ID, QString Message)
{
	if(result==SAM_Message_Types::OK){
		if(allreadySendedSize==FileSize){
			emit event_FileTransferFinishedOK();	
		}
		else
			emit event_FileTransferAborted();
	}
	else{
		emit event_FileTransferAborted();
	}

	FileForSend->close();
}

cFileTransferSend::~ cFileTransferSend()
{
	
	delete FileForSend;
	delete Dialog;
}

void cFileTransferSend::StreamReadyToSend(bool t)
{
	if(t==false)return;
	if(FileTransferAccepted==false)return;

	if(allreadySendedSize==FileSize)
	{
		emit event_FileTransferFinishedOK();
		Core->StreamClose(StreamID);
		return;
	}

	QByteArray Buffer;

	Buffer=FileForSend->read(MAXPAKETSIZE);
	allreadySendedSize+=Buffer.length();

	
	Core->StreamSendData(StreamID,Buffer);
	emit event_allreadySendedSizeChanged(allreadySendedSize);
}

void cFileTransferSend::operator <<(QByteArray t)
{
	if(t.length()==1){
		if(t.contains("0")){//true
			emit event_FileTransferAccepted(true);
			FileTransferAccepted=true;
			StartFileTransfer();
			
		}
		else{
			emit event_FileTransferAccepted(false);
			Core->StreamClose(StreamID);
			
		}
	}
	else{
		emit event_FileTransferAccepted(false);
		Core->StreamClose(StreamID);
	}
}

void cFileTransferSend::StartFileTransfer()
{
	allreadySendedSize=0;
	FileForSend->open(QIODevice::ReadOnly);
	StreamReadyToSend(true);
}
