diff --git a/src/messages.cpp b/src/messages.cpp index 65a35c472a56c05b93948bb27f2061ab33b61e72..974a71631a29f26ba440bc7fcdd3491e2f119b83 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -247,6 +247,77 @@ int Message::sendPUT(unsigned char* fileName){ } } +int Message::sendGET(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 get, answer, ack, nack, err, ok; + ofstream fileOut; + + ufds[0].fd = soquete; + ufds[0].events = POLLIN; + + get.setData(fileName,6,0); + + while(!success){ + error = send(soquete, get.objToString(), get.getSize()+4, 0); + if (error == -1){ + cout << "Erro ao receber arquivo (messages.cpp::sendGET)" << 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::sendGET)" << 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 + if(answer.getType() == 0){ + success = 0; + } else if (answer.getType() == 15){ // Erro + if(answer.getData()[0] == '0'){ + cout << "Arquivo Inexistente" << endl; + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + return -1; + } else if (answer.getData()[0] == '1'){ + cout << "Sem permissão para baixar o arquivo" << endl; + ack.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, ack.objToString(), ack.getSize()+4, 0); // Manda um ACK + return -1; + } else { + success = 0; + } + } else if (answer.getType() == 9){ // Tamanho + if(testaSeTamanhoEhInvalido()){ + err.setData((unsigned char*)answer.getSeq(),1,0); + send(soquete, err.objToString(), err.getSize()+4, 0); // Erro + return -1; + } else if(answer.checkParity()){ + nack.setData((unsigned char*)answer.getSeq(),0,0); // Manda um nack + send(soquete,nack.objToString(),nack.getSize()+4, 0); + return -1; + } else { + ok.setData((unsigned char*)answer.getSeq(),8,0); // Manda um ok + send(soquete,ok.objToString(),ok.getSize()+4, 0); + funcaoRecebeDados(); + return 0; + } + } + } + } + } + } + } +} + int Message::sendData(unsigned char* stringMessage){ int numberOfMessages, sizeLastMessage, size=0; int i, j, k, garbage, error, rv, success = 0;