From c9fb294709f78e04b5496ba1f8312d319f077b69 Mon Sep 17 00:00:00 2001
From: Vytor Calixto <vytorcalixto@gmail.com>
Date: Sat, 5 Dec 2015 19:28:35 -0200
Subject: [PATCH] Sending appropriate message

---
 Makefile     |  8 ++++----
 Message.cpp  | 26 ++++++++++++++++++++++----
 Protocol.cpp | 19 ++++++++++---------
 client.cpp   | 39 ++++++++++++++++++++-------------------
 server.cpp   |  3 ++-
 5 files changed, 58 insertions(+), 37 deletions(-)

diff --git a/Makefile b/Makefile
index a2a739a..b1472c1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CFLAGS= -w -g -Wall -O2
+CXXFLAGS= -w -g -Wall -O2 -std=c++11
 CC=g++
 
 OBJ=Protocol.o Message.o
@@ -6,10 +6,10 @@ OBJ=Protocol.o Message.o
 all: cacoclient cacoserver
 
 %.o: %.cpp
-	$(CC) $(CFLAGS) $^ -c -o $@
+	$(CC) $(CXXFLAGS) $^ -c -o $@
 cacoclient: client.cpp $(OBJ)
-	$(CC) $(CFLAGS) $^ -o $@
+	$(CC) $(CXXFLAGS) $^ -o $@
 cacoserver: server.cpp $(OBJ)
-	$(CC) $(CFLAGS) $^ -o $@
+	$(CC) $(CXXFLAGS) $^ -o $@
 clean:
 	rm -f *.o caco*
