OSDN Git Service

* Implemented sending 0x00 when receiving was aborted.
[greensite/jasmine.git] / server / tcpserver.cxx
index cf3acd0..78b5e9c 100644 (file)
@@ -1,9 +1,9 @@
-#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);
@@ -21,6 +21,7 @@ void tcpServer::incomingConnection(int handle){
 
 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()));
 }
@@ -43,13 +44,13 @@ void serverSocket::header_event(){
                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;
@@ -66,7 +67,11 @@ void serverSocket::data_event(){
 
        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;
@@ -76,17 +81,42 @@ void serverSocket::data_event(){
        }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;}