1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| //----------------------------------------------------------------------------------------------------------------
// Décompose le Buffer Recu en plusieurs Messages -
// Paramètres : -
// - BuffersReceipt : Buffer Reçu depuis la socket sous la forme d'une Chaine -
// - TypeCanal : Chaine contenant l'identifiant du Port -
// Resultat : -
// - Chaine contenant la valeur restante non décomposée -
//----------------------------------------------------------------------------------------------------------------
function ScanBuffers(const BuffersReceipt, TypeCanal : String): String;
var
iSOM, iEOM, iEOL : Integer;
TempSSE : _STRUCT_SEGMENT_ENVELOPE;
begin
Result := BuffersReceipt;
repeat
// si une seule position est à zéro, c'est que le buffer n'est pas complet
// Recherche du SOM (FD 253) dans BuffersReceipt
iSOM := Pos(Chr(START_OF_MESSAGE), Result);
// La ligne de code suivante n'est pas valable à cause des þ imprévus
// iEOM = Pos(Chr(END_OF_MESSAGE), Result);
// Protection pour gérer les þ imprévus
// Lecture dans le champ LENGHT du nombre d'octets des donnees
if iSOM > 0 then begin
// &BufferRestant[iSOM] car la position du SOM est la première incluse dans le BufferRestant
CopyMemory(@TempSSE, @Result[iSOM], SizeOf(TempSSE));
// SIZE_STRUCT_SEGMENT_TAIL - 1 car la position du EOM est la dernière incluse dans le SEGMENT_TAIL
iEOM := iSOM + SIZE_STRUCT_SEGMENT_ENVELOPE + TempSSE.wLength + SIZE_STRUCT_SEGMENT_TAIL - 1;
// Controle dans la location iEOM si il est ègal a EOM (FD 254)
if Result[iEOM] <> Chr(END_OF_MESSAGE) then begin
iEOM := -1; // le message n'est pas correct car il n'y a pas de þ comme prévu !
end;
end else begin
iEOM := -1;
end;
// On peut considerer valide le message contenu de l'octet iSOM à l'octet iEOM,
// Ce mécanisme gère les éventuel FD ou FE compris en tant que donnees et non pas en SOM ou EOM
iEOL := Length(Result);
// si le message a des bornes correctes, on décompose celui-ci
if (iSOM >= 1 ) and (iEOM >= iSOM) and (iEOL >= iEOM) then begin
// iEOM - iSOM + 1 car SOM et EOM sont inclus dans le Message
AddMessageToTreat(Copy(Result, iSOM, iEOM - iSOM + 1), TypeCanal);
end;
// Récupération de la fin du buffer pour obtenir les messages suivants
if iEOL > 0 then begin
// iEOL + 1 car EOM N'est PAS inclus dans le Message suivant
Result := Copy(Result, iEOM + 1, iEOL - iEOM);
end else begin
Result := '';
Break;
end;
// Fin de la boucle si il n'y a plus délimiteur de message
until (iSOM = 0 ) or (iEOM = 0 )
end; |
Partager