diff --git a/include/submessages.h b/include/submessages.h index 9ba2d2e69a64bd2b1a42c18eb01b69b94f9a04cd..ecff63c4579447cba0c5eaaa4d511339e99db2c9 100644 --- a/include/submessages.h +++ b/include/submessages.h @@ -28,6 +28,8 @@ class SubMessage{ // Aqui nós entramos com os dados e o tamanho dos dados (em bytes). void setData(unsigned char*, int, int); + void deleteData(); + int getStartMessage(); unsigned char getParity(); //Retorna a paridade diff --git a/src/messages.cpp b/src/messages.cpp index 2b9614a27c80bc62fead712eea092003c699d838..40faec1bce542a9153b6f99039250b7058663d67 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -63,6 +63,7 @@ int Message::sendCD(unsigned char* dirName){ garbage++; } } + changeDir.deleteData(); } int Message::sendLS(unsigned char* options){ @@ -91,16 +92,22 @@ int Message::sendLS(unsigned char* options){ cout << "Erro no recebimento de resposta (messages.cpp::sendLS)" << endl; return -1; } else { +cout << "recv" << endl; recv(soquete, receiptMessage, 68, 0); // Lê começo da mensagem e vê se tem o delimitador de início if(receiptMessage[0] == 0x7E){ // 0x7E = 01111110 answer.stringToObj((unsigned char*)receiptMessage); success = 1; +cout << "checkparity" << endl; if(answer.checkParity()){ // Caso a paridade dê errado success = 0; // Vai reenviar +cout << "deu ruim" << endl; }else{ +cout << "deu boa" << endl; if(answer.getType() == 1){ +cout << "recebeu ack" << endl; showLS = receiveData(10); +cout << "recebeu dados" << endl; if(showLS != ""){ success = 1; cout << showLS << endl; @@ -124,6 +131,7 @@ int Message::sendLS(unsigned char* options){ cout << "Tempo limite de resposta excedido :c\n" << endl; cout << "TIMEOUT ATINGIDO (messages.cpp::sendData)" << endl; } + answer.deleteData(); } } } @@ -402,6 +410,9 @@ int Message::sendData(unsigned char* stringMessage, int type){ } } } + for(i = 0; i < numberOfMessages; i++){ + subMensagem[i].deleteData(); + } return 0; } @@ -474,13 +485,11 @@ int Message::receiveLS(unsigned char* options, char* currentPath){ fileName = path + "/ls.txt"; lsFile.open(fileName.c_str(), ios::in); lsFile.seekg (0); -cout << "+1+" << endl; // Leitura do arquivo. show += path + "\n"; while(getline(lsFile, temp)) { show += temp + "\n"; } -cout << "+2+" << endl; // Remove arquivo ls.txt remove(fileName.c_str()); @@ -488,13 +497,10 @@ cout << "+2+" << endl; for(i = 0; i < show.size(); i++){ lsData[i] = show[i]; } -cout << "+3+" << endl; - if(sendData(lsData, 14) == 0){ -cout << "+return 0+" << endl; + if(sendData(lsData, 10) == 0){ return 0; }else{ -cout << "+return -1+" << endl; return -1; } } @@ -649,27 +655,36 @@ string Message::receiveData(int type){ cout << "Erro no recebimento dos dados (messages.cpp::receiveData)" << endl; return(""); }else{ +cout << "recv" << endl; recv(soquete, receiptMessage, 68, 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 +cout << "startmesg" << endl; if(answer.checkParity()){ +cout << "paridade deu ruim" << endl; nack.setData((unsigned char*)"0",0,0); // Manda um nack send(soquete,nack.objToString(),68, 0); }else{ +cout << "paridade deu boa" << endl; if(answer.getType() == type){ +cout << "tipo = ls" << endl; if(subData[(seqCounter*64)+answer.getSeq()] == ""){ subData[(seqCounter*64)+answer.getSeq()] = (char*)answer.getData(); if(answer.getSeq() == 63) seqCounter++; size++; +cout << "seqc = " << seqCounter << endl; +cout << "size = " << size << endl; } ack.setData((unsigned char*)"0",1,0); send(soquete, ack.objToString(), 68, 0); // Manda um ACK }else if(answer.getType() == 15){ +cout << "tipo = fim" << endl; success = 1; ack.setData((unsigned char*)"0",1,0); send(soquete, ack.objToString(), 68, 0); // Manda um ACK }else{ +cout << "tipo = sei la -> nack" << endl; nack.setData((unsigned char*)"0",0,0); // Manda um nack send(soquete,nack.objToString(),68, 0); } @@ -679,6 +694,7 @@ string Message::receiveData(int type){ }else{ cout << "TIMEOUT ATINGIDO (messages.cpp::receiveData)" << endl; } + answer.deleteData(); } for(i = 0; i < size; ++i){ diff --git a/src/submessages.cpp b/src/submessages.cpp index 841cf8884a738bc2a9f91d0fda4db355687757ce..184008b42727b3e2e534217fe5d1bcf23adace01 100644 --- a/src/submessages.cpp +++ b/src/submessages.cpp @@ -13,8 +13,8 @@ void SubMessage::setParity(){ int i, j, bitsParity[8]; // Alocação da matriz de bits - bitsMessage = new int*[this->getSize()]; - for(i = 0 ; i < this->getSize() ; i++){ + bitsMessage = new int*[getSize()]; + for(i = 0 ; i < getSize() ; i++){ bitsMessage[i] = new int[8]; // Divide os dados em bits for(j = 0 ; j < 8 ; j++){ @@ -25,7 +25,7 @@ void SubMessage::setParity(){ // Soma os bits verticalmente for(j = 0 ; j < 8 ; j++){ bitsParity[j] = 0; - for(i = 0 ; i < this->getSize() ; i++){ + for(i = 0 ; i < getSize() ; i++){ bitsParity[j] = bitsParity[j] + bitsMessage[i][j]; } // Caso a soma vertical de uma coluna for par, bitsParity recebe 1, @@ -38,7 +38,12 @@ void SubMessage::setParity(){ // Atribui os bits para parity (variável de paridade do objeto) parity = (parity << 1) | bitsParity[j]; } - + for(i = 0 ; i < getSize() ; i++){ + if(bitsMessage[i]){ + delete(bitsMessage[i]); + } + } + delete(bitsMessage); } void SubMessage::setSizSeqTyp(int size, int seq, int type){ @@ -65,6 +70,10 @@ void SubMessage::setData(unsigned char* dataBody, int type, int seq){ setParity(); } +void SubMessage::deleteData(){ + data = (unsigned char*)realloc(data, sizeof(unsigned char)); +} + void SubMessage::setStartMessage(){ startMessage = 0x7E; } @@ -132,20 +141,26 @@ int SubMessage::checkParity(){ int i, j, bitsParity[8]; unsigned char parityTest; +cout << "AQUI" << endl; // Alocação da matriz de bits - bitsMessage = new int*[this->getSize()]; - for(i = 0 ; i < this->getSize() ; i++){ +cout << "this-getSize = " << getSize() << endl; +// bitsMessage = (int**) malloc(sizeof(int*)*getSize()); + bitsMessage = new int*[getSize()]; + //bitsMessage = (int**) realloc(bitsMessage,sizeof(int*)*getSize()); +cout << "AQUI2" << endl; + for(i = 0 ; i < getSize() ; i++){ bitsMessage[i] = new int[8]; // Divide os dados em bits for(j = 0 ; j < 8 ; j++){ bitsMessage[i][j] = ((data[i] >> (7-j)) & 0x01); } } +cout << "AQUI 3" << endl; // Soma os bits verticalmente for(j = 0 ; j < 8 ; j++){ bitsParity[j] = 0; - for(i = 0 ; i < this->getSize() ; i++){ + for(i = 0 ; i < getSize() ; i++){ bitsParity[j] = bitsParity[j] + bitsMessage[i][j]; } // Caso a soma vertical de uma coluna for par, bitsParity recebe 1, @@ -158,6 +173,12 @@ int SubMessage::checkParity(){ // Atribui os bits para parity (variável de paridade do objeto) parityTest = (parityTest << 1) | bitsParity[j]; } + for(i = 0 ; i < getSize() ; i++){ + if(bitsMessage[i]){ + delete(bitsMessage[i]); + } + } + delete(bitsMessage); if (parityTest == parity){ return 0; }else{