Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}