From 03c70322319f8082ff37d2f879033ba84044f94b Mon Sep 17 00:00:00 2001
From: Victor Perszel <vlp14@inf.ufpr.br>
Date: Sun, 29 Nov 2015 17:13:43 -0200
Subject: [PATCH] SendCD

---
 include/messages.h |   8 +++-
 src/messages.cpp   | 112 +++++++++++++++++++++++++++++++++------------
 2 files changed, 90 insertions(+), 30 deletions(-)

diff --git a/include/messages.h b/include/messages.h
index 2f07379..b31d555 100644
--- a/include/messages.h
+++ b/include/messages.h
@@ -13,6 +13,10 @@ class Message{
 		SubMessage messages[3]; // Janela deslizante permite 3 mensagens de uma vez
 
 	public:
-		int sendMessage(unsigned char*); // Método que divide e envia uma mengam.
-
+		int sendCD(unsigned char*); 
+		int sendLS(unsigned char*);
+		int sendPUT(unsigned char*);
+		int sendGET(unsigned char*);
+		int sendData(unsigned char*); // Método que divide e envia uma mensagem.
+		// int receiveMessage(); // Método que recebe as mensagens e as agrupa
 };
diff --git a/src/messages.cpp b/src/messages.cpp
index cc48a91..c0fd212 100644
--- a/src/messages.cpp
+++ b/src/messages.cpp
@@ -5,14 +5,74 @@
 
 //######################### MÉTODOS DA CLASSE Message #########################
 
