int DECL2
daveGetNCfile(daveConnection *dc, const char *filename, char *buffer, int *length)
{
PDU p, p2;
int res = 0;
uc unackcount = 0;
int filename_len = 0;
int tot_len = 0;
int part_len = 0;
/* Request upload */
uc req_up_pa[]= {
0x00, 0x01, 0x12, 0x04, 0x11, 0x7f, 0x06, 0x00
};
uc req_up_da[]= {
0xff, 0x09, 0x00, 32,
/* Anzahl Telegramme die ohne ack angenommen werden = 20 */
20, 0x00,
/* Dateiname max. 32 Zeichen */
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
/* Continue upload */
uc cont_up_pa[]= {
0x00, 0x01, 0x12, 0x04, 0x11, 0x3f, 0x08, 0x00
};
uc cont_up_da[]= {
0xff, 0x09, 0x00, 0x02,
/* Anzahl Telegramme die ohne ack angenommen werden = 20 */
20, 0x00
};
*length = 0;
filename_len = strlen(filename); /* max. 32 chars */
if (filename_len > 32) {
return -1;
}
req_up_da[3] = filename_len + 2; /* + 1 Byte Anzahl Telegramme + 1 Byte unbekannt */
memcpy(&req_up_da[6], filename, filename_len);
p.header = dc->msgOut + dc->PDUstartO;
_daveInitPDUheader(&p, 7);
_daveAddParam(&p, req_up_pa, sizeof(req_up_pa));
_daveAddData(&p, req_up_da, 6 + filename_len);
res = _daveExchange(dc, &p);
if (res != daveResOK) {
return res;
}
res = _daveSetupReceivedPDU(dc, &p2);
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p2);
}
/* Errorcode im Parameterteil prüfen */
res = daveGetU16from(&p2.param[10]);
LOG2("daveGetNCfile: Response start upload, param.errorcode=0x%04x\n", res);
if (res != 0) {
return -2;
}
cont_up_pa[7] = p2.param[7]; /* Sequenznummer für alle folgenden Continue-Uploads verwenden */
LOG2("daveGetNCfile: Verwendete Sequenznummer=%d\n", cont_up_pa[7]);
res = _daveTestResultData(&p2);
if (daveDebug & daveDebugPDU) {
LOG3("_daveTestReadResult() returned: %d=%s\n", res, daveStrerror(res));
}
if (res != daveResOK) {
return res;
}
LOG2("daveGetNCfile: Response start upload, p2.udlen=%d\n", p2.udlen);
/* Vor den eigentlichen Daten sind hier noch 2 Bytes unbekannter Funktion eingeschoben */
part_len = p2.udlen - 2;
if (part_len <= 0) {
return -3;
}
memcpy(buffer + tot_len, p2.data + 6, part_len);
tot_len += part_len;
/* Wenn ab hier noch nicht alles gelesen, dann werden bis zu 20 Telegramme gesendet die
* nicht bestätigt werden müssen. Dann gibt es ein ack usw. usf.
*/
while (p2.param[9] != 0) { /* 0 = Last data unit */
LOG2("daveGetNCfile: unackcount=%d\n", unackcount);
/* Nach 20 Telegrammen continue Telegramm senden */
if (++unackcount == 20) {
_daveAddParam(&p, cont_up_pa, sizeof(cont_up_pa));
_daveAddData(&p, cont_up_da, sizeof(cont_up_da));
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p);
}
res = _daveSendTCP(dc, &p);
if (res != daveResOK) {
return res;
}
unackcount = 0;
}
res = _daveGetResponseISO_TCP(dc);
if (res != daveResOK) {
return res;
}
res = _daveSetupReceivedPDU(dc, &p2);
if (daveGetDebug() & daveDebugPDU) {
_daveDumpPDU(&p2);
}
/* Errorcode im Parameterteil prüfen */
res = daveGetU16from(&p2.param[10]);
LOG2("daveGetNCfile: continue upload, param.errorcode=0x%04x\n", res);
if (res != 0) {
return -2;
}
res = _daveTestResultData(&p2);
if (daveDebug & daveDebugPDU) {
LOG3("_daveTestReadResult() returned: %d=%s\n", res, daveStrerror(res));
}
if (res != daveResOK) {
return res;
}
LOG2("daveGetNCfile: Response start upload, p2.udlen=%d\n", p2.udlen);
part_len = p2.udlen - 2;
if (part_len <= 0) {
return -3;
}
memcpy(buffer + tot_len, p2.data + 6, part_len);
tot_len += part_len;
}
*length = tot_len;
return res;
}