// Wrapper für die FA_XML in c#
// Stand: 14.09.2011
// Copyright: Olaf Stüben
//
using System;
using System.Runtime.InteropServices;
class VBFAXML
{
[DllImport("VBfa_xml.Dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern IntPtr GetFAXMLVersion();
[DllImport("VBfa_xml.Dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern void FreeMemory(IntPtr ptr);
[DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern void CoalaInit(IntPtr mem, IntPtr message, IntPtr messageLen, IntPtr vars);
[DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]
public static extern IntPtr CoalaMakeElsterXML(IntPtr rc, IntPtr message, IntPtr messageLen,
String xml,
String verfahren,
String datenart,
String vorgang,
String testmerker,
String herstellerid,
String datenLieferant,
String transportSchl);
[DllImport("VBFA_XML.dll", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)]
public static extern IntPtr CoalaTransfer(IntPtr rc, IntPtr message, IntPtr messageLen,
String xml,
int sigtype,
String fileForPks,
String password);
}
public class FAXML
{
private static void freememory(IntPtr ptr)
{
IntPtr mem = Marshal.AllocHGlobal(4);
Marshal.WriteInt32(mem, ptr.ToInt32());
VBFAXML.FreeMemory(mem);
Marshal.FreeHGlobal(mem);
}
public static String GetVersion()
{
IntPtr ptr = VBFAXML.GetFAXMLVersion();
String ret = Marshal.PtrToStringAnsi(ptr);
freememory(ptr);
return ret;
}
public static int Init(ref String errortxt, String param, String value)
{
int rc = -1;
// Initialize unmanged memory to hold the array.
IntPtr ptr = Marshal.AllocHGlobal(12);
// Copy the Strings to unmanaged memory
IntPtr unParam = Marshal.StringToHGlobalAnsi(param);
IntPtr unValue = Marshal.StringToHGlobalAnsi(value);
IntPtr ret = Marshal.AllocHGlobal(4);
IntPtr msg = Marshal.AllocHGlobal(1000);
IntPtr msglen = Marshal.AllocHGlobal(4);
try
{
// Build the parameterarray
Marshal.WriteIntPtr(ptr, 0, unParam);
Marshal.WriteIntPtr(ptr, 4, unValue);
Marshal.WriteIntPtr(ptr, 8, IntPtr.Zero);
Marshal.WriteInt32(ret, -1);
Marshal.WriteInt32(msglen, 1000);
VBFAXML.CoalaInit(ret, msg, msglen, ptr);
rc = Marshal.ReadInt32(ret);
int msglength = Marshal.ReadInt32(msglen);
errortxt = Marshal.PtrToStringAnsi(msg, msglength);
}
finally
{
// Free the unmanaged memory.
Marshal.FreeHGlobal(ptr);
Marshal.FreeHGlobal(unParam);
Marshal.FreeHGlobal(unValue);
Marshal.FreeHGlobal(msg);
Marshal.FreeHGlobal(msglen);
Marshal.FreeHGlobal(ret);
}
return rc;
}
public static int MakeElsterXML(ref String errortxt,
String xml,
String verfahren,
String datenart,
String vorgang,
String testmerker,
String herstellerid,
String datenLieferant,
String transportSchl,
ref String newXML)
{
int rc = 0;
IntPtr ret = Marshal.AllocHGlobal(4);
IntPtr msg = Marshal.AllocHGlobal(1000);
IntPtr msglen = Marshal.AllocHGlobal(4);
try
{
// Vorbelegung Fehlertext
Marshal.WriteInt32(ret, -1);
Marshal.WriteInt32(msglen, 1000);
IntPtr unNewxml = VBFAXML.CoalaMakeElsterXML(ret, msg, msglen,
xml, verfahren, datenart, vorgang, testmerker, herstellerid, datenLieferant, transportSchl);
rc = Marshal.ReadInt32(ret);
int msglength = Marshal.ReadInt32(msglen);
errortxt = Marshal.PtrToStringAnsi(msg, msglength);
newXML = Marshal.PtrToStringAnsi(unNewxml);
freememory(unNewxml);
}
finally
{
// Free Unmanaged Memory
Marshal.FreeHGlobal(ret);
Marshal.FreeHGlobal(msg);
Marshal.FreeHGlobal(msglen);
}
return rc;
}
public static int Transfer(ref String errortxt,
String xml,
int sigType,
String pks,
String pwd,
ref String newXML)
{
int rc = 0;
IntPtr ret = Marshal.AllocHGlobal(4);
IntPtr msg = Marshal.AllocHGlobal(1000);
IntPtr msglen = Marshal.AllocHGlobal(4);
try
{
// Vorbelegung Fehlertext
Marshal.WriteInt32(ret, -1);
Marshal.WriteInt32(msglen, 1000);
IntPtr unNewxml = VBFAXML.CoalaTransfer(ret, msg, msglen,
xml, sigType, pks, pwd);
rc = Marshal.ReadInt32(ret);
int msglength = Marshal.ReadInt32(msglen);
errortxt = Marshal.PtrToStringAnsi(msg, msglength);
newXML = Marshal.PtrToStringAnsi(unNewxml);
freememory(unNewxml);
}
finally
{
// Free Unmanaged Memory
Marshal.FreeHGlobal(ret);
Marshal.FreeHGlobal(msg);
Marshal.FreeHGlobal(msglen);
}
return rc;
}
/// Es soll nicht signiert werden: Wert 99
public const int SIG_NOSIG = 99;
/// Es soll mit einem Softzertifikat signiert werden: Wert 0
public const int SIG_SOFTTOKEN = 0;
/// Es soll mit einem Sicherheitsstick (ElsterStick) signiert werden: Wert 1
public const int SIG_ELSTERSTICK = 1;
/// Es soll mit einer Signaturkarte signiert werden: Wert 2
public const int SIG_SIGCARD = 2;
/// Kein Fehler
public const int ERR_NOERROR = 0;
/// Es wurde ungueltige Parameter übergeben
public const int ERR_PARAM = 1;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_DATENTEILNOTFOUND = 2;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_DATENTEILENDNOTFOUND = 3;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_DATEIENDNOTFOUND = 4;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_BEGINDATENLIEFERANT = 5;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_ENDDATENLIEFERANT = 6;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_BEGINTRANSPORTSCHLUESSEL = 7;
//7 Im XML-String konnte der Text nicht gefunden werden
public const int ERR_ENDTRANSPORTSCHLUESSEL = 8;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_BEGINDATENGROESSE = 9;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_ENDDATENGROESSE = 10;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_BEGINNUTZDATENNOTFOUND = 11;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_ENDNUTZDATENNOTFOUND = 12;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_HERSTELLERIDNOTFOUND = 13;
/// Die Windows-Netzwerkbibliothek konnte nicht initialisiert werden (nur WIN32)
public const int ERR_INITSOCKET = 20;
/// Beim Datenaustausch ist ein Fehler aufgetreten
public const int ERR_SEND = 21;
/// Die Daten hatten keine gültig BASE64 kodierung
public const int ERR_DECODEBASE64 = 22;
// Die Antwortdaten waren nicht im Format PKCS7
public const int ERR_DECODEP7 = 23;
/// Die Antwortdaten waren nicht PKCS7 encrypted
public const int ERR_NOTENCRYPTED = 24;
/// Die Daten konnten nicht dekodiert werden (Falscher Privat-Key?)
public const int ERR_DECODE = 25;
/// Verbindung zum ProxyServer konnte nicht aufgebaut werden
public const int ERR_PROXYCONNECT = 26;
/// Fehlerhafte bzw fehlende ProxyPort Angabe
public const int ERR_NOPROXYPORT = 27;
/// Zu den Servern konnte keine Verbindung aufgebaut werden
public const int ERR_CONNECTSERVER = 28;
/// Von der Clearingstelle konnte keine Antwort empfangen werden
public const int ERR_NORESPONSE = 29;
/// Der Proxyserver erwartet Anmeldedaten.
public const int ERR_PROXYAUTH = 30;
/// Die Signaturdatei konnte nicht geöffnet werden
public const int ERR_OPENSIGFILE = 31;
/// Das Passwort für die Signaturdatei ist nicht korrekt
public const int ERR_OPENPWDSIGFILE = 32;
/// Der Private Schluessel konnte nicht aus der Signaturdatei gelesen werden
public const int ERR_SIGNGETPKEY = 33;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_NUTZDATENNOTFOUND = 34;
/// Im XML-String konnte der Text nicht gefunden werden
public const int ERR_NUTZDATENENDNOTFOUND = 35;
/// Der Schluessel zur Signierung konnte nicht aus der Signaturdatei gelesen werden
public const int ERR_SIGNGETSIGNATUREKEY = 36;
/// Der Proxyserver erwartet unbekannt Authentifizierung.
public const int ERR_PROXYAUTHMETHOD = 37;
/// Fehler bei der Signaturerstellung
public const int ERR_SIGERROR = 38;
/// Keine passende Signaturkarte gefunden
public const int ERR_NOCARDFOUND = 39;
/// Fuer die Signaturkarte wird eine PIN benoetigt
public const int ERR_NEEDPIN = 40;
/// Die PIN fuer die Signaturkarte ist falsch
public const int ERR_PIN_INCORRECT = 41;
/// Die PIN fuer die Signaturkarte ist gesperrt
public const int ERR_PIN_LOCKED = 42;
/// Die HerstellerID ist nicht fuer diese DLL/so lizensiert
public const int ERR_HERSTELLERID = 998;
/// Sonstige Fehler
public const int ERR_OTHER = 999;
}