diff --git a/src/messages.cpp b/src/messages.cpp index 1f0189eff6f98bc7f1e6d6c2408fdbba1e2970f6..083ed2be782b4ba369c9472c9d9e25af01f7f8b3 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -11,6 +11,9 @@ int Message::sendCD(unsigned char* dirName){ struct pollfd ufds[1]; // usado para timeout em recv SubMessage changeDir, answer; + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + changeDir.setData(dirName,3,0); while(!success){ @@ -21,9 +24,6 @@ int Message::sendCD(unsigned char* dirName){ 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){ @@ -69,7 +69,11 @@ 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 - SubMessage listDir, answer; + String listagem; + SubMessage listDir, answer, ack, nack; + + ufds[0].fd = soquete; + ufds[0].events = POLLIN; listDir.setData(options,4,0); @@ -81,9 +85,6 @@ int Message::sendLS(unsigned char* options){ 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){ @@ -98,6 +99,33 @@ int Message::sendLS(unsigned char* options){ success = 1; 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 + send(soquete,nack.objToString(),nack.getSize()+4, 0); + success = 0; + } else { + strcat(listagem,answer.getData()); // Põe o valor recebido em "listagem" + success = 0; + while(!success){ + rv = poll(ufds, 1, 500); // Observa por novas mensagens + if(rv){ + recv(soquete, receiptMessage, 68*sizeof(char), 0); + 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 + } else if (answer.getType() == 15) { // Se for FIM + ack.setData(answer.getSeq(),1,0); + success = 1; + } + } + } else { + // TIMEOUT + } + } + } return 0; // YAY } else if(answer.getType() == 0){ // 0 = NACK // NACK @@ -105,10 +133,7 @@ int Message::sendLS(unsigned char* options){ } 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; + cout << "Opção inválida, por favor tente -l, -a ou -la\n" << endl; return -1; } else { success = 0; // reenvia pedido @@ -134,6 +159,9 @@ int Message::sendData(unsigned char* stringMessage){ struct pollfd ufds[1]; // usado para timeout em recv SubMessage answer, end; + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + // Calcula o tamanho da msg while( stringMessage[size] != '\0'){ size++; @@ -207,9 +235,6 @@ int Message::sendData(unsigned char* stringMessage){ cout << "Problema com o envio da mensagem (messages.cpp::sendData)" << endl; } - // 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){ @@ -257,9 +282,6 @@ int Message::sendData(unsigned char* stringMessage){ success = 0; 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; // vetor de pollfd, numero de buffers observados, timeout(ms) rv = poll(ufds, 1, 500); if(rv){