From 777d39ca73f8d9a500e620f4db38e6b6b2184fb1 Mon Sep 17 00:00:00 2001
From: Nico <nigr21@inf.ufpr.br>
Date: Sun, 26 Feb 2023 19:36:43 -0300
Subject: [PATCH] ahh

---
 63                |   0
 Adicionar         |   0
 Arrumar           |   0
 Demonstracao      |   0
 Enviar            |   0
 Janela            |   0
 Merge             |   0
 Readme            |   0
 headers/server.h  | 110 ++++++++++++++++++++++++++++++++++++++--------
 received/todo.txt |   0
 10 files changed, 91 insertions(+), 19 deletions(-)
 create mode 100644 63
 create mode 100644 Adicionar
 create mode 100644 Arrumar
 create mode 100644 Demonstracao
 create mode 100644 Enviar
 create mode 100644 Janela
 create mode 100644 Merge
 create mode 100644 Readme
 create mode 100644 received/todo.txt

diff --git a/63 b/63
new file mode 100644
index 0000000..e69de29
diff --git a/Adicionar b/Adicionar
new file mode 100644
index 0000000..e69de29
diff --git a/Arrumar b/Arrumar
new file mode 100644
index 0000000..e69de29
diff --git a/Demonstracao b/Demonstracao
new file mode 100644
index 0000000..e69de29
diff --git a/Enviar b/Enviar
new file mode 100644
index 0000000..e69de29
diff --git a/Janela b/Janela
new file mode 100644
index 0000000..e69de29
diff --git a/Merge b/Merge
new file mode 100644
index 0000000..e69de29
diff --git a/Readme b/Readme
new file mode 100644
index 0000000..e69de29
diff --git a/headers/server.h b/headers/server.h
index d45e9e6..07473d0 100644
--- a/headers/server.h
+++ b/headers/server.h
@@ -376,31 +376,103 @@ int server::receive_valid_frame(frame **f) {
   return 1;
 }
 
+queue<frames *> server::receive_frames_window(int lastSeq)
+{
+  queue<frames *> frames_queue;
+  frame *f;
+  retries = 0;
+
+  do {
+    f = receive_frame_socket();
+    if ( f == NULL ) { continue; }
+    
+    retries++;
+
+    int tipo = f->get_tipo();
+
+    // Primeiro frame a ser recebido, seta o tipo
+    if ( lastSeq == -1 ) 
+    {
+      // Ignora os frames perdidos na linha
+      if ( (tipo != MIDIA || tipo != TEXTO) && f->get_seq() != 0 ) {continue;}
+      tipoReceivingFrames = f->get_tipo();
+      frames_queue.push(f);
+      lastSeq = 0;
+      retries = 0;
+      continue; }
+
+    // Adiciona o frame de fim de transmissao
+    if ( f->get_tipo() == FIMT ) 
+    {
+      frames_queue.push(f);
+      return frames_queue;
+    }
+
+    // Ignora se o frame nao for do tipo midia e esteja recebendo midia
+    if ( f->get_tipo() == MIDIA && tipoReceivingFrames == MIDIA )
+    {
+      // Ignora se for um frame do tipo midia que nao e o segundo da sequencia
+      if ( lastSeq != 0 || (TAM_JANELA > 1 && f->get_seq() != 1)) { continue; }
+
+      // Se for o segundo frame do tipo midia, muda o tipo esperado
+      tipoReceivingFrames = DADOS;
+      frames_queue.push(f);
+      lastSeq = 1;
+      retries = 0;
+      continue;
+    }
+
+    // Recebe os frames de dados de um arquivo
+    if ( tipoReceivingFrames == DADOS && f->get_tipo() == DADOS )
+    {
+      if ( !verify_seq(f->get_seq(), lastSeq) ) { continue; }
+      frames_queue.push(f);
+      retries = 0;
+      continue;
+    }
+
+    // Recebe os frames de uma mensagem
+    if ( tipoReceivingFrames == TEXTO && f->get_tipo() == TEXTO )
+    {
+      if ( !verify_seq(f->get_seq(), lastSeq) ) { continue; }
+      frames_queue.push(f);
+      retries = 0;
+      continue;
+    }
+
+  } while ( (f == NULL && retries < NUM_RETRIES) || frames_queue.size() < TAM_JANELA );
+
+  return frames_queue;
+}
+
 void server::start_receveing_message() {
   int continueTransmission = 1;
 
   cout << "Recebendo frames\n";
   frame *f;
+  lastSeq = -1;
   do {
-    if (!receive_valid_frame(&f)) { return; }
-    if (!f) { return; }
-    int frameType = f->get_tipo();
-
-    switch (frameType) {
-    case TEXTO:
-      receive_text(f);
-      continueTransmission = 0;
-      break;
-
-    case MIDIA:
-      receive_midia(f);
-      continueTransmission = 0;
-      break;
-
-    default:
-      break;
-    }
-
+    queue<frames *> frames = receive_frames_window(lastSeq);
+
+//    if (!receive_valid_frame(&f)) { return; }
+//    if (!f) { return; }
+//    int frameType = f->get_tipo();
+//
+//    switch (frameType) {
+//    case TEXTO:
+//      receive_text(f);
+//      continueTransmission = 0;
+//      break;
+//
+//    case MIDIA:
+//      receive_midia(f);
+//      continueTransmission = 0;
+//      break;
+//
+//    default:
+//      break;
+//    }
+//
   } while (continueTransmission);
 }
 
diff --git a/received/todo.txt b/received/todo.txt
new file mode 100644
index 0000000..e69de29
-- 
GitLab