uint16_t ptp_ptpip_getresp (PTPParams* params, PTPContainer* resp) { PTPIPHeader hdr; unsigned char *data = NULL; uint16_t ret; int n; ret = ptp_ptpip_cmd_read (params, &hdr, &data); if (ret != PTP_RC_OK) return ret; resp->Code = dtoh16a(&data[ptpip_resp_code]); resp->Transaction_ID = dtoh32a(&data[ptpip_resp_transid]); n = (dtoh32(hdr.length) - sizeof(hdr) - ptpip_resp_param1)/sizeof(uint32_t); switch (n) { case 5: resp->Param5 = dtoh32a(&data[ptpip_resp_param5]); case 4: resp->Param4 = dtoh32a(&data[ptpip_resp_param4]); case 3: resp->Param3 = dtoh32a(&data[ptpip_resp_param3]); case 2: resp->Param2 = dtoh32a(&data[ptpip_resp_param2]); case 1: resp->Param1 = dtoh32a(&data[ptpip_resp_param1]); case 0: break; default: gp_log( GP_LOG_ERROR, "ptpip/getresp", "response got %d parameters?", n); break; } free (data); return PTP_RC_OK; }
uint16_t ptp_ptpip_getdata(PTPParams *params, PTPContainer *ptp, PTPDataHandler *handler) { PTPIPHeader hdr; unsigned char *xdata = NULL; uint16_t ret; unsigned long toread, curread; int xret; ret = ptp_ptpip_cmd_read(params, &hdr, &xdata); if (ret != PTP_RC_OK) return ret; if (dtoh32(hdr.type) == PTPIP_CMD_RESPONSE) /* might happen if we have no data transfer due to error? */ { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: Unexpected ptp response, code %x\n", dtoh32a(&xdata[8])); return PTP_RC_GeneralError; } if (dtoh32(hdr.type) != PTPIP_START_DATA_PACKET) { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: got reply type %d\n", dtoh32(hdr.type)); return PTP_RC_GeneralError; } toread = dtoh32a(&xdata[ptpip_data_payload]); free(xdata); xdata = NULL; curread = 0; while (curread < toread) { ret = ptp_ptpip_cmd_read(params, &hdr, &xdata); if (ret != PTP_RC_OK) return ret; if (dtoh32(hdr.type) == PTPIP_END_DATA_PACKET) { unsigned long written; unsigned long datalen = dtoh32(hdr.length)-8-ptpip_data_payload; if (datalen > (toread-curread)) { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: returned data is too much, expected %ld, got %ld\n", (toread-curread),datalen ); break; } xret = handler->putfunc(params, handler->priv, datalen, xdata+ptpip_data_payload, &written ); if (xret == -1) { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: failed to putfunc of returned data\n"); break; } curread += written; free(xdata); xdata = NULL; continue; } if (dtoh32(hdr.type) == PTPIP_DATA_PACKET) { unsigned long written; unsigned long datalen = dtoh32(hdr.length)-8-ptpip_data_payload; if (datalen > (toread-curread)) { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: returned data is too much, expected %ld, got %ld\n", (toread-curread),datalen ); break; } xret = handler->putfunc(params, handler->priv, datalen, xdata+ptpip_data_payload, &written ); if (xret == -1) { VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: failed to putfunc of returned data\n"); break; } curread += written; free(xdata); xdata = NULL; continue; } VitaMTP_Log(VitaMTP_ERROR, "ptpip/getdata: ret type %d\n", hdr.type); } if (curread < toread) return PTP_RC_GeneralError; return PTP_RC_OK; }