IvoSilva

[RCOM - Final] Sender Functions

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