kernel.rawNewMsg("CustomMsg");
// durch alle jobs loopen, die eigentlich in der aktuellen
// nachricht abgearbeitet werden m�ssten
for (Iterator<HBCIJobImpl> i=tasks.iterator();i.hasNext();) {
HBCIJobImpl task=i.next();
// wenn der Task entweder noch gar nicht ausgef�hrt wurde
// oder in der letzten Antwortnachricht ein entsprechendes
// Offset angegeben wurde
if (task.needsContinue(loop)) {
task.setContinueOffset(loop);
Properties p=task.getLowlevelParams();
String header=HBCIUtilsInternal.withCounter("GV",taskNum);
String taskName=task.getName();
HBCIUtils.log("adding task "+taskName,HBCIUtils.LOG_DEBUG);
HBCIUtilsInternal.getCallback().status(mainPassport,HBCICallback.STATUS_SEND_TASK,task);
task.setIdx(taskNum);
// Daten f�r den Task festlegen
for (Enumeration e=p.keys();e.hasMoreElements();) {
String key=(String)(e.nextElement());
kernel.rawSet(header+"."+key,p.getProperty(key));
}
// additional passports f�r diesen task ermitteln
// und zu den passports f�r die aktuelle nachricht
// hinzuf�gen;
// doppelg�nger werden schon von
// HBCIPassportList.addPassport() herausgefiltert
msgPassports.addAll(task.getSignaturePassports());
taskNum++;
}
}
// wenn keine jobs f�r die aktuelle message existieren
if (taskNum==0) {
HBCIUtils.log(
"loop "+(loop+1)+" aborted, because there are no more tasks to be executed",
HBCIUtils.LOG_DEBUG);
addMsgStatus=false;
break;
}
kernel.rawSet("MsgHead.dialogid", dialogid);
kernel.rawSet("MsgHead.msgnum", getMsgNum());
kernel.rawSet("MsgTail.msgnum", getMsgNum());
nextMsgNum();
// nachrichtenaustausch durchf�hren
msgstatus=kernel.rawDoIt(msgPassports,HBCIKernelImpl.SIGNIT,HBCIKernelImpl.CRYPTIT,HBCIKernelImpl.NEED_SIG,HBCIKernelImpl.NEED_CRYPT);
Properties result=msgstatus.getData();
// searching for first segment number that belongs to the custom_msg
// we look for entries like {"1","CustomMsg.MsgHead"} and so
// on (this data is inserted from the HBCIKernelImpl.rawDoIt() method),
// until we find the first segment containing a task
int offset=0; // this specifies, how many segments precede the first task segment
for (offset=1;true;offset++) {
String path=result.getProperty(Integer.toString(offset));
if (path==null || path.startsWith("CustomMsg.GV")) {
if (path==null) { // wenn kein entsprechendes Segment gefunden, dann offset auf 0 setzen
offset=0;
}
break;
}
}
if (offset!=0) {
// f�r jeden Task die entsprechenden R�ckgabedaten-Klassen f�llen
// in fillOutStore wird auch "executed" fuer den jeweiligen Task auf true gesetzt.
for (Iterator<HBCIJobImpl> i=tasks.iterator();i.hasNext();) {
HBCIJobImpl task=i.next();
if (task.needsContinue(loop)) {
// nur wenn der auftrag auch tatsaechlich gesendet werden musste
try {
task.fillJobResult(msgstatus,offset);
HBCIUtilsInternal.getCallback().status(mainPassport,HBCICallback.STATUS_SEND_TASK_DONE,task);
} catch (Exception e) {
msgstatus.addException(e);
}
}