diff --git a/headers/client.h b/headers/client.h index f06619b20d8807d7c37997ad777cbe055dca3b21..c71edeed6068f3367ef8f7cf4593e98b869c91ed 100644 --- a/headers/client.h +++ b/headers/client.h @@ -216,7 +216,7 @@ string client::calc_file_size(string fileName) return {}; } - int fileSize = buffer.st_size; + long long fileSize = buffer.st_size; return to_string(fileSize); } diff --git a/headers/server.h b/headers/server.h index 085a75334f38e38269221604ec3b8ce024d972e5..327046df7c4afe484879588e646681282fdba8c1 100644 --- a/headers/server.h +++ b/headers/server.h @@ -16,6 +16,7 @@ #include <sys/socket.h> #include <sys/types.h> #include <mutex> +#include <sys/statvfs.h> #include <arpa/inet.h> @@ -23,6 +24,8 @@ #include "conexao.h" #include "frame.h" +#define FILE_DESTINATION "./received" + using namespace std; class server { @@ -40,6 +43,7 @@ private: int send_ack(frame *fReceive); void send_confirm(frame *fReceive); void receive_text(frame *f); + void receive_midia(frame *f); frame *receive_frame_socket(); int receive_valid_frame(frame **f); void start_receveing_message(); @@ -119,7 +123,36 @@ void server::receive_text(frame *f) cout << "Mensagem recebida: " << textoReceive << "\n"; } -// Recebe o primeiro frame do cliente +// Verifica o espaco disponivel em disco +unsigned long server::chk_available_size() +{ + struct statvfs st; + if ( statvfs(FILE_DESTINATION, &st) == -1 ) + { + cout << "Erro no statvfs, abortado\n"; + //send_error(); + return; + } + + return st.f_bsize * st.f_bavail; +} + +void server::receive_midia(frame *f) +{ + unsigned long availSize = chk_available_size(); + unsigned long fileSize = stoi(f->get_dado()); + + if ( fileSize > availSize*0.9 ) + { + cout << "Tamanho do arquivo muito grande, abortado\n"; + //send_error(); + return; + } + + cout << "Espaco suficiente em disco\n"; +} + +// Recebe um frame do cliente frame *server::receive_frame_socket() { frame *fReceive; @@ -162,8 +195,9 @@ void server::start_receveing_message() { int endTransmission = 0; + frame *f; do { - frame *f = receive_frame_socket(); + if ( !receive_valid_frame(&f) ) { return; } if ( !f ) { return; } int frameType = f->get_tipo(); @@ -175,6 +209,8 @@ void server::start_receveing_message() break; case MIDIA: + receive_midia(f); + endTransmission = 1; break; default: diff --git a/todo.txt b/todo.txt index f1653f25511af31b9fa71c051f565ea5eb8bf7cd..2242c510feec551c963ab6cdbc898e1356cba81b 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,7 @@ -> Ver se os frames que estao vindo sao arquivos e juntar eles no arquivo +-> Arrumar nome arquivo > 63 + -> Testar tamanho antes de enviar o arquivo -> Arrumar a interface