//---------------------------------------------------------------------------
// Vlakno pro odesilani UDP paketu

#include <vcl.h>
#include <winsock2.h>
#include <vector>
#pragma hdrstop

#include "Unit1.h"
#include "sendudp.h"
#include "Static.h"

#pragma package(smart_init)

using namespace std;
// Deklarace
extern SOCKET socket_udp;
extern sockaddr_in sock_udp_name;

// constructor --------------------------------------------------------------
__fastcall sendudp::sendudp(bool CreateSuspended)
	: TThread(CreateSuspended)
{
 	FreeOnTerminate = true;
}
//---------------------------------------------------------------------------

// Zjisteni kolik dat je jiz odeslano (pro progressbar) ---------------------
int __fastcall sendudp::GetProgress()
{
	if (velikost != 0) {
		ProgressPosition = (int)((float(tx_pos) / velikost)*100);
	} else ProgressPosition = 0;
	return ProgressPosition;
}
//---------------------------------------------------------------------------

// Vypis do Info logu -------------------------------------------------------
void __fastcall sendudp::UpdateCaption()
{
	Form1->Memo1->Lines->Add(GetTime().TimeString()+"> "+Message);
}
//---------------------------------------------------------------------------

// Algoritmus vlakna --------------------------------------------------------
void __fastcall sendudp::Execute()
{
char databuf[1500];
FILE *file_tx;
int lenght;
int start_time;

	NameThreadForDebugging("sendudp");
	// Otevřeni souboru pokud existuje
	if ((file_tx = fopen(Form1->FileListBox1->FileName.t_str(),"rb")) == NULL) {
		Message = "Nepodařilo se otevřít soubor!";
		Synchronize(&UpdateCaption);
		Terminate();
	}
	// Zjisti velikost souboru (omezeno na max 4GB)
	if (!Terminated) {
		fseek(file_tx,0,SEEK_END);
		velikost = ftell(file_tx);
		rewind(file_tx);
		Message = "Odesílám soubor " + Form1->FileListBox1->FileName + " ...";
		Synchronize(&UpdateCaption);
	}

	lenght = fread(databuf, sizeof(char),UDP_SIZE,file_tx);
	start_time = GetTickCount();

	// Vlastní odeslání souboru
	while ((lenght != 0) && (!Terminated)) {

		sendto(socket_udp, databuf, lenght, 0, (sockaddr *)&sock_udp_name, sizeof(sock_udp_name));
		lenght = fread(databuf, sizeof(char),UDP_SIZE,file_tx);
		tx_pos = ftell(file_tx);
		// Nastavitelne zpoždeni - rizeni toku
		if (UDP_DLY != 0) {
			Sleep(UDP_DLY);
		}
	}

	// konec souboru
	if (file_tx != NULL && velikost != 0) {
		fclose(file_tx);
		if (!Terminated) {
			int time = GetTickCount() - start_time;
			if (time == 0) { time = 1; }
			int speed = velikost/time;
			Message = "Soubor odeslán za "+IntToStr(time/1000)+"s. Průměrná rychlost "+speed+"kB/s.";
		} else {
			Message = "Přenos zrušen!";
		}
		Synchronize(&UpdateCaption);
	}
}
//---------------------------------------------------------------------------
