IvoSilva

[RCOM] Final

Oct 30th, 2014
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 27.12 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <signal.h>
  7. #include <termios.h>
  8. #include <sys/stat.h>
  9. #include <sys/types.h>
  10. #include <sys/ioctl.h>
  11.  
  12. // Variáveis de configuração
  13.  
  14. #define BAUDRATE B38400
  15. #define MODEMDEVICE "/dev/ttyS"
  16. #define RECEIVER 0
  17. #define TRANSMITTER 1
  18. #define alarm_timeout 3
  19. #define numTransmissions 2
  20. #define filename "pinguim.gif"
  21. #define packetsize 100
  22.  
  23. // Variáveis de mensagem
  24.  
  25. #define F 0x7e
  26. #define A 0x03
  27. #define S 0x03
  28. #define U 0x07
  29.  
  30. #define I0 0x00
  31. #define I1 0x40
  32.  
  33. #define RR0 0x05
  34. #define RR1 0x85
  35.  
  36. #define REJ0 0x01
  37. #define REJ1 0x81
  38.  
  39. #define DISC 0x0B
  40.  
  41.  
  42. // Variáveis globais
  43.  
  44. int time_flag, counter = 0;
  45. struct termios oldtio;
  46.  
  47. typedef struct
  48. {
  49.     long int filesize, position;
  50.     char *filepath;
  51.     char *filedata;
  52. } imageFile;
  53.  
  54. imageFile ficheiro_de_imagem;
  55.  
  56. typedef struct
  57. {
  58.     int dataSeq, packetSize;
  59.     char tramaSeq;
  60. } dataConnection;
  61.  
  62. dataConnection dataHandler;
  63.  
  64. // Funções
  65.  
  66. void atende()
  67. {
  68.     time_flag = 1;
  69.     counter++;
  70. }
  71.  
  72. void printBar (char symbol)
  73. {
  74.     int i;
  75.     struct winsize w;
  76.  
  77.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  78.  
  79.     for (i = 0; i < w.ws_col; i++)
  80.         printf ("%c", symbol);
  81. }
  82.  
  83. void printm (char *string, int adjust)
  84. {
  85.     int i;
  86.     struct winsize w;
  87.  
  88.     ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
  89.  
  90.     for (i = 0; i < (w.ws_col / 2) - (strlen(string) / 2) + adjust ; i++)
  91.         printf (" ");
  92.    
  93.     printf ("%s", string);
  94. }
  95.  
  96. char * performStuffing(char *buffer, int length, int *destLength)
  97. {
  98.     char *stuffed = malloc(length * 2 * sizeof(char));  //  Worse case scenario!
  99.  
  100.     int i = 0, j = 0;
  101.  
  102.     for (; i < length; i++) {
  103.  
  104.         if (buffer[i] == 0x7e) {
  105.  
  106.             stuffed[j++] = 0x7d;
  107.             stuffed[j++] = 0x5e;
  108.  
  109.         } else if (buffer[i] == 0x7d) {
  110.  
  111.             stuffed[j++] = 0x7d;
  112.             stuffed[j++] = 0x5d;
  113.  
  114.         } else
  115.             stuffed[j++] = buffer[i];
  116.  
  117.     }
  118.  
  119.     (* destLength) = j;
  120.  
  121.     return stuffed;
  122. }
  123.  
  124. char * performDestuffing(char *buffer, int length, int *destLength)
  125. {
  126.     char *destuffed = malloc(length * sizeof(char));    //  Worse case scenario!
  127.    
  128.     int i = 0, j = 0;
  129.    
  130.     for (; i < length; i++, j++)
  131.     {
  132.        
  133.         if (buffer[i] == 0x7d)
  134.         {
  135.            
  136.             if (buffer[i + 1] == 0x5e)
  137.             {
  138.                
  139.                 destuffed[j] = 0x7e;
  140.                
  141.                 i++;
  142.                
  143.             }
  144.             else if (buffer[i + 1] == 0x5d) {
  145.                
  146.                 destuffed[j] = 0x7d;
  147.                
  148.                 i++;
  149.                
  150.             } else
  151.                 destuffed[j] = 0x7d;
  152.                
  153.         } else
  154.             destuffed[j] = buffer[i];
  155.        
  156.     }
  157.    
  158.     (* destLength) = j;
  159.    
  160.     return destuffed;
  161. }
  162.  
  163. char *getDataSeq (char *total_buffer, int total_size, int seq, int *new_size)
  164. {
  165.     int i, j, start;
  166.     char *buffer;
  167.  
  168.     if ((seq + 1) * packetsize > ficheiro_de_imagem.filesize)
  169.         *new_size = ficheiro_de_imagem.filesize - seq * packetsize;
  170.     else
  171.         *new_size = (seq + 1) * packetsize;
  172.  
  173.     buffer = (char *) malloc (sizeof(char) * packetsize);
  174.  
  175.     if (seq == 0)
  176.         start = 0;
  177.     else
  178.         start = seq * packetsize - 1;
  179.  
  180.     for (j = 0, i = start; i < *new_size; i++, j++)
  181.         buffer[j] = total_buffer[i];
  182.  
  183.     return buffer;
  184. }
  185.  
  186. void create_information (char *buffer, int *buffer_size, char c, char *data, int data_size, char BCC2)
  187. {
  188.     int i;
  189.  
  190.     *buffer_size = data_size + 6;
  191.  
  192.     /*printm ("Data:", 0);
  193.     printf ("\n");
  194.     for (i = 0; i < data_size; i++)
  195.         printf ("%x |", data[i]);
  196.     printf ("\n");*/
  197.  
  198.     buffer[0] = F;
  199.     buffer[1] = A;
  200.     buffer[2] = c;
  201.     buffer[3] = buffer[1] ^ buffer[2];
  202.  
  203.     for (i = 0; i < data_size; i++)
  204.         buffer[i + 4] = data[i];
  205.  
  206.     if (BCC2 != NULL)
  207.     {
  208.         buffer[data_size + 4] = BCC2;
  209.         buffer[data_size + 5] = F;
  210.     }
  211.     else
  212.     {
  213.         buffer[data_size + 4] = F;
  214.         *buffer_size--;
  215.     }
  216.  
  217.     buffer = performStuffing(buffer, buffer_size, &buffer_size);
  218.  
  219.     /*printm ("Information:", 0);
  220.     printf ("\n");
  221.     for (i = 0; i < *buffer_size; i++)
  222.         printf ("%x |", buffer[i]);
  223.     printf ("\n");*/
  224. }
  225.  
  226. unsigned char create_control_packet (char *buffer, int *buffer_size , int c, char *file_name, int filesize)
  227. {
  228.     int i;
  229.     unsigned char BCC2;
  230.  
  231.     *buffer_size = strlen(file_name) + 6;
  232.  
  233.     buffer[0] = (char) c;
  234.  
  235.     buffer[1] = (char) 0;
  236.     buffer[2] = (char) sizeof ((char) filesize);
  237.     buffer[3] = (char) filesize;
  238.  
  239.     buffer[4] = (char) 1;
  240.     buffer[5] = (char) sizeof (file_name);
  241.     for (i = 0; i < strlen(file_name); i++)
  242.         buffer[i + 6] = (char) file_name[i];
  243.  
  244.     BCC2 = buffer[0];
  245.     for (i = 1; i < strlen(file_name) + 6; i++)
  246.         BCC2 ^= buffer[i];
  247.  
  248.     return BCC2;
  249. }
  250.  
  251. // BCC2 = create_data_packet (Nova mensagem, tamanho, N, data, tamanho da data)
  252. unsigned char create_data_packet (char *buffer, int *buffer_size, int n, char *file_data, int datasize)
  253. {
  254.     char BCC2;
  255.     int i, L2 = (int) (packetsize * 8 / 256), L1 = (int) (packetsize * 8) - L2 * 256;
  256.  
  257.     *buffer_size = datasize + 4;
  258.  
  259.     buffer[0] = (char) 1;
  260.     buffer[1] = (char) n;  
  261.  
  262.     buffer[2] = (char) L2;
  263.     buffer[3]= (char) L1;
  264.  
  265.     for(i = 0; i < datasize; i++)
  266.         buffer[4+i] = file_data[i];
  267.  
  268.     BCC2 = buffer[0];
  269.     for (i = 1; i < *buffer_size; i++)
  270.         BCC2 ^= buffer[i];
  271.  
  272.     return BCC2;
  273. }
  274.  
  275. int menu ()
  276. {
  277.     int op = 0;
  278.  
  279.     system ("clear");
  280.     printBar ('*');
  281.     printm ("Programa iniciado!", 0);
  282.     printf ("\n\n\n");
  283.     printm ("Menu (escolher função do programa):", 0);
  284.     printf ("\n");
  285.     printm ("1. Emissor (llwrite).", 0);
  286.     printf ("\n");
  287.     printm ("2. Receptor (llread).", 0);
  288.     printf ("\n");
  289.     printm ("3. Sair.", 0);
  290.     printf ("\n\n");
  291.     printm ("Opcao: ", 0);
  292.     scanf ("%d", &op);
  293.  
  294.     return op;
  295. }
  296.  
  297. void sair ()
  298. {
  299.     system ("clear");
  300.  
  301.     printBar ('*');
  302.     printm ("Programa a encerrar...", 0);
  303.     printf ("\n");
  304.     printBar ('*');
  305.     sleep (1);
  306. }
  307.  
  308. char read_control_packet (int fd, char BCC2, char *auxFilepath, int *auxFilepathsize, int *auxFilesize)
  309. {  
  310.     char bit_received, auxFile[30], received_message[255];
  311.     int state = 0, i, res, count = 0;
  312.  
  313.     while (state < 6)
  314.     {
  315.         res = read (fd, &bit_received, 1);
  316.         if(res == -1)
  317.             return NULL;
  318.  
  319.         switch (state)
  320.         {
  321.                 case 0:
  322.                     if (bit_received == 0)
  323.                     {
  324.                         received_message[count] = bit_received;
  325.                         state++;
  326.                         count++;
  327.                     }
  328.                     else
  329.                         return NULL;
  330.                     break;
  331.  
  332.                 case 1:
  333.                     received_message[count] = bit_received;
  334.                     state++;
  335.                     count++;
  336.                     break;
  337.  
  338.                 case 2:
  339.                     auxFile[0] = bit_received;
  340.                     received_message[count++] = bit_received;
  341.                     for(i = 1; i < received_message[state--]; i++, count++)
  342.                     {
  343.                         res = read (fd, &bit_received, 1);
  344.                         if(res == -1)
  345.                             return NULL;
  346.  
  347.                         auxFile[i] = bit_received;
  348.                         received_message[count] = bit_received;
  349.                     }
  350.  
  351.                     *auxFilesize = (int) auxFile;
  352.                     //ficheiro_de_imagem.filesize = (int) auxFile; // Isto tem de ser no llread() caso a mensagem esteja correcta.
  353.  
  354.                     state++;
  355.                     count++;
  356.                     break;
  357.  
  358.                 case 3:
  359.                     if (bit_received == 1)
  360.                     {
  361.                         received_message[count] = bit_received;
  362.                         state++;
  363.                         count++;
  364.                     }
  365.                     else
  366.                         return NULL;
  367.                     break;
  368.                    
  369.                 case 4:
  370.                     received_message[count] = bit_received;
  371.                     state++;
  372.                     count++;
  373.                     break;
  374.  
  375.                 case 5:
  376.                     auxFile[0] = bit_received;
  377.                     received_message[count++] = bit_received;
  378.                     for(i = 1; i < received_message[state--]; i++, count++)
  379.                     {
  380.                         res = read (fd, &bit_received, 1);
  381.                         if(res == -1)
  382.                             return NULL;
  383.  
  384.                         auxFile[i] = bit_received;
  385.                         received_message[count] = bit_received;
  386.                     }
  387.  
  388.                     // Isto tem de ser no llread() caso a mensagem esteja correcta.
  389.                     //ficheiro_de_imagem.filepath = (long int) malloc (received_message[state--]);
  390.                     *auxFilepathsize = received_message[state--];
  391.                     /*for (i = 0; i < *auxFilepathsize; i++)
  392.                         ficheiro_de_imagem.filepath[i] = auxFile[i];*/
  393.  
  394.                     state++;
  395.                     count++;
  396.                     break;
  397.  
  398.                 default:
  399.                     break;
  400.         }
  401.     }
  402.  
  403.     for (i = 0; i < count; i++)
  404.         BCC2 ^= received_message[i];
  405.  
  406.     return BCC2;
  407. }
  408.  
  409. char read_data_packet (int fd, char BCC2, char *data)
  410. {
  411.     int i, count = 0, state = 0, res;
  412.     char received_message[255], bit_received, auxFile[255];
  413.  
  414.     while (state < 4)
  415.     {
  416.         res = read (fd, &bit_received, 1);
  417.         if(res == -1)
  418.             return NULL;
  419.  
  420.         switch (state)
  421.         {
  422.             case 0:
  423.                 received_message[count] = bit_received;
  424.                 dataHandler.dataSeq = (int) bit_received;
  425.                 state++;
  426.                 count++;
  427.                 break;
  428.            
  429.             case 1:
  430.                 received_message[count] = bit_received;
  431.                 state++;
  432.                 count++;
  433.                 break;
  434.  
  435.             case 2:
  436.                 received_message[count] = bit_received;
  437.                 dataHandler.packetSize = (int) (256 * (int) received_message[count - 1] + (int) received_message[count]);
  438.                 state++;
  439.                 count++;
  440.                 break;
  441.  
  442.             case 3:
  443.                 auxFile[0] = bit_received;
  444.                 received_message[count++] = bit_received;
  445.                 for(i = 1; i < dataHandler.packetSize; i++, count++)
  446.                 {
  447.                     res = read (fd, &bit_received, 1);
  448.                     if(res == -1)
  449.                         return NULL;
  450.  
  451.                     auxFile[i] = bit_received;
  452.                     received_message[count] = bit_received;
  453.                 }
  454.  
  455.                 /*ficheiro_de_imagem->filedata = (char *) malloc (sizeof(char) * dataHandler->packetSize);
  456.                 for (i = 0; i < received_message[state--]; i++)
  457.                     ficheiro_de_imagem->filedata[i] = auxFile[i];*/
  458.  
  459.                 state++;
  460.                 count++;
  461.                 break;
  462.         }
  463.     }
  464.     for (i = 0; i < count; i++)
  465.         BCC2 ^= received_message[i];
  466.  
  467.     data = (char *) malloc (sizeof(char) * dataHandler.packetSize);
  468.     for(i = 0; i < dataHandler.packetSize; i++)
  469.         data[i] = auxFile[i];
  470.  
  471.     return BCC2;
  472. }
  473.  
  474. void main (int argc, char** argv)
  475. {
  476.     int op = 0, fd, filesize;
  477.     char *buffer = NULL;
  478.  
  479.     while (op != 3)
  480.     {
  481.         op = menu();
  482.         switch (op)
  483.         {
  484.             case 1:
  485.                 fd = llopen (0, TRANSMITTER);
  486.                 if (fd != -1)
  487.                 {
  488.                     //filesize = myWrite (buffer);
  489.                     llwrite(fd, buffer, filesize);
  490.                 }
  491.                 break;
  492.             case 2:
  493.                 fd = llopen (0, RECEIVER);
  494.                 llread(fd, buffer);
  495.                 //saveToFile(buffer);
  496.                 break;
  497.             case 3:
  498.                 llclose (fd);
  499.                 sair();
  500.                 break;
  501.             default:
  502.                 break;
  503.         }
  504.     }  
  505. }
  506.  
  507. int llopen (int porta, int flag)
  508. {
  509.     /* -----    Variáveis  ----- */
  510.  
  511.     unsigned char send_message[5], receive_message[5], bit_received;
  512.     char buffer[1], gate[10] = MODEMDEVICE;
  513.     int vtime, fd, res[2], return_value, i;
  514.     unsigned int msg_sent = 0, state;
  515.     struct termios newtio;
  516.  
  517.     /* -----    Código     ----- */
  518.  
  519.     sprintf (buffer, "%d", porta);
  520.     strcat (gate, buffer);
  521.  
  522.     system ("clear");
  523.  
  524.     printBar ('*');
  525.     printm ("Função \"llopen(", -7);
  526.     printf ("%d, %d)\" iniciada!\n", porta, flag);
  527.  
  528.     if (flag == TRANSMITTER)
  529.     {
  530.         send_message[0] = F;
  531.         send_message[1] = A;
  532.         send_message[2] = S;
  533.         send_message[3] = send_message[1] ^ send_message[2];
  534.         send_message[4] = F;
  535.  
  536.         vtime = 3;
  537.  
  538.         fd = open(gate, O_RDWR | O_NOCTTY | O_NONBLOCK);
  539.     }
  540.     else if (flag == RECEIVER)
  541.     {
  542.         send_message[0] = F;
  543.         send_message[1] = A;
  544.         send_message[2] = U;
  545.         send_message[3] = send_message[1] ^ send_message[2];
  546.         send_message[4] = F;
  547.  
  548.         vtime = 0;
  549.  
  550.         fd = open(gate, O_RDWR | O_NOCTTY);
  551.     }
  552.     else
  553.         return -1;
  554.  
  555.     if (fd < 0)
  556.             return -1;
  557.  
  558.     // Teste ao apontador para o Pipe.
  559.  
  560.     if (tcgetattr (fd, &oldtio) == -1)
  561.     {
  562.         perror ("tcgetattr");
  563.         return -1;
  564.     }
  565.  
  566.     // Configuração da ligação.
  567.  
  568.     bzero(&newtio, sizeof(newtio));
  569.     newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
  570.     newtio.c_iflag = IGNPAR;
  571.     newtio.c_oflag = 0;
  572.  
  573.     /* set input mode (non-canonical, no echo,...) */
  574.     newtio.c_lflag = 0;
  575.  
  576.     newtio.c_cc[VTIME]    = vtime;   /* inter-character timer unused */
  577.     newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */
  578.  
  579.     /* VTIME e VMIN devem ser alterados de forma a proteger com um temporizador a leitura do(s) próximo(s) caracter(es) */
  580.  
  581.     tcflush(fd, TCIOFLUSH);
  582.     if (tcsetattr (fd, TCSANOW, &newtio) == -1)
  583.     {
  584.         perror ("tcsetattr");
  585.         return -1;
  586.     }
  587.  
  588.     (void) signal(SIGALRM, atende);
  589.  
  590.     if (flag == TRANSMITTER)
  591.     {
  592.         for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions && msg_sent != 1;)
  593.         {
  594.             if (time_flag)
  595.             {
  596.                 alarm (alarm_timeout);
  597.                 time_flag = 0;
  598.            
  599.                 printm ("A enviar SETUP: tentativa #", -1);
  600.                 printf ("%d\n", counter + 1);
  601.  
  602.                 res[0] = write (fd, send_message, 5);
  603.  
  604.                 while (state < 5)
  605.                 {
  606.                     res[1] = read (fd, &bit_received, 1);
  607.                     if(res[1] == -1)
  608.                         break;
  609.  
  610.                     switch (state)
  611.                     {
  612.                         case 0:
  613.                           if (bit_received == F)
  614.                           {
  615.                             receive_message[state]=bit_received;
  616.                             state++;
  617.                           }
  618.                           break;
  619.  
  620.                         case 1:
  621.                           if (bit_received == A)
  622.                           {
  623.                             receive_message[state]=bit_received;
  624.                             state++;
  625.                           }
  626.                           else if (bit_received != A && bit_received !=F)
  627.                             state--;
  628.                           break;
  629.                  
  630.                         case 2:
  631.                           if (bit_received == U)
  632.                           {
  633.                             receive_message[state]=bit_received;
  634.                             state++;
  635.                           }
  636.                           else if (bit_received == F)
  637.                             state--;
  638.                           else
  639.                             state = 0;
  640.                           break;
  641.  
  642.                         case 3:
  643.                           if (bit_received == (A^U))
  644.                           {
  645.                             receive_message[state]=bit_received;
  646.                             state++;
  647.                           }
  648.                           else
  649.                             state = 0;
  650.                           break;
  651.  
  652.                         case 4:
  653.                           if (bit_received == F)
  654.                           {
  655.                             receive_message[state]=bit_received;
  656.                             state++;
  657.                             msg_sent = 1;
  658.                           }
  659.                           else
  660.                             state = 0;
  661.                           break;
  662.  
  663.                         default:
  664.                             break;
  665.                     }
  666.                 }
  667.             }
  668.         }
  669.  
  670.         if (msg_sent == 0)
  671.         {
  672.             printm ("Mensagem não enviada (não recebeu UA).", +3);
  673.             printf ("\n");
  674.             return_value = -1;
  675.         }
  676.         else
  677.         {
  678.             printm ("Mensagem enviada (recebeu UA).", 0);
  679.             printf ("\n");
  680.             printm ("Mensagem UA:", 0);
  681.             printf ("\n");
  682.             printm (" ", -5);
  683.             for(i = 0; i < state; i++)
  684.                 printf("%x", receive_message[i]);
  685.             printf ("\n");
  686.             return_value = fd;
  687.         }
  688.     }
  689.     else if (flag == RECEIVER)
  690.     {
  691.         state = 0;
  692.         while (state < 5)
  693.         {
  694.             res[1] = read (fd, &bit_received, 1);
  695.  
  696.             switch (state)
  697.             {
  698.                     case 0:
  699.                             if (bit_received == F)
  700.                             {
  701.                                     receive_message[state] = bit_received;
  702.                                     state++;
  703.                             }
  704.                             break;
  705.                     case 1:
  706.                             if (bit_received == A)
  707.                             {
  708.                                     receive_message[state] = bit_received;
  709.                                     state++;
  710.                             }
  711.                             else if (bit_received != F && bit_received != A)
  712.                                     state--;
  713.                             break;
  714.                     case 2:
  715.                             if (bit_received == S)
  716.                             {
  717.                                     receive_message[state] = bit_received;
  718.                                     state++;
  719.                             }
  720.                             else if (bit_received == F)
  721.                                     state--;
  722.                             else
  723.                                     state = 0;
  724.                             break;
  725.                     case 3:
  726.                             if (bit_received == (A ^ S))
  727.                             {
  728.                                     receive_message[state] = bit_received;
  729.                                     state++;
  730.                             }
  731.                             else if (bit_received == F)
  732.                                     state = 1;
  733.                             else
  734.                                     state = 0;
  735.                             break;
  736.                     case 4:
  737.                             if (bit_received == F)
  738.                             {
  739.                                     receive_message[state] = bit_received;
  740.                                     state++;
  741.                                     msg_sent = 1;
  742.                             }
  743.                             else
  744.                                     state = 0;
  745.                             break;
  746.                     default:
  747.                         break;
  748.             }
  749.         }
  750.        
  751.         if (msg_sent == 0)
  752.         {
  753.             printm ("Mensagem não enviada (não recebeu SETUP).", +3);
  754.             printf ("\n");
  755.             return_value = -1;
  756.         }
  757.         else
  758.         {
  759.             printm ("Mensagem enviada (recebeu SETUP).", 0);
  760.             printf ("\n");
  761.             printm ("Mensagem SETUP:", 0);
  762.             printf ("\n");
  763.             printm (" ", -5);
  764.             for(i = 0; i < state; i++)
  765.                 printf("%x", receive_message[i]);
  766.             printf ("\n");
  767.  
  768.             res[0] = write(fd, send_message, 5);
  769.             /*if (!res[0])
  770.                 printf("Mensagem (UA) não enviada.\n");
  771.             else
  772.                 printf("%d bytes (UA) enviados.\n", res[0]);*/
  773.  
  774.             return_value = fd;
  775.         }
  776.     }
  777.  
  778.     printf ("\n\n");
  779.     printm ("Função \"llopen(", -7);
  780.     printf ("%d, %d)\" a fechar!\n", porta, flag);
  781.     printm ("Clique numa tecla para voltar ao menu.", 0);
  782.     printf ("\n");
  783.     printBar ('*');
  784.     getchar();
  785.     getchar();
  786.  
  787.     return return_value;
  788. }
  789.  
  790. int llwrite (int fd, char * buffer, int length)
  791. {
  792.     char *cntrl_message, *new_message, *data_message, *message, *message_received, bit_received, auxCntrl;
  793.     unsigned char BCC2;
  794.     int file_found = 1, i, j, cntrl_size, message_size, msg_error = 0, state, res, buffer_size, denied = 0, new_message_size;
  795.     FILE *pImg;
  796.  
  797.     while (file_found)
  798.     {
  799.         system ("clear");
  800.         printBar ('*');
  801.         printm ("Nome do ficheiro a usar: pinguim.gif", 0);
  802.         printf ("\n");
  803.         printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  804.         printf ("\n\n\n");
  805.  
  806.         pImg = fopen (filename, "r");
  807.         if (pImg == NULL)
  808.         {
  809.             printm ("Ficheiro não encontrado.", 0);
  810.             printf ("\n");
  811.             printm ("(certifique-se que o ficheiro está na pasta do programa)", 0);
  812.             printf ("\n");
  813.             printm ("Clique <Enter> para voltar a tentar.", 0);
  814.             getchar ();
  815.         }
  816.         else
  817.         {
  818.             file_found = 0;
  819.             printm ("Ficheiro encontrado.", 0);
  820.             printf ("\n");
  821.             printm ("Clique <Enter> para continuar.", 0);
  822.             getchar ();
  823.         }
  824.     }
  825.  
  826.     // Leitura do conteúdo da imagem para variável "buffer"
  827.     fseek (pImg, 0, SEEK_END);
  828.     length = ftell (pImg);
  829.     fseek (pImg, 0, SEEK_SET);
  830.  
  831.     buffer = (char *) malloc (sizeof(char) * length);
  832.  
  833.     for (i = 0; i < length; i++)
  834.         buffer[i] = getc(pImg);
  835.  
  836.     fclose (pImg);
  837.     // Leitura do conteúdo da imagem para variável "buffer"
  838.  
  839.     // Primeira mensagem a enviar: Pacote de controlo (start)
  840.     cntrl_message = (char *) malloc (sizeof(char) * (strlen(filename) + 6));
  841.     BCC2 = create_control_packet (cntrl_message, &cntrl_size, 2, filename, length);
  842.    
  843.     message = (char *) malloc (sizeof(char) * (cntrl_size + 6));
  844.     create_information (message, &message_size, I0, cntrl_message, cntrl_size, BCC2);
  845.  
  846.     dataHandler.dataSeq = 0;
  847.     // Primeira mensagem a enviar: Pacote de controlo (start)
  848.  
  849.     // Leitura de verificação
  850.     for (time_flag = 1, state = 0, counter = 0; counter < numTransmissions;)
  851.     {
  852.         if (time_flag)
  853.         {
  854.             alarm (alarm_timeout);
  855.             time_flag = 0;
  856.  
  857.             res = write (fd, message, message_size); // envio do pacote de controlo
  858.             if (res != -1)
  859.                 denied = 0;
  860.            
  861.             while (state < 6 || denied != 1)
  862.             {
  863.                 res = read (fd, &bit_received, 1);
  864.                 if(res == -1)
  865.                     break;
  866.  
  867.                 switch (state)
  868.                 {
  869.                     case 0:
  870.                         if (bit_received == F)
  871.                             state++;
  872.                         else
  873.                             denied = 1;
  874.  
  875.                         break;
  876.  
  877.                     case 1:
  878.                         if (bit_received == A)
  879.                             state++;
  880.                         else
  881.                             denied = 1;
  882.  
  883.                         break;
  884.  
  885.                     case 2:
  886.                         auxCntrl = bit_received;
  887.                         state++;
  888.                         break;
  889.  
  890.                     case 3:
  891.                         if (bit_received == auxCntrl ^ A)
  892.                             state++;
  893.                         else
  894.                             denied = 1;
  895.  
  896.                         break;
  897.  
  898.                     case 4:
  899.                         if (bit_received == F)
  900.                             state++;
  901.                         else
  902.                             denied = 1;
  903.  
  904.                         break;
  905.  
  906.                     case 5://verificar rej, rr, disc
  907.                         if (auxCntrl == RR1 && dataHandler.tramaSeq == I0)
  908.                         {
  909.                             dataHandler.tramaSeq = I1;
  910.                             dataHandler.dataSeq++;
  911.  
  912.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  913.  
  914.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  915.  
  916.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  917.                            
  918.                         }
  919.                         else if(auxCntrl == RR1 && dataHandler.tramaSeq == I1)
  920.                         {
  921.                             denied = 1;
  922.                             break;
  923.                         }
  924.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I0)
  925.                         {
  926.                             denied = 1;
  927.                             break;
  928.                         }
  929.                         else if(auxCntrl == RR0 && dataHandler.tramaSeq == I1)
  930.                         {
  931.                             dataHandler.tramaSeq = I0;
  932.                             dataHandler.dataSeq++;
  933.                            
  934.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq, &new_message_size);
  935.  
  936.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq, data_message, new_message_size);
  937.  
  938.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  939.                         }
  940.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I0)
  941.                         {
  942.                             denied = 1;
  943.                             break;
  944.                         }
  945.                         else if(auxCntrl == REJ0 && dataHandler.tramaSeq == I1)
  946.                         {
  947.                             dataHandler.tramaSeq = I0;
  948.                            
  949.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  950.  
  951.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  952.  
  953.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  954.                         }
  955.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I0)
  956.                         {
  957.                             dataHandler.tramaSeq = I1;
  958.  
  959.                             data_message = getDataSeq (buffer, i, dataHandler.dataSeq - 1, &new_message_size);
  960.  
  961.                             BCC2 = create_data_packet (new_message, &message_size, dataHandler.dataSeq - 1, data_message, new_message_size);
  962.  
  963.                             create_information (message, &message_size, dataHandler.tramaSeq, new_message, new_message_size, BCC2);
  964.                         }
  965.                         else if(auxCntrl == REJ1 && dataHandler.tramaSeq == I1)
  966.                         {
  967.                             denied = 1;
  968.                             break;
  969.                         }
  970.                         else if(auxCntrl == DISC)
  971.                         {
  972.                             // --
  973.                         }
  974.  
  975.                 }
  976.             }
  977.         }
  978.     }  
  979.     // Leitura de verificação
  980.  
  981.     return length;
  982. }
  983.  
  984. /* ----- llread -----
  985. argumentos
  986.     fd: identificador da ligação de dados
  987.     buffer: array de caracteres recebidos
  988. retorno
  989.     comprimento do array (número de caracteres lidos)
  990.     valor negativo em caso de erro
  991. */
  992. int llread (int fd, char *buffer)
  993. {
  994.     char bit_received, *auxFilepath, BCC2, auxCntrl = I0, *msg, auxmsg[255], *data;
  995.     int msg_wanted = 0, state = 0, res, final = 0, i, j, denied = 1, auxFilesize, auxDatasize, auxFilepathsize, buffer_size;
  996.  
  997.     ficheiro_de_imagem.position = 0;
  998.     dataHandler.tramaSeq = I0;
  999.  
  1000.     while (auxCntrl != DISC)
  1001.     {
  1002.         i = 0;
  1003.         state = 0;
  1004.  
  1005.         read (fd, &bit_received, 1);
  1006.         if (bit_received == F)
  1007.         {
  1008.             auxmsg[i] = F;
  1009.             while (bit_received != F)
  1010.             {
  1011.                 read (fd, &bit_received, 1);
  1012.                 auxmsg[i++] = bit_received;
  1013.             }
  1014.             denied = 0;
  1015.             msg = performDestuffing (auxmsg, i, &i);
  1016.  
  1017.             for (j = 0; j < i; j++)
  1018.                 printf ("msg[%d]: %x\n", j, msg[j]);
  1019.             printf ("\n\n\n");
  1020.         }
  1021.  
  1022.         while (state < 8 && denied == 0)
  1023.         {
  1024.             switch (state)
  1025.             {
  1026.                     case 0:
  1027.                         if (msg[state] == F)
  1028.                             state++;
  1029.                         else
  1030.                             denied = 1;
  1031.  
  1032.                         break;
  1033.  
  1034.                     case 1:
  1035.                         if (msg[state] == A)
  1036.                             state++;
  1037.                         else
  1038.                             denied = 1;
  1039.  
  1040.                         break;
  1041.  
  1042.                     case 2:
  1043.                         if (msg[state] == dataHandler.tramaSeq)
  1044.                             msg_wanted = 1;
  1045.  
  1046.                         state++;
  1047.  
  1048.                         break;
  1049.  
  1050.                     case 3:
  1051.                         if (msg[state] == A ^ msg[state - 1])
  1052.                             state++;
  1053.                         else
  1054.                             denied = 1;
  1055.  
  1056.                         break;
  1057.  
  1058.                     case 4:
  1059.                         if (msg[state] == 1)
  1060.                         {
  1061.                             BCC2 = read_data_packet (fd, msg[state], data);
  1062.                             state++;
  1063.                         }
  1064.                         else if (msg[state] == 2)
  1065.                         {
  1066.                             BCC2 = read_control_packet (fd, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize);
  1067.                             state++;
  1068.                         }
  1069.                         else if (msg[state] == 3)
  1070.                         {
  1071.                             BCC2 = read_control_packet (fd, msg[state], auxFilepath, &auxFilepathsize, &auxFilesize);
  1072.                             state++;
  1073.                             final = 1;
  1074.                         }
  1075.                         else
  1076.                             denied = 1;
  1077.  
  1078.                         break;
  1079.  
  1080.                     case 5:
  1081.                         if (msg[state] == BCC2)
  1082.                             state++;
  1083.                         else
  1084.                             denied = 1;
  1085.  
  1086.                         break;
  1087.  
  1088.                     case 6:
  1089.                         if (msg[state] == F)
  1090.                             state++;
  1091.                         else
  1092.                             denied = 1;
  1093.  
  1094.                         break;
  1095.  
  1096.                     case 7:
  1097.                         if (msg_wanted && final == 0)
  1098.                         {
  1099.                             if (dataHandler.tramaSeq == I0)
  1100.                             {
  1101.                                 dataHandler.tramaSeq = I1;
  1102.                                 auxCntrl = RR1;
  1103.                             }
  1104.                             else if (dataHandler.tramaSeq == I1)
  1105.                             {
  1106.                                 dataHandler.tramaSeq = I0;
  1107.                                 auxCntrl = RR0;
  1108.                             }
  1109.  
  1110.                             // concatenar data ou guardar filepath e filesize
  1111.  
  1112.                             if (msg[4] == 1) // Concatenar data
  1113.                             {
  1114.                                 for (j = 0; j < auxDatasize; j++, ficheiro_de_imagem.position++)
  1115.                                     ficheiro_de_imagem.filedata[ficheiro_de_imagem.position] = data[j];
  1116.                             }
  1117.                             else if (msg[4] == 2 || msg[4] == 3)
  1118.                             {
  1119.                                 ficheiro_de_imagem.filepath = (char *) malloc (sizeof(char) * auxFilepathsize);
  1120.                                 for (j = 0; j < auxFilepathsize; j++)
  1121.                                     ficheiro_de_imagem.filepath[j] = auxFilepath[j];
  1122.  
  1123.                                 ficheiro_de_imagem.filesize = dataHandler.packetSize;
  1124.  
  1125.                                 ficheiro_de_imagem.filedata = (char *) malloc (sizeof(char) * ficheiro_de_imagem.filesize);
  1126.                             }
  1127.  
  1128.                         }
  1129.                         else if (msg_wanted && final == 1)
  1130.                         {
  1131.                             auxCntrl = DISC;
  1132.                         }
  1133.                         else if (!msg_wanted)
  1134.                         {
  1135.                             if (dataHandler.tramaSeq == I0)
  1136.                                 auxCntrl = REJ0;
  1137.                             else if (dataHandler.tramaSeq == I1)
  1138.                                 auxCntrl = REJ1;
  1139.                         }
  1140.  
  1141.                         buffer = (char *) malloc (sizeof(char) * 5);
  1142.                         create_information (buffer, &buffer_size, auxCntrl, NULL, 0, NULL);
  1143.                         write (fd, buffer, buffer_size);
  1144.  
  1145.                     default:
  1146.                         break;
  1147.  
  1148.             }
  1149.         }
  1150.     }
  1151.     /* --- */
  1152.  
  1153.     // Criação do ficheiro com data
  1154.     for (j = 0; j < ficheiro_de_imagem.filesize; j++)
  1155.         printf ("Byte[%d]: %x\n", j, ficheiro_de_imagem.filedata[j]);
  1156. }
  1157.  
  1158.  
  1159. int llclose (int fd)
  1160. {
  1161.     if (tcgetattr (fd, &oldtio) == -1)
  1162.     {
  1163.         perror ("tcgetattr");
  1164.         return -1;
  1165.     }
  1166.  
  1167.     close (fd);
  1168.  
  1169.     return 0;
  1170. }
Advertisement
Add Comment
Please, Sign In to add comment