-int Message::sendMessage(unsigned char* stringMessage){
+int Message::sendCD(unsigned char* dirName){
+  int error, success = 0, garbage, rv;
+  char *receiptMessage = (char*)malloc(sizeof(char*)*64);
+  struct pollfd ufds[1]; // usado para timeout em recv
+  SubMessage changeDir, answer;
+  
+  changeDir.setData(dirName,3,0);
+
+  while(!success){
+    error = send(soquete, changeDir.objToString(), changeDir.getSize()+4, 0);
+    if (error == -1){
+      cout << "Erro ao tentar mudar de diretório (messages.cpp::sendCD)" << endl;
+    }
+
+    garbage = 0;
+    while((garbage < 10) && (!success)){
+      // recebe resposta
+      ufds[0].fd = soquete;
+      ufds[0].events = POLLIN;
+      // 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::sendData)" << 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
+              // Tá ok para mudar de Diretório
+              return 0; // YAY
+            } else if(answer.getType() == 0){ // 0 = NACK
+              // NACK
+              success = 0; // reenvia pedido
+            } else if(answer.getType() == 14){ //14 = 0xE --> Erro
+              // ERRO
+              if(answer.getData()[0] == '0'){
+                cout << "Diretório Inexistente\n" << endl;
+                return -1;
+              } else if (answer.getData()[0] == '1'){
+                cout << "Sem permissão para acessar o diretório\n" << endl;
+                return -1;
+              } else {
+                success = 0; // reenvia pedido
+              }
+            }
+          }
+        }
+      } else{
+        cout << "Tempo limite de resposta excedido :c\n" << endl;
+        cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
+      }
+      garbage++;
+    }
+  }
+}
+
+int Message::sendData(unsigned char* stringMessage){
   int numberOfMessages, sizeLastMessage, size=0;
-  int i, j, k, error, tipo, rv, success = 0;
+  int i, j, k, garbage, error, rv, success = 0;
   unsigned char* subData; // a parte da mensagem que vai em cada sequencia
   char *receiptMessage = (char*)malloc(sizeof(char*)*64);
   char *erro1, *erro2, *sucesso, *buffer;
   struct pollfd ufds[1]; // usado para timeout em recv
-  SubMessage answer;
+  SubMessage answer, end;
 
   // Calcula o tamanho da msg
   while( stringMessage[size] != '\0'){
@@ -26,26 +86,16 @@ int Message::sendMessage(unsigned char* stringMessage){
     numberOfMessages = (size/64);
   }
   sizeLastMessage = size%64;
+  numberOfMessages++;  // +1 = Mensagem de FIM
 
   // Cria as sub mensagens
   SubMessage subMensagem[numberOfMessages];
 
-  // Atribui os tipos da mensagem
-  if(stringMessage[0] == 'l' && stringMessage[1] == 's'){
-    tipo = 4;
-  } else if (stringMessage[0] == 'c' && stringMessage[1] == 'd'){
-    tipo = 3;
-  } else if (stringMessage[0] == 'p' && stringMessage[1] == 'u' && stringMessage[2] == 't') {
-    tipo = 5;
-  } else if (stringMessage[0] == 'g' && stringMessage[1] == 'e' && stringMessage[10] == 't') {
-    tipo = 6;
-  } else {
-    tipo = 13; // 13 = 0xD --> Dados
-  }
-
   // string usada para dividir a mensagem de entrada e colocar na parte de data das SubMessages
   subData = (unsigned char*) malloc(sizeof(unsigned char) * 64);
 
+  int tipo = 13; // 13 = 0xD --> Dados
+
   // Divide a mensagem
   k = 0; // k é a numero da sequencia na submensagem
   for(i = 0; i < numberOfMessages-1; ++i){
@@ -65,20 +115,25 @@ int Message::sendMessage(unsigned char* stringMessage){
       subData[j] = stringMessage[(i*64)+j];
     }
     subMensagem[i].setData(subData, tipo, k);
+    ++k;
   }else{
     // Caso contrario continua com o tamanho maior
     for(j = 0; j < 64; ++j){
       subData[j] = stringMessage[(i*64)+j];
     }
     subMensagem[i].setData(subData, tipo, k);
+    ++k;
   }
+  // Seta mensagem de FIM
+  i++;
+  subMensagem[i].setData((unsigned char*)"FIM", 15, k); // Dados = "FIM", tipo = 0xF, sequencia = proxima
 
   // Caso haja só uma ou duas mensagens
   if (numberOfMessages < 4){
     while(!success){
       if(numberOfMessages < 1) {
         cout << "Algo parece estranho, sua mensagem contém conteúdo?\n" << endl;
-        cout << "Erro: Mensagem nula (messages.cpp::sendMessage)" << endl;
+        cout << "Erro: Mensagem nula (messages.cpp::sendData)" << endl;
         return -1;
       }
       // manda a primeira msg
@@ -89,7 +144,7 @@ int Message::sendMessage(unsigned char* stringMessage){
         error = send(soquete, subMensagem[2].objToString() , subMensagem[i].getSize()+4, 0);
 
       if(error == -1){
-        cout << "Problema com o envio da mensagem (messages.cpp::sendMessage)" << endl;
+        cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl;
       }
 
       // recebe resposta
@@ -99,7 +154,7 @@ int Message::sendMessage(unsigned char* stringMessage){
       rv = poll(ufds, 1, 500);
       if(rv){
         if(rv == -1){
-          cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl;
+          cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << endl;
         } else {
           recv(soquete, receiptMessage, 68*sizeof(char), 0);
           answer.stringToObj((unsigned char*)receiptMessage);
@@ -109,26 +164,26 @@ int Message::sendMessage(unsigned char* stringMessage){
               if(answer.getData()[0] == '1'){
                 success = 1; // YAY
               } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl;
+                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
               }
             } else if (numberOfMessages == 2){ // numero de mensagens = 2
               if(answer.getData() == (unsigned char*)"1 1"){ // aceitou ambas as msgs
                 success = 1; // YAY
               } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl;
+                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
               }
             } else { // numbero de mensagens = 3
               if(answer.getData() == (unsigned char*)"1 2"){ // aceitou ambas as msgs
                 success = 1; // YAY
               } else {
-                cout << "Mensagem entregue com erro (messages.cpp::sendMessage)" << endl;
+                cout << "Mensagem entregue com erro (messages.cpp::sendData)" << endl;
               }
             }
           }
         }
       } else {
         cout << "Tempo limite de resposta excedido :c\n" << endl;
-        cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl;
+        cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
       }
     }
     success = 0;
@@ -140,8 +195,8 @@ int Message::sendMessage(unsigned char* stringMessage){
       error = send(soquete, subMensagem[i+2].objToString() , subMensagem[i].getSize()+4, 0);
 
       success = 0;
-      k = 0;
-      while((k < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo
+      garbage = 0;
+      while((garbage < 10) && (!success)){ // Tenta 10 vezes para evitar reenviar a mensagem quando recebe lixo
         // recebe resposta
         ufds[0].fd = soquete;
         ufds[0].events = POLLIN;
@@ -149,9 +204,10 @@ int Message::sendMessage(unsigned char* stringMessage){
         rv = poll(ufds, 1, 500);
         if(rv){
           if(rv == -1){
-            cout << "Erro no recebimento de resposta (messages.cpp::sendMessage)" << endl;
+            cout << "Erro no recebimento de resposta (messages.cpp::sendData)" << 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
@@ -174,9 +230,9 @@ int Message::sendMessage(unsigned char* stringMessage){
           }
         } else {
           cout << "Tempo limite de resposta excedido :c\n" << endl;
-          cout << "TIMEOUT ATINGIDO (messages.cpp::sendMessage)" << endl;
+          cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl;
         }
-        k++;
+        garbage++;
       }
     }
   }
-- 
GitLab