-#include "../ported_rmd6/rmd6.h"
#include "tcpserver.h"
#include "../structures/header.h"
using namespace network;
using namespace enc_hash;
+using namespace structures;
tcpServer::tcpServer(quint64 buffersize, QObject *parent):QTcpServer(parent){this->buffersize=buffersize;}
void tcpServer::incomingConnection(int handle){
serverSocket *socket=new serverSocket(this->buffersize,this);
serverSocket::serverSocket(quint64 buffersize, QObject *parent):QTcpSocket(parent){
this->buffer_size=buffersize;
+ this->canceled=false;
connect(this,SIGNAL(disconnected()),SLOT(deleteLataer()));
connect(this,SIGNAL(readyRead()),SLOT(read_data()));
}
QDataStream datastream(data);
datastream>>this->head_data;
if(this->head_data==structures::header()){
- emit this->receive_aborted((*this),serverSocket::header_invalid);
- this->disconnectFromHost();
+ this->abort_receive(serverSocket::header_invalid);
return;
}
if(!this->head_data.fileName().isEmpty()){
this->where_to_save=(emit this->file_pending((*this)));
if(this->where_to_save.isEmpty()){
+ this->write(QByteArray(1,0x00));
emit this->receive_aborted((*this),serverSocket::empty_filename_specified);
this->disconnectFromHost();
return;
if(this->head_data.fileName().isEmpty()){
QByteArray msg;
- for(quint64 count=0;count<read_count;count++) msg+=this->read(this->buffer_size);
+ for(quint64 count=0;count<read_count;count++){
+ this->check_canceled_then_abort();
+ msg+=this->read(this->buffer_size);
+ }
+ this->check_canceled_then_abort();
msg+=this->read(final_readsize);
rmd6 generator;
}else{
streamopen:
if(this->where_to_save.isEmpty()){
- emit this->receive_aborted((*this),serverSocket::empty_filename_specified);
- this->disconnectFromHost();
+ this->abort_receive(serverSocket::empty_filename_specified);
+ return;
}
QFile file(this->where_to_save,this);
if(!file.open(QIODevice::Truncate|QIODevice::WriteOnly)){
this->where_to_save=emit this->fileStream_openFailed((*this),file.error(),file.errorString());
goto streamopen;
}
- for(quint64 count=0;count<read_count;count++) file<<this->read(this->buffer_size);
- file<<this->read(final_readsize);
+ for(quint64 count=0;count<read_count;count++){
+ this->check_canceled_then_abort();
+ file.write(this->read(this->buffer_size));
+ emit this->file_receive_progress(file.pos(),(*this));
+ }
+ this->check_canceled_then_abort();
+ file.write(this->read(final_readsize));
+ emit this->file_receive_progress(file.pos(),(*this));
file.close();
- //todo
+
+ rmd6 generator;
+ if(this->head_data.ripemd160()==generator.compute_hash(file))
+ emit this->file_saved((*this));
+ else emit this->file_broken((*this));
}
+ this->disconnectFromHost();
+}
+void serverSocket::check_canceled_then_abort(){
+ if(this->canceled){
+ this->abort_receive(serverSocket::user);
+ return;
+ }
+}
+void serverSocket::abort_receive(aborted_reason reason){
+ this->write(QByteArray(1,0x00));
+ emit this->receive_aborted((*this),reason);
+ this->disconnectFromHost();
}
+void serverSocket::cancel(){this->canceled=true;}
+QString serverSocket::path_to_save() const{return this->where_to_save;}
+header serverSocket::header_data() const{return this->head_data;}