Plugin-Schnittstelle - CONZEPT 16
Plugin-Schnittstelle - CONZEPT 16 Erstellung eine Plugin-Anwendung in CONZEPT 16
- Siehe: Plugin-Schnittstelle
Um den Entwicklungsprozess einer Plugin-Anwendung in CONZEPT 16 zu vereinfachen wurde eine API entwickelt, welche grundlegende Funktionen für das Versenden und Kodieren/Dekodieren von Nachrichten zu Verfügung stellt.
Die API wurde in CONZEPT 16 entwickelt und ist Bestandteil der CodeLibrary.
Überblick
- Core-API
- Instanziierung
- Erstellung einer Instanz
- Schließen einer Instanz
- Schließen aller Instanzen
- Iterieren der Instanzen
- Ermitteln des JobControl-Objektes
- Senden einer Nachricht
- Empfangen einer Nachricht
- Eindeutige Antwortkennung generieren
- Informationen zur API ermitteln
- Ermitteln des zuletzt aufgetretenen Fehlers
- Converter-API
- Authentifizierungsaufforderung erwarten
- Authentifizierungsaufforderung beantworten
- Erstellen eines neuen PluginCommand-Handles
- Löschen eines PluginCommand-Handles
- Leeren eines PluginCommand-Handles
- Name des Plugin-Kommandos ermitteln
- Name eines Plugin-Kommandos überprüfen
- Ermitteln des Kommando-Typs
- Überprüfung auf einen bestimmten Kommando-Typ
- Ermitteln der Antwortkennung (fortlaufende Nummer)
- Ermitteln des zuletzt aufgetretenen Fehlers
- Setzen von Argumenten
- String-Argument
- 32-bit vorzeichenbehaftetes ganzzahliges Argument
- Logisches Argument
- String-Argument als Memory-Objekt
- Rückgabe-Argument
- Argument für Resultat des Designer-Befehls
- Ermitteln von Argumenten
- Argument nach Name ermitteln
- Argument nach Nummer ermitteln
- Ermitteln der Anzahl der Argumente
- Ermitteln der Länge eines Argumentes
- Argumentwert vom Typ _TypeAlpha ermitteln
- Argumentwert eines Base64 kodierten Argumentes vom Typ _TypeAlpha ermitteln
- Argumentwert vom Typ _TypeInt ermitteln
- Argumentwert vom Typ _TypeLogic ermitteln
- String-Argument als Memory-Objekt ermitteln
- Kodieren / dekodieren von Kommandos
- Kodieren eines Plugin-Kommandos in das Nachrichtenformat
- Dekodieren eines Plugin-Kommandos aus dem Nachrichtenformat
- Empfangen und dekodieren einer Nachricht
- Kodieren und Senden einer Nachricht
Core-API
Die Core-API stellt Basisfunktionen für das Senden und Empfangen von
Befehlen und Ereignissen zur Verfügung und besteht aus den Modulen
Plugin.Core sowie Plugin.Core.Inc. Plugin.Core.Inc deklariert
alle Funktionen, die Bestandteil der Core-API sind. Das Modul
Plugin.Core implementiert diese Funktionalität und sollte nicht
verändert werden, da ansonsten eine Kompatibilität mit zukünftigen
Versionen der API nicht gewährleistet werden kann.
Funktionen, die nicht Bestandteil der Core-API sind (also solche, die nur in Plugin.Core jedoch nicht in Plugin.Core .Inc definiert sind, sollten nicht aufgerufen werden, da sich die Implementierung in Zukunft ändern kann.
Instanziierung
Eine Plugin-Anwendung kann aus ein oder mehreren Instanzen bestehen, die getrennt voneinander fungieren. Jede Plugin-Instanz verfügt über eine eigene Verbindung zum Designer und einen eigenen Thread zum Empfang von Designer-Ereignissen bzw. Befehlen.
Erstellung einer Instanz
Eine Plugin-Instanz wird über die Funktion Plugin.Core:InstanceNew erstellt:
declare Plugin.Core:InstanceNew
(
aPluginPort : word; // Plugin port to connect to.
opt aTimeout : int; // Timeout (connect/read/write) in milliseconds.
opt aFrame : handle; // Frame to receive EvtJob (Client only).
)
: int;
Der Funktion muss beim Aufruf der Port übergeben werden, auf dem sich
die Instanz mit dem Designer
verbinden soll. Die Funktion wartet solange, bis die Verbindung
hergestellt werden konnte oder das angegebene Timeout erreicht wurde. Im
Argument aFrame kann ein Frame-Handle übergeben werden. Diesem
werden über das Ereignis EvtJob neu eingetroffene Nachrichten
signalisiert.
Die Angabe des Frame-Handles ist nur im Standard- bzw. Advanced-Client erlaubt. Bei Verwendung des SOA-Service muss hier NULL übergeben werden (alternativ kann das Argument auch ganz weggelassen werden).
Bei erfolgreicher Verbindungsherstellung wird eine Instanz-ID (>
0) zurückgegeben, die für alle nachfolgenden Befehle der
Core-API verwendet werden kann. Bei nicht erfolgreicher
Verbindungsherstellung wird einer der folgenden Fehlercodes (<
0) zurückgeliefert.
_ErrPluginCorePlatform: Die Funktion wurde nicht vom Standard-, Advanced- oder SOA-Service aus aufgerufen._ErrPluginCoreLimitReached: Das Limit für Plugin-Instanzen (derzeit 10) ist bereits erreicht._ErrPluginCoreConnectTimeout: Es konnte keine Verbindung hergestellt werden (Timeout wurde erreicht)._ErrPluginCoreSckConnect: Es konnte keine Verbindung hergestellt werden (Socket-Fehler /Plugin.Core:GetLastError()liefert den aufgetretenen Fehlercode)._ErrPluginCoreInternal: Interner Fehler aufgetreten.
Schließen einer Instanz
Terminiert sich die Plugin-Anwendung oder wird die Instanz nicht mehr
benötigt, dann sollte diese durch Aufruf der Funktion Plugin.Core:InstanceClose
geschlossen werden.
declare Plugin.Core:InstanceClose
(
aID : int; // Plugin instance ID to close.
);
Im Argument aID muss die von InstanceNew
zurückgelieferte Instanz-ID angegeben werden. Die Funktion baut die
Verbindung zum Designer ab und
terminiert den Empfangs-Thread. Die Funktion hat keinen Rückgabewert.
Schließen aller Instanzen
Zum Schließen aller Instanzen einer Plugin-Anwendung kann die Funktion
Plugin.Core:InstanceCloseAll verwendet werden.
declare Plugin.Core:InstanceCloseAll
();
Iterieren der Instanzen
Zum Iterieren der geöffneten Instanzen steht die Funktion
Plugin.Core:InstanceGet zur Verfügung.
declare Plugin.Core:InstanceGet
(
aMode : int; // _InstanceModeGetFirst, _InstanceModeGetNext
opt aInstanceID : int; // Reference in case of _InstanceModeGetNext
)
: int;
Im Argument aMode wird angegeben, was durchgeführt werden
soll:
_InstanceModeGetFirst: liefert die erste vorhandene Instanz zurück. Die Angabe vonaInstanceIDist nicht notwendig._InstanceModeGetNext: liefert ausgehend vonaInstanceIDdie nächste vorhandene Instanz zurück.
Der Befehl liefert 0, wenn keine erste bzw. nächste
Instanz existiert, ansonsten eine Instanz-ID (> 0).
Ermitteln des JobControl-Objektes
Zur Ermittlung des von einer Instanz verwendeten JobControl-Objektes
kann die Funktion Plugin.Core:GetJobControl verwendet werden.
declare Plugin.Core:GetJobControl
(
aReceiverType : int; // Type of receiver.
aReceiver : int; // Job control object / instance id.
)
: handle; // Handle to job control object.
Das Argument aReceiverType kennzeichnet den Inhalt von
aReceiver.
_ReceiverByJobControl:aReceiverenthält das JobControl-Objekt._ReceiverByInstanceID:aReceiverenthält die Instanz-ID.
Der Rückgabewert liefert im erfolgreichen Fall das
JobControl-Objekt (>
0) oder einen Wert < 0 im Fehlerfall.
_ErrPluginCoreInit: Es wurde noch keinInstanceNew()durchgeführt._ErrPluginCoreNoInstance: Bei dem angegebenen Wert (aReceiver) handelt es sich nicht um eine gültige Instanz-ID.
Senden einer Nachricht
Zum Senden von Nachrichten steht die Funktion Plugin.Core:SendLine zur
Verfügung.
declare Plugin.Core:SendLine
(
aInstanceID : int; // Instance ID.
aMem : handle; // Memory object containing content to send.
opt aWaitTimeout : int; // > 0 = sync mode (wait time in milli seconds for reply).
opt aMemReply : handle; // Reply data in case of sync mode (aWaitTimeout > 0).
)
: int; // Result error code.
Die Funktion sendet eine Nachricht, deren Inhalt in einem Memory-Objekt enthalten ist. Das Nachrichtenformat ist hierbei wie unter (Nachrichtenaustausch) definiert.
Im Argument aInstanceID muss die Instanz-ID angegeben werden,
welche die Nachricht versenden soll. Über das optionale Argument
(aWaitTimeout) kann auf die Antwort einer Nachricht vom
Designer gewartet werden. In diesem
Fall muss auch das Argument (aMemReply) angegeben werden, welches
den Inhalt der Antwort aufnimmt.
Das Versenden von Nachrichten über die Converter-API vereinfacht das Versenden nochmals, da hier ein zu sendender Befehl samt Argumente definiert werden kann.
Fehlerwerte:
_ErrPluginCoreInit: Es wurde noch keinInstanceNew()durchgeführt._ErrPluginCoreNoInstance: Bei dem angegebenen Wert (aInstanceID) handelt es sich nicht um eine gültige Instanz-ID._ErrPluginCoreSckWriteFailed: Fehler beim Schreiben auf den Socket (Plugin.Core:GetLastError()liefert den aufgetretenen Fehlercode)._ErrPluginCoreNoData: Nur bei synchronem Versenden, wenn keine Daten vorhanden sind._ErrData: Unbekanntes MsxItem empfangen._ErrPluginCoreThreadTerm: Plugin-Thread hat sich beendet. Dies ist der Fall, wenn die Socket-Verbindung im Designer beendet wurde, z. B. weil der Designer vom Anwender beendet wurde (den genauen Fehlercode liefertPlugin.Core:GetLastError())._ErrPluginCoreReceive: Fehler beim Empfangen der Daten, Fehlercode liefertPlugin.Core:GetLastError().
Empfangen einer Nachricht
Es gibt zwei Arten, wie überprüft werden kann, ob eine neue Nachricht vorliegt:
(a) Benachrichtigung durch Ereignis EvtJob.
Dies ist die bevorzugte Art im CONZEPT 16-Standard- oder
Advanced-Client. Hierzu muss beim Aufruf von InstanceNew() ein
Frame-Deskriptor angegeben werden.
(b) Polling
Es kann in definierten Zeitabständen nach neuen Ereignissen "gepollt" werden. Diese Möglichkeit kann im SOA-Service genutzt werden.
Zum Empfangen und Auslesen von Daten steht die Funktion Plugin.Core:ReceiveLine()
zur Verfügung.
declare Plugin.Core:ReceiveLine
(
aReceiverType : int; // Type of receiver.
aReceiver : int; // Job control object / instance id.
aTargetMem : handle; // Memory object containing received line.
var aInstanceID : int; // Regarding Instance ID.
opt aWaitTimeout : int; // Wait for message in milliseconds (0 = no wait).
opt aWaitReply : logic; // Wait for reply message. (API-Ver 1.1)
)
: int; // Instance ID or error code.
Der Funktion muss im ersten Argument eine der folgenden Konstanten angegeben werden:
_ReceiverByJobControl: BeiaReceiverhandelt es sich um ein JobControl-Objekt . Dies ist sinnvoll, wenn der Aufruf der Funktion aus dem EreignisEvtJobheraus stattfindet. Dem Ereignis wird bereits das JobControl-Objekt übergeben und kann somit direkt an diese Funktion weitergegeben werden._ReceiverByInstanceID: BeiaReceiverhandelt es sich um eine Instanz-ID. Dies ist sinnvoll, wenn nach neuen Nachrichten gepollt werden soll.
Die Funktion liefert die empfangene Nachricht in aTargetMem
zurück. Das
Memory-Objekt muss
zuvor mit MemAllocate ( _MemAutoSize ) angelegt worden sein. Im Argument
aInstanceID wird die übermittelte Instanz-ID zurückgegeben. Diese
kann zu Verifikationszwecken herangezogen werden.
Das optionale Argument aWaitTimeout wird nur beim pollen verwendet,
um eine gewisse Zeitspanne in Millisekunden auf das Eintreffen einer
Nachricht zu warten. Im Ereignis EvtJob braucht das Argument
nicht angegeben werden, da in diesem Fall bereits mindestens eine
Nachricht empfangen wurde.
Mit dem optionalen Argument aWaitReply kann auf eine Antwort des
Designers gewartet werden. Als aReceiverType muss _ReceiverByInstanceID
sein. Die Funktion wird intern von der Funktion Plugin.Core:SendLine()
aufgerufen.
Rückgabewerte:
_ErrOK: Es wurde eine Nachricht inaTargetMemhinterlegt._ErrPluginCoreInit: Es wurde noch keinInstanceNew()durchgeführt._ErrPluginCoreNoInstance: Bei dem angegebenen Wert (aReceiver) handelt es sich nicht um eine gültige Instanz-ID._ErrPluginCoreArgumentInvalid:aWaitReplyist gesetzt undaReceiverTypeist nicht_ReceiverByInstanceID, oderaWaitReplyist nicht gesetzt undaReceiverTypewurde ein ungültiger Wert angegeben._ErrPluginCoreNoData: Es keine Daten vorhanden sind._ErrPluginCoreThreadTerm: Plugin-Thread hat sich beendet. Dies ist der Fall, wenn die Socket-Verbindung im Designer beendet wurde, z. B. weil der Designer vom Anwender beendet wurde (den genauen Fehlercode liefertPlugin.Core:GetLastError())._ErrPluginCoreReceive: Fehler beim Empfangen der Daten, Fehlercode liefertPlugin.Core:GetLastError().
Eindeutige Antwortkennung generieren
Mit der Funktion Plugin.Core:NextSerial() kann eine eindeutige Antwortkennung
generiert werden. Diese Funktion steht ab API-Version 1.1 zur Verfügung.
declare Plugin.Core:NextSerial
()
: bigint; // Next serial number (> 0) or error code (< 0).
Im Fehlerfall liefert die Funktion den Wert _ErrPluginCoreInit. In diesem
Fall wurde die Initialisierung der Core-API noch nicht durchgeführt.
Informationen zur API ermitteln
Mit der Funktion Plugin.Core:ApiInfo() können Informationen der API abgefragt
werden. Bei Übergabe eines ungültigen Modus wird eine leere Zeichenkette
zurückgeliefert.
declare Plugin.Core:ApiInfo
(
aMode : int; // Type of information to retrieve
)
: alpha;
Folgende Konstanten können in aMode angegeben werden.
_ApiVersion: Version der API als Zeichenkette. Derzeit wird hier'1.1.00'zurückgegeben._ApiVersionCompare: Es wird die Version als Zeichenkette zurückgegeben, die für eine einfachere Versionsprüfung verwendet werden kann. Derzeit wird hier'010100'zurückgegeben. (API-Ver 1.1)
Ermitteln des zuletzt aufgetretenen Fehlers
Zu einigen Fehlercodes können die nativen Fehlercodes ermittelt werden,
die von den Funktionen der Core-API gesetzt werden. Hierzu dient die
Funktion Plugin.Core:GetLastError(). Bei der Rückgabe von 0 ist
kein Fehlercode vorhanden.
declare Plugin.Core:GetLastError
()
: int;
Converter-API
Zum Kodieren und Dekodieren von Nachrichten (wie unter
Nachrichtenaustausch
beschrieben) gibt es die Converter-API. Diese baut auf die Core-API auf
und vereinfacht die Erstellung von Plugin-Befehlen und Ereignissen. Die
API stellt einen abstrakten Datentyp PluginCommand bereit. Ein
PluginCommand wird durch einen Deskriptor abgebildet.
Die Converter-API ist in den Modulen Plugin.Converter und
Plugin.Converter.Inc enthalten.
Authentifizierungsaufforderung erwarten
Die Funktion wartet auf die Nachricht Designer.Auth, die vom Designer zur Plugin-Anwendung gesendet wird, damit diese sich authentifiziert.
declare Plugin.Converter:ReceiveAuth
(
aReceiverType : int; // (in) Type of receiver.
aReceiver : int; // (in) Job control object / instance id.
var aSerial : bigint; // (out) Serial number.
var aUser : alpha; // (out) User name
opt aWaitTimeout : int; // (in) Maximum wait time in milli seconds.
)
: int;
Die Argumente aReceiverType, aReceiver und aWaitTimeout
haben dieselbe Bedeutung wie unter Plugin.Core:ReceiveLine beschrieben. Liefert
die Funktion _ErrOk, wird in aSerial die vom
Designer erwartete Antwortkennung
zurückgegeben. In aUser wird der Name des Benutzers
zurückgegeben, für den die Authentifizierung erfolgen soll.
Authentifizierungsaufforderung beantworten
Die Funktion sendet die Antwort auf die Authentifizierungsaufforderung,
die durch die Funktion Plugin.Converter:ReceiveAuth empfangen wurde.
declare Plugin.Converter:ReplyAuth
(
aInstanceID : int; // Instance ID.
aSerial : bigint; // Serial number.
aPluginName : alpha(40); // Plugin short name.
var aPassword : alpha; // Password (C16 charset).
opt aWaitTimeout : int; // Maximum wait time in milli seconds.
opt aDescriptiveName : alpha(4096); // Plugin descriptive name. (API-Ver 1.1)
opt aDescription : alpha(4096); // Plugin description. (API-Ver 1.1)
)
: int;
In aSerial wird die empfangene Antwortkennung übergeben.
In aPluginName wird ein Name für die Plugin-Anwendung übergeben.
Der Name wird für Einträge, die das Plugin betreffen, im Anwendungslog
des Designers verwendet. Der Name muss mindestens ein Zeichen und darf
maximal 40 Zeichen umfassen und kann keine Steuerzeichen (< ASCII 32)
sowie '?' und '\' enthalten. Er darf auch
nicht nur aus Leerzeichen bestehen.
In aPassword muss das zum Benutzer gehörende
Plugin-Kennwort
übergeben werden.
In aWaitTimeout wird die maximale Zeitspanne in Millisekunden
übergeben, die gewartet wird.
aDescriptiveName enthält einen Anzeigename für die Plugin-Anwendung.
Dieser Name wird im Plugin-Menü des Designers angezeigt, wenn die
Anwendung dort einen Menüeintrag erstellt.
aDescription enthält eine kurze Beschreibung der Plugin-Anwendung.
Das Argument wird z. Zt. nicht ausgewertet.
Rückgabewert:
_ErrOk: Authentifizierung erfolgreich._ErrRights: Authentifizierung fehlgeschlagen.
Erstellen eines neuen PluginCommand-Handles
Zum Erstellen eines Plugin-Kommandos steht die Funktion Plugin.Converter:CreateCmd()
zur Verfügung.
declare Plugin.Converter:CreateCmd
(
opt aKind : int;
opt aName : alpha(4096);
opt aSerial : bigint;
)
: handle;
Im ersten Argument wird die Art des Kommandos übergeben:
sPluginCmdKindEvt: Es soll ein Ereignis generiert werden (EVT).sPluginCmdKindCmd: Es soll ein Befehl generiert werden (CMD).sPluginCmdKindRet: Es soll eine Antwort generiert werden (RET).
Im optionalen Argument aName wird der Name des Kommandos
angegeben. Bei der Angabe von sPluginCmdKindRet sollte das Argument nicht
angegeben werden, da das RET-Kommando keinen Namen besitzt
und sich ausschließlich auf die fortlaufende Nummer (aSerial)
bezieht.
Mit der Funktion Plugin.Core:NextSerial kann eine eindeutige Antwortkennung
für aSerial generiert werden.
Die Funktion liefert einen Deskriptor auf ein PluginCommand zurück. Der
Deskriptor muss mit Plugin.Converter:DeleteCmd() freigegeben werden, wenn er nicht
mehr benötigt wird.
Löschen eines PluginCommand-Handles
declare Plugin.Converter:DeleteCmd
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
);
Die Funktion löscht ein durch Plugin.Convert:CreateCmd() erstelltes Kommando. In
aPluginCmd muss das zu löschende Handle angegeben werden.
Leeren eines PluginCommand-Handles
Mit der Funktion Plugin.Converter:ClearCmd() kann ein PluginCommand-Handle für die
Wiederverwendung geleert bzw. neu definiert werden.
declare Plugin.Converter:ClearCmd
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
opt aKind : int;
opt aName : alpha(4096);
opt aSerial : bigint;
);
In aPluginCmd muss ein Handle auf ein mit Plugin.Converter:CreateCmd()
generiertes PluginCommand übergeben werden.
Name des Plugin-Kommandos ermitteln
Der Name des Plugin-Kommandos kann mit der Funktion Plugin.Convert:GetCmdName()
ermittelt werden.
declare Plugin.Converter:GetCmdName
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: alpha;
Name eines Plugin-Kommandos überprüfen
Mit der Funktion Plugin.Converter:IsCmdName() kann der Name eines Plugin-Kommandos
auf Gleichheit (ohne Berücksichtigung von Groß-/Kleinschreibung) geprüft
werden.
declare Plugin.Converter:IsCmdName
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aCmdName : alpha(4096); // Command name to compare.
)
: logic;
Ermitteln des Kommando-Typs
Mit der Funktion Plugin.Converter:GetCmdKind() kann der Typ eines Kommandos ermittelt
werden.
declare Plugin.Converter:GetCmdKind
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: int;
Rückgabewert:
sPluginCmdKindEvt: EreignissPluginCmdKindCmd: BefehlsPluginCmdKindRet: Antwort
Überprüfung auf einen bestimmten Kommando-Typ
Die folgenden Funktionen stehen für die Überprüfung auf einen bestimmten Kommando-Typ zur Verfügung:
declare Plugin.Converter:IsCmdKindEvt
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: logic;
declare Plugin.Converter:IsCmdKindCmd
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: logic;
declare Plugin.Converter:IsCmdKindRet
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: logic;
Ermitteln der Antwortkennung (fortlaufende Nummer)
Mit Plugin.Converter:GetCmdSerial() kann die im Kommando gesetzte Antwortkennung
ermittelt werden. Ist der Rückgabewert 0, dann besitzt
das Kommando keine Antwortkennung.
declare Plugin.Converter:GetCmdSerial
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: bigint;
Ermitteln des zuletzt aufgetretenen Fehlers
Zu einigen Fehlercodes können die nativen Fehlercodes ermittelt werden,
die von den Funktionen der Converter-API gesetzt werden. Hierzu dient
die Funktion Plugin.Converter:GetLastError(). Bei der Rückgabe von 0 ist
kein Fehlercode vorhanden.
declare Plugin.Converter:GetLastError
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
)
: int;
Setzen von Argumenten
Zum Setzen von Argumenten und deren zugehörigen Werten gibt es je nach Datentyp unterschiedliche Funktionen.
String-Argument
Mit der Funktion Plugin.Converter:AddArgStr() wird einem Plugin-Kommando ein
String-Argument hinzugefügt.
declare Plugin.Converter:AddArgStr
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Argument name.
aValue : alpha(4096); // Argument value.
aValueCharset : int; // Charset of value.
opt aReturnArg : logic; // Function / Return argument.
);
Der Name des Argumentes muss im Parameter aName übergeben
werden. Sein Wert wird im Argument aValue übergeben.
aValueCharset gibt den Zeichensatz an, in dem aValue
kodiert ist:
sPluginArgStrC16: CONZEPT 16-ZeichensatzsPluginArgStrISO: ANSI-ZeichensatzsPluginArgStrUtf8: UTF-8 -Zeichensatz
Über das optionale Argument aReturnArg kann angegeben werden, ob
das Argument in die Liste der Rückgabe-Argumente (true)
eingefügt werden soll oder nicht (false). Letzteres ist der
Default-Fall.
32-bit vorzeichenbehaftetes ganzzahliges Argument
declare Plugin.Converter:AddArgInt
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Argument name.
aValue : int; // Argument value.
opt aReturnArg : logic; // Function / Return argument.
);
Analog zur Funktion AddArgStr(), nur dass ein Argument vom Type
_TypeInt generiert wird.
Logisches Argument
declare Plugin.Converter:AddArgLogic
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Argument name.
aValue : logic; // Argument value.
opt aReturnArg : logic; // Function / Return argument.
);
Analog zur Funktion AddArgStr(), nur dass ein Argument vom Type
_TypeLogic generiert wird.
String-Argument als Memory-Objekt
Diese Funktion steht ab API-Version 1.1 zur Verfügung.
declare Plugin.Converter:AddArgMem
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Argument name.
aValue : handle; // Argument value (copies memory object).
opt aMemCnvMode : int; // Convert option for MemCnv.
opt aReturnArg : logic; // Function / Return argument.
);
Die Funktion nimmt in aValue den Deskriptor eines
Memory-Objektes entgegen. Der Inhalt des Memory-Objektes wird kopiert.
Binäre Inhalte müssen konvertiert werden, so dass keine Steuerzeichen
etc. enthalten sind. Hierfür gibt es die Option aMemCnvMode mit der
eine der Optionen des CONZEPT 16-Befehls MemCnv () angegeben
werden kann. Durch Angabe von _MemEncBase64 wird der Inhalt des
kopierten Memory-Objektes nach Base-64 kodiert und somit übertragen
werden kann.
Rückgabe-Argument
Die Funktion Plugin.Converter:AddArgRet() generiert ein Rückgabe-Argument in der
Form <name>=?.
declare Plugin.Converter:AddArgRet
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Argument name.
);
Argument für Resultat des Designer-Befehls
Die Funktion Plugin.Converter:AddExecResult() fügt dem Kommando ein Argument
ExecResult hinzu. Dieses wird bei der Rückantwort vom Designer
gesetzt und gibt Aufschluss über Fehler bei der Ausführung eines
Designer-Befehls. Diese Funktion steht ab API-Version 1.1 zur Verfügung.
declare Plugin.Converter:AddExecResult
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
);
Ermitteln von Argumenten
Analog zum Setzen von Argumenten werden Funktionen für das Ermitteln von Argumenten und Argumentwerte definiert.
Argument nach Name ermitteln
Die Funktion Plugin.Converter:GetArg() ermittelt ein Argument eines
Plugin-Kommandos anhand seines Namens.
declare Plugin.Converter:GetArg
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
opt aRetArg : logic; // 'Return argument' y/n.
)
: handle; // Handle to CteNode object.
Es wird ein Deskriptor auf das im Kommando gespeicherte
CteNode-Objekt
zurückgegeben. Der Typ des Arguments kann anhand der Eigenschaft
Type bestimmt und danach mit der entsprechenden Eigenschaft
Value... ausgelesen werden.
Argument nach Nummer ermitteln
Die Funktion Plugin.Converter:GetArgByNum() ermittelt ein Argument anhand seiner
Position (1..Anzahl der Argumente). Die Position muss im Argument
aArgNum übergeben werden.
declare Plugin.Converter:GetArgByNum
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aArgNum : int; // Argument number / one-based.
opt aRetArg : logic; // 'Return argument' y/n.
)
: handle; // Handle to CteNode object.
Ermitteln der Anzahl der Argumente
Mit Plugin.Converter:GetArgCount() kann die Anzahl der gesetzten Argument ermittelt
werden.
declare Plugin.Converter:GetArgCount
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
opt aRetArg : logic; // 'Return argument' y/n.
)
: int;
Ermitteln der Länge eines Argumentes
Mit Plugin.Converter:GetArgStrLen() kann die Länge eines gesetzten Argumentes vom Typ
_TypeAlpha ermittelt werden. Diese Funktion steht ab API-Version
1.1 zur Verfügung.
declare Plugin.Converter:GetArgStrLen
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument.
opt aRetArg : logic; // 'Return argument' y/n.
)
: int;
Rückgabewerte:
>=0: Länge des Inhaltes. Ist das Argument nicht vom Typ_TypeAlpha, wird0zurückgegeben._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden.
Argumentwert vom Typ _TypeAlpha ermitteln
Die Funktion Plugin.Converter:GetArgStr() ermittelt den Wert eines Argumentes vom
Typ _TypeAlpha. Falls das angegebene Argument (aName)
nicht vom Type _TypeAlpha ist, wird der Fehlercode
_ErrType zurückgegeben.
declare Plugin.Converter:GetArgStr
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
var aValue : alpha; // Value of argument (UTF-8).
opt aRetArg : logic; // 'Return argument' y/n. (API-Ver 1.1)
)
: int;
Rückgabewerte:
_ErrOK: Durchführung erfolgreich._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden._ErrType: Das ArgumentaNameist nicht vom Typ_TypeAlpha.
Argumentwert eines Base64 kodierten Argumentes vom Typ _TypeAlpha ermitteln
Die Funktion Plugin.Converter:GetArgStrDecB64() ermittelt den Wert eines Argumentes vom
Typ _TypeAlpha. Falls das angegebene Argument (aName)
nicht vom Type _TypeAlpha ist, wird der Fehlercode
_ErrType zurückgegeben. Diese Funktion steht ab API-Version 1.1
zur Verfügung.
declare Plugin.Converter:GetArgStrDecB64
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
var aValue : alpha; // Value of argument (UTF-8).
opt aRetArg : logic; // 'Return argument' y/n.
)
: int;
Rückgabewerte:
_ErrOK: Durchführung erfolgreich._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden._ErrType: Das ArgumentaNameist nicht vom Typ_TypeAlpha._ErrOutOfMemory: Speicheranforderungsfehler.
Argumentwert vom Typ _TypeInt ermitteln
Die Funktion Plugin.Converter:GetArgInt() ermittelt den Wert eines Argumentes vom
Typ _TypeInt. Falls das angegebene Argument (aName)
nicht vom Type _TypeInt ist, wird der Fehlercode
_ErrType zurückgegeben.
declare Plugin.Converter:GetArgInt
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
var aValue : int; // Value of argument.
opt aRetArg : logic; // 'Return argument' y/n. (API-Ver 1.1)
)
: int;
Rückgabewerte:
_ErrOK: Durchführung erfolgreich._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden._ErrType: Das ArgumentaNameist nicht vom Typ_TypeInt.
Argumentwert vom Typ _TypeLogic ermitteln
Die Funktion Plugin.Converter:GetArgLogic() ermittelt den Wert eines Argumentes vom
Typ _TypeLogic. Falls das angegebene Argument (aName)
nicht vom Type _TypeLogic ist, wird der Fehlercode
_ErrType zurückgegeben.
declare Plugin.Converter:GetArgLogic
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
var aValue : logic; // Value of argument.
opt aRetArg : logic; // 'Return argument' y/n. (API-Ver 1.1)
)
: int;
Rückgabewerte:
_ErrOK: Durchführung erfolgreich._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden._ErrType: Das ArgumentaNameist nicht vom Typ_TypeLogic.
String-Argument als Memory-Objekt ermitteln
Die Funktion Plugin.Converter:GetArgMem() ermittelt den Wert eines Argumentes vom
Typ _TypeAlpha. Falls das angegebene Argument (aName)
nicht vom Type _TypeAlpha ist, wird der Fehlercode
_ErrType zurückgegeben. Diese Funktion steht ab API-Version 1.1
zur Verfügung.
declare Plugin.Converter:GetArgMem
(
aPluginCmd : handle; // Handle of plugin command (0 = current).
aName : alpha(4096); // Name of argument to retrieve.
var aValue : handle; // Value of argument as memory content.
opt aMemCnvMode : int; // Convert option for MemCnv.
opt aRetArg : logic; // 'Return argument' y/n.
)
: int;
In aValue muss der Deskriptor eines Memory-Objektes angegeben
werden, in welches der Inhalt des Argumentes kopiert wird. Das optionale
Argument aMemCnvMode kann eine, der bei MemCnv ()
zulässigen, Optionen sein. Der Inhalt einer Base64 kodierten
Zeichenkette kann z. B. durch Angabe der Option _MemDecBase64
ermittelt werden.
Rückgabewerte:
_ErrOK: Durchführung erfolgreich._ErrUnavailable: Das Argument mit dem NameaNameist im KommandoaPluginCmdnicht vorhanden._ErrHdlInvalid: BeiaValuehandelt es sich nicht um einen gültigen Deskriptor eines Memory-Objektes._ErrType: Das ArgumentaNameist nicht vom Typ_TypeAlpha._ErrOutOfMemory: Speicheranforderungsfehler.
Kodieren / dekodieren von Kommandos
Kodieren eines Plugin-Kommandos in das Nachrichtenformat
Um eine Nachricht an den Designer zu
senden, muss das PluginCommand-Handle zunächst in das Nachrichtenformat
(siehe
Nachrichtenaustausch)
umgewandelt (kodiert) werden. Zum Kodieren steht die Funktion
Plugin.Converter:Encode() bereit.
declare Plugin.Converter:Encode
(
aPluginCmd : handle; // (in) Handle of plugin command (0 = current).
aOutput : handle; // (out) Memory object with encoded content.
)
: int; // Result.
Im Argument aPluginCmd wird das zu kodierende PluginCommand-Handle
übergeben. Im Argument aOutput muss ein Memory-Objekt übergeben
werden, welches den kodierten Nachrichteninhalt aufnimmt. Das
Memory-Objekt muss zuvor mit MemAllocate ( _MemAutoSize ) generiert worden sein.
Dekodieren eines Plugin-Kommandos aus dem Nachrichtenformat
Zum Umwandeln einer Nachricht vom
Designer in ein PluginCommand-Handle
steht die Funktion Plugin.Converter:Decode() bereit. Diese nimmt eine Nachricht
(die z. B. durch Plugin.Core:ReceiveLine() ermittelt wurde) und dekodiert diese
in ein PluginCommand-Handle.
declare Plugin.Converter:Decode
(
aInput : handle; // (in) Memory object with encoded content.
aPluginCmd : handle; // (in/out) Handle to decoded plugin command.
)
: int; // Result.
aPluginCmd muss ein PluginCommand-Handle sein, dass zuvor mit
Plugin.Converter:CreateCmd() angelegt wurde. Bei erfolgreicher Verarbeitung wird der
Wert _ErrOk zurückgegeben, ansonsten ein Fehlercode <
0.
Empfangen und dekodieren einer Nachricht
Mit der Funktion Plugin.Converter:ReceiveCmd() kann ein Plugin-Kommando empfangen
werden. Die Funktion ruft hierzu Plugin.Core:ReceiveLine() und anschließend
Plugin.Converter:Decode() auf.
declare Plugin.Converter:ReceiveCmd
(
aReceiverType : int; // (in) Type of receiver.
aReceiver : int; // (in) Job control object / instance id.
aPluginCmd : handle; // (in) Received plugin command.
var aInstanceID : int; // (out) Regarding Instance ID.
opt aWaitTimeout : int; // (in) Wait for message in milliseconds (0 = no wait).
)
: int; // Instance ID or error code.
Die Argumente aReceiverType, aReceiver, aInstanceID und
aWaitTimeout haben dieselbe Bedeutung wie unter Plugin.Core:ReceiveLine()
beschrieben. Das Plugin-Kommando aPluginCmd muss zuvor mit
Plugin.Converter:CreateCmd() generiert werden und wird von der Funktion entsprechend
der empfangenen Nachricht dekodiert.
Kodieren und Senden einer Nachricht
Die Funktion Plugin.Converter:SendCmd() wandelt ein PluginCommand-Handle in eine
Nachricht um und sendet diese zum
Designer.
declare Plugin.Converter:SendCmd
(
aInstanceID : int; // (in) Instance ID.
aPluginCmd : handle; // (in) Plugin command to send.
opt aWaitTimeout : int; // (in) > 0 = sync mode (wait time in milli seconds for reply).
opt aReplyCmd : handle;
)
: int;
Bei erfolgreicher Verarbeitung wird _ErrOk zurückgegeben,
ansonsten ein Wert < 0.