IvoSilva

[RCOM.c] Manipulação de mensagens

Nov 2nd, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.27 KB | None | 0 0
  1. #include "manipulation.h"
  2.  
  3. /* --- Stuffing --- */
  4.  
  5. unsigned char *Stuffing(unsigned char *Destuffed, unsigned short DestuffedSize, unsigned short *StuffedSize)
  6. {
  7.         int i, j;
  8.         unsigned char *Stuffed = malloc(DestuffedSize * 2 * sizeof(unsigned char));
  9.  
  10.         for (i = 0, j = 0; i < DestuffedSize; i++)
  11.             if (Destuffed[i] == 0x7e && i != 0 && i != DestuffedSize - 1)
  12.             {
  13.                 Stuffed[j++] = 0x7d;
  14.                 Stuffed[j++] = 0x5e;
  15.             }
  16.             else if (Destuffed[i] == 0x7d && i != 0 && i != DestuffedSize - 1)
  17.             {
  18.                 Stuffed[j++] = 0x7d;
  19.                 Stuffed[j++] = 0x5d;
  20.             }
  21.             else
  22.                 Stuffed[j++] = Destuffed[i];
  23.  
  24.         (*StuffedSize) = j;
  25.         Stuffed = (unsigned char *) realloc (Stuffed, *StuffedSize * sizeof(unsigned char));
  26.  
  27.         return Stuffed;
  28. }
  29.  
  30. /* --- Destuffing --- */
  31.  
  32. unsigned char *Destuffing(unsigned char *Stuffed, unsigned short StuffedSize, unsigned short *DestuffedSize)
  33. {
  34.         int i, j;
  35.         unsigned char *Destuffed = malloc(StuffedSize * sizeof(unsigned char));
  36.  
  37.         for (i = 0, j = 0; i < StuffedSize; i++, j++)
  38.             if (Stuffed[i] == 0x7d)
  39.                 if (Stuffed[i + 1] == 0x5e && i != 0 && i != StuffedSize - 1)
  40.                 {
  41.                     Destuffed[j] = 0x7e;
  42.                     i++;
  43.                 }
  44.                 else if (Stuffed[i + 1] == 0x5d && i != 0 && i != StuffedSize - 1)
  45.                 {
  46.                     Destuffed[j] = 0x7d;
  47.                     i++;
  48.                 }
  49.                 else
  50.                     Destuffed[j] = 0x7d;
  51.             else
  52.                 Destuffed[j] = Stuffed[i];
  53.  
  54.         (*DestuffedSize) = j;
  55.         Destuffed = (unsigned char *) realloc (Destuffed, *DestuffedSize * sizeof(unsigned char));
  56.  
  57.         return Destuffed;
  58. }
  59.  
  60. /* --- CreateDataPacket --- */
  61.  
  62. unsigned char *CreateDataPacket (DataStruct DataPacket, unsigned short *PacketSize, unsigned short CntrlField, unsigned short *BCC2)
  63. {
  64.     unsigned short L2 = DataPacket.DataSize / 256, L1 = DataPacket.DataSize % 256, i, counter = 0;
  65.  
  66.     *PacketSize = 4 + DataPacket.DataSize;
  67.  
  68.     unsigned char *DataString = malloc (sizeof(char) * (*PacketSize));
  69.  
  70.     DataString[counter] = (unsigned char) CntrlField;
  71.     *BCC2 = DataString[counter];
  72.     counter++;
  73.  
  74.     DataString[counter] = (unsigned char) DataPacket.SeqNumber;
  75.     *BCC2 ^= DataString[counter];
  76.     counter++;
  77.  
  78.     DataString[counter] = (unsigned char) L2;
  79.     *BCC2 ^= DataString[counter];
  80.     counter++;
  81.  
  82.     DataString[counter] = (unsigned char) L1;
  83.     *BCC2 ^= DataString[counter];
  84.     counter++;
  85.  
  86.     for (i = 0; i < DataPacket.DataSize; i++)
  87.     {
  88.         DataString[counter + i] = DataPacket.Data[i];
  89.         *BCC2 ^= DataString[counter + i];
  90.     }
  91.     counter += DataPacket.DataSize;
  92.  
  93.     return DataString ;
  94. }
  95.  
  96. /* --- ReadDataPacket --- */
  97.  
  98. signed short ReadDataPacket (DataStruct *DataPacket, unsigned char *DataString, unsigned short PacketSize)
  99. {
  100.     signed short BCC2;
  101.     unsigned short counter = 0, i;
  102.  
  103.     if (!DataString[counter])
  104.         return -1;
  105.     else
  106.     {
  107.         BCC2 = DataString[counter];
  108.         counter++;
  109.  
  110.         (*DataPacket).SeqNumber = DataString[counter];
  111.         printf ("0. SeqNumber: %lu\n", DataString[counter]);
  112.         printf ("SeqNumber: %lu\n", (*DataPacket).SeqNumber);
  113.         BCC2 ^= DataString[counter];
  114.         counter++;
  115.  
  116.         printf ("L2: %x\nL1: %x\n", DataString[counter], DataString[counter + 1]);
  117.  
  118.         (*DataPacket).DataSize = 256 * DataString[counter] + DataString[counter + 1]; // <---------------
  119.         printf ("DataSize: %lu\n", (*DataPacket).DataSize);
  120.         BCC2 ^= DataString[counter];
  121.         BCC2 ^= DataString[counter + 1];
  122.         counter += 2;
  123.  
  124.         (*DataPacket).Data = (unsigned char*) malloc (sizeof(char) * (*DataPacket).DataSize);
  125.  
  126.         for (i = 0; i < (*DataPacket).DataSize; i++)
  127.         {
  128.             (*DataPacket).Data[i] = DataString[counter + i];
  129.             BCC2 ^= DataString[counter + i];
  130.         }
  131.  
  132.     }
  133.  
  134.     return BCC2;
  135. }
  136.  
  137. /* --- CreateCntrlPacket --- */
  138.  
  139. unsigned char *CreateCntrlPacket (CntrlStruct CntrlPacket, unsigned short *PacketSize, unsigned short CntrlField, unsigned short *BCC2)
  140. {
  141.     unsigned short i, counter = 0;
  142.  
  143.     *PacketSize = 5 + CntrlPacket.Length[0] + CntrlPacket.Length[1];
  144.  
  145.     printf ("PacketSize: %hu\n", *PacketSize);
  146.  
  147.     unsigned char *CntrlString = malloc (sizeof(char) * (*PacketSize));
  148.  
  149.     CntrlString[counter] = (unsigned char) CntrlField;
  150.     *BCC2 = CntrlString[counter];
  151.     counter++;
  152.  
  153.     CntrlString[counter] = (unsigned char) CntrlPacket.Type[0];
  154.     *BCC2 ^= CntrlString[counter];
  155.     counter++;
  156.  
  157.     CntrlString[counter] = (unsigned char) CntrlPacket.Length[0];
  158.     *BCC2 ^= CntrlString[counter];
  159.     counter++;
  160.  
  161.     for (i = 0; i < CntrlPacket.Length[0]; i++)
  162.     {
  163.         CntrlString[counter + i] = CntrlPacket.FileSize[i];
  164.         *BCC2 ^= CntrlString[counter + i];
  165.     }
  166.     counter += CntrlPacket.Length[0];
  167.  
  168.     CntrlString[counter] = (unsigned char) CntrlPacket.Type[1];
  169.     *BCC2 ^= CntrlString[counter];
  170.     counter++;
  171.  
  172.     CntrlString[counter] = (unsigned char) CntrlPacket.Length[1];
  173.     *BCC2 ^= CntrlString[counter];
  174.     counter++;
  175.  
  176.     for (i = 0; i < CntrlPacket.Length[1]; i++)
  177.     {
  178.         CntrlString[counter + i] = CntrlPacket.Filename[i];
  179.         *BCC2 ^= CntrlString[counter + i];
  180.     }
  181.     counter += CntrlPacket.Length[1];
  182.  
  183.     return CntrlString;
  184. }
  185.  
  186. /* --- ReadCntrlPacket --- */
  187.  
  188. signed short ReadCntrlPacket (CntrlStruct *CntrlPacket, unsigned char *CntrlString, unsigned short PacketSize)
  189. {
  190.     signed short BCC2;
  191.     unsigned short counter = 0, i;
  192.  
  193.     if (CntrlString[counter] != 2 && CntrlString[counter] != 3)
  194.         return -1;
  195.     else
  196.     {
  197.         printf ("ReadCntrlPacket!\n");
  198.  
  199.  
  200.         BCC2 = CntrlString[counter];
  201.         counter++;
  202.  
  203.         (*CntrlPacket).Type[0] = CntrlString[counter];
  204.         BCC2 ^= CntrlString[counter];
  205.         counter++;
  206.  
  207.         (*CntrlPacket).Length[0] = CntrlString[counter];
  208.         BCC2 ^= CntrlString[counter];
  209.         counter++;        
  210.  
  211.         (*CntrlPacket).FileSize = (unsigned char*) malloc (sizeof(char) * (*CntrlPacket).Length[0]);
  212.  
  213.         for (i = 0; i < (*CntrlPacket).Length[0]; i++)
  214.         {
  215.             (*CntrlPacket).FileSize[i] = CntrlString[counter + i];
  216.             BCC2 ^= CntrlString[counter + i];
  217.         }
  218.         counter += (*CntrlPacket).Length[0];
  219.  
  220.         (*CntrlPacket).Type[1] = CntrlString[counter];
  221.         BCC2 ^= CntrlString[counter];
  222.         counter++;
  223.  
  224.         (*CntrlPacket).Length[1] = CntrlString[counter];
  225.         BCC2 ^= CntrlString[counter];
  226.         counter++;        
  227.  
  228.         (*CntrlPacket).Filename = (unsigned char*) malloc (sizeof(char) * (*CntrlPacket).Length[1]);
  229.  
  230.         for (i = 0; i < (*CntrlPacket).Length[1]; i++)
  231.         {
  232.             (*CntrlPacket).Filename[i] = CntrlString[counter + i];
  233.             BCC2 ^= CntrlString[counter + i];
  234.         }
  235.     }
  236.     return BCC2;
  237. }
  238.  
  239. /* --- CreateConfirmMsg --- */
  240.  
  241. unsigned char *CreateConfirmMsg (unsigned short *ConfirmMsgSize, unsigned short CntrlField)
  242. {
  243.     unsigned char *ConfirmMsg = malloc (sizeof(char) * 5);
  244.  
  245.     *ConfirmMsgSize = 0;
  246.  
  247.     ConfirmMsg[(*ConfirmMsgSize)++] = (unsigned char) F;
  248.     ConfirmMsg[(*ConfirmMsgSize)++] = (unsigned char) A;
  249.     ConfirmMsg[(*ConfirmMsgSize)++] = (unsigned char) CntrlField;
  250.     ConfirmMsg[(*ConfirmMsgSize)++] = (unsigned char) (A ^ CntrlField);
  251.     ConfirmMsg[(*ConfirmMsgSize)++] = (unsigned char) F;
  252.  
  253.     return ConfirmMsg;
  254. }
  255.  
  256. /* --- ReadConfirmMsg --- */
  257.  
  258. signed short ReadConfirmMsg (unsigned char *ConfirmMsg, unsigned short ConfirmMsgSize)
  259. {
  260.     unsigned short state = 0, CntrlField = 0 ;
  261.     while (state < 5 && CntrlField != -1)
  262.         switch (state)
  263.         {
  264.             case 0: // Verificar F na 1ª posição
  265.                 if (ConfirmMsg[state] == F)
  266.                     state++;
  267.                 else
  268.                     CntrlField = -1;
  269.  
  270.                 break;
  271.  
  272.             case 1: // Verificar A na 2ª posição
  273.                 if (ConfirmMsg[state] == A)
  274.                     state++;
  275.                 else
  276.                     CntrlField = -1;
  277.  
  278.                 break;
  279.  
  280.             case 2: // Verificar Campo de Controlo
  281.                 if (ConfirmMsg[state] == SET)
  282.                 {
  283.                     state++;
  284.                     CntrlField = SET;
  285.                 }
  286.                 else if (ConfirmMsg[state] == DISC)
  287.                 {
  288.                     state++;
  289.                     CntrlField = DISC;
  290.                 }
  291.                 else if (ConfirmMsg[state] == UA)
  292.                 {
  293.                     state++;
  294.                     CntrlField = UA;
  295.                 }
  296.                 else if (ConfirmMsg[state] == RR0)
  297.                 {
  298.                     state++;
  299.                     CntrlField = RR0;
  300.                 }
  301.                 else if (ConfirmMsg[state] == RR1)
  302.                 {
  303.                     state++;
  304.                     CntrlField = RR1;
  305.                 }
  306.                 else if (ConfirmMsg[state] == REJ0)
  307.                 {
  308.                     state++;
  309.                     CntrlField = REJ0;
  310.                 }
  311.                 else if (ConfirmMsg[state] == REJ1)
  312.                 {
  313.                     state++;
  314.                     CntrlField = REJ1;
  315.                 }
  316.                 else
  317.                     CntrlField = -1;
  318.  
  319.                 break;
  320.  
  321.             case 3: // Verificar BCC1
  322.                 if (ConfirmMsg[state] == ConfirmMsg[state - 1] ^ ConfirmMsg[state - 2])
  323.                     state++;
  324.                 else
  325.                     CntrlField = -1;
  326.  
  327.                 break;
  328.  
  329.             case 4: // Verificar F na última posição
  330.                 if (ConfirmMsg[state] == F)
  331.                     state++;
  332.                 else
  333.                     CntrlField = -1;
  334.  
  335.                 break;
  336.  
  337.             default:
  338.                 break;
  339.         }
  340.  
  341.     return CntrlField;
  342. }
  343.  
  344. /* --- CreateInfMsg --- */
  345.  
  346. unsigned char *CreateInfMsg (unsigned short *InfMsgSize, unsigned short CntrlField, unsigned char *DataField, unsigned short DataSize, unsigned short BCC2)
  347. {
  348.     int i, counter = 0;
  349.  
  350.     *InfMsgSize = 6 + DataSize;
  351.  
  352.     unsigned char *InfMsg = malloc (sizeof(char) * *InfMsgSize);
  353.  
  354.     InfMsg[counter++] = (unsigned char) F;
  355.     InfMsg[counter++] = (unsigned char) A;
  356.     InfMsg[counter++] = (unsigned char) CntrlField;
  357.     InfMsg[counter++] = (unsigned char) (A ^ CntrlField);
  358.  
  359.     for (i = 0; i < DataSize; i++)
  360.         InfMsg[counter + i] = DataField[i];
  361.     counter += DataSize;
  362.  
  363.     InfMsg[counter++] = (unsigned char) BCC2;
  364.     InfMsg[counter++] = (unsigned char) F;
  365.  
  366.     return InfMsg;
  367. }
  368.  
  369. /* --- ReadInfMsg --- */
  370.  
  371. signed short ReadInfMsg (InfStruct *InfPacket, unsigned char *InfString, unsigned short InfMsgSize, signed short CntrlField)
  372. {
  373.     signed short Type, BCC2;
  374.     unsigned short state = 0, counter = 0, StringSize, i;
  375.     unsigned char *DataString, *CntrlString;
  376.     DataStruct DataPacket;
  377.     CntrlStruct CntrlPacket;
  378.  
  379.     if (CntrlField == RR0 || CntrlField == REJ0)
  380.         CntrlField = I0;
  381.     else if (CntrlField == RR1 || CntrlField == REJ1)
  382.         CntrlField = I1;
  383.  
  384.     while (state < 7 && CntrlField != -1)
  385.         switch (state)
  386.         {
  387.             case 0: // Verificar F
  388.                 printf ("Comparar %x com %x.\n", InfString[counter], F);
  389.                 if (InfString[counter] == F)
  390.                 {
  391.                     state++;
  392.                     counter++;
  393.                 }
  394.                 else
  395.                     Type = -1;
  396.  
  397.                 break;
  398.  
  399.             case 1: // Verificar A
  400.                 printf ("Comparar %x com %x.\n", InfString[counter], A);
  401.                 if (InfString[counter] == A)
  402.                 {
  403.                     state++;
  404.                     counter++;
  405.                 }
  406.                 else
  407.                     Type = -1;
  408.  
  409.                 break;
  410.  
  411.             case 2: // Verificar C
  412.                 printf ("Comparar %x com %x.\n", InfString[counter], CntrlField);
  413.                 if (InfString[counter] == CntrlField)
  414.                 {
  415.                     state++;
  416.                     counter++;
  417.                 }
  418.                 else
  419.                     Type = -1;
  420.  
  421.                 break;
  422.  
  423.             case 3: // Verificar BCC1
  424.                 printf ("Comparar %x com %x.\n", InfString[counter], InfString[counter - 1] ^ InfString[counter - 2]);
  425.                 if (InfString[counter] == InfString[counter - 1] ^ InfString[counter - 2])
  426.                 {
  427.                     state++;
  428.                     counter++;
  429.                 }
  430.                 else
  431.                     Type = -1;
  432.  
  433.                 break;
  434.  
  435.             case 4: // Verificar Dados
  436.                 if (InfString[counter] == 1)
  437.                 {
  438.                     StringSize = InfMsgSize - 6;
  439.                     DataString = (unsigned char*) malloc (sizeof(unsigned char) * StringSize);
  440.                     for (i = 0; i < StringSize; i++)
  441.                     {
  442.                         DataString[i] = InfString[counter + i];
  443.                         printf ("Datastring[%d] calculada: %x\n", i, DataString[i]);
  444.                     }
  445.  
  446.                     BCC2 = ReadDataPacket (&DataPacket, DataString, StringSize);
  447.  
  448.                     printf ("BCC2: %x\n", BCC2);
  449.  
  450.                     printf ("SeqNumber: %lu\n", DataPacket.SeqNumber);
  451.                     printf ("DataSize: %lu\n", DataPacket.DataSize);
  452.                     for (i = 0; i < DataPacket.DataSize; i++)
  453.                         printf ("Data[%hu]: %x\n", i, DataPacket.Data[i]);
  454.  
  455.                     if (BCC2 == -1)
  456.                         Type = -1;
  457.                     else
  458.                     {
  459.                         Type = InfString[counter];
  460.                         counter += StringSize;
  461.                         state++;
  462.                     }
  463.                 }
  464.                 else if (InfString[state] == 2 || InfString[state] == 3)
  465.                 {
  466.                     StringSize = InfMsgSize - 6;
  467.                     CntrlString = (unsigned char*) malloc (sizeof(unsigned char) * StringSize);
  468.                     for (i = 0; i < StringSize; i++)
  469.                         CntrlString[i] = InfString[counter + i];
  470.  
  471.                     BCC2 = ReadCntrlPacket (&CntrlPacket, CntrlString, StringSize);
  472.  
  473.                     if (BCC2 == -1)
  474.                         Type = -1;
  475.                     else
  476.                     {
  477.                         Type = InfString[counter];
  478.                         counter += StringSize;
  479.                         state++;
  480.                     }
  481.                 }
  482.                 else
  483.                     Type = -1;
  484.  
  485.                 break;
  486.  
  487.             case 5: // Verificar BCC2
  488.                 printf ("Comparar %x com %x.\n", InfString[counter], BCC2);
  489.                 if (InfString[counter] == BCC2)
  490.                 {
  491.                     state++;
  492.                     counter++;
  493.                 }
  494.                 else
  495.                     Type = -1;
  496.  
  497.                 break;
  498.  
  499.             case 6: // Verificar F
  500.                 printf ("Comparar %x com %x.\n", InfString[counter], F);
  501.                 if (InfString[counter] == F)
  502.                 {
  503.                     state++;
  504.                     counter++;
  505.                 }
  506.                 else
  507.                     Type = -1;
  508.  
  509.                 break;
  510.         }
  511.  
  512.     if (Type == 1)
  513.     {
  514.         (*InfPacket).InfType = Type;
  515.         (*InfPacket).InfData.SeqNumber = DataPacket.SeqNumber;
  516.         (*InfPacket).InfData.DataSize = DataPacket.DataSize;
  517.         (*InfPacket).InfData.Data = (unsigned char*) malloc (sizeof(char) * (*InfPacket).InfData.DataSize);
  518.         for (i = 0; i < (*InfPacket).InfData.DataSize; i++)
  519.             (*InfPacket).InfData.Data[i] = DataPacket.Data[i];
  520.     }
  521.     else if (Type == 2 || Type == 3)
  522.     {
  523.         /*
  524.         (*InfPacket).InfType = Type;
  525.         (*InfPacket).InfCntrl.Type[0] = CntrlPacket.Type[0];
  526.         (*InfPacket).InfCntrl.Length[0] = CntrlPacket.Length[0];
  527.  
  528.         (*InfPacket).InfCntrl.Type[1] = CntrlPacket.Type[1];
  529.         (*InfPacket).InfCntrl.Length[1] = CntrlPacket.Length[1];
  530.         */
  531.     }
  532.  
  533.     return Type;
  534. }
Advertisement
Add Comment
Please, Sign In to add comment