

- job list for user:
   - contains jobs to be sent for a given user, from those the job queue will be filled
- job queue:
   - contains jobs to be sent now to the bank
   - there is only one job queue


- sending jobs in HBCI mode:
  - create message 1
  - for every job from the queue:
    - get segment and DB from job
    - set segment number accordingly
    - encode and add segment to commandBuffer
  - if message needs signing:
    - for every signer:
      - create signature head
      - encode signature head
      - hash data from signature head
      - hash data from commandBuffer (jobs to sign)
      - add signature head to fullMessageBuffer
      - create signature tail, set hash
      - add signature tail to tailBuffer
    - add commandBuffer to fullMessageBuffer
    - add signatureTails to fullMessageBuffer
  - if message needs crypting:
    - generate crypt head
    - add crypt head to encryptedMessageBuffer
    - generate and encode crypt data segment
    - add crypt data segment to encryptedMessageBuffer
    - exchange encryptedMessageBuffer and fullMessageBuffer
  - determine full size of HBCI message
  - generate message head
  - insert message head into fullMessageBuffer



- folder
  - formals oder hbci
    - bpd
    - upd
    - xml
  - parser



- Session:
  - haelt Nummer der naechsten zu sendenden Message
  - haelt Nummer der naechsten zu empfangenen Message
  - sendCommands()
    - kuemmert sich intern um Signatur, Verschluesselung
  - schickt Nachricht ueber TransportLayer
  - empfaengt Nachricht ueber TransportLayer
  - entschluesselt Nachricht, prueft ggf. Signatur
  - parsed Nachricht in Segmente
  - parsed Segmente in DB

- Message:
  - add Signer (KeyName)
  - set Crypter (KeyName)

- vor dem Senden:
  - jedes segment in einen Puffer schreiben
  - diesen Puffer im Segment speichern
  - beim Signieren:
    - fuer jeden Signierer:
      - erzeuge SigHead segment
      - fuege SigHead zu SigHead-Liste hinzu
      - schreibe SigHead in buffer, speichere im Segment
      - hashe SigHead
      - hashe alle Daten-Segmente (alles ausser SigTail und SigHead)
      - signiere hash
      - erzeuge SigTail
      - fuege SigTail zu SigTail-Liste hinzu
    - addiere alle SigHead-Buffer in den Zielbuffer
    - addiere alle Daten-Segmente in den Zielbuffer
    - addiere alle SigTail-Buffer in den Zielbuffer


- neue Klasse: KeyName (wie bei HBCI, also BLZ, UserId, KeyType, KeyVer, KeyNum)
