From d508680a2a34a0128f5ffcc72162b9664cc1b731 Mon Sep 17 00:00:00 2001
From: Victor Perszel <vlp14@inf.ufpr.br>
Date: Sun, 29 Nov 2015 23:42:14 -0200
Subject: [PATCH] sendLS e sendPUT completos

---
 include/connectionRawSocket.h |   2 +
 src/messages.cpp              | 113 +++++++++++++++++++++++++++++++---
 src/submessages.cpp           |   4 +-
 3 files changed, 109 insertions(+), 10 deletions(-)

diff --git a/include/connectionRawSocket.h b/include/connectionRawSocket.h
index 91ba9b0..8db0796 100644
--- a/include/connectionRawSocket.h
+++ b/include/connectionRawSocket.h
@@ -20,6 +20,8 @@
 #include <cstdlib>
 #include <poll.h>
 #include <bitset>
+#include <fstream>
+#include <map>
 
 using namespace std;
 
diff --git a/src/messages.cpp b/src/messages.cpp
index 083ed2b..65a35c4 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -69,7 +69,7 @@ int Message::sendLS(unsigned char* options){
   int error, success = 0, garbage, rv;
   char *receiptMessage = (char*)malloc(sizeof(char*)*64);
   struct pollfd ufds[1]; // usado para timeout em recv
-  String listagem;
+  char* listagem;
   SubMessage listDir, answer, ack, nack;
 
   ufds[0].fd = soquete;
@@ -100,11 +100,11 @@ int Message::sendLS(unsigned char* options){
             if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
               // Mostra as mensagens
               if(answer.checkParity()){ // Caso a paridade dê errado
-                nack.setData(answer.getSeq(),0,0); // Manda um nack
+                nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
                 send(soquete,nack.objToString(),nack.getSize()+4, 0);
                 success = 0;
               } else {
-                strcat(listagem,answer.getData()); // Põe o valor recebido em "listagem"
+                strcat(listagem,(char*)answer.getData()); // Põe o valor recebido em "listagem"
                 success = 0;
                 while(!success){
                   rv = poll(ufds, 1, 500); // Observa por novas mensagens
@@ -113,19 +113,26 @@ int Message::sendLS(unsigned char* options){
                     answer.stringToObj((unsigned char*)receiptMessage);
                     if(answer.getStartMessage() == 0x7E){
                       if(answer.getType() == 10){ // 10 = 0xA --> (A)mostra
-                        strcat(listagem,answer.getData()); // Põe em "listagem"
-                        ack.setData(answer.getSeq(),1,0);
-                        send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+                        if(answer.checkParity()){ // Caso a paridade dê errado
+                          nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack
+                          send(soquete,nack.objToString(),nack.getSize()+4, 0);
+                          success = 0;
+                        } else {
+                          strcat(listagem,(char*)answer.getData()); // Põe em "listagem"
+                          ack.setData((unsigned char*)answer.getSeq(),1,0);
+                          send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK
+                        }
                       } else if (answer.getType() == 15) { // Se for FIM
-                        ack.setData(answer.getSeq(),1,0);
+                        ack.setData((unsigned char*)answer.getSeq(),1,0);
                         success = 1;
                       }
                     }
                   } else {
-                    // TIMEOUT
+                    cout << "TIMEOUT DO LS (messages.cpp::sendLS)" << endl;
                   }
                 }
               }
+              cout << listagem << endl;
               return 0; // YAY
             } else if(answer.getType() == 0){ // 0 = NACK
               // NACK
@@ -150,6 +157,96 @@ int Message::sendLS(unsigned char* options){
   }
 }
 
+int Message::sendPUT(unsigned char* fileName){
+  int error, success = 0, garbage, rv;
+  char *receiptMessage = (char*)malloc(sizeof(char*)*64);
+  string temp, fileData;
+  struct pollfd ufds[1]; // usado para timeout em recv
+  SubMessage put, answer, size;
+  ifstream fileIn;
+
+  ufds[0].fd = soquete;
+  ufds[0].events = POLLIN;
+
+  put.setData(fileName,5,0);
+
+  fileIn.open((char*)fileName, ios::in);
+  fileIn.seekg(0);
+
+  while(getline(fileIn, temp)) {
+    fileData += temp + "\n";
+  }
+
+  while(!success){
+    error = send(soquete, put.objToString(), put.getSize()+4, 0);
+    if (error == -1){
+      cout << "Erro ao enviar arquivo (messages.cpp::sendPUT)" << endl;
+    }
+
+    garbage = 0;
+    while((garbage < 10) && (!success)){
+      // vetor de pollfd, numero de buffers observados, timeout(ms)
+      rv = poll(ufds, 1, 500);
+      if(rv){
+        if(rv == -1){
+          cout << "Erro no recebimento de resposta (messages.cpp::sendPUT)" << endl;
+          return -1;
+        } else {
+          recv(soquete, receiptMessage, 68*sizeof(char), 0);
+          answer.stringToObj((unsigned char*)receiptMessage);
+          // Lê começo da mensagem e vê se tem o delimitador de início
+          if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
+            success = 1;
+            if(answer.getType() == 8){ // 8 = OK
+              // OK, mandar tamanho
+              size.setData((unsigned char*)fileData.size(),9,0);
+              send(soquete, size.objToString(), size.getSize()+4, 0);
+              success = 0;
+              while(!success){
+                rv = poll(ufds, 1, 500);
+                if (rv){
+                  if(rv == -1){
+                    cout << "Erro no recebimento de resposta (messages.cpp::sendPUT)" << endl;
+                    return -1;
+                  } else {
+                    recv(soquete, receiptMessage, 68*sizeof(char), 0);
+                    answer.stringToObj((unsigned char*)receiptMessage);
+                    if(answer.getStartMessage() == 0x7E){ // 0x7E = 01111110
+                      if(answer.getType() == 8){
+                        success = 1;
+                        if(sendData((unsigned char*)fileData.c_str())){
+                          cout << "Erro ao mandar dados (messages.cpp::sendPUT)" << endl;
+                          return -1;
+                        }
+                      } else if (answer.getType() == 0){
+                        success = 0;
+                      } else if (answer.getType() == 15){ // 15 = 0xE --> Erro
+                        if(answer.getData()[0] == '2'){
+                          cout << "Não tem espaço para mandar o arquivo" << endl;
+                          return -1;
+                        } else {
+                          success = 0;
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            } else if(answer.getType() == 0){ // 0 = NACK
+              // NACK
+              success = 0; // reenvia pedido
+            }
+          }
+        }
+      } else{
+        cout << "Tempo limite de resposta excedido :c\n" << endl;
+        cout << "TIMEOUT ATINGIDO (messages.cpp::sendPUT)" << endl;
+      }
+      garbage++;
+    }
+  }
+}
+
 int Message::sendData(unsigned char* stringMessage){
   int numberOfMessages, sizeLastMessage, size=0;
   int i, j, k, garbage, error, rv, success = 0;
diff --git a/src/submessages.cpp b/src/submessages.cpp
index 6489dcc..9c32a24 100644
--- a/src/submessages.cpp
+++ b/src/submessages.cpp
@@ -162,8 +162,8 @@ int SubMessage::checkParity(){
   }
 
   if (parityTest == parity){
-    return 1;
-  }else{
     return 0;
+  }else{
+    return 1;
   }
 }
-- 
GitLab