From 7a6d2d21c972e54464690c689ec182f5f773af29 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Mon, 7 Dec 2015 02:25:35 -0200
Subject: [PATCH] Receive and transmit kinda working

---
 Protocol.cpp | 89 ++++++++++++++++++++++++++++++++++------------------
 Protocol.h   |  2 +-
 client.cpp   |  8 +++--
 3 files changed, 64 insertions(+), 35 deletions(-)

diff --git a/Protocol.cpp b/Protocol.cpp
index e96f14b..081fde2 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -131,7 +131,8 @@ void Protocol::transmit(int sockt, int window){
         status = response.recvMessage(sockt);
         cout << "transmit status:" << status << endl;
         if(status == NACK){
-            int nackIndex = stoi(getDataAsString());
+            printf("nstoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            int nackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < window; ++j) {
                 if(frame[j].index < nackIndex) {
                     frame.erase(frame.begin() + j);
@@ -143,7 +144,8 @@ void Protocol::transmit(int sockt, int window){
             response.reset();
 
         }else if(status == ACK){
-            int ackIndex = stoi(response.getMessages().back().getDataAsString());
+            printf("astoi %i\n", response.getMessages().back().getDataAsString()[0]);
+            int ackIndex = response.getMessages().back().getDataAsString()[0];
             for(int j=0; j < window; ++j) {
                 if(frame[j].index <= ackIndex) {
                     frame.erase(frame.begin() + j);
@@ -168,48 +170,73 @@ void Protocol::transmit(int sockt, int window){
     sendMessage(sockt,0);
 }
 
-void Protocol::receive(int sockt, int window){
-    int status, nextSequence;
+int Protocol::receive(int sockt, int type, int window, bool dataEndable){
+    int status, nextSequence = 0;
     vector<int> frame;
     Protocol response;
     bool shouldSend = false;
+    int end = ((dataEndable)? ENDTX : type);
     do{
         if(shouldSend){
             response.sendMessages(sockt);
+            response.reset();
+            shouldSend = false;
         }
         status = recvMessage(sockt);
+        cout << "receive status:" << status << endl;
         if(status == NOISE){
             continue;
-        }else if(response.getMessages().back().sequence.to_ulong() != nextSequence){
-            response.reset();
-            vector<BYTE> val(1,(BYTE)nextSequence);
-            response.setData(val, NACK);
-            shouldSend = true;
-        }
-        else if(status == OUTPUT) {
-            cout << messages.back().getDataAsString();
-
-            frame.push_back(messages.size());
-
-            response.reset();
-            vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
-            response.setData(val, ACK);
-            nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
-        }else if(status == ERROR){
+        } else if(status == type) {
+            if(messages.back().sequence.to_ulong() != nextSequence){
+                response.reset();
+                vector<BYTE> val(1,(BYTE)nextSequence);
+                response.setData(val, NACK);
+                shouldSend = true;
+            } else if(window == WAIT_STOP || ((nextSequence % SLIDING) == 0)) {
+                response.reset();
+                vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
+                response.setData(val, ACK);
+                nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
+            } else {
+                //TODO: treat something?
+            }
+        } else if(status == ERROR) {
             string str(messages.back().data.begin(), messages.back().data.end());
             cout << "ERROR: " << getDataAsString() << endl;
-            break;
-        }else if(status == INCONSISTENT){
-            response.reset();
-            vector<BYTE> val(1,(BYTE)nextSequence);
-            response.setData(val, NACK);
-            shouldSend = true;
-        }else{
-            //TODO: treat error
-            break;
+            return -1;
         }
-        shouldSend = shouldSend || (frame.size()%window == 0);
-    }while(status != ENDTX);
+
+        // else if(messages.back().sequence.to_ulong() != nextSequence){
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)nextSequence);
+        //     response.setData(val, NACK);
+        //     shouldSend = true;
+        // }
+        // else if(status == OUTPUT) {
+        //     cout << messages.back().getDataAsString();
+        //
+        //     frame.push_back(messages.size());
+        //
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)messages.back().sequence.to_ulong());
+        //     response.setData(val, ACK);
+        //     nextSequence = (messages.back().sequence.to_ulong()+1)%(MAXSIZE+1);
+        // }else if(status == ERROR){
+        //     string str(messages.back().data.begin(), messages.back().data.end());
+        //     cout << "ERROR: " << getDataAsString() << endl;
+        //     break;
+        // }else if(status == INCONSISTENT){
+        //     response.reset();
+        //     vector<BYTE> val(1,(BYTE)nextSequence);
+        //     response.setData(val, NACK);
+        //     shouldSend = true;
+        // }else{
+        //     //TODO: treat error
+        //     break;
+        // }
+        // shouldSend = shouldSend || (frame.size()%window == 0);
+    }while(status != end);
+    return 0;
 }
 
 void Protocol::addMessage(Message msg) {
diff --git a/Protocol.h b/Protocol.h
index 6577966..76bf29b 100644
--- a/Protocol.h
+++ b/Protocol.h
@@ -19,7 +19,7 @@ public:
     int recvMessage(int sockt);
     void addMessage(Message msg);
     void transmit(int sockt, int window);
-    void receive(int sockt, int window);
+    int receive(int sockt, int type, int window, bool dataEndable);
     void reset();
 
     Protocol();
diff --git a/client.cpp b/client.cpp
index 4d26113..2044d83 100644
--- a/client.cpp
+++ b/client.cpp
@@ -31,14 +31,16 @@ int main(){
             }else if(command == "cdr"){
                 args = line.substr(pos+1, line.size());
                 sendProtocol.setData(vector<BYTE>(args.begin(), args.end()), CD);
-                sendProtocol.transmit(sockt, WAIT_STOP);
+                sendProtocol.sendMessage(sockt, 0);
+                receiveProtocol.receive(sockt, OK, WAIT_STOP, false);
+                cout << "Diretório remoto: " << args;
             }else if(command == "lsr"){
                 line.replace(line.find("lsr"), string("lsr").length(), "ls");
                 sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), LS);
                 sendProtocol.sendMessage(sockt,0);
                 cout << "Remoto:" << endl;
-                receiveProtocol.receive(sockt, WAIT_STOP);
-                cout << endl;
+                receiveProtocol.receive(sockt, OUTPUT, WAIT_STOP, true);
+                cout << receiveProtocol.getDataAsString() << endl;
             }else if(command == "put"){
                 sendProtocol.setData(vector<BYTE>(line.begin(), line.end()), PUT);
                 sendProtocol.transmit(sockt, WAIT_STOP);
-- 
GitLab