diff --git a/Message.cpp b/Message.cpp
index b2aaa19..4242225 100644
--- a/Message.cpp
+++ b/Message.cpp
@@ -20,26 +20,42 @@ bool Message::checkParity() {
 void Message::setBitFields(BYTE begin, BYTE sizeSeq, BYTE seqType, BYTE parity){
     //if the size of val passed in the bitset constructor is greater than the bitset size,
     // only the least significant bits of val are taken into consideration.
+    // cout << "Input:\t" << bitset<8>(sizeSeq) << "\t" << bitset<8>(seqType);
+    // cout << "Set bitFields:\t";
     this->begin = bitset<BEGIN_S>(begin);
     this->size = bitset<SIZE_S>(sizeSeq >> 2);
+    // cout << size << "\t";
     this->sequence = bitset<SEQUENCE_S>((sizeSeq << 4) | (seqType >> 4));
+    // cout << sequence << "\t";
     this->type = bitset<TYPE_S>(seqType);
+    // cout << type << endl;
     this->parity = bitset<PARITY_S>(parity);
 }
 
 vector<BYTE> Message::getBitFieldsAsBytes(){
     vector<BYTE> bitFields;
     bitFields.push_back((BYTE)begin.to_ulong());
-    bitFields.push_back((BYTE)size.to_ulong());
-    bitFields.push_back((BYTE)sequence.to_ulong());
-    bitFields.push_back((BYTE)type.to_ulong());
+    // bitFields.push_back((BYTE)size.to_ulong());
+    // bitFields.push_back((BYTE)sequence.to_ulong());
+    // bitFields.push_back((BYTE)type.to_ulong());
+    string str = size.to_string();
+    str += sequence.to_string();
+    str += type.to_string();
+    // cout << "str:" << str << "\t" << (BYTE)bitset<8>(str.substr(8,8)).to_ulong() << endl;
+    bitFields.push_back((BYTE)bitset<8>(str.substr(0,8)).to_ulong());
+    bitFields.push_back((BYTE)bitset<8>(str.substr(8,8)).to_ulong());
     bitFields.push_back((BYTE)parity.to_ulong());
     return bitFields;
 }
 
 vector<BYTE> Message::getMessage(){
     vector<BYTE> msg = getBitFieldsAsBytes();
-    msg.insert(msg.end()-2, data.begin(), data.end());
+    msg.insert(msg.end()-1, data.begin(), data.end());
+    // cout << "getMessage:\n";
+    // for(int i=0; i < msg.size(); ++i) {
+    //     cout << bitset<8>(msg[i]);
+    // }
+    // cout<<endl;
     return msg;
 }
 
@@ -75,10 +91,12 @@ int Message::getMessageSize(){
 
 ostream& operator<<(ostream& os, const Message& msg){
     os << '|' << msg.begin << '|' << msg.size << '|' << msg.sequence << '|' << msg.type << '|';
+    // os << msg.begin << msg.size << msg.sequence << msg.type;
     for(int i=0; i<msg.data.size(); ++i){
         os << bitset<8>(msg.data[i]);
     }
     os << '|' << msg.parity << '|';
+    // os << msg.parity;
     return os;
 }
 
diff --git a/Protocol.cpp b/Protocol.cpp
index 9fa9699..1acf851 100644
--- a/Protocol.cpp
+++ b/Protocol.cpp
@@ -12,14 +12,14 @@ void Protocol::setMessages(vector<Message> messages){
 
 bool Protocol::sendMessages(int socket, int window) {
     for(int i=0; i < messages.size(); ++i) {
-        cout << "message: " << messages[i] << endl;
+        // cout << "message: " << messages[i] << endl;
         vector<BYTE> message = messages[i].getMessage();
-        char* msg = reinterpret_cast<char*> (message.data());
-        cout << "char* msg: ";
-        for(int j=0;j<message.size();++j){
-            cout << bitset<8>(msg[j]);
-        }
-        cout <<endl;
+        unsigned char* msg = reinterpret_cast<unsigned char*> (message.data());
+        // cout << "char* msg: ";
+        // for(int j=0;j<message.size();++j){
+        //     cout << bitset<8>(msg[j]);
+        // }
+        // cout <<endl;
         send(socket, msg, messages[i].getMessageSize(), 0);
     }
     return true;
@@ -77,15 +77,16 @@ void Protocol::setData(vector<BYTE> data, int type){
 int Protocol::recvMessage(int sockt){
     BYTE dataRec[MAXSIZE+4];
     int r = recv(sockt, dataRec, MAXSIZE+4, 0);
-    cout << bitset<8>(dataRec[0]) << bitset<8>(dataRec[1]) << bitset<8>(dataRec[2]) << "|\t";
+    cout << bitset<8>(dataRec[0]) << "|" << bitset<8>(dataRec[1]) << "|" << bitset<8>(dataRec[2]) << "|" << bitset<8>(dataRec[3]) << "|\t";
     cout << "recv response: " << r << endl;
     if(dataRec[0] != BEGIN){
         return NOISE;
     }
     Message msg = Message();
     int size = (int)(dataRec[1]>>2);
+    cout << "Tamanho:" << size << "\t";
     msg.setBitFields(dataRec[0], dataRec[1], dataRec[2], dataRec[size+3]);
-    cout << "Sequence:" << msg.sequence.to_ulong() << endl;
+    cout << "Sequence:" << msg.sequence.to_ulong() << "\t";
     // FIXME: Erro na primeira mensagem de sequencialização
     // if(msg.sequence.to_ulong() != ((messages.back().sequence.to_ulong()+1)%(MAXSIZE+1))){
     //     return SEQ_MISS;
diff --git a/client.cpp b/client.cpp
index 1a3576a..e8eeb56 100644
--- a/client.cpp
+++ b/client.cpp
@@ -29,7 +29,9 @@ int main(){
             }else if(command == "ls"){
                 cout << ls(line);
             }else if(command == "cdr"){
-                //TODO
+                args = line.substr(pos+1, line.size());
+                protocol.setData(vector<BYTE>(args.begin(), args.end()), CD);
+                protocol.sendMessages(sockt, WAIT_STOP);
             }else if(command == "lsr"){
                 Message msg = Message();
                 line.replace(line.find("lsr"), string("lsr").length(), "ls");
@@ -52,24 +54,23 @@ int main(){
             cerr<<"Error: Esse comando requer argumentos."<<endl;
         }
 
-        int status = protocol.recvMessage(sockt);
-        cout << "Status: " << status << endl;
-        if(status > 0){
-            if(status == ENDTX){
-                protocol = Protocol();
-                //TODO: send ACK
-            }else if(status == CD){
-                cd(protocol.getDataAsString());
-            }else if(status == LS){
-                cout << "Recebeu LS\n";
-                string output = ls(protocol.getDataAsString());
-                //TODO: send output back
-            }else if(status == PUT){
-                //TODO
-            }else if(status == GET){
-                //TODO
-            }
-        }
+        // int status = protocol.recvMessage(sockt);
+        // cout << "Status: " << status << endl;
+        // if(status > 0){
+        //     if(status == ENDTX){
+        //         protocol = Protocol();
+        //         //TODO: send ACK
+        //     }else if(status == CD){
+        //         cd(protocol.getDataAsString());
+        //     }else if(status == LS){
+        //         string output = ls(protocol.getDataAsString());
+        //         //TODO: send output back
+        //     }else if(status == PUT){
+        //         //TODO
+        //     }else if(status == GET){
+        //         //TODO
+        //     }
+        // }
     }
     return 0;
 }
diff --git a/server.cpp b/server.cpp
index a3c177a..264c508 100644
--- a/server.cpp
+++ b/server.cpp
@@ -10,12 +10,13 @@ int main(){
     while(true){
         int status = protocol.recvMessage(sockt);
         cout << "status: " << status << endl;
-        cout << protocol.getDataAsString() << endl;
+        // cout << protocol.getDataAsString() << endl;
         if(status > 0){
             if(status == ENDTX){
                 protocol = Protocol();
                 //TODO: send ACK
             }else if(status == CD){
+                cout << "Recebeu CD\n";
                 cd(protocol.getDataAsString());
             }else if(status == LS){
                 cout << "Recebeu LS\n";
-- 
GitLab