Application Programmers and Service Provider Reference Manual.
All DDBAC interfaces are Automation compatible dual interfaces that can be used from
and implemented in almost any programming language, including Visual Basic and
Visual J++.
Therefore, in an attempt to be comprehensible to programmers using any programming
language, the Microsoft IDL syntax is used throughout this document. To make that
syntax more readable the names of the data types have been aliased in order to
correspond with the Visual Basic type names.
#define Boolean VARIANT_BOOL #define Byte BYTE #define Long long #define String BSTR #define Currency CY #define Date DATE #define Single float #define Double double #define Variant VARIANT #define SafeArray(_type_) SAFEARRAY(_type_)* #define True VARIANT_TRUE #define False VARIANT_FALSE #define Nothing 0
Instances of the BACAccount coclass represent a particular HBCI online banking
Account which represents one HIUPD in the contacts UPD.
A BACAccount object can be created directly or found by using the Accounts
collection in the BACContact/BACCustomer object.
The BACAccount is always a persistent, readonly object.
IBACSegment BACAccount1::FindOptimalBPDSegment(
[in] String sSegmentType,
[in] long nMaxSegmentVersion);
Find a matching BPD segment for the requested segmenttype.
The determined segmentversion depends on the avalailabe segments
in the Bankdata collection from the BACContact that owns this Account.
With SEPA, some transactions are only possible, when IBAN and BIC of this
Account are present.
Returns the matching BPD BACSegment object or null if no segment could be found.
String BACAccount::AccountNumber;
Get or set the AccountNumber ("Kontonummer")
String BACAccount::AcctName;
Get or set the AcctName ("Kontoproduktbezeichnung")
IDispatch BACAccount::AvailableTransactions;
Collection of all available transaction ("ErlaubteGeschaeftsvorfaelle").
This is a read only property. Not yet implemented.
String BACAccount::BankCode;
Get or set the BankCode ("Kreditinstitutcode")
String BACAccount::BIC;
Get or set the BIC if the account supports Sepa
String BACAccount::CountryCode;
Get or set the CountryCode ("Laenderkennzeichen")
String BACAccount::Currency;
Get or set the Currency ("Kontowaehrung")
String BACAccount::Customer;
Get or set the BACCustomer owner of this Account.
String BACAccount::CustomerID;
Get or set the CustomerID ("Kundenid")
String BACAccount::Fields([in] String sName);
Indexed property that provides access to the fields of this account
String BACAccount::IBAN;
Get or set the IBAN if the account supports Sepa
IBACContact* BACAccount::IsSepa();
Tests, if the contact supports Sepa. This information is stored separatly from
ths HIUPD and contains the result of a HISPA response.
If Sepa is supported, the IBAN and BIC fields are filled.
True if Sepa is supported
String BACAccount::NameEins;
Get or set the NameEins ("NameEins")
String BACAccount::NameZwei;
Get or set the NameZwei ("NameZwei")
String BACAccount::Segment;
Get or set the HIUPD BACSegment of this Account.
IDispatch BACAccount::SpendingLimits;
Collection of all SpendingLimits ("Kontolimit")
This is a read only property. Not yet implemented.
String BACAccount::SubAccountNumber;
Get or set the SubAccountNumber ("Unterkontomerkmal")
The BACAccountData object holds the information of all accounts that are accessible to a particular customer. In the HBCI implementation this object corresponds directly with the User Parameter Data (UPD).
An application program usually never instantiates a BACAccountData
object directly. Instead it creates a customer object via
BACBanking::NewCustomer which includes a BACAccountData
object in the BACCustomer::AccountData property.
The Segments Collection holds all the HIUPD Segments belonging
to the identified User. The Collection is indexed by the account
number. The HIUPA Segment of the User is stored in the "UserData"
property.
void BACAccountData::Clear();
Clears all stored UPD segments, clears the UserData segment and resets the Version property to zero.
IBACSegments* BACAccountData::Segments;
BACSegments collection of all HIUPD segments that are active for the current homebanking session. These segments describe the accounts that are accessible by the current contact.
void BACAccountData::SetSegment(
[in] IBACSegment* aSegment);
Adds or updates the given UPD segment. If this is a HIUPD segment and a HIUPD segment referring to the same account already exists in the collection, then it is replaced by the new one. If the segment is the "HIUPA" segment, then the UserID and Version properties are updated according to ts contents. In any case, the object is marked as "Dirty".
IBACSegment* BACAccountData::UserData;
This property holds the HIUPA Segment of the User. The properties UserID and Version are merely shortcuts into this Segment.
String BACAccountData::UserID;
Read-only UserID of this UPD. This field is only initialised when the BACAccountData object is instantiated by the BAC, e.g. during BACBanking::NewCustomer. When a BACAccountData object is directly instantiated by an application program, this field holds an empty string.
Long BACAccountData::Version;
Current version of UPD. 0 is a legal Version number, If you need to detect, whether the UPDs have been downloaded or not, use AccountData.Segments.Count. If > 0 UPDs are present.
The BACAccounts object is an OLE Automation Collection that holds an ordered
sequence of BACAccount objects.
The BACAccount objects in the collection can be adressed solely through their
numerical index. The first BACAccount object has the index zero, the last
BACAccount object has the index Count-1.
void BACAccounts::Add(
[in] BACAccount* piAccount,
[in] Long lBeforeIndex);
Add another BACAccount object to this collection.
Long BACAccounts::Count;
Read only property that provides the number of BACAccount objects in this collection.
IBACContact* BACAccounts::Item([in] Long lIndex);
The Item property provides indexed access to the BACAccount objects stored in this collection. The Item property is the default value of the BACAccounts object.
The BACBankData object holds all available information of a particular bank.
The bank represented by an instance of the BACBankData object is uniquely
identified via its CountryCode and BankCode (In germany this is 280
and the BLZ).
In the HBCI implementation this object is reponsible to manage and represent the
Bank Parameter Data (BPD).
An application program usually never instantiates a BACBankData object
directly. Instead it creates a customer object via BACBanking::NewCustomer
which includes a BACBankData object in its BACCustomer::BankData property.
The BACBankData object implements the IBACPersistentObject interface in
order to manage the BPD file. This means that the BPD data of a BACBankData
object can be explicitly stored into and retrieved from a file. Usually, however,
persistent storage of the BPD data is managed automatically by the BACCustomer
object that hosts the BACBankData object.
In order to import a BPD file for a given BACCustomer object an application
program only needs to use the IBACPersistentObject::Load method of the
contained BACBankData. If the BACCustomer object is marked as persistent,
it will store a working copy of the loaded BPD file in its own storage location.
String BACBankData::BankCode;
Unique national bank sort code of this customers bank (BLZ). This property is read-only.
void BACBankData::Clear();
Clears all stored BPD segments and resets the Version property to zero.
Long BACBankData::CountryCode;
Country code of the bank (Laenderkennzeichen). The country code for germany is 280. This property is read-only.
IBACSegments* BACBankData::Segments;
BACSegments of all BPD segments of this bank. This collection corresponds directly with the segments in the persistent BPD file.
void BACBankData::SetSegment(
[in] IBACSegment* aSegment);
Adds or updates the given BPD segment. If a segment with the same type already exists in the collection, then it is replaced by the new one. If the segment is the "HIBPA" segment, then the BankCode, CountryCode, and Version properties are updated according to ts contents. In any case, the object is marked as "Dirty", that is, the BPD file needs to be re-written.
Long BACBankData::Version;
Current version of BPD stored for this bank. If no BPD have been loaded, yet, then the version number is 0. The first real version number is 1. This property is read only and is only updated when new BPD segments are
The BACBanking object is the root of the object model of the DataDesign HBCI Banking Application Components. The BACBanking object is a singleton object, that is, its state is global across all instances. Hence, it supplies the shared environment for all DDBAC objects and provides the application programmer with convenience methods.
IBACCustomers* BACBanking::Customers;
BACCustomers collection that represents all known customer contacts installed in the system.
void BACBanking::DeleteCustomer(
[in] Long lCountryCode,
[in] String sBankCode,
[in] String sUserID);
Deletes a customer entry from the global contacts table.
String BACBanking::GetSmartcardSecurityProgID(
[in] IBACCardTerminal* aCT);
Detects the inserted smart card type and returns the ProgID of the security provider class that can handle it.
Returns the ProgID of a security provider class that can handle the
inserted smart card. Returns an empty string if the inserted card is not
known.
If no card is inserted or another card terminal related error occurs an
exception is raised.
This method begins by instantiating a card terminal object. Then it attempts to detect the inserted smart card type through its application ID (AID).
This method is implemented in the IBACBanking3 interface.
IBACCardTerminal* BACBanking::NewCardTerminal();
Creates a new and initialised card terminal object.
An implementation of the IBACCardTerminal interface.
This operation creates a suitable card terminal object as selected through the "Homebanking Kontakte" control panel applet program. Before the created object is returned its IBACCardTerminal::CardTerminalID and IBACCardTerminal::CardTerminalParameter properties are initialized according to the users selection in the control panel applet.
IBACCustomer* BACBanking::NewCustomer(
[in] Long lCountryCode,
[in] String sBankCode,
[in] String sUserID);
Creates a new temporary BACCustomer object that associates the given CountryCode, BankCode, and UserID into a unique identification.
Returns the new BACCustomer object.
The new contact is not stored in the global contacts table unless one of its fields is explicitly written.
IBACDialog* BACBanking::NewDialog(
[in] IBACCustomer* aCustomer,
[in] IBACTransport* aTransport,
[in] IBACSecurity* aSecurity);
Creates and initialises a new BACDialog object. The new object is strongly associated with the given BACCustomer, IBACTransport, and IBACSecurity objects.
Returns the newly created BACDialog object.
This method provides a low level possibility to construct a BACDialog object. Usually the more convenient BACCustomer::NewDialog method of the BACCustomer object will be used to create a dialog object.
IBACSegment* BACBanking::NewSegment(
[in] String sSegmentType,
[in] Long lVersion);
Creates a new and initialised BACSegment object of the given type. If the indicated type is not known to the DDBAC then an error is raised.
A BACSegment object.
String BACBanking::Options(String);
Indexed property that provides access to the DDBAC options stored in the registry. This should not be used by application code. Its purpose is to support independent security components or transport components.
The DDBAC options are stored as string values in the registry key
HKLM/SOFTWARE/DataDesign/DDBAC.
When the option is read, and the requested option does not exist, then an empty
string is returned. If an error (e.g. access is not granted) occurs when the
registry is read, then a corresponding failure HRESULT is returned. If the
registry value does not have the type REG_SZ, then DISP_E_TYPEMISMATCH is
returned as the HRESULT.
| Option Name | Description |
|---|---|
| InstallDir | The InstallDir defines the location where all the DDBAC software components (i.e. DLL and DAT files) are installed. Hence, if you want to locate these files somewhere else, e.g. on a network share, then you can do so by setting this value appropriately. The InstallDir defaults to the module directory of the DDBAC.DLL itself. |
| DataDir | If not present then a sub-directory "DataDesign\DDBAC" will be created below the system shell's "Application Data" directory (i.e. SHGetSpecialFolderPath with CSIDL_APPDATA) and used. The DataDir is used to store the DDUSERS.DAT file and all UPD and BPD files. You may want to redirect the directory to a network share in order to share these files across multiple workstations. |
| PersistBPD | Defaults to "1" to indicate that all received BPD files are persistently stored into the DataDir. If this value is explicitly set to "0", then no BPD files will be stored. |
| PersistUPD | Defaults to "1" to indicate that all received UPD files are persistently stored into the DataDir. If this value is explicitly set to "0", then no UPD files will be stored. |
| ResponseTimeout | Defaults to "120000" giving a response timeout of two minutes (120000 ms). This can be set to another value if required. |
| IsTraceOn | Default is “0” for logging disabled. Value can be changed in the tab “Herstellerhinweis” at the HBCI control panel. If tracing is enabled the value is “1” and all messages will be written at a file “%Windir%\HBCILog.txt”. |
| CardReaderClass2 | Is value "0" class 2 functions for secure PIN entry are disabled. Value can be set at smartcard reader control panel (DDBACCTM.CPL). |
| CardTerminalID | This value is stored by BACCardTerminalManager object at smartcard reader control panel. Value is same as IBACCardTerminal::CardTerminalID. |
| CardTerminalParameter | This value is stored by BACCardTerminalManager object at smartcard reader control panel. Value is same as IBACCardTerminal::CardTerminalParameter. |
| CardTerminalProgID | This value is stored by BACCardTerminalManager object at smartcard reader control panel. Possible values are "DataDesign.BACCardTerminal.1" if it is an CT-API driver or "DataDesign.BACCardTerminalSC.1" for PS/SC smart card readers. |
| CustomerSystemStatusTAN | This value is used by the BACSecurityTAN component as its CustomerSystemStatus parameter. If this value does not exist, then "1" is used as the default. The option is supported starting with version 2.9.2.1 of the DDBACTAN.DLL. Previously the CustomerSystemStatus parameter of the BACSecurityTAN component was hardcoded as "1". |
| CustomizeUI | Used to set the CustomizeUI Tag used for customized Dialogs. See external Documentation. |
| Version | Returns the version of the currently installed DDBAC.dll. The string ist formatted like: "4.2.1.0" |
void BACBanking::RunContactsCPL();
Launches the "HBCI Kontakte" Control Panel Applet. Blocks and returns after the applet was closed.
IBACCustomer* BACBanking::RunNewContactWizard();
Jumps directly into the new contact wizard of the "HBCI Kontakte" Control Panel Applet.
Returns an instance of a BACCustomer object that corresponds with the newly created contact. If the user cancels the wizard then Nothing is returned.
IBACCustomer* BACBanking::RunNewContactWizardEx(
[in] String sParameters);
Jumps directly into the new contact wizard of the "HBCI Kontakte" Control Panel Applet. This method allows passing an additional string parameter to the control panel.
Returns an instance of a BACCustomer object that corresponds with the newly created contact. If the user cancels the wizard then Nothing is returned.
The specified resource must contain a 256 color bitmap that is 120 pixels
wide and 226 pixels tall. The string must be specified exactly as follows:
C[ModuleFilename],[ResourceID],0x[RR][GG][BB]
Where [ModuleFilename] provides the filename of the DLL or EXE module that
contains the bitmap resource. The [ResourceID] is the numeric resource ID
of the resource in the given module.
Finally, for future use a dialog background color must be given as
hexadecimal RGB values with two hex digits per base color.
A complete example parameter string looks, used by the new HBCIPad sample,
is:
CHBCIPAD.EXE,101,0x083863
Boolean BACBanking::SynchronizeCustomer(
[in] IBACCustomer* aCustomer);
Runs the synchronization from the "Homebanking Kontakte" control panel applet for a given BACCustomer object.
Returns True if the customer was successfully synchronized and is now ready to use. Returns False if not. Thus return value is identical to the "NeedSynchronisation" field value of the BACCustomer object.
This method is implemented in the IBACBanking2 interface.
The interface IBACBlzInfo allows you to search in the Institute Database
String BACBlzInfo::FindByBLZ(
String sBLZ);
Searches the XML for a specific Bank-Identification-Code (Bankleitzahl)
Returns a XML string that contains the BankInfo data.
<XML> <BANK> <BLZ>70000999</BLZ> <NAME>DataDesign DemoBank</NAME> <NOTICE>MIGRATION</NOTICE> <SRC>E</SRC> <HBCI> <IP>hbci02.datadesign.de</IP> <SFX>HBCIServerSfx</SFX> <VER>220</VER> <USR>Benutzernummer</USR> <ID>HBCIKundeID</ID> </HBCI> <PTAN> <URL>http://hbci02.datadesign.de/</URL> <VER>220</VER> <ID>PTANKundeID</ID> <USR>PTANBenutzerkennung</USR> <SFX>PTANServerSfx</SFX> </PTAN> </BANK> </XML>
| Tag | Description |
|---|---|
| BLZ | Bankleitzahl des (gesuchten) Kreditinstituts (exakt 8 Ziffern) |
| NAME | Bezeichnung des (gesuchten) Kreditinstituts (ermittelt aus den jeweils aktuellen Daten der Bundesbank; max. 58 Zeichen) |
| SRC | Datenquelle (DDBAC-interne Information; M=Manuell, E=Extra, P=Pattern, X=Extern; exakt 1 Zeichen) |
| USEBLZ | Beim Kontakt zu verwendende Bankleitzahl. Einige Institute verwenden für Ihr Onlinebanking eine dedizierte Bankleitzahl, die sich von den Filialbankleitzahlen unterscheidet. In solchen Fällen ist das Tag USEBLZ mit der zu verwendenden BLZ belegt (exakt 8 Ziffern) |
| NOTICE | Zusatzinformationen für DDBAC-interne Zwecke (z. B. MIGRATION, wenn Zugangsdaten durch DDBAC-Migrationsassistenten geändert werden sollen: max. 50 Zeichen) |
| HBCI | HBCI/FinTS-Zugangsdaten für Sicherheitsmedium Signatur (SmartCard, Schlüsseldatei) |
| IP(HBCI) | IP-Adresse des HBCI/FinTS-Servers der Bank (max. 250 Zeichen) |
| SFX(HBCI) | Adress-Suffix zum HBCI/FinTS-Server der Bank (Portnummer; max. 5 Ziffern) |
| VER(HBCI) | zu verwendende (getestete) HBCI/FinTS-Version des Banksystems in HBCI-Schreibweise (ohne Punkt; max. 3 Ziffern) |
| USR(HBCI) | Verwendet die Bank in der Kommunikation nicht "Benutzerkennung", so ist hier der entsprechend verwendete Alias hinterlegt (z.B. Benutzernummer; max. 30 Zeichen) |
| ID(HBCI) | Verwendet die Bank in der Kommunikation nicht "Kunden-ID", so ist hier der entsprechend verwendete Alias hinterlegt. Falls "Kunden-ID" vom Banksystem generell nicht verwendet wird, enthält dieses Feld "(nicht belegt)" (z.B. Kundennummer; max. 30 Zeichen) |
| PTAN | HBCI+/FinTS-Zugangsdaten für das Sicherheitsmedium PIN/TAN |
| URL(PTAN) | URL des HBCI+/FinTS-Servers der Bank (max. 250 Zeichen) |
| SFX(PTAN) | Adress-Suffix zum HBCI/FinTS-Server der Bank (Portnummer; max. 5 Ziffern) |
| VER(PTAN) | zu verwendende (getestete) HBCI+/FinTS-Version des Banksystems in HBCI-Schreibweise (ohne Punkt; max. 3 Ziffern) |
| USR(PTAN) | Verwendet die Bank in der Kommunikation nicht "Benutzerkennung", so ist hier der entsprechend verwendete Alias hinterlegt (z.B. Benutzernummer; max. 30 Zeichen) |
| ID(PTAN) | Verwendet die Bank in der Kommunikation nicht "Kunden-ID", so ist hier der entsprechend verwendete Alias hinterlegt (z.B. Kundennummer; max. 30 Zeichen) |
String BACBlzInfo::FindByXPath(
String sXPath);
Searches the XML with any XPath expression. You may search for NAME, CITY and so on
See FindByBLZ
String BACBlzInfo::GetValue(
String bstrXml,
String bstrXPath);
Helperfunction to extract single value from a XML string.
Value as String, Empty String if Tag is Empty or not found.
Object give access to a configured Chipdrive. The Cardterminal will be configured by the "Chipdrive Administrator" control panel application.
IBACCardTerminal* BACCardTerminalManager::NewCardTerminal();
Creates a new and initialised card terminal object.
An implementation of the IBACCardTerminal interface.
This operation creates a suitable card terminal object as selected through the "Homebanking Kontakte" control panel applet program. Before the created object is returned its IBACCardTerminal::CardTerminalID and IBACCardTerminal::CardTerminalParameter properties are initialized according to the users selection in the control panel applet.
IBACCardTerminal* BACCardTerminalManager::RunCPL(
String sReservedForFuturUse);
Runs a new instance of Chipdrive Administrator.
Instances of the BACContact coclass represent a particular HBCI online banking
contact, uniquely identified by the combination of the ID Tag.
A BACContact object can be created directly or found by using the IBACContacts
collection.
The BACContact is always a persistent object, which can explicity saved, deleted
and created.
The BACContact object is responsible for managing all persistent
storage of contact attributes, user records, bank records and the BPD and UPD files. The
current implementation maintains all its data in the configurable DataDir folder.
The BACContact Object supports the IBACCustomer4 Interface, which is needed for all
the other operations. Consider the BACContact as the persistent Banking contact and the
BACCustomer Object as a temporary Customer, where the operations run on. The results can
be save, by calling the Save() method oder dropped by simply destroying the IBACContact.
This behaviour differs from the IBACCustomer, where, (in persistent mode) all changes are
automatically saved, when the content has changed and the object is destroyed.
A BACContact Object can be identified with the "ID" value from the Fields property. This
"ID" contains an unique value that can be used to load the contact at a later time using
the Load() function.
IBACContact* BACContact::ActivateTANList(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKTLF or DKTLF
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanActivateTANList();
Tests, if the Contact allows HITLFS or DITLFS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanChangeKeys();
Tests, if the Contact supports a key change on the security media.
True if the function is supported.
This method is implemented in the IBACContact3 interface.
IBACContact* BACContact::CanChangePin();
Tests, if the Contact supports pin change.
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanChangeTANMethod();
Tests, if the Contact allows to change the two-step-tan-method. This requieres a two-step contact with at leat one two-step-method
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanGenerateIniLetter();
Tests, if the Contact supports the generation of an ini-letter.
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanLockKeys();
Tests, if the Contact supports locking of the keys.
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanLockPIN();
Tests, if the Contact allows HIPSPS or DIPSPS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanLockTANList();
Tests, if the Contact allows HITSPS or DITSPS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanRequestTANList();
Tests, if the Contact allows HITLAS or DITLAS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanShowTANList();
Tests, if the Contact allows HITAZS or DITAZS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanUnlockPIN();
Tests, if the Contact allows HISASS or DISASS
True if the function is supported.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::CanUpgradeKeys();
Tests, if the Contact supports "Sicherheitsprofilwechsel"
True if the function is supported.
This method is implemented in the IBACContact3 interface.
IBACContact* BACContact::ChangeConnection(
long hWnd);
Opens a wizard, which allows the user to change the communication paramters. There is no CanChangeConnection, since this would be always true.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::ChangeHbciVersion(
long hWnd);
Opens a wizard, which allows the user to change the HBCI Version. There is no CanChangeHbciVersion, since this would be always true.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::ChangeKeys(
long hWnd);
Opens a wizard, which allows the user to change the keys in the security media.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact3 interface.
IBACContact* BACContact::ChangePin(
long hWnd);
Opens the changepin wizard to change the pin of a BACContact. This can be different, depending on the security media. For PIN/TAN contacts, a message ist send to the server, for smardcards, the Pin is set on the card and for files, it's set for the file. This command executes a ChangePinRq
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
IBACContact* BACContact::ChangeTANMethod(
long hWnd);
Opens a wizard, which allows the user to select a two-step-tan-method and synchronises the account afterwards.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::ChangeUserId(
long hWnd);
Opens a wizard, which allows the user to change the User/CustomerID and the Contact Name. There is no CanChangeUserId, since this would be always true.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
HRESULT BACContact::Create();
Creates a new, empty Contact
HRESULT BACContact::Delete();
Deletes the customers data. This executes a DeleteCustomerRq
IBACContact* BACContact::Edit(
long hWnd);
Opens a dialog, where the user is able to change the current contacts account data. This command executes a EditContactRq
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
IBACContact* BACContact::Execute(
long hWnd,
String bsRequest);
Executes a request by name, the Dialogresult returns,
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::GenerateIniLetter(
long hWnd);
Opens a wizard, which allows the user generate the ini-letter
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::IsPersistant();
Tests, if the contact is already stored or if it is a new or temporary contact.
True if the contact is stored.
This method is implemented in the IBACContact2 interface.
HRESULT BACContact::Load();
Loads an existing Contact with the specified ID. This executes a ReadCustomerRq ID="bstrID"
IBACContact* BACContact::LockKeys(
long hWnd);
Opens a dialog, where the user is able to lock contact. This command executes a LockContactRq
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
IBACContact* BACContact::LockPIN(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKPSP or DKPSP
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::LockTANList(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKSPS or DKSPS
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
BACDialogResults BACContact::NewWizard(
long hWnd);
Version of new Segment correspond to BACSyntaxSegment::Version. Opens the new contact wizard to create a new BACContact. If the DialogResult is bacDialogResultOK, the BACContact object has been successfully created, has already been saved and can be used. This command executes a NewContactWizardRq request.
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
IBACContact* BACContact::QueryPin();
Sends a QueryPinRq through the callback interface, so that the application can provide
a PIN if the PIN ist persistant.
The default implementation will never return a Pin here, its up to the application to
provide the Pin here.
The PIN.
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::RequestTANList(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKTLA or DKTLA
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
HRESULT BACContact::Save();
Saves the customers data. This executes a UpdateCustomerRq
IBACContact* BACContact::ShowTANList(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKTAZ or DKTAZ
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::Synchronize(
long hWnd);
Opens the synchronize wizard to synchronize new BACContact. This function check for alle neccessary information, that is needed. This includes BankKeys, UserKey, test for aktual HKVVB Version. This command executes a SyncCustomerWizardRq
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
IBACContact* BACContact::UnlockPIN(
long hWnd);
Opens a wizard, which collects the neccessary data to execute a HKSAS or DKSAS
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact2 interface.
IBACContact* BACContact::UpgradeKeys(
long hWnd);
Opens a wizard, which allows the user to perform a "Sicherheitsprofilwechsel".
Wether the Dialog has been closed with BACDialogResults::bacDialogResultOK or BACDialogResults::bacDialogResultCancelled
This method is implemented in the IBACContact3 interface.
The BACContacts object is an OLE Automation Collection that holds an ordered
sequence of BACContact objects.
The collection is empty until PopulateContacts is called.
The BACContact objects in the collection can be adressed solely through their
numerical index. The first BACCustomer object has the index zero, the last
BACContact object has the index Count-1.
Long BACContacts::Count;
Read only property that provides the number of BACContact objects in this collection.
Long BACContacts::FindContact(
[in] String sContact);
Finds a particular BACCustomer object identified by its unique contact name.
If the BACContact object was found its index is returned. If no matching BACContact object is found then -1 is returned.
IBACContact* BACContacts::Item([in] Long lIndex);
The Item property provides indexed access to the BACContact objects stored in this collection. The Item property is the default value of the BACContacts object.
Long BACContacts::Populate(
[in] String sFilter);
Populates the list by generating a ListCustomersRq.
Instances of the BACCustomer coclass represent a particular HBCI online banking
contact, uniquely identified by the combination of CountryCode, BankCode
and UserID.
The actual CustomerID is a property of the BACDialog session object and is
bound when a dialog is begun with BACDialog::BeginDialog. The CustomerID that is
stored as a BACCustomer field is only a default value that is used when no CustomerID
was explicitly passed to BACDialog::BeginDialog.
A BACCustomer object can be created explicitly through the
BACBanking::NewCustomer method. A collection of user installed contacts is
available through the BACBanking::Customers collection. Usually an application
will pick one of the installed contacts.
The BACCustomer object comes in two flavours, Persistent and Transient. A
persistent BACCustomer object is tied to the local contact storage
(DDUSERS.DAT, UPD, and BPD files). On the other hand, a transient BACCustomer
object holds all properties, UPD, and BPD only in volatile memory and never
accesses the local contact storage.
The third possibility to create a BACCustomer object is through invoking
BACBanking::NewDialog with a null reference for the customer object parameter.
In this case, the DDBAC will automatically create a suitable BACCustomer object
based on information extracted directly from the security object.
Through the pseudo field "Transient", a client program can determine whether
a given BACCustomer object is transient or persistent. If this field is
returned as zero or an empty string, then the BACCustomer object is persistent.
For a transient object this field is returned as "1".
A BACCustomer should be generally thread as a temporary Customer to do some actions
with, all data changed during this interaction will not be stored.
The persistent BACCustomer object is kept for compatibilitiy reasons. The
persistant Contact is now represanted by the BACContact Object. Please refer to
this object for persistant contact.
The account data is maintained by the BACAccountData object that is held in
the AccountData property. The account data corresponds with the HBCI User
Parameter Data (UPD). The persistent account data is loaded from the corresponding
UPD file when the AccountData property is accessed for the first time. The UPD
file is written back whenever the data is updated. An update usually only occurs
during initialisation of the online dialog when the account information for the
user has changed.
The bank data is maintained by the BACBankData object that is referenced by the
BankData property. The bank data corresponds with the HBCI Bank Parameter Data
(BPD). The bank data is handled largely similar to the account data. Note, however,
that the bank data of a bank is shared by all contacts that refer to the same bank.
BACBanking::NewCustomer, BACBanking::Customers, BACDialog::BeginDialog, BACDialog::CustomerID, BACAccountData, BACBankData
IBACAccountData* BACCustomer::AccountData;
BACAccountData object that holds information about all accounts that the customer can work with.
In the HBCI implementation, the accounts information is stored in a HBCI conformant UPD file.
IBACSecurity BACCustomer::Authenticate(
[in] String sPassphrase);
Hidden internal method that returns an authenticated security object for this customer.
Returns the authenticated security object. If authentication fails, then the security object will raise an error.
IBACSecurity BACCustomer::AuthenticateUI();
Hidden internal method that returns an authenticated security object for this
customer.
This method differs from Authenticate in that it prompts the user to enter
the passphrase or PIN. As such it is more convenient and can support class 2
smart card readers with protected PIN entry.
Returns the authenticated security object. If authentication fails, then the method will raise an error. If the user cancels the PIN entry then this method returns with a null (VisualBasic Nothing) return value.
This method is implemented in the IBACCustomer3 interface.
String BACCustomer::BankCode;
Unique national bank sort code of this customers bank (BLZ). This property is read-only.
IBACBankData* BACCustomer::BankData;
Reference to BACBankData object that holds information about the bank identified by this object.
In the HBCI implementation, the bank information is stored in a HBCI conformant BPD file.
Long BACCustomer::CountryCode;
Country code of the bank (Laenderkennzeichen). The country code for germany is 280. This property is read-only.
String BACCustomer::Fields([in] String sName);
Indexed property that provides access to the fields of this customers record
in the global customer table.
The global customer table maintains a dynamic set of string value fields that
are accessed by name. An application program is allowed to add any additional
fields of its own, as long as the chosen field name does begin with an
underscore ('_') character. Fields added by the application are stored and
retrieved along with the DDBAC defined fields.
Currently the following values are stored in the DDUSERS.DAT file.
String BACCustomer::GetCustomerSystemID(
[in] IBACSecurity* piSecurity);
Hidden internal method that returns the right CustomerSystemID.
Returns the assigned CustomerSystemID, "0" or an empty string.
If the CustomerSystemStatus of this contact is "0", then CustomerSystemIDs are
not used and therefore "0" is returned.
Otherwise, if the SecurityMediaStatus is "0" or an empty string, then the
fields of this BACCustomer object are queried for a CustomerSystemID. If the
SecurityMediaStatus is "1", then the Parameters property of the given security
object (if any) is queried. If no CustomerSystemID was found an empty string is
returned.
This method is implemented in the IBACCustomer2 interface.
String BACCustomer::GetSignatureID(
[in] IBACSecurity* piSecurity);
Hidden internal method that returns the next unused SignatureID and increments the stored value, such that the returned value will never be returned again.
Returns the next SignatureID or "0".
If the CustomerSystemStatus is 0, then the SignatureID is completely managed by
the security object. In this case, this method simply returns the value of the
"SignatureID" parameter of the security object. It is the responsibility of the
security object to increment this counter appropriately.
Otherwise, the SecurityMediaStatus of the security object is checked. If it is
"0" or an empty string, then an attempt is made to read a SignatureID from a
field of the BACCustomer object. If this results in an nonempty string, then
we assume this is the right one. The BACCustomer field "SignatureID" always
holds the NEXT SignatureID that shall be assigned, thus if we are retrieving
this value successfully, then we increment and update it. If an empty string
was returned, then a warning message is logged and the special SignatureID
value "0" is returned to the caller.
If the SecurityMediaStatus is "1", then an attempt is made to obtain a
SignatureID from the security object. If that succeeds, the obtained
SignatureID is returned. If we still do not have a SignatureID, then a
warning message is logged and the special SignatureID value "0" is returned.
This method is implemented in the IBACCustomer2 interface.
IBACDialog* BACCustomer::NewDialog(
[in] String sPassphrase);
Creates a new BACDialog object using the information stored in this contact. This is a convenience method that ultimately invokes BACBanking::NewDialog.
Returns the newly created BACDialog object.
This method starts by attempting to instantiate a security object using the
ProgID from the Field "SecurityProgID". If this field is empty or the method
fails to create the security provider for another reason, then the failure
is propagated to the caller.
Next the security object is authenticated using the given passphrase and the
value from the "SecurityMediaID" Field of this BACCustomer. An empty security
media ID is propagated to the security object. If authentication fails, then
this method fails, too.
The transport provider object named by the field "CommunicationsProgID" is
instantiated and initialized with the communication parameters from the fields
"CommunicationsAddress" and "CommunicationsAddressSuffix".
Finally, using the security and transport objects a new dialog is created via
BACBanking::NewDialog. The BACCustomer object does not
keep any references to the security or transport objects. Hence they will be
released along with the BACDialog object.
IBACDialog* BACCustomer::NewDialogUI();
Creates a new BACDialog object using the information stored in this
contact. This is a convenience method that ultimately invokes
BACBanking::NewDialog.
This method differs from NewDialog in that it prompts the user to enter
the passphrase or PIN. As such it is more convenient and can support class 2
smart card readers with protected PIN entry.
Returns the newly created BACDialog object. If authentication fails, then the method will raise an error. If the user cancels the PIN entry then this method returns with a null (VisualBasic Nothing) return value.
This method is implemented in the IBACCustomer3 interface.
void BACCustomer::SetCustomerSystemID(
[in] IBACSecurity* piSecurity,
[in] String sCustomerSystemID);
Hidden internal method that returns the right CustomerSystemID.
This method is called whenever a HISYN with a CustomerSystemID was received
in an online dialogue. Note that this method is invoked by the BACDialog object
for all HISYN segments that carry a new CustomerSystemID, regardless of the
actual CustomerSystemStatus or SecurityMediaStatus indicated by the security
media.
First of all, if the CustomerSystemStatus is not "1", then a warning message is
logged and the method returns without storing anything.
If the SecurityMediaStatus of the contact is "0" or an empty string, then the
CustomerSystemID is stored in this BACCustomer object's field of that name.
As the SignatureID is tied to the CustomerSystemID, the SignatureID counter
stored with the BACCustomer is also reset to one.
If the SecurityMediaStatus is "1", then the given sCustomerSystemID is written
to the security media, replacing whatever was previously stored for it.
This method is implemented in the IBACCustomer2 interface.
void BACCustomer::SignMessage(
[in] IBACMessage* piMessage,
[in] String sPassphrase,
[in] BACSignerRole nSignerRole);
Adds an explicit signature to the given BACMessage. The "TAN" in the BACCustomer Object can be used to provide a TAN if Pin/Tan based security is used. This will avoid additional UI requests.
void BACCustomer::SignMessageUI(
[in] IBACMessage* piMessage,
[in] BACSignerRole nSignerRole);
Adds an explicit signature to the given BACMessage.
This method differs from SignMessage in that it prompts the user to enter
the passphrase or PIN. As such it is more convenient and can support class 2
smart card readers with protected PIN entry.
If authentication fails, then the method will raise an error. If the user cancels the PIN entry then this method returns successful, but does not sign the message.
This method is implemented in the IBACCustomer3 interface.
Long BACCustomer::TransactionNeedsTAN(
[in] String sSegmentType);
This method determines whether a TAN is required for th given segment type. It does so by searching the BPD for information.
Returns the number of TANs required for the given transaction type. Currently only either 0 or 1 is returned.
This method is implemented in the IBACCustomer4 interface.
void BACCustomer::UpdateAccountInformation(
[in] IBACDialog* piDialog);
The new Sepa standard defines additional Accountdatadata like IBAN or BIC which
must be retrieved separatly from the UPD information.
This function uses the given Dialog to send a HKSPA for each Accound in the UPD. The response
for every BACAccount ist stored in the BACAccounts collection. This collection is
persistand, and will be available when the Account is loaded.
This function ist automatically called when new UPD or BPDs are received during
BeginDialog or when the Account is being synchronised.
The BACCustomer will not be automatically saved.
This method is implemented in the IBACContact3 interface.
void BACCustomer::UpdateAccountInformation(
[in] IBACDialog* piDialog);
The new Sepa standard defines additional Accountdatadata like IBAN or BIC which
must be retrieved separatly from the UPD information.
This function uses the given Dialog to send a HKSPA for each Accound in the UPD. The response
for every BACAccount ist stored in the BACAccounts collection. This collection is
persistand, and will be available when the Account is loaded.
This function ist automatically called when new UPD or BPDs are received during
BeginDialog or when the Account is being synchronised.
The BACCustomer will not be automatically saved.
This method is implemented in the IBACCustomer5 interface.
String BACCustomer::UserID;
The UserID (HBCI Benutzerkennung) of this customer. This property is read-only.
The BACCustomers object is an OLE Automation Collection that holds an ordered
sequence of BACCustomer objects. It cannot be instantiated by applications
but solely exists in the BACBanking::Customers property of the BACBanking
object.
The BACCustomer objects in the collection can be adressed solely through their
numerical index. The first BACCustomer object has the index zero, the last
BACCustomer object has the index Count-1.
Long BACCustomers::Count;
Read only property that provides the number of BACCustomer objects in this collection.
Long BACCustomers::FindContact(
[in] String sContact);
Finds a particular BACCustomer object identified by its unique contact name.
If the BACCustomer object was found its index is returned. If no matching BACCustomer object is found then -1 is returned.
Long BACCustomers::FindCustomer(
[in] Long lCountryCode,
[in] String sBankCode,
[in] String sUserID);
Finds a particular BACCustomer object identified by its unique contact parameters.
If the BACCustomer object was found its index is returned. If no matching BACCustomer object is found then -1 is returned.
IBACCustomer* BACCustomers::Item([in] Long lIndex);
The Item property provides indexed access to the BACCustomer objects stored in this collection. The Item property is the default value of the BACCustomers object.
The BACDataObject class is a small helper class that can be used
to set and retrieve small binary data elements inside a segment.
When an application has to send the contents of a file inside a
binary data element it instantiates a BACDataObject and invokes
its Load() method in order to associate it with the file to be
sent. It then sets the object as the value of a segments data
element. Everything else happens automatically.
void BACDataObject::GetData(
[in, out] SafeArray(Byte) aData);
Returns the data of this data object. The entire data is returned.
String BACDataObject::GetString();
Returns the data of this data object as a String. The entire data is returned in a single string.
The returned string contains the entire data of this object. Although this is an Unicode string, only the low order byte of each character is used to hold the actual binary data. The returned string may contain NUL characters.
This method is implemented in the IBACDataObject2 interface.
void BACDataObject::PutData(
[in, out] SafeArray(Byte) aData);
Provide the data for this data object. The supplied data replaces any previuosly held data.
void BACDataObject::PutString(
[in] String sData);
Provides the data for this data object as a String. The supplied data replaces any previuosly held data.
This method is implemented in the IBACDataObject2 interface.
void BACDataObject::ReadFromObject(
[in] IUnknown* piObject);
Retrieves the data for this data object from the given source object. The source object data replaces all data that this data object currently holds.
This method is implemented in the IBACDataObject2 interface.
void BACDataObject::WriteToObject(
[in] IUnknown* piObject);
Sends the data for this data object to the given destination object. The destination object is re-initialized with the data from this data object.
This method is implemented in the IBACDataObject2 interface.
The BACDialog object represents the online dialog of a customer with a particular bank.
void BACDialog::Abort();
Forcibly abort the current Dialog. This means any pending activity is cancelled and the transport connection is torn down. This method is always synchronous, when it returns, the dialog really was aborted.
Boolean BACDialog::Asynchronous;
This property determines whether online operations will be synchronous or asynchronous. By default this property is False whenever a BACDialog object is created. An application that wants asynchronous online operations must explicitly set this property to True after instantiating the BACDialog object.
If synchronous operation is selected and the operation does not complete within
the timeout limit, the dialog will be forcibly aborted and an error is raised.
If asynchronous operation is selected, then all methods will return immediately
performing the actual online operation asynchronously in the background.
Boolean BACDialog::AutoSignature;
This property determines whether outgoing messages will be automatically signed, or not. By default this will be set to "True" to have all messages signed.
Regardless of the setting of this property, if no security object is available messages will not be signed.
IBACSegments* BACDialog::BankNotices;
This BACSegments collection receives all HIKIM segments that were received from the bank since this dialog was started.
IBACMessage* BACDialog::BeginDialog(
[in] BACDialogTypes nDialogType,
[in] String sCustomerID,
[in] IBACMessage* aBeginDialogMessage);
Begins a homebanking online session, aka. dialog. All homebanking transactions must be submitted in the context of an online dialog. A homebanking online dialog is closed down with the EndDialog method.
If an initialisation message was provided by the caller, then that same message will be returned. If "Nothing" was provided, then the created initialisation message is returned.
This method begins by attempting to establish a transport connection using the
supplied transport object. The transport object is not initialized by this
method, that is, the communication parameters must have been established in the
transport object before this method is called. Usually all this is done by the
BACCustomer::NewDialog method and therefore there is no need to worry.
If no initialization message was provided by the caller through the
aBeginDialogMessage parameter then this method will create its own. The
dialog type determines which segments will be included in the initialization
message. See BACDialogTypes for more information.
The dialog type also determines whether the property AutoSignature is
set to True or False by this method. If it is set to True,
then the supplied security object is used to automatically
sign all outgoing messages.
In the initialisation reponse, the connected bank may include an update to
the BPD. If such an update occurs, the BACBankData object associated with
the BACCustomer is automatically updated with the new BPD. The
BACBankData::Version property of the BACBankData object can be checked
to determine whether the BPD have been updated. Any update will be
automatically saved.
The bank may also respond with an update of the user parameters UPD. If such
update occurs, the corresponding BACAccountData object is updated and
persisted automatically. The BACAccountData::Version property of
the BACAccountData object can be checked to determine whether
the UPD have been updated.
Optionally, the bank may include short notices (i.e. "HIKIM" segments) in the
initialisation reponse. These notices must be presented to the user and must
be persistently stored for later reference by the application program. If any
such notices are received, they are stored in the BankNotices collection.
There is no special return value indicating the reception of bank notices,
hence, the application must check the BankNotices collection after
completion of the dialog initialisation.
Whenever the dialog initialisation fails, the dialog is automatically
terminated before the operation completes. If the dialog was begun
successfully, then the method EndDialog must be invoked in order to
orderly terminate the dialog.
IBACCustomer* BACDialog::Customer;
This read only property holds a reference of the BACCustomer object that was supplied when this BACDialog object was created.
String BACDialog::CustomerID;
Read-only property that returns the CustomerID (HBCI Kunden ID)that was assigned to the dialog in the BeginDialog call.
If an empty string was passed to BeginDialog, then this property contains the substituted value, either the UserID or "9999999999" as appropriate to the dialog type.
String BACDialog::DialogID;
String property that holds the current Dialog-ID that was assigned by the bank system during dialog initialisation. Initialised to the literal String "0".
BACDialogTypes BACDialog::DialogType;
Read-only property that indicates the type of the current dialog.
This property is initialized as bacDialogNone and is set to the requested dialog type by the BeginDialog method. Whenever a dialog is terminated the value of this property is reset to bacDialogNone.
IBACMessage* BACDialog::EndDialog(
[in] IBACMessage* aEndDialogMessage);
End dialog.
If a termination message was provided by the caller, then that same message will be returned. If "Nothing" was provided, then the created default termination message is returned.
This methods terminates the homebanking dialog by sending a
dialog termination message to the bank. The caller optionally
supplies the actual termination message object through the
aEndDialogMessage parameter.
Finally, the transport is physically disconnected.
void BACDialog::ExecuteMessage(
[in] IBACMessage* aMessage);
Submit the given message online.
The BACDialog must be in the state bacDialogReady when this method is invoked,
otherwise an exception will be raised.
The returned "HIRMG" segment is checked and its information is copied into the
HBCIResult and HBCIResultCode properties.
The returned "HIRMS" segments are directly associated with each transaction and
are therefore stored in the BACTransaction::Acknowledgement property of the
corresponding BACTransaction objects.
IBACMessage* BACDialog::ExecuteSegment(
[in] IBACSegment* aSegment);
Submit the given segment online. Convenience method that takes an OrderSegment packs it into a BACTransaction into a BACMessage and executes it. The result is the BACMessage.
IBACMessage* BACDialog::ExecuteSpecial(
[in] BACSpecialTransactionTypes nTransactionType,
[in] IBACMessage* aMessage);
Perform a very special online transaction such as user key update or key blocking.
This method is needed because it is not possible to perform some types of
online transactions using ExecuteMessage.
For example, it is not possible to update a key by simply invoking
ExecuteMessage with a HKSAK segment. the difference is, that the
updated key must be made active during the transaction, after the message
was sent but before the response was received. If an error is encountered in
the response, the new key must not be made active at all.
After all, this method will mostly be used by the "HBCI Kontakte" Control
Panel Applet only.
String BACDialog::HBCIResult;
Read only property that provides the HBCI error description for the HBCIResultCode property. This string includes the entire HBCI Acknowledgement.
Long BACDialog::HBCIResultCode;
Read only property that indicates the most recent asynchronously
reported HBCI error code of the most recent activity. The HBCI
error code is defined as an unsigned value in the range from
0 upto 9999. In addition, the value 10000 will be used to
indicate internal errors that cannot be naturally represented
as valid HBCI error codes. Such errors are usually related to
system or programmer errors.
The HBCIResultCode property is only set when an error is
reported asynchronously during background activity. This means
that the method that did initiate the background activity did
already synchronously return with a success indicator.
Whenever the HBCIResultCode is set, the property
HBCIResult may or may not contain additional
information that can be presented to the user.
Whenever a method of the BACDialog object is invoked all
error properties are cleared first.
Long BACDialog::HBCIVersion;
This property holds the HBCI version that this dialog is using. It is initialised to the global bacVersionHBCI when a BACDialog object is created. If an application wants to override this default, it must set this property before invoking BeginDialog.
The HBCI version number appears in every HBCI message and must not be changed during a dialog. An attempt to write this property in another state than bacDialogIdle will raise an exception.
BACDialogLanguages BACDialog::Language;
This property selects the language to be used for this dialog. It holds a value from the BACDialogLanguages enumeration.
The initial default value is bacDialogLanguageDefault.
An application can choose another language by setting this property before
invoking the BeginDialog method.
An application may only choose a language that is actually supported by the
HBCI system. The set of supported languages can be determined from the
HIBPA segment from the BACBankData object.
Long BACDialog::NextMessageSeqNo;
Long property that holds the next message sequence number that will be assigned by ExecuteMessage. This is initialised to 1 when the BACDialog was created and whenever BeginDialog is invoked. It is incremented each time a message is sent through ExecuteMessage.
BACDialog::OnActivityComplete(
[in] Long lHBCIResultCode);
This event is fired whenever an asynchronous activity completes with or without error.
BACDialog::OnReceiveProgress(
[in] Long lBytesReceived);
This event is fired periodically while a message is received from the bank. An application may use this event to implement a GUI progress indicator -- although it will have a hard time doing so, because it won't know how much data will be received in total.
BACDialog::OnSendProgress(
[in] Long lBytesSent,
[in] Long lBytesTotal);
This event is fired periodically while a message is transmitted to the bank. An application may use this event to implement a GUI progress indicator.
BACDialog::OnStateChange(
[in] BACDialogStates nNewState);
This event is fired whenever the state of the dialog changes.
IBACSecurity* BACDialog::Security;
This read only property holds a reference of the security object that was supplied when this BACDialog object was created. This property may also hold a null reference.
BACDialogStates BACDialog::State;
Read-only state property that indicates the current state of this BACDialog. It is set to one of the values of the BACDialogStates enumeration.
| Enumerator | Description |
|---|---|
| bacDialogIdle | The BACDialog object is currently offline and completely idle. There is no transport connection. This state is the initial state of the BACDialog object. If this state is re-entered after a HBCI dialog was completed, all properties still contain their most recent values. |
| bacDialogBeginning | The BACDialog object is currently attempting to begin a new dialog. This state is entered through invoking BeginDialog. |
| bacDialogReady | The BACDialog object is currently online, idle and ready to accept requests. In this state the method ExecuteMessage may be invoked. |
| bacDialogExecuting | The BACDialog object is executing a message online. In this state no requests may be submitted. Once the message completes, the dialog will automatically re-enter the bacDialogReady state. |
| bacDialogEnding | The dialog is currently closed. |
| bacDialogAborted | The HBCI dialog was cancelled or unexpectedly aborted. A dialog is aborted when the transport connection is lost. If the transport connection is lost after the dialog was orderly shut down, it is not considered an error and the dialog will switch into the bacDialogIdle state in this case. A dialog is aborted either in response to invocation of the Abort method or when the BACDialog object detects errorneous data in the received data. |
Variant BACDialog::SynchronizationResult;
This read-only property receives the returned result value from a synchronization. The actual type of the returned value depends on the type of the synchronized item.
Long BACDialog::Timeout;
This property defines the response timeout in milliseconds that is applied to all methods that perfom an online message exchange. It is initialised to the default timeout read from the DDBAC option "ResponseTimeout".
Setting this property will change the timeout for that dialog only, the default value will not be altered. The default value can be changed through the BACBanking::Options property of the BACBanking object. Changing the default value affects all dialogs created thereafter.
IBACTransport* BACDialog::Transport;
This read only property holds a reference of the transport object that was supplied when this BACDialog object was created.
A BACMessage object is the entity of a single online transaction. As such it collects all information that is sent to the homebanking server in a single HBCI message and all information from the corresponding HBCI response message.
When a BACMessage object is created it must be filled with BACTransaction
objects representing the individual homebanking orders. Usually, an application
program puts only a single BACTransaction object into the BACMessage, but it
is free to use the message to bundle any number of transactions. However, individual
banks may restrict the extend of bundling. The actual message limitations imposed by
the bank system can be determined through its BPD. That is, through the data of the
"HIBPA" segment of the banks BACBankData object (see HBCI IV.2: Number of business
transaction types).
After adding the desired transactions to a BACMessage object one or more users may
sign these transactions. Once a user signature was added to a message no more
modifications are allowed. The number of signatures required can be determined through
the BPD parameters for the transaction types contained in the message (see HBCI IV.6:
Number of signatures permitted). The property NumSignaturesRequired is initially
zero and must be set during the initialisation phase if more than one signature will
follow. The default value zero allows zero signatures or a single signature only.
A BACMessage object can be persistently stored in any state. A BACMessage
object is stored as a stream of HBCI segments. The first segment in this stream is a
DDBAC custom segment that contains the properties State,
NumSignaturesRequired, DialogID, SequenceNumber and HBCIVersion.
It is followed by the HBCI representation of all other directly or indirectly
contained segments. The segments are stored in the following order:
DDMSG 1 State num(..5); NumSignaturesRequired num(1); Dialogid id; SequenceNumber num(..4) HBCIVersion num(..3) HNSHK 0..3 Signatures(i).SignatureHeaderSegment HK___ 0.. Transactions(i).OrderSegment HNSHA 0..3 Signatures(i).SignatureValueSegment HIRMG 0..1 Acknowledgement HIRMS 0.. Transactions(i).Acknowledgement HI___ 0.. Transactions(i).ResponseSegments HI___ 0.. OrphanResponseSegments
IBACSegment* BACMessage::Acknowledgement;
Read only property that contains the acknowledgement segment (HIRMG) that was returned for this message. If no acknowledgement was returned, yet, then this property is not available.
Generally the acknowledgement is only available when the BACMessage is in the bacMessageDone state. In any other state this property won't be available.
Actually the acknowledgement segment is attached when the raw response message is processed by the hidden private ParseMessageBuffer method.
void BACMessage::AddSignature(
[in] IBACCustomer* piCustomer,
[in] IBACSecurity* piSecurity,
[in] BACSignerRole nSignerRole);
Private method that is used by the BACCustomer object to add its signature to this BACMessage object.
The AddSignature method can be invoked when the BACMessage object is in
the bacMessageInit state in order to add the first signature
to this message. This will implicitly switch the message into the
bacMessageSigned state. If the property
NumSignaturesRequired has the value zero when this method is invoked, it is
assumed that there will only be this single signature. The property
NumSignaturesRequired will be adjusted to one and thus no further signatures
will be allowed.
The AddSignature method can also be invoked when the BACMessage object
is in the bacMessageSigned state and further signatures are
required. That is, the property NumSignaturesRequired has a higher value
than the count of signatures in the Signatures collection.
If this is the first signature then this method will assign sequence numbers to all order segments of the contained transactions. The first transaction receives the sequence number NumSignaturesRequired plus two.
void BACMessage::AddTransaction(
[in] IBACSegment* piOrderSegment);
Through this method additional transactions can be added to this message.
Transactions can only be added to a message that is in the bacMessageInit state. Once a message was signed no further transactions can be added.
String BACMessage::DialogID;
Read only property that stores the HBCI dialog ID that was assigned to this message when it was executed online. The default value is "0".
IBACMessageBuffer* BACMessage::GenerateMessageBuffer(
[in] IBACCustomer* piCustomer,
[in] IBACSecurity* piSecurity,
[in] Long lHBCIVersion,
[in] String sDialogID,
[in] Long lMsgSeqNo,
[in] Boolean fEncrypt);
Private method that is used by the BACDialog object to extract the eqivalent raw HBCI message from this BACMessage object for the purpose of sending it online.
Internal message buffer that contains the raw generated HBCI message. The generated message buffer contains the entire HBCI message including message header and trailer. The message body is optionally encrypted.
This method may be invoked in the bacMessageInit or
bacMessageSigned states. If the method is successful, then the
BACMessage switches into the bacMessageSent state. The
value of the property NumSignaturesRequired must equal the count of
signatures in the Signatures collection, otherwise the method fails.
If the message is in the bacMessageInit state then this
method will assign sequence numbers to all order segments of the contained
transactions. The first transaction receives the sequence number two.
Long BACMessage::HBCIVersion;
Property that defines the HBCI version for this message.
Initially this property contains the value zero in order to indicate that the HBCI
version is not explicitly defined for this message. The HBCI version can be
defined by setting this property.
If none is defined, then the HBCI version is derived from the BACCustomer object
given to AddSignature. If the BACCustomer object does not define a HBCI
version, too, then the default version HBCI 2.0.1 is assumed. If the HBCI version
is already explicitly defined when AddSignature is called, then the HBCI
version defined in the BACCustomer object is ignored.
This property is implemented in the IBACMessage2 interface.
Long BACMessage::NumSignaturesRequired;
Number of signatures that must be added to this BACMessage object before the message can be assumed to be complete. The property NumSignaturesRequired is initially zero and must be set during the initialisation phase if more than one signature shall follow. The default value zero allows zero signatures or a single signature only.
Currently HBCI limits the maximum number of signatures per message to three.
IBACSegments* BACMessage::OrphanResponseSegments;
This BACSegments collection holds all BACSegment objects of response segments that were not associated with a transaction. Initially, when a BACMessage is created, this collection is empty.
Actually this collection is filled by the hidden private ParseMessageBuffer method.
BACMessageFlags BACMessage::ParseMessageBuffer(
[in] IBACMessageBuffer* piBuf,
[in] IBACCustomer* piCustomer,
[in] IBACSecurity* piSecurity);
Private method that is used by the BACDialog object to hand over the response message to the originating BACMessage object.
Returns flags that indicate whether the parsed message was encrypted and/or signed. Note that if the message was signed, the signature was successfully verified. If a signature is present that can not be verified, then an error is raised.
This method must only be invoked in the bacMessageSent state.
It parses the given message buffer, adding the contained response segments to the
appropriate collections and properties. The message is then automatically switched
into the bacMessageDone state.
The given message buffer must contain only the raw message body without bank
signature and without message header or trailer segments. It must not be encrypted.
Long BACMessage::SequenceNumber;
Read only property that stores the message sequence number of this message. The sequence number is assigned when the message is transmitted online. Before that it is zero.
IBACSignatures* BACMessage::Signatures;
This BACSignatures collection holds all BACSignature objects (i.e. user signatures) that have been added to this message. Initially, when a BACMessage is created, this collection is empty.
This collection is an ordered sequence. Each subsequently added signature
is added to the front of this sequence, effectively signing not only the message
but all previous signatures, too.
The collection itself cannot be modified. Additional signatures can only be added
by the BACCustomer::SignMessage method of the BACCustomer object and by
automatic signatures of the BACDialog object.
Actually all signatures must be added through the hidden private AddSignature method.
BACMessageStates BACMessage::State;
Read only property that indicates the current state of this BACMessage object. BACMessageStates enumerates the possible states.
IBACTransactions* BACMessage::Transactions;
This BACTransactions collection holds all BACTransaction objects of this message. Initially, when a BACMessage is created, this collection is empty.
This collection is an ordered sequence where new transactions are always added at the end of the sequence. The collection itself is read-only. New transactions can only be added by the AddTransaction method.
The BACMessageBuffer stores the raw data of a single (perhaps partial) HBCI
message. The stored message data is accessed through an IStream interface
implemented by the buffer. The buffer recognises and works with segment boundaries
and the message trailer.
The methods of the BACMessageBuffer object allow random access to the message
data at any segment boundary. Individual segments can be erased and inserted.
Segments can be located by type or number.
The IBACMessageBuffer operations always identify a segment by its index. The
index is the position of the segment inside the message buffer. That is, the first
segment of the message buffer always has the index zero. The index is not related
to the segment number that appears in the segment header of a segment.
The BACMessageBuffer object is an internal object that should only be accessed by service provider components and should never be accessed by application programs directly.
void BACMessageBuffer::CopyToStream(
[in] Long lBegin,
[in] Long lEnd,
[in] IUnknown* piStm);
Copies the indicated range of segments from this message buffer to the given stream.
IUnknown* BACMessageBuffer::CreateStream(
[in] Long lBegin,
[in] Long lEnd,
[in] Long lAccessMode);
Returns an IStream interface through which the buffered message data can be accessed. The message buffer is locked
Through this out parameter the new stream object is returned. When the method
fails, then NULL is returned instead. The caller must invoke
QueryInterface() on the returned IUnknown in order to obtain either the
IStream or the ISequentialStream interface of the stream object.
When the stream was created for reading, only the Read() method of the IStream
interface must be invoked. If the stream was created for writing, only the
Write() method must be invoked. All other methods are not implemented and
return E_NOTIMPL.
Returns a stream interface that presents the raw data of a sequence of segments from the message buffer as a single continous byte stream. The actual behaviour of the returned stream object depends on whether the stream was created for reading or writing. Currently only the following values are supported for the parameter lAccessMode:
If the stream was created for reading, then the method ensures that the message
length data element of the message header is correct. Hence, the caller no
longer needs to care about setting that message length correctly.
If the stream was created for reading then the caller can read the data from
the range of segments defined by the lBegin and lEnd parameters. If
the end of this range is encountered, IStream::Read returns S_FALSE together
with the remaining data.
If the stream was created for writing, then the written data will be inserted
in front of the segment selected by the lBegin parameter. The lEnd parameter
is ignored. The implementation refuses to write any data beyond a HNHBS
(message trailer) segment. An attempt to continue writing into a stream past
the final character of a previously written HNHBS is refused by returning
S_FALSE from IStream::Write together with the actual number of bytes that
were written. If more data is written than the allowed by the
MaxLength property, IStream::Write will return STG_E_MEDIUMFULL.
String BACMessageBuffer::DebugGetSegment(
[in] Long lIndex);
Returns the entire raw segment data from a segment in this message buffer.
Returns the entire raw segment data inside a string. Note that this data may contain embedded nul characters!
void BACMessageBuffer::DebugSetSegment(
[in] Long lIndex,
[in] String sSegmentData);
Explicitly sets the entire raw segment data for a segment in this message buffer.
void BACMessageBuffer::Decrypt(
[in] String sHexSessionKey);
Attempts to decrypt the message buffer using the given session key and the 2-Key-Triple-DES algorithm.
When this function is called the message buffer must contain only a single HNVSD
segment with the version number 1 and the sequence number 999. If it contains any
other segment then an error is raised.
The data contained in the HNVSD segment is decrypted and replace the HNVSD segment.
If the decrypted data cannot be legally dissected into a sequence of HBCI segments
then an error is raised.
void BACMessageBuffer::Encrypt(
[in] String sHexSessionKey);
Encryptes the entire contents of this message buffer using the given session key and the 2-Key-Triple-DES algorithm.
The encrypted message buffer then contains a single HNVSD segment
void BACMessageBuffer::EraseSegments(
[in] Long lBegin,
[in] Long lEnd);
Erases a range of segments from this message buffer.
Long BACMessageBuffer::FindSegmentByNumber(
[in] Long lSegmentNumber);
Scans the message buffer, looking for a segment with the given segment number. If one is found, the index of the segment is returned in the plSegIndex parameter.
Returns the index of the segment found. If no matching segment was found, then this is set to -1.
Long BACMessageBuffer::FindSegmentByType(
[in] String sSegmentType);
Scans the message buffer, looking for a segment of a given type. Returns the index of the first matching segment.
Returns the index of the segment or -1 if no matching segment was found.
String BACMessageBuffer::Hash();
Computes the RIPE-MD 160 Message Digest (Hash value) over the entire contents of this message buffer.
Returns the 20 byte hash value in hexadecimal representation (40 hex digits).
Long BACMessageBuffer::Length;
Length of the entire message buffer in bytes (read only). The value is not guaranteed to be meaningful while the message buffer is written to.
Long BACMessageBuffer::MaxLength;
This property can be used to limit the maximum size of the message buffer in
bytes (read/write). If this property is set to zero, then there is no limit on
the size of the message buffer, other than the amount of available memory.
When the message buffer is constructed the property is initialised to zero.
It is not possible to truncate a buffer by setting a maximum length smaller
than the actual length. An attempt to do so will return a failure.
Long BACMessageBuffer::SegmentCount;
Number of segments that are currently stored in this message buffer (read only). The value is not guaranteed to be meaningful while the message buffer is written to.
void BACMessageBuffer::SegmentInfo(
[in] Long lIndex,
[in, out] String* psSegmentType,
[in, out] Long* plSegmentNumber,
[in, out] Long* plSegmentSize);
Returns information about a particular stored segment.
The BACMonitor object is a global singleton that receives all diagnostic output
from the various DDBAC components. By default it writes all such output to the
debugging console using the Win32 API OutputDebugString(). In addition it fires
an event whenever it writes a string to the debugging console. Hence, an
application can intercept all such output and handle it as needed.
The BACMonitor is only an in-proc singleton, that means, each process gets its own
instance. As all DDBAC components are in-proc all output from an application will
be funneled through the same monitor. If two applications are run each has its own
monitor.
BACMonitor::AfterEncryptMessageBuffer(
[in] IBACMessageBuffer* piMsgBuf);
This event is fired after a message buffer was encrypted. The message now contains nothing but the HNVSK and the HNVSD segment.
BACMonitor::AfterSignMessageBuffer(
[in] IBACMessageBuffer* piMsgBuf);
This event is fired after a signature was added to a generated message. At this time no message header or trailer is in the buffer. The generate signature header is the first segment in the buffer. The new signature trailer is the last segment in the buffer. This event is fired for each signature that is added to the message buffer.
BACMonitor::BeforeEncryptMessageBuffer(
[in] IBACMessageBuffer* piMsgBuf);
This event is fired before a message buffer is encrypted. All data that will be encrypted is in the message buffer.
BACMonitor::BeforeSignMessageBuffer(
[in] IBACMessageBuffer* piMsgBuf);
This event is fired before a signature is added to a generated message. At this time no message header or trailer is in the buffer. The BeforeSignMessageBuffer event is fired after the signature header was added to the message, thusm immediately before the actual signature is computed.
BACMonitor::BeforeTransmitMessageBuffer(
[in] IBACMessageBuffer* piMsgBuf);
This event is fired immediately before a message buffer is transmitted. The message buffer contains the entire message exactly as it will be sent over the wire.
BACMonitor::OnTrace(
[in] String sText);
This event is fired whenever something is traced.
BACMonitor::OnTracePerformance(
[in] Long lEntry,
[in] Long lBeforeSend,
[in] Long lAfterReceive,
[in] Long lExit);
This event is fired whenever performance data of the most recent message
exchange is traced.
The performance data is collected by the internal execute message routine that
is used from BACDialog::BeginDialog, BACDialog::ExecuteMessage, and
BACDialog::EndDialog. The performance data consists of four millisecond
timestamps taken during the executing of the message.
The difference between lBeforeSend and lEntry reflects the internal
processing time needed to construct the binary message buffer, including
any signature and ciphering.
The difference between lBeforeSend and lAfterReceive reflects the
time required for transmitting the message and receiving the response.
The difference between lAfterReceive and lExit reflects the internal
processing time needed to evaluate the binary message buffer containing the
response, including any signature verification and de-ciphering.
void BACMonitor::Trace(
[in] Long lSeverity,
[in] String sText);
Trace the given text string.
The purpose of the BACSegment class is to scan, create, manage,
and store HBCI message segments. Hence, the BACSegment object
is the work horse of the BAC. BACSegment objects are often used
as subordinate objects or method parameters and therefore have
a key role in the BAC architecture. Understanding the
BACSegment object is vital to successful use of the BAC.
From the point of view of the application programmer, a
BACSegment is primarily a collection of related named data
items. The implementor of the BACSegment class, however,
usually focuses on its relation to the HBCI message segment.
The BACSegment object supports the IBACTransmogrify interface.
Syntax for XML is generated by the BACSyntax element names.
| Format | XML form | Example |
|---|---|---|
| bacFormatAlphanumeric | As it is. | Auftrag an Hans |
| bacFormatText | As it is. | Auftrag an Hans |
| bacFormatNumeric | Numbers | 12 |
| bacFormatDigits | Numbers | 0012 |
| bacFormatFloat | Numbers with dot as seperator. | 12.13 |
| bacFormatObject | If Object supports IBACTransmogrify, then the XML representation of the embedded object is directly inserted. | <OBJECT>...</OBJECT> |
| bacFormatYesNo | True (1) or False (0) | False |
| bacFormatDate | yyyy-mm-dd | 2000-08-13 |
| bacFormatTime | hh:mm:ss | 11:34:51 |
<SEGMENT TYPE="HIRMS" VERSION="2" SEQNO="4" REFSEQNO="3"> <Rueckmeldung> <Code>9210</Code> <Bezugsdatenelement>3,3</Bezugsdatenelement> <Text>BLZ existiert nicht</Text> </Rueckmeldung> </SEGMENT>
Variant BACSegment::Item([in] Variant vGroup, [in] Variant vElement);
This indexed property can be used to retrieve or assign data element values of this segment. This is the default property of the segment class.
The type of the accessed element is a Variant in order to be capable of holding any type of element. The mapping of the actual Variant type of the element to the HBCI types is documented in "DataDesign HBCI Banking Application Components (DDBAC)".
Long BACSegment::RefSeqNo;
This property holds the sequence number of that this segment refers to. If no sequence number is available the result is 0.
Long BACSegment::SeqNo;
This property holds the sequence number of the segment within a message. The DDBAC initialise this property when building or scanning a HBCI message.
void BACSegment::SetValue(
[in] String sGroupName,
[in] Long lGroupPos,
[in] String sElementName,
[in] Long lElementPos,
[in] Variant vValue);
Explicitly set a data element with all its keys.
String BACSegment::Type;
This property defines the type of the segment. It holds the segment name string, for example, "HIUPD", etc...
Long BACSegment::Version;
This property defines the version of the segment. This is usually of no concern to the application programmer.
The BACSegments object is an OLE Automation Collection that holds an ordered
sequence of BACSegment objects.
The collection is a persistent object that implements the IBACPersistentObject
base interface. Thus the entire collection can be persisted in a single stream or
file. The persistent data stream is a continous sequence of HBCI segments.
The segments in the collection can be adressed solely through their numerical
index. The first segment has the index zero, the last segment has the index
Count-1. Various methods for finding segments with specific attributes exist.
All these methods return the index position of the first matching segment that was
found in the collection or -1 if nothing was found.
void BACSegments::Add(
[in] IBACSegment* piSegment,
[in] Long lBeforeIndex);
Add another BACSegment object to this collection.
void BACSegments::Clear();
Removes all BACSegment objects from this collection.
Long BACSegments::Count;
Read only property that provides the number of BACSegment objects in this collection.
Long BACSegments::FindSegment(
[in] IBACSegment* piSegment);
Finds a particular instance of a BACSegment object inside the collection.
If the segment was found its index is returned. If no matching segment is found then -1 is returned.
Long BACSegments::FindSegmentSeqNo(
[in] Long lSeqNo);
Finds a segment that has a particular sequence number inside the collection.
If the segment was found its index is returned. If no matching segment is found then -1 is returned.
Long BACSegments::FindSegmentType(
[in] String sType,
[in] Long lVersion);
Finds a segment of a particular type and version inside the collection.
If the segment was found its index is returned. If no matching segment is found then -1 is returned.
IBACSegment* BACSegments::Item([in] Long lIndex);
The Item property provides indexed access BACSegment objects stored in this collection. The Item property is the default value of the BACSegments object.
void BACSegments::Remove(
[in] Long lIndex);
Remove BACSegment object from collection.
Note that the index of every segment inside the collection may change as a result of this call.
Instances of the BACSepaMessage coclass represent a Sepa message.
A BACSepaMessage object can be created directly.
IBACSepaOrder BACSepaMessage::Add();
Add a BACSepaOrder object to this transaction.
BSTR BACSepaMessage::Descriptor;
Get the sepa pain Descriptor of this transaction.
DATE BACSepaMessage::ExecutionDate;
The execution date of this transaction.
IBACAccount BACSepaMessage::FromAccount;
Set or get the ordering BACAccount.
If the SepaMessage is attached to a BACSegment, the segments "Auftraggeberkontoverbindung"
will be filled with the account data too.
BSTR* BACSepaMessage::GetValue();
Gets a value inside the sepa pain message xml.
Boolean BACSepaMessage::IsIBANValid();
Validates the IBAN.
void BACSepaMessage::LoadXML();
Loads an external sepa pain message.
IBACSepaOrders* BACSepaMessage::Orders;
BACSepaOrders of all orders segments of this transaction.
IBACAccount BACSepaMessage::Recipient;
Get or set the Recipient of this order.
void BACSepaMessage::Remove(
[in] Long lIndex);
Remove BACSepaOrder object from collection.
IBACSegment BACSepaMessage::Segment;
Attaches this SepaMessage to a BACSegment.
If the BACSegment is an order segment:
The properties set in this BACSepaMessage will create a Sepa Pain Message Xml
which will be filled into the segments "SEPAPainMessage" field. The
SEPADesriptor will be filled with the selected SEPA Descriptor.
If the BACSegment is an response segment:
The properties in this BACSepaMessage can be used to retrieve data from the
Sepa Pain Message.
BSTR BACSepaMessage::SetValue();
Sets a value inside the sepa pain message xml.
BSTR* BACSepaMessage::Verify();
Validate the inside sepa pain message.
Returns S_OK and an empty String in Reason if the verification succeeds.
Returns S_FALSE if the verfication fails, and the error description from
the MSXML implementation (not end-user conform).
Returns an Error if the currently installed MSXML does not support schema
verification. (i.E: Windows 2000, Windows 98)
BSTR BACSepaMessage::xml;
Get the sepa pain formatted xml of this transaction.
Instances of the BACSepaOrder coclass represent a particular order inside a Sepa transaction.
A BACSepaOrder object can be created directly or found by using the Orders
collection in the BACSepaTransaction object.
CURRENCY BACSepaOrder::Amount;
This field holds the actual transaction amount. If the transaction is a debit transaction or a reversal of credit transaction, then this value is negative.
The property CurrencyCode in the BACSepaOrder interface provides the currency code to this amount.
BSTR BACSepaOrder::CurrencyCode;
This is the currency code of this order.
BSTR* BACSepaOrder::GetValue(
[in] BSTR sPath);
Gets a value inside the sepa pain order xml.
The value or an empty string if the tag does not exist.
IBACSepaMessage BACSepaOrder::Message;
Get the BACSepaMessage, which this order belongs too.
BSTR BACSepaOrder::Purpose;
Get or set the sepa pain formatted Purpose of this order.
BSTR BACSepaOrder::SetValue(
[in] BSTR sPath,
[in] BSTR sValue);
Sets a value inside the sepa pain order xml.
IBACAccount BACSepaOrder::ToAccount;
Set or get the BACAccount recipient.
BSTR BACSepaOrder::xml;
Get or set the sepa pain formatted xml of this order.
The BACSepaOrders object is an OLE Automation Collection that holds an ordered
sequence of BACSepaOrder objects.
The orders in the collection can be adressed solely through their numerical
index. The first segment has the index zero, the last segment has the index
Count-1. Various methods for finding segments with specific attributes exist.
All these methods return the index position of the first matching segment that was
found in the collection or -1 if nothing was found.
void BACSepaOrders::Clear();
Removes all BACSepaOrder objects from this collection.
Long BACSepaOrders::Count;
Read only property that provides the number of BACSegment objects in this collection.
BACSepaOrder* BACSepaOrders::Item([in] Long lIndex);
The Item property provides indexed access BACSegment objects stored in this collection. The Item property is the default value of the BACSegments object.
The BACSignature object represents a single user signature in the context of the BACMessage::Signatures collection of the BACMessage object.
A BACSignature object cannot be explicitly created by an application. It is implicitly created when a new signature is added to the BACMessage by BACCustomer::AddSignature or the BACDialog object.
IBACSegment* BACSignature::SignatureHeaderAcknowledgement;
Read only property that contains the acknowledgement segment (HIRMS) that was returned for the signature header of this signature. If no corresponding acknowledgement was returned, then this property is null.
IBACSegment* BACSignature::SignatureHeaderSegment;
Read only property that contains the signature header segment (HNSHK) of this segment.
IBACSegment* BACSignature::SignatureValueAcknowledgement;
Read only property that contains the acknowledgement segment (HIRMS) that was returned for the signature value of this signature. If no corresponding acknowledgement was returned, then this property is null.
IBACSegment* BACSignature::SignatureValueSegment;
Read only property that contains the signature value segment (HNSHA) of this segment.
The BACSignatures object is an OLE Automation Collection that holds an ordered sequence of BACSignature objects. It appears in the BACMessage::Signatures property of the BACMessage object.
Long BACSignatures::Count;
Read only property that provides the number of BACSignature objects in this collection.
Long BACSignatures::FindSignatureHeaderSeqNo(
[in] Long lSeqNo);
Finds a signature that has an BACSignature::SignatureHeaderSegment with a particular sequence number.
If the signature was found its index is returned. If no matching signature is found then -1 is returned.
Long BACSignatures::FindSignatureValueSeqNo(
[in] Long lSeqNo);
Finds a signature that has an BACSignature::SignatureValueSegment with a particular sequence number.
If the signature was found its index is returned. If no matching signature is found then -1 is returned.
IBACSignature* BACSignatures::Item([in] Long lIndex);
The Item property provides indexed access BACSignature objects stored in this collection. The Item property is the default value of the BACSignatures object.
This object is the entry point of syntax description with the DDBAC.
You can use all objects with the prefix "BACSyntax" to get and set
a description of the syntax of the HBCI segments.
At a starting point you need always a BACSyntax object. With the
BACSyntax object you can set a new segment syntax with
BACSyntax::Add or you get an existing segment syntax with
BACSyntax::FindSegment. BACSyntax::FindSegment returns a
BACSyntaxSegment object, this represents the whole description of
a HBCI segement. The property BACSyntaxSegment::SyntaxElements
of the BACSyntaxSegment object gives you access to the BACSyntaxElements
object. The BACSyntaxElements object is a collection of BACSyntaxElement
objects.
The syntax object model:
BACSyntax BACSyntaxSegment BACSyntaxElements BACSyntaxElement BACSyntaxElement BACSyntaxElement .... BACSyntaxSegment BACSyntaxElements BACSyntaxElement .... ....
void BACSyntax2::AddSchema(
String sName,
Long lVersion,
String sSchema,
String sSegmentDescription);
Adding a new syntax description to the BACSyntax collection. New syntax will be used instead of the standard elements. The major key is the BACSyntaxSegment::Name, BACSyntaxSegment::Version pair. So you can overwrite the syntax of an existing segment by adding a new BACSyntaxSegment object with the same name and version as the existing.
void BACSyntax::Add(
BACSyntaxSegment newSyntaxSegment);
Adding a new syntax description to the BACSyntax collection. New syntax will be used instead of the standard elements. The major key is the BACSyntaxSegment::Name, BACSyntaxSegment::Version pair. So you can overwrite the syntax of an existing segment by adding a new BACSyntaxSegment object with the same name and version as the existing.
void BACSyntax::Clear();
Removes all added syntax segments. Standard elements can not be removed (standard elements are elements from the Dat-file).
String BACSyntax::ConvertFormat(
BACFormatType typ);
It is just a helper method for converting the enum in a readable String. For example BACFormatNumeric is converted to "Numeric".
The String of the format. For example "Numeric".
String BACSyntax::FileName;
No longer supported. Raises an E_NOTIMPL exception.
BACSyntaxSegment BACSyntax::FindSegment(
String strName,
Long lVersion);
Searching for a segment in the collection. First will be searched at the new segments (added with Add), then at the segments stored in the file FileName.
Returns an reference on the BACSyntaxSegment object. If segment is not existing, no object will be returned.
Long BACSyntax::FindSegmentVersion(
String strName,
Long lHBCIVersion);
Searching for the segment version in a specific HBCI version.
Returning the version of the segment in this HBCI version. Is the segment not present in the HBCI version, the value -1 is returned.
Long BACSyntax::MajorFileVersion;
No longer supported. Raises an E_NOTIMPL exception.
Long BACSyntax::MinorFileVersion;
No longer supported. Raises an E_NOTIMPL exception.
void BACSyntax::Remove(
String strName,
Long lVersion);
Removes the syntax segment if it was added. Standard elements can not be removed (standard elements are elements from the Dat-file "ddHBCI.DAT").
The BACSyntaxElement object is the elementary object of the DDBAC segment syntax
description objects. It describes a new atomic syntax element. A complete segment
syntax uses a sequence of BACSyntaxElement objects to define the segment.
The BACSyntaxElement object is a passive property container with no methods. The
sum of the individual properties define the syntax requirements of the data
element.
String BACSyntaxElement::Delimiter;
Delimiter between this and the next element.
The delimiter dependence on the format. Is the format
bacFormatDEG then the delimiter is the seperate character
after the DEG this can only be a "+" or "'".
All other tuples (GD and GDG) must be delimited with a colon ":".
As delimiter is "+", "'" and ":" legal.
BACFormatType BACSyntaxElement::Format;
Defines the data type of the element. The possible values are enumerated as BACFormatType. If the data type is BACFormatObject then the property ObjectClass further identifies the class of the object.
Long BACSyntaxElement::MaxCount;
The Count field indicates how often the DEG, DE, GD, or GDG must be iterated
(lower bound - MinCount) and may be iterated (upper bound - MaxCount).
In such, it implies whether the element is optional or mandatory.
If MinCount is 0, then the element is completely optional.
If element is required then MinCount must be at least 1.
MaxCount is not optional so if HBCI gives no upper bound specify
maximal value is 2097152.
Long BACSyntaxElement::MaxLength;
Specify the maximum length of the data element or the number of data elements
in a group (DEG).
MaxLength is not optional so if HBCI gives no upper bound specify
maximal value of type Long, this is 2147483647.
Lenght at normal format:
Format is bacFormatAlphanumeric.
MinLength is 1 and MaxLength is 6 so the
bounds are 1..6. The element
must contain at least one element, up to six.
A possible value is "HKUEB".
Length at a group format:
Format is bacFormatDEG.
MinLength and MaxLength should be equal.
MinLength and MaxLength contains the nummer
of GD elements in the DEG.
The correct value for the DEG "Segementkopf"
is 4 for MinLenght and 4 for MaxLength.
Long BACSyntaxElement::MinCount;
Represents the count of repetition of the element in the segment. If MinCount is zero then the element is optional. See also MaxCount.
Long BACSyntaxElement::MinLength;
Specify the length of the format. For more details see MaxLength.
String BACSyntaxElement::Name;
Name of the data element that can be used to access an instance of this
element through the BACSegment object. The name is also useful for
generating readable parser/generator error messages.
Value examples are "Segmentkopf", "Segmentkennung" and "BPDVersion".
The property Name can consist of any printable characters, except whitespace.
It must not end with a trailing digit.
String BACSyntaxElement::ObjectClass;
The Format proptery must have the value bacFormatObject.
Contains the class name of the object for parsing and generating the HBCI message.
You can support your own class for parsing and generating a HBCI message if you
change this property. Your class has to implement the interface IPersistStream.
IPersistStream is not an automation interface so this class can not be coded in VB.
The parser calls IPersitStream::Load and the generator IPersisStream::Save.
At the moment the DDBAC defines this classes:
| Class Name | Description |
|---|---|
| DataDesign.BACDataObject | This is useful for small data blobs. It implements a default interface with a single byte array property that represents the entire data. |
| DataDesign.BACDTAUS | This can be used to conveniently process DTAUS formatted data (useful for sending "HKSUB", "HKSLA"). |
| DataDesign.BACDTAZV | Similar for DTAZV data ("HKAUB"). |
| DataDesign.BACSwiftStatementOfHoldings | This can be used to process MT 571 data ( "HIWPD"). |
| DataDesign.BACSwiftStatement | This can be used to parse returned MT 940 data (e.g. "HIKAZ", "HIKAN"). |
| DataDesign.BACSwiftInterimTransactionReport | Similar for MT 942 data ("HIKAZ", "HIKAN"). |
The BACSyntaxElements object is a collection object that contains BACSyntaxElement objects. The collection offers methods for creating a new syntax or changing the existent. You can find a BACSyntaxElement object by using one of the find methods.
Changing the syntax of a BACSyntaxElements object
Dim Syntax As New BACSyntax
Dim seg As BACSyntaxSegment
Dim elements As BACSyntaxElements
Dim elm As BACSyntaxElement
Set seg = Syntax.FindSegment("HIAUBS", 3)
Set elements = seg.SyntaxElements
For Each elm In elements
' don't change the group
If Not elm.Format = bacFormatDEG Then
elm.Format = bacFormatText
End If
Next
' replacing the old syntax by the new
Syntax.Add seg
BACSyntaxElement BACSyntaxElements::Add(
String sName,
BACFormatType nFormatType,
Long lMinLength,
Long lMaxLength,
Long lMinCount,
Long lMaxCount,
String strDelimiter,
String strObjectClass);
Add a new BACSyntaxElement object at the end of the collection and return a reference of the new object. The new BACSyntaxElement object is initalized with all properties given by the method.
Returns an reference on the new object.
BACSyntaxElement BACSyntaxElements::AddNew();
Add a new BACSyntaxElement object at the end of the collection and returning a reference of the new object. The new object is empty and should be initalized.
void BACSyntaxElements::Clear();
All BACSyntaxElement objects will be destroyed.
Long BACSyntaxElements::Count;
Count of all BACSyntaxElement objects in the collection.
BACSyntaxElement BACSyntaxElements::FindElementByName(
String sName);
Looking for an BACSyntaxElement object in the collection (see also FindElementByPos).
Returns an reference on the BACSyntaxElement object. If element is not existing, no object will be returned.
BACSyntaxElement BACSyntaxElements::FindElementByPos(
Long lGroup,
Long lElement);
Searching for an element in the collection.
Returns an reference of the BACSyntaxElement object. If element is not existing, no object will be returned.
Searching for "Segmentkopf"
Dim Syntax As New BACSyntax
Dim Seg As BACSyntaxSegment
Dim Elem As BACSyntaxElement
Set Seg = Syntax.FindSegment("HKVVB", 2)
Set Elem = Seg.SyntaxElements.FindElementByPos(1)
' Elem.Name should be "Segmentkopf"
Set Elem = Seg.SyntaxElements.FindElementByPos(1,1)
' Elem.Name should be "Segmentkennung"
IBACSyntaxElement* BACSyntaxElements::Item;
The Item property provides indexed access to the BACSyntaxElement objects stored in this collection. The Item property is the default value of the BACSyntaxElements object.
This object holds all information about the syntax of one HBCI segment. In the property SyntaxElements is the syntax stored and the rest of the properties give some additional information. The key to distinguish between two segments are the properties Name and Version this mus be unequivocal.
String BACSyntaxSegment::Description;
Description of the segment. Examples are "Auslandsueberweisung", "Verarbeitungsvorbereitung" and "Identifikation".
String BACSyntaxSegment::Name;
Name of the segment, it is the short mark of HBCI segments. Examples are "HKAUB", "HKVVB" and "HKIDN".
BACSyntaxElements BACSyntaxSegment::SyntaxElements;
The syntax elements which represend the actual syntax. For more information see BACSyntaxElements.
String BACSyntaxSegment::Version;
HBCI version of this segment.
The BACTransaction object encapsulates the details of a single homebanking transaction. A BACTransaction object can only appear inside the BACMessage::Transactions collection of the BACMessage object. It cannot be instantiated on its own.
IBACSegment* BACTransaction::Acknowledgement;
This is the HIRMS BACSegment that was replied by the bank for this transaction. If the transaction was not submitted, yet, then this is an empty object.
IBACSegment* BACTransaction::OrderSegment;
This is a BACSegment object that holds the parameters for this transaction.
IBACSegments* BACTransaction::ResponseSegments;
This BACSegments collection holds all reponse data segments that were returned for this transaction. If no response data was returned (yet) then this is an empty collection.
The BACTransactions object is an OLE Automation Collection that holds an ordered sequence of BACTransaction objects. It appears only in the BACMessage::Transactions property of the BACMessage object.
Long BACTransactions::Count;
Read only property that provides the number of BACTransaction objects in this collection.
Long BACTransactions::FindTransaction(
[in] IBACTransaction* piTransaction);
Finds a particular instance of a BACTransaction object inside the collection.
If the Transaction was found its index is returned. If no matching Transaction is found then -1 is returned.
Long BACTransactions::FindTransactionSeqNo(
[in] Long lSeqNo);
Finds a transaction that has an BACTransaction::OrderSegment with a particular sequence number.
If the transaction was found its index is returned. If no matching transaction is found then -1 is returned.
Long BACTransactions::FindTransactionType(
[in] String sType,
[in] Long lVersion);
Finds a transaction of a particular type and version inside the collection.
If the transaction was found then its index is returned. If no matching transaction is found then -1 is returned.
IBACTransaction* BACTransactions::Item([in] Long lIndex);
The Item property provides indexed access BACTransaction objects stored in this collection. The Item property is the default value of the BACTransactions object.
String IBACBankInfo::FindBIC(
String sIBAN,
Bool pfGood);
Searches the BLZ-Database for a specific BIC.
Returns the BIC or an empty string if the BIC cannot be found.
The database contains records for german "DE" IBANs, all other countrycodes will return an empty string.
String IBACBankInfo::GenerateIBAN(
String bstrCountryCode,
String bstrValue1,
String bstrValue2,
String bstrValue3,
String bstrValue4);
Generates an IBAN.
If this method is used to generate IBANs, the end user must be warned, that
the results must be verified. In Germany only the account-holding bank can submit
the valid IBAN.
The parameters are used as follows: Country Value1 Value2 Value3 Value4 DE Bankleitzahl(8) Kontonummer(10)
Returns the generated IBAN.
Boolean IBACBankInfo::IsIBANValid(
[in] String sIBAN);
Validates an IBAN.
Returns true if the checksum of the IBAN is valid.
The interface IBACCardTerminal is the generic base interface that must be
implemented by all DDBAC compliant smart card terminal provider objects. It
defines a complete set of generic smart card terminal operations.
A card terminal object can be in one of three states: "Closed", "Opened", "ICC".
Any raised error will return the object into the "Closed" state.
The Implementation based on the CT-API recogizes the "Eutelis" specification for
HBCI compliant smart card terminals as the minimum set of required functionality.
Any errorneous CT-API return values (other than zero) are indicated in the HRESULT
as OLE Automation exceptions. The designated return value parameter is used to
carry the status word (SW1:SW2).
The IBACCardTerminal interface defines the internal interface to a card terminal provider component. It should never be accessed by application programs directly.
String IBACCardTerminal2::DriverVersion;
Returns the smartcard reader version if available.
BACSmartcardState IBACCardTerminal2::SmartcardState;
Property that informs about smartcard state at chipdrive. See description of states at BACSmartcardState.
Long IBACCardTerminal3::PerformChangePin(
[in] String sHexCommandTemplate);
Performs card reader local PIN entry and verification.
Status word (SW1:SW2) that was returned in the response data. The status word value 0x16400 means that the PIN input timed out. The value 0x16401 means that the user aborted the PIN input by pressing cancel on the card reader. Any other return values are the actual status word from the smart card.
If the user aborts locally at the card reader, or the PIN entry times out, then
an exception with an appropriate display text is raised.
If the card reader does not support local PIN entry, then the exception E_NOTIMPL
is raised. The caller is responsible for using another way of verification then.
CardTerminal Basic Command Set (CT-BCS) specification, Version 1.0, 15. April 1999.
Long IBACCardTerminal3::PerformVerification(
[in] String sHexCommandTemplate,
[in] Long nInsertionPosition,
[in] Long nLengthOfPIN,
[in] Long nPINCoding);
Performs card reader local PIN entry and verification.
Status word (SW1:SW2) that was returned in the response data. The status word value 0x16400 means that the PIN input timed out. The value 0x16401 means that the user aborted the PIN input by pressing cancel on the card reader. Any other return values are the actual status word from the smart card.
If the user aborts locally at the card reader, or the PIN entry times out, then
an exception with an appropriate display text is raised.
If the card reader does not support local PIN entry, then the exception E_NOTIMPL
is raised. The caller is responsible for using another way of verification then.
CardTerminal Basic Command Set (CT-BCS) specification, Version 1.0, 15. April 1999.
Boolean IBACCardTerminal3::SupportsVerification;
Indicates whether the attached card reader device actually supports local pin verification through the PerformVerification method. The property is False if local verification is not supported and PerformVerification would raise E_NOTIMPL.
BACSmartcardState IBACCardTerminal4::RequestForSmartcard(
[in] String sDescription);
Request the user for insert a smartcard. Function shows a dialog which asks user for smartcard.
Property that informs about smartcard state at chipdrive. See description of states at BACSmartcardState.
String IBACCardTerminal::CardTerminalID;
Property that selects a particular installed smart card reader and driver.
This is a generic property which meaning can be defined by an implementation.
It shall, however, always be used for the purpose of identifying a particular
smart card reader.
The CT-API based implementation uses this property to select the actual path
and name of the CT-API DLL file. It uses a default value of "CT32.DLL"
The PC/SC Smart Card API based implementation uses this parameter to receive
the name of the smart card reader to connect to. By default the single
installed default card reader is used.
String IBACCardTerminal::CardTerminalParameter;
Property that further qualifies the CardTerminalID property.
The CT-API based implementation uses this property to receive the port number of the desired smart card reader. The PC/SC based implementation ignores this property.
void IBACCardTerminal::CloseCT();
Close card terminal.
Releases any acquired resources and shuts the card terminal down. This
operation may be followed by an OpenCT invocation or by a final object
release.
Note that an implementation of this interface must gracefully shut down upon
a final release, even if this operation was not invoked.
void IBACCardTerminal::EjectICC();
Power down and (optionally) eject ICC. This operation may be issued to conserve power between subsequent sessions.
The purpose of this command is to return into the open card terminal state. If
this is not possible, then an error shall be raised. If it is possible to
return into this state, then any problems should be ignored and the operation
shall succeed.
Note that the caller may issue CloseCT without issuing EjectICC
first.
Long IBACCardTerminal::ExecuteCommand(
[in] String sHexCommand,
[in, out] String* psHexResponse);
Sends command to ICC and returns its response (if any).
Status word (SW1:SW2) that was returned in the response data.
If the command cannot be successfully transmitted to the ICC or no reponse was received, then this operation is required to raise an IErrorInfo instance with a description that is suitable to be displayed to the user. In case of any error the card terminal is implicitly closed.
void IBACCardTerminal::OpenCT();
Open card terminal. Only if this operation was successful then any of the other operations in this interface may be invoked.
Before this operation is invoked the caller must select the desired smart card
reader by setting the CardTerminalID and CardTerminalParameter
properties.
If the requested card terminal cannot be successfully opened for any reason, then
this operation is required to raise an IErrorInfo instance with a description that
is suitable to be displayed to the user.
Note that the DDBACCPL invokes this operation in order to test whether a selected
card terminal is available. Hence, an implementation is required to ensure that
the card terminal is physically attached and ready for use.
void IBACCardTerminal::RequestICC();
Obtain access to inserted ICC. This operation must be successfully completed before an ICC command can be executed.
If no ICC is inserted at the time this operation is invoked or if the
operation fails for any other reason (e.g. inserted type of card not supported),
then this operation is required to raise an IErrorInfo instance with a description
that is suitable to be displayed to the user. This means, the message should not
be to technical, but rather guide the user to resolve the problem.
If this function completes successfully, then a card is inserted and ready to
be used.
BACCardTerminalStates IBACCardTerminal::State;
Read-only property that returns the current state of this IBACCardTerminal instance.
IBACAccounts IBACContact::Accounts;
Return a collection of Accounts which belong to this contact
This method is implemented in the IBACContact3 interface.
IBACAccounts IBACContact::Accounts;
Return a collection of Accounts which belong to this contact
This method is implemented in the IBACCustomer5 interface.
The IBACPersistentObject interface is an abstract base from which all persistent BAC objects are derived.
Several objects of the BAC support object persistence. This means, that the entire object can be persistently stored in some storage location, and recreated later by restoring it from that storage. The following BAC objects support persistency:
These objects support persistency by implementing the standard COM
interfaces IPersist, IPersistFile, IPersistStream,
IPersistStreamInit, and IPersistMemory. If possible,
clients shall use these interfaces in order to store and retrieve
persistent objects. However, Visual Basic cannot use these
interfaces.
In order to support incapable clients, each persistent object also
implements the helper methods of the IBACPersistentObject
interface in its default interface. These helper methods make the
IPersistFile interface available to all Automation compatible
clients.
Hint: Most databases support direct storage of objects that support
the IPersistStream interface. Usually this is accomplished by
defining a field of type "OLE Object" or similar. Such a field can
then be used to store an object directly.
String IBACPersistentObject::CurrentFilename;
Read-only property that returns the current filename of this persistent object. The current filename is established by Load and SaveAs. This may be an empty string if the object was newly created and not saved, yet.
IPersistFile::GetCurFile in the COM specification.
Boolean IBACPersistentObject::IsDirty;
Boolean read-only property that indicates whether this object was changed since it was last saved to its current filename. This flag is set whenever the object is changed and is cleared by Save and SaveAs. It is not cleared by SaveCopyAs.
IPersistFile::IsDirty in the COM specification.
void IBACPersistentObject::Load(
[in] String sFilename);
Loads the object data from the given file. The object is reinitialised with the loaded data.
IPersistFile::Load in the COM specification.
void IBACPersistentObject::Save();
Saves the object using the current filename. The existing file
of that name will be silently overwritten. The current filename
is set by the Load and SaveAs methods.
This methods clears the internal IsDirty flag.
IPersistFile::Save in the COM specification.
void IBACPersistentObject::SaveAs(
[in] String sFilename);
Saves the object using the given filename.
IPersistFile::Save in the COM specification.
void IBACPersistentObject::SaveCopyAs(
[in] String sFilename);
Saves the object using the given filename, but will not remember that name. The CurrentFilename property will remain unchanged.
IPersistFile::Save in the COM specification.
The interface IBACSecurity is the generic base interface that must be implemented
by all DDBAC security provider components. It provides an overly complete set of
generic security operations that are required to implement the HBCI security
procedures. The abstraction of the security provider component models that of a
security media such as a chipcard and its operations. It is the goal of this interface
to fully support all chipcard features, yet allow an entirely software based
implementation.
Some methods declared in this interface are not applicable to all security
providers, for example, not all security providers can generate keys. An implementation
of an unsupported method is obliged to return the standard HRESULT E_NOTIMPL.
Chipcard based security providers are required to use the IBACCardTerminal
interface for access to the chipcard.
A security component manages up to six different keys enumerated in the BACKeyIDs
enumeration. The temporary keys are used during an update of the corresponding active
keys.
The IBACSecurity interface defines the internal interface to a security provider component. It should never be accessed by application programs directly.
void IBACSecurity2::DeactivateKey(
[in] Long nKeyID);
Resets the key state from bacKeyStatusActive to bacKeyStatusInactive.
This method switches a key state from bacKeyStatusActive to
bacKeyStatusInactive. If the key is in any other state, then
this method returns an error.
If the security media does not support deactivating the key refered to by
nKeyID, then this method should do nothing and return.
GeneratePrivateKey, ActivateKey
void IBACSecurity2::EraseKey(
[in] Long nKeyID);
Physically erases the indicated key with all its attributes.
This method completely and physically (if possible) erases the indicated key,
regardless of the keys current state. After the key was erased its key status
is bacKeyStatusNull.
If the security media does not support erasing the key refered to by
nKeyID, then this method should do nothing and return.
GeneratePrivateKey, ActivateKey
void IBACSecurity4::AuthenticateUI(
[in] String sSecurityMediaID);
Authenticates the user and thus opens up access to the security media. The actual security media must be identified by its security media ID.
This method is identical to IBACSecurity::Authenticate, but does not have a
passphrase parameter. Instead this method will pop up a dialog box and prompt
the user itself. If this method is implemented by smart card based security
components it provides special support for class 2 smart card readers with own
pinpad for PIN entry.
Note that even if this method is implemented, the caller must be prepared to
catch a E_NOTIMPL exception and gracefully degrade to using its own PIN entry
dialog box.
If the user cancelled the PIN entry at the card reader, then the security object
will not be authenticated and this method returns S_FALSE.
void IBACSecurity::ActivateKey(
[in] Long nKeyID);
Activates the indicated key. The detailed bahaviour depends on the type of key that is activated.
If nKeyID refers to a bank key or a user key (not a temporary key) then this
method solely changes its status from bacKeyStatusInactive to
bacKeyStatusActive.
If nKeyID refers to a temporary key then that key will be copied over the
corresponding user key. The destination user key receives the key status
bacKeyStatusActive. The temporary key is erased and thus receives
the new key status bacKeyStatusNull.
If nKeyID refers to a key that is already active (not possible for a temporary
key) then this method does nothing.
Note that support of temporary keys is optional.
void IBACSecurity::Authenticate(
[in] String sSecurityMediaID,
[in] String sPassphrase);
Authenticates the user and thus opens up access to the security media. The actual security media must be identified by its security media ID.
When a security provider object is newly created it is not associated with any
security media and is in an unauthorized state. In the unauthorized state no
access to any security media is possible, hence, no other operations can be
performed. Only after a successful authentication by this method the security
media becomes accessible and security operations can be performed with the
private keys contained on it.
Any authentication failure is indicated by raising an appropriate error with a
user friendly descriptive error text in the associated ErrorInfo object.
void IBACSecurity::ChangePassphrase(
[in] String sNewPassphrase);
Changes the passphrase that is used to protect access to the security media. If the passphrase cannot be changed, then this method will not be implemented.
String IBACSecurity::DecryptSessionKey(
[in] Long nKeyID,
[in] String sHexCryptogram);
Decrypts the session key.
Hexadecimal representation of the original unencrypted session key.
String IBACSecurity::EncryptSessionKey(
[in] Long nKeyID,
[in] String sHexSessionKey);
Encrypts the rather small session key using the indicated public key.
Hexadecimal representation of encrypted session key.
The current HBCI specification requires that the bulk encryption of the message data has to be done using a random session key and the 2K3DES algorithm. Only the encryption of the session key is done according to the chosen security procedure.
void IBACSecurity::GeneratePrivateKey(
[in] Long nKeyID);
Generates a new private key (or asymetric key pair). If the security provider does not support generation of keys, then this method will not be implemented.
This method can generate an user key or a temporary key. An user key usually needs
only to be generated during the first time initialization of the security media.
For subsequent key updates a temporary key shall be generated and subsequently
activated via ActivateKey after it was accepted by the bank.
The newly generated key always receives the key status
bacKeyStatusInactive. This method also creates a suitable key
name for the new key and perhaps resets the signature ID counter.
If an user key is generated, then the key number and version are reset according
to the needs of the security media (usually either zero or one). The country code,
bank code and user ID parts of the key name are chosen according to the
authenticated user (see Parameters). The key type is either "S" or "V"
according to the key ID.
If a temporary key is generated, then the key name is copied from the
corresponding user key and the key version is incremented by one. If the
corresponding user key does not exist, then an initial key name as described
above is generated for the key.
void IBACSecurity::ImportPublicKey(
[in] Long nKeyID,
[in] Long nKeyNumber,
[in] Long nKeyVersion,
[in] String sHexPublicModulus,
[in, defaultvalue(0)] Long nCertificateType,
[in, defaultvalue("")] String sHexCertificate);
Imports the public part of an asymmetric key pair and all associated key attributes into this security provider. This method is not implemented by symmetric security procedures. The BACDialog object invokes this method for every HIISA segment that it receives. It is also invoked during setup of a new HBCI contact by the contact wizard.
The imported key receives the key status bacKeyStatusInactive. It
can subsequently be made active using the method ActivateKey. The imported
key is immediately persistently stored onto the security media.
The imported key can only be used to verify signatures using the
VerifySignature method or to encrypt a session key using the
EncryptSessionKey method. The public key cannot be used to create
a signature or to decrypt data - these operations need the private parts
of a key.
String IBACSecurity::KeyAttribute(
[in] Long nKeyID,
[in] Long nKeyAttributeID);
Indexed read-only property that returns the selected key attribute inside a string.
String IBACSecurity::Parameter([in] String sName);
Indexed property that provides named access to the parameters of the security provider. Only some of these properties can be changed, most are read only.
The definition of the IBACSecurity Interface includes a set of standard
parameters that must be available through this property. Nevertheless,
additional specialised parameters may be available by some security providers.
If a parameter is read that is not known by the security provider it is obliged to
return an empty string.
The following standard parameters are defined:
String IBACSecurity::SignMessageDigest(
[in] Long nKeyID,
[in] String sHexMessageDigest);
Creates an electronic signature for a given message digest (MD).
Hexadecimal representation of signature. The size of the signature depends on the actual security procedure.
Boolean IBACSecurity::VerifySignature(
[in] Long nKeyID,
[in] String sHexMessageDigest,
[in] String sHexSignature);
Verifies the given signature against the also given message digest.
If the signature is valid, then the result value will be True. If the signature did not match the message digest, then the result value will be False.
The interface IBACSecurityCardTerminal can be implemented by smart card based security provider objects. If it is implemented, the application may set or query the card terminal object used by the security provider object.
IBACCardTerminal IBACSecurityCardTerminal::CardTerminal;
This property provides access to the card terminal object that is used by this security provider object.
The property my be read at any time. Immediately after the security provider object is created, there is no card terminal object associated with it, hence this property will be read back as null. The property may only be written before the IBACSecurity::Authenticate or IBACSecurity4::AuthenticateUI method was called.
String IBACSegment2::GetXML();
Converts the entire data into XML.
Returns a XML string that contains the object data. The typedefinition of XML you can see at specified object.
Function uses the Microsoft XML 3.0 Parser, so it has to be installed.
String IBACSegment2::PutXML(
String sXML);
Read object data from XML.
Function uses the Microsoft XML 3.0 Parser, so it has to be installed.
String IBACSegment3::Verify();
Verify the data in the segment.
Checks the Segment against the HBCI Syntax and returns S_OK if the Segment is valid.
The interface IBACTransmogrify is a generic interface for serialization of an object in an XML representation. An object supporting this interface can be initialized by reading an XML stream.
String IBACTransmogrify::GetXML();
Converts the entire data into XML.
Returns a XML string that contains the object data. The typedefinition of XML you can see at specified object.
Function uses the Microsoft XML 3.0 Parser, so it have to be installed.
String IBACTransmogrify::PutXML(
String sXML);
Read object data from XML.
Function uses the Microsoft XML 3.0 Parser, so it have to be installed.
This is a common base interface that is used for the communication between the BACDialog and BACTransport objects. Basically, the BACDialog object uses the generic transport services of the transport object solely through this interface.
The HBCI transport interface defines a minimal asynchronous
communication API for sending and receiving message buffers, tailored
to be usable for an HBCI 2.0 application or server, only. Hence,
you won't find sophisiticated transport functionality here.
Usually an actual implementation of this interface adds its own
transport specific methods in an interface that is derived from
this interface. This derived interface may then be published to the
application programmer.
The IBACTransport interface is asynchronous, that is, it usually
returns immediately from every method invocation, executing the
actual operation asynchronously in the background. The client of
the IBACTransport interface can establish a callback interface to
be informed about the progress of the backgound operation. It does
so by passing an implementation of the IBACTransportCallback
interface to the IBACTransport::Advise method.
The IBACTransport interface defines the internal interface to a transport provider component. It should never be accessed by application programs directly.
The IBACTransport2 is used to pass additional, named parameters
String IBACTransport2::Parameter([in] String sName);
Indexed property that provides named access to the parameters of the tranport provider.
Additional Headers to be sent with the http request. Default: Pragma: no-cache\r\nContent-Type: application/x-vnd.hbci\r\n
void IBACTransport2::SendReceiveXml(
[in] String sXml,
[out] String psResult);
Loads the object data from the given file. The object is reinitialised with the loaded data.
Long IBACTransport::Advise(
[in] IBACTransportCallback* piCallback);
Install a callback interface.
Receives an identifier for this advise connection. This must be passed to Unadvise.
void IBACTransport::Cancel();
Requests that any outstanding operations are forcibly stopped and the transport returns to the idle error state.
This method may be invoked in any state. However, in the states
bacTransIdle and
bacTransError it is completely ignored and does nothing
at all.
As a result of the method invocation, the transport object switches into the
bacTransError state. If there was an active operation,
the callback method IBACTransportCallback::Error is invoked. The indicated
error code will be bacTransErrCancelled.
String IBACTransport::CommunicationsAddress;
Property that selects the communications address to connect to.
This property must be set to the communications address as it appears in the HIKOM segment. For a "T-Online" access this is the gateway page number. For a "TCP/IP" access this is the IP address in dotted decimal notation (e.g. 123.123.123.123).
String IBACTransport::CommunicationsAddressSuffix;
Property that selects the communications address suffix to connect to.
This property must be set to the communications address suffix code as it appears in the HIKOM segment. For a "T-Online" access this is the regional code. For "TCP/IP" this is not defined by HBCI. However, the BACTransportTCPIP implementation uses this parameter to optionally select the IP port which is 3000 by default.
void IBACTransport::Connect();
Initiate establishing of a new transport connection.
This method must only be invoked if the transport object is
currently in either the bacTransIdle
or the bacTransError state. In the
latter case, the transport object attempts to clear the error
condition before trying to establish another connection. In
any other state, an immediate failure will be returned.
This method only initiates the connection and returns to the
caller as soon as possible. When this method returns
successfully the state has been switched to the
bacTransConnecting state.
When the connection becomes available, the transport object
switches into the bacTransConnected
state and invokes the IBACTransportCallback::Connected
method of an installed callback interface.
Whenever a communication failure is encountered during a
connection, the transport object is obliged to tear down the connection
and switch into the bacTransError state. Only after
the errorneous connection is completely idle again, the transport object must
invoke the callback method IBACTransportCallback::Error.
void IBACTransport::Disconnect();
Initiate tearing down of the transport connection.
This method must only be invoked if the transport object is
currently in the bacTransConnected
state. In any other state, a failure will be returned.
In response to this method invocation the transport object
switches into the bacTransDisconnecting
state and returns to the caller. Once the connection is
completely torn down, the transport switches into the
bacTransIdle state and invokes the
callback method IBACTransportCallback::Disconnected.
BACTransportErrors IBACTransport::Error;
Read-only property that provides the error code associated with the bacTransError state. In any other state the value of this property is meaningless. The possible error codes are enumerated in the BACTransportErrors enumeration.
void IBACTransport::SendReceive(
[in] IBACMessageBuffer* piOutgoingMessageBuffer,
[in] IBACMessageBuffer* piIncomingMessageBuffer);
Initiate sending and receiving of a pair of messages.
This method must only be invoked if the transport object is
currently in the bacTransConnected
state. In any other state, a failure will be returned.
In response to this method invocation the transport object
switches into the bacTransSending
state and returns to the caller as soon as possible. During
the background send operation the transport object periodically
invokes the IBACTransportCallback::SendProgress callback
method to indicate its progress. Once the entire message has
been sent the transport switches automatically into the
bacTransReceiving state.
During the background receive operation the transport object
periodically invokes the IBACTransportCallback::ReceiveProgress
callback method to indicate its progress. Once the entire
response message has been received the transport switches back
into the bacTransConnected state and invokes
the callback method IBACTransportCallback::SendReceiveComplete.
Note that the completeness of the receive operation is
determined by the message buffer object which tells its caller
when it has collected a complete message.
BACTransportStates IBACTransport::State;
Read-only property that indicates the current state of the transport object. The value of this property is one of the BACTransportStates enumeration.
void IBACTransport::Unadvise(
[in] Long lCookie);
Remove previously installed callback interface.
This method releases any previously installed callback interface. As a result, no more callback methods will be invoked.
An object that implements this interface must be passed to the
IBACTransport::Advise method. The transport object will then asynchronously
invoke the callback at appropriate times.
While a callback is executing it must not re-enter the transport object. Any
attempt to do so will be refused with an E_UNEXPECTED failure.
There is only one object that implements this interface, namely the BACDialog
object.
The IBACTransportCallback interface defines the internal callback interface to be invoked by transport provider component. It must never be accessed by application programs directly.
void IBACTransportCallback::Connected();
This event method is invoked when the initiated IBACTransport::Connect operation is complete and a connection was successfully established. The transport object was switched into the bacTransConnected state.
void IBACTransportCallback::Disconnected();
This event method is invoked when the initiated IBACTransport::Disconnect operation is complete and the connection was orderly shut down. The transport object was switched into the bacTransIdle state.
void IBACTransportCallback::Error();
This event method is invoked when the previous transport operation failed due to a transport error. The transport object was switched into the bacTransError state.
void IBACTransportCallback::ReceiveProgress(
Long lBytesReceived);
This callback method should be invoked periodically during a receive operation in order to inform the client about the actual progress. A client may use this callback to implement a GUI progress indicator -- although it will have a hard time doing so, because it won't know how much data will be received in total.
void IBACTransportCallback::SendProgress(
[in] Long lBytesSent,
[in] Long lBytesTotal);
This callback method should be invoked periodically during a send operation in order to inform the client about the actual progress. A client may use this callback to implement a GUI progress indicator.
void IBACTransportCallback::SendReceiveComplete();
This event method is invoked when the initiated IBACTransport::SendReceive operation is complete and a complete response message was received. The transport object was switched into the bacTransConnected state.
void IBACTransportCallback::StateChange(
[in] BACTransportStates nNewState);
This callback method must be invoked by the transport object whenever it enters a new state. A client is allowed to immediately invoke another suitable operation during the execution of this callback method.
Enumerates the possible states of the IBACCardTerminal interface.
enum BACCardTerminalStates
{
bacCTClosed,
bacCTOpen,
bacCTICCReady
};
Enumerates the possible values of the BACDialog::Language property. Refer to this property for a detailed discussion of the individual flags.
enum BACDialogLanguages
{
bacDialogLanguageDefault,
bacDialogLanguageGerman,
bacDialogLanguageEnglish,
bacDialogLanguageFrench
};
Enumerates the possible results in UI dialogs
enum BACDialogResults
{
bacDialogResultOK,
bacDialogResultCancelled
};
Enumerates the possible states of the BACDialog object. Refer to BACDialog::State for a detailed discussion of the individual states.
enum BACDialogStates
{
bacDialogIdle,
bacDialogBeginning,
bacDialogReady,
bacDialogExecuting,
bacDialogEnding,
bacDialogAborted
};
Enumerates the possible dialog types that can be initiated by the BACDialog::BeginDialog method.
enum BACDialogTypes
{
bacDialogNone,
bacDialogStandard,
bacDialogAnonymous,
bacDialogSynchronizeCustomerSystemID,
bacDialogSynchronizeMessageSeqNo,
bacDialogSynchronizeSignatureID,
bacDialogRequestCommunicationParameters,
bacDialogUpdateUserKeys,
bacDialogRequestBankKeys,
bacDialogSubmitUserKeys,
bacDialogBlockUserKeys,
bacDialogBlockUserKeysAnonymous
};
The dialog type determines whether the outgoing message are encrypted or not.
The dialog type also determines which segments will be included in the dialog
initialization message sent to the bank system.
The current dialog type is stored in the BACDialog::DialogType property.
Enumerates the possible formats of the BACSyntaxElement::Format property. Most formats needs an explicit length qualification.
enum BACFormatType
{
bacFormatUnknown,
bacFormatAlphanumeric,
bacFormatText,
bacFormatNumeric,
bacFormatDigits,
bacFormatFloat,
bacFormatDTAText,
bacFormatByteVector,
bacFormatHexString,
bacFormatObject,
bacFormatYesNo,
bacFormatDate,
bacFormatVirtualDate,
bacFormatTime,
bacFormatID,
bacFormatCountryCode,
bacFormatCurrency,
bacFormatValue,
bacFormatDEG,
bacFormatGDG,
bacFormatUnicode,
bacFormatRawText
};
The BACGlobals enumeration lists all global constants that do
not belong into any other enumeration.
Most importantly this enumeration contains definitions for the basic DDBAC HRESULT
error codes. These error codes are returned as HRESULT values 0x800A2710 through
0x800A2716. The high word is always 0x800A and the low word is the hex
representation of the actual error code. In Visual Basic the error codes are
returned in the Err.Number property.
enum BACGlobals
{
bacVersionHBCI,
bacErrorCantBuildMessage,
bacErrorTransportFailure,
bacErrorCantParseMessage,
bacErrorDialogAborted,
bacErrorTimeout,
bacErrorSecurity,
bacErrorCustomerSystemID,
bacErrorNoPINTANSecurity
};
Enumerates the well known key attributes used by security components. Refer to the documentation of the IBACSecurity::KeyAttribute property for more information about these values.
enum BACKeyAttributes
{
bacKeyStatus,
bacKeyNumber,
bacKeyVersion,
bacKeyModulus,
bacKeyCertificateType,
bacKeyCertificate
};
Enumeration of the well known KeyID values. KeyID values are used as parameters to many IBACSecurity interface methods. Refer to the documentation of the IBACSecurity interface for more information about these values.
enum BACKeyIDs
{
bacInvalidKeyID,
bacUserCipheringKeyID,
bacUserSignatureKeyID,
bacBankCipheringKeyID,
bacBankSignatureKeyID,
bacTempCipheringKeyID,
bacTempSignatureKeyID,
bacUserPINKeyID,
bacUserPINTANKeyID
};
The key ID values have been chosen to be identical to the corresponding KID values of the Giesecke & Devrient HBCI RSA Chipcard.
Enumerates the possible key status values returned through the
IBACSecurity::KeyAttribute property by security components. Refer to the
documentation of the IBACSecurity::KeyAttribute property for more information
about these values.
If the DDV security procedure is used the key status is always bacKeyStatusActive.
Other key states are only possible when the RDH security procedure is used.
Note that an application program usually does not need to deal with keys and key
status. All required key management is implemented in the HBCI contacts control panel
applet.
enum BACKeyStatus
{
bacKeyStatusNull,
bacKeyStatusInactive,
bacKeyStatusActive,
bacKeyStatusExtern
};
Enumerates the possible key transmit status values returned through the "BACKeyTransmitStatus" Parameter by security components.
enum BACKeyTransmitStatus
{
KTS_MustSubmit,
KTS_ISO9796,
KTS_BankKeyValidated,
KTS_MustSubmitChipherKey,
KTS_MustSubmitSignatureKey,
KTS_KeysLocked,
KTS_Error
};
Enumerates a set of bits that indicate message features. Message flags are returned by the internal private method BACMessage::ParseMessageBuffer.
enum BACMessageFlags
{
bacMessageFlagNone,
bacMessageFlagSignature,
bacMessageFlagEncrypted
};
Enumerates the possible states of a BACMessage object. The current state of a BACMessage can be read through the BACMessage::State property.
enum BACMessageStates
{
bacMessageInit,
bacMessageSigned,
bacMessageSent,
bacMessageDone
};
Enumerates the possible security media status values available through the
IBACSecurity::Parameter property by security components. Refer to the
documentation of the IBACSecurity::Parameter property for more information
about these values.
Note that an application program usually does not need to deal with security medias
and their status.
enum BACSecurityMediaStatus
{
bacSecurityMediaStatusNull,
bacSecurityMediaStatusSubmitUserKeys,
bacSecurityMediaStatusActive,
bacSecurityMediaStatusBlockUserKeys,
bacSecurityMediaStatusUpdateUserKeys
};
Enumerates the possible security media types available through the IBACSecurity::Parameter property by security components. Refer to the documentation of the IBACSecurity::Parameter property for more information about these values.
enum BACSecurityMediaTypes
{
bacSecurityMediaFile,
bacSecurityMediaSmartcard,
bacSecurityMediaBTX,
bacSecurityMediaPINTAN
};
Enumerates the possible roles of a signer that signs a message according to HBCI 2.0.1 Kap. VI.5.2.1 Nr. 5. The signer role must be explicitly stated when invoking the method BACCustomer::AddSignature of the BACCustomer object. The values of the enumerators correspond directly with the values required by HBCI.
enum BACSignerRole
{
bacSignerIsIssuer,
bacSignerConfirms,
bacSignerWitness,
bacSignerSynchronizeCustomerSystemID,
bacSignerSynchronizeSignatureID,
bacSignerSubmitUserKeys
};
Enumerates the possible states of smartcards at an chipdirve.
enum BACSmartcardState
{
bacSmartcardNotFound,
bacSmartcardInserted
};
Enumerates the possible special dialog types that can be initiated by the BACDialog::ExecuteSpecial method.
enum BACSpecialTransactionTypes
{
bacSpecialTransactionBlockUserKeys,
bacSpecialTransactionUpdateSignatureKey,
bacSpecialTransactionUpdateCipheringKey
};
Enumerates the possible asynchronous errors of the IBACTransport interface. The current error code can be queried through the IBACTransport::Error property. Whenever an asynchronous transport error is detected, the transport component sets the IBACTransport::Error property, switches into the bacTransError state, and invokes all appropriate callbacks.
enum BACTransportErrors
{
bacTransOK,
bacTransErrConnectionLost,
bacTransErrConnectionFailed,
bacTransErrSendFailed,
bacTransErrReceiveFailed,
bacTransErrCancelled
};
IBACTransport, IBACTransport::Error
Enumerates constants that identify the various possible transport services. This enumeration is in accordance with HBCI.
enum BACTransportServices
{
bacTransServiceUnknown,
bacTransServiceTOnline,
bacTransServiceTCPIP,
bacTransServiceHTTP,
bacTransServiceHTTPBase64,
bacTransServiceWinHTTP,
bacTransServiceCOM
};
Enumerates the visible states of the IBACTransport interface and thus the client transport object. The current state of the transport object can be queried through reading the IBACTransport::State property. In addition, all state changes of the transport object are announced through the IBACTransportCallback::StateChange callback method.
enum BACTransportStates
{
bacTransIdle,
bacTransError,
bacTransConnecting,
bacTransConnected,
bacTransSending,
bacTransReceiving,
bacTransDisconnecting
};