XATMI-Anwendungen tauschen Nachrichten mit Hilfe von „typisierten Datenpuffern“ aus. Dadurch werden die über das Netz gehenden Daten korrekt an die Anwendung übergeben, d.h. gemäß der über den Puffernamen identifizierten Datenstruktur mit ihren Datentypen.
Dies hat den Vorteil, dass die Anwendungen keine Maschinenabhängigkeiten berücksichtigen müssen wie z.B. Big Endian/Little Endian Darstellungen, ASCII-/EBCDIC-Konvertierungen oder Ausrichtungen auf Wortgrenzen. Damit können Datentypen wie int
, long
, float
usw. als solche übertragen werden.
Eine eventuell notwendige Kodierung/Dekodierung durch die Anwendungsprogramme entfällt, da dies von XATMI übernommen wird (gemäß den Regeln der XATMI U-ASE Definition).
Ein Datenpuffer-Objekt besteht aus vier Komponenten:
Typ: Definiert die Klasse des Puffers. Es gibt drei Typen (siehe unten).
Subtyp: Definiert das Objekt des Typs, d.h. die eigentliche Datenstruktur.
Längenangabe
Dateninhalt
Ein solcher Datenpuffer wird während der Laufzeit erzeugt und kann dann über seinen Variablen-Namen (=Subtyp-Name) angesprochen werden. Der Subtyp definiert die Struktur, der Typ legt die Wertemenge der erlaubten elementaren Datentypen fest. In C-Programmen werden solche Puffer dynamisch mit tpallcoc() erzeugt, man spricht dann von „typisierten Puffern“. In Cobol-Programmen sind diese Puffer statisch festgelegt, man spricht von „typisierten Records“.
Typen
Mit dem Typ eines Datenpuffers wird festgelegt, welche elementaren Datentypen der verwendeten Programmiersprache erlaubt sind. Dadurch wird ein gemeinsames Datenverständnis in einem heterogenen Client-Server-Verbund ermöglicht.
Bei XATMI sind drei Typen definiert:
X_OCTET | Untypisierter Datenstrom von Bytes („Userbuffer“). Dieser Typ besitzt keine Subtypen. Es wird keine Konvertierung vorgenommen. |
X_COMMON | Alle von C und COBOL gemeinsam verwendbaren Datentypen. Die Konvertierung wird von XATMI vorgenommen. |
X_C_TYPE | Alle elementaren C-Datentypen mit Ausnahme von Zeigern. Die Konvertierung wird von XATMI vorgenommen. |
Subtypen
Subtypen haben einen bis zu 16 Zeichen langen Namen, unter dem sie im Anwendungsprogramm angesprochen werden. Jedem Subtyp ist eine Datenstruktur (C-Structure oder COBOL-Record) zugeordnet, die die Syntax des Subtyps bestimmt, siehe Abschnitt „Typisierte Puffer erstellen“.
Die Datenstrukturen dürfen nicht geschachtelt werden.
In der Local Configuration wird die Struktur eines Subtyps durch einen Syntaxstring repräsentiert, in dem jeder elementare Datentyp (Basistyp) durch einen Code gekennzeichnet ist, der im Bedarfsfall die Angabe von Feldlängen (<m> und <n>) enthält.
Die folgende Tabelle gibt einen Überblick über die elementaren Datentypen (Basistypen), deren Codes und den Zeichenvorrat der String-Typen:
Code 1 | Bedeutung | ASN.1-Typ | X_C_TYPE | X_COMMON |
s | short integer | INTEGER | short | S9(4) COMP-5 |
S<n> | short integer array | SEQUENCE OF INTEGER | short[n] | S9(4) COMP-5 ... |
i | integer | INTEGER | integer | --2 |
I<n> | integer array | SEQUENCE OF INTEGER | integer[n] | -- |
l | long integer | INTEGER | long | S9(9) COMP-5 |
L<n> | long integer array | SEQUENCE OF INTEGER | long[n] | S9(9) COMP-5 ... |
f | float | REAL | float | -- |
F<n> | float array | SEQUENCE OF REAL | float[n] | -- |
d | double | REAL | double | -- |
D<n> | double array | SEQUENCE OF REAL | double[n] | -- |
c | character | OCTET STRING | char | PIC X |
t | character | T.61-String | char | PIC X |
C<n> | character array: Alle Werte von 0 bis 255 (dezimal) | OCTET STRING | char[n] | PIC X(n) |
C!<n> | character array, durch Null ('\0') terminiert | OCTET STRING | char[n] | -- |
C<m>:<n> | character matrix3 | SEQUENCE OF OCTET STRING | char[m][n] | -- |
C!<m>:<n> | character matrix, durch Null ('\0') terminiert | SEQUENCE OF OCTET STRING | char[m][n] | -- |
T<n> | Die abdruckbaren Zeichen A-Z, a-z und 0-9 plus4 eine Reihe von Sonderzeichen und Steuerzeichen, siehe Abschnitt „Zeichensätze“ | T.61-String | t61str[n] | PIC X(n) |
T!<n> | character array, durch Null ('\0') terminiert | T.61-String | t61str[n] | -- |
T<m>:<n> | character matrix | SEQUENCE OF T.61-String | t61str[m][n] | -- |
T!<m>:<n> | character matrix, durch Null ('\0') terminiert | SEQUENCE OF T.61-String | t61str[m][n] | -- |
1Dient in der Local Configuration zur Beschreibung der Datenstrukturen
2-- : in X_COMMON nicht vorhanden
3eine character matrix ist ein zweidimensionales character array
4gemäß CCITT Recommodation T.61 bzw. ISO 6937
Die Zuordnung zwischen Datenstrukturen, Subtypen und gewünschten Services wird in der Local Configuration festgelegt, siehe Abschnitt „Local Configuration File erzeugen“.
Zeichensatz-Konvertierung bei X_C_TYPE und X_COMMON
Die Datenpuffer werden im ASCII-Zeichensatz über das Netz geschickt.
Ein Partner kann jedoch eine andere Zeichensatzcodierung als ASCII verwenden, wie z.B. eine BS2000-Anwendung, die EBCDIC verwendet. In diesem Fall konvertiert die XATMI-Bibliothek bei allen eingehenden und abgehenden Daten den ASN.1-Typ T.61-String. (Ausnahme: OCTET STRINGs werden nicht konvertiert.)
Daher darf für das Trägersystem keine automatische Konvertierung generiert werden: Für das Trägersystem UPIC muss daher in der upicfile
das entsprechende Kennzeichen generiert werden:
Für Unix-, Linux- und Windows-Systeme (stand-alone-Anwendung) ist das SD oder ND.
Für BS2000-Systeme (stand-alone-Anwendung) ist das HD.
Für Knoten-Anwendungen einer UTM-Cluster-Anwendung ist das CD.