Ejemplo n.º 1
0
static uint16_t
ptp_ptpip_init_event_request(PTPParams *params)
{
    unsigned char   evtrequest[ptpip_eventinit_size];
    ssize_t         ret;

    htod32a(&evtrequest[ptpip_type],PTPIP_INIT_EVENT_REQUEST);
    htod32a(&evtrequest[ptpip_len],ptpip_eventinit_size);
    htod32a(&evtrequest[ptpip_eventinit_idx],params->eventpipeid);

    VitaMTP_Log(VitaMTP_DEBUG, "ptpip/init_event recieved\n");

    if (MASK_SET(g_VitaMTP_logmask, VitaMTP_DEBUG))
    {
        VitaMTP_hex_dump(evtrequest, ptpip_eventinit_size, 16);
    }

    ret = write(params->evtfd, evtrequest, ptpip_eventinit_size);

    if (ret == -1)
    {
        perror("write init evt request");
        return PTP_RC_GeneralError;
    }

    if (ret != ptpip_eventinit_size)
    {
        VitaMTP_Log(VitaMTP_ERROR, "ptpip: unexpected retsize %zd, expected %d\n", ret, ptpip_eventinit_size);
        return PTP_RC_GeneralError;
    }

    return PTP_RC_OK;
}
Ejemplo n.º 2
0
/* send / receive functions */
uint16_t
ptp_ptpip_sendreq(PTPParams *params, PTPContainer *req)
{
    ssize_t         ret;
    uint32_t        len = 18+req->Nparam*4;
    unsigned char       *request = malloc(len);

    //ptp_ptpip_check_event (params);

    htod32a(&request[ptpip_type],PTPIP_CMD_REQUEST);
    htod32a(&request[ptpip_len],len);
    htod32a(&request[ptpip_cmd_dataphase],1);   /* FIXME: dataphase handling */
    htod16a(&request[ptpip_cmd_code],req->Code);
    htod32a(&request[ptpip_cmd_transid],req->Transaction_ID);

    switch (req->Nparam)
    {
    case 5:
        htod32a(&request[ptpip_cmd_param5],req->Param5);

    case 4:
        htod32a(&request[ptpip_cmd_param4],req->Param4);

    case 3:
        htod32a(&request[ptpip_cmd_param3],req->Param3);

    case 2:
        htod32a(&request[ptpip_cmd_param2],req->Param2);

    case 1:
        htod32a(&request[ptpip_cmd_param1],req->Param1);

    case 0:
    default:
        break;
    }

    VitaMTP_Log(VitaMTP_DEBUG, "ptpip/oprequest\n");

    if (MASK_SET(g_VitaMTP_logmask, VitaMTP_DEBUG))
    {
        VitaMTP_hex_dump(request, len, 16);
    }

    ret = write(params->cmdfd, request, len);
    free(request);

    if (ret == -1)
        perror("sendreq/write to cmdfd");

    if (ret != len)
    {
        VitaMTP_Log(VitaMTP_ERROR, "ptpip: ptp_ptpip_sendreq() len =%d but ret=%zd\n", len, ret);
        return PTP_RC_OK;
    }

    return PTP_RC_OK;
}
Ejemplo n.º 3
0
static uint16_t
ptp_ptpip_init_command_request(PTPParams *params)
{
    unsigned char  *cmdrequest;
    unsigned int        len;
    ssize_t ret;
    unsigned char   guid[16] = {0};
    // TODO: See if GUID is required

    len = ptpip_initcmd_name;

    cmdrequest = malloc(len);
    htod32a(&cmdrequest[ptpip_type],PTPIP_INIT_COMMAND_REQUEST);
    htod32a(&cmdrequest[ptpip_len],len);

    memcpy(&cmdrequest[ptpip_initcmd_guid], guid, 16);

    VitaMTP_Log(VitaMTP_DEBUG, "ptpip/init_cmd recieved\n");

    if (MASK_SET(g_VitaMTP_logmask, VitaMTP_DEBUG))
    {
        VitaMTP_hex_dump(cmdrequest, len, 16);
    }

    ret = write(params->cmdfd, cmdrequest, len);
    free(cmdrequest);

    if (ret == -1)
    {
        perror("write init cmd request");
        return PTP_RC_GeneralError;
    }

    VitaMTP_Log(VitaMTP_ERROR, "ptpip/init_cmd: return %zd / len %d\n", ret, len);

    if (ret != len)
    {
        VitaMTP_Log(VitaMTP_ERROR, "ptpip: return %zd vs len %d\n", ret, len);
        return PTP_RC_GeneralError;
    }

    return PTP_RC_OK;
}
Ejemplo n.º 4
0
static uint16_t
ptp_ptpip_init_command_request (PTPParams* params)
{
	char		hostname[100];
	unsigned char*	cmdrequest;
	unsigned int	i;
	int 		len, ret;
	unsigned char	guid[16];
	
	ptp_nikon_getptpipguid(guid);
	if (gethostname (hostname, sizeof(hostname)))
		return PTP_RC_GeneralError;
	len = ptpip_initcmd_name + (strlen(hostname)+1)*2 + 4;

	cmdrequest = malloc(len);
	htod32a(&cmdrequest[ptpip_type],PTPIP_INIT_COMMAND_REQUEST);
	htod32a(&cmdrequest[ptpip_len],len);

	memcpy(&cmdrequest[ptpip_initcmd_guid], guid, 16);
	for (i=0;i<strlen(hostname)+1;i++) {
		/* -> ucs-2 in little endian */
		cmdrequest[ptpip_initcmd_name+i*2] = hostname[i];
		cmdrequest[ptpip_initcmd_name+i*2+1] = 0;
	}
	htod16a(&cmdrequest[ptpip_initcmd_name+(strlen(hostname)+1)*2],PTPIP_VERSION_MINOR);
	htod16a(&cmdrequest[ptpip_initcmd_name+(strlen(hostname)+1)*2+2],PTPIP_VERSION_MAJOR);

	gp_log_data ( "ptpip/init_cmd", (char*)cmdrequest, len);
	ret = write (params->cmdfd, cmdrequest, len);
	free (cmdrequest);
	if (ret == -1) {
		perror("write init cmd request");
		return PTP_RC_GeneralError;
	}
	gp_log (GP_LOG_ERROR,"ptpip/init_cmd", "return %d / len %d", ret, len);
	if (ret != len) {
		gp_log (GP_LOG_ERROR, "ptpip", "return %d vs len %d", ret, len);
		return PTP_RC_GeneralError;
	}
	return PTP_RC_OK;
}
Ejemplo n.º 5
0
uint16_t
ptp_usb_control_cancel_request (PTPParams *params, uint32_t transactionid) {
	Camera	*camera = ((PTPData *)params->data)->camera;
	int	ret;
	unsigned char	buffer[6];

	htod16a(&buffer[0],PTP_EC_CancelTransaction);
	htod32a(&buffer[2],transactionid);
	ret = gp_port_usb_msg_class_write (camera->port, 0x64, 0x0000, 0x0000, (char*)buffer, sizeof (buffer));
	if (ret < GP_OK)
		return PTP_ERROR_IO;
	return PTP_RC_OK;
}
Ejemplo n.º 6
0
static uint16_t
ptp_ptpip_init_event_request (PTPParams* params)
{
	unsigned char	evtrequest[ptpip_eventinit_size];
	int 		ret;

	htod32a(&evtrequest[ptpip_type],PTPIP_INIT_EVENT_REQUEST);
	htod32a(&evtrequest[ptpip_len],ptpip_eventinit_size);
	htod32a(&evtrequest[ptpip_eventinit_idx],params->eventpipeid);

	gp_log_data ( "ptpip/init_event", (char*)evtrequest, ptpip_eventinit_size);
	ret = write (params->evtfd, evtrequest, ptpip_eventinit_size);
	if (ret == -1) {
		perror("write init evt request");
		return PTP_RC_GeneralError;
	}
	if (ret != ptpip_eventinit_size) {
		gp_log (GP_LOG_ERROR, "ptpip", "unexpected retsize %d, expected %d", ret, ptpip_eventinit_size);
		return PTP_RC_GeneralError;
	}
	return PTP_RC_OK;
}
Ejemplo n.º 7
0
/* send / receive functions */
uint16_t
ptp_ptpip_sendreq (PTPParams* params, PTPContainer* req)
{
	int		ret;
	int		len = 18+req->Nparam*4;
	unsigned char 	*request = malloc(len);

	ptp_ptpip_check_event (params);

	htod32a(&request[ptpip_type],PTPIP_CMD_REQUEST);
	htod32a(&request[ptpip_len],len);
	htod32a(&request[ptpip_cmd_dataphase],1);	/* FIXME: dataphase handling */
	htod16a(&request[ptpip_cmd_code],req->Code);
	htod32a(&request[ptpip_cmd_transid],req->Transaction_ID);

	switch (req->Nparam) {
	case 5: htod32a(&request[ptpip_cmd_param5],req->Param5);
	case 4: htod32a(&request[ptpip_cmd_param4],req->Param4);
	case 3: htod32a(&request[ptpip_cmd_param3],req->Param3);
	case 2: htod32a(&request[ptpip_cmd_param2],req->Param2);
	case 1: htod32a(&request[ptpip_cmd_param1],req->Param1);
	case 0:
	default:
		break;
	}
	gp_log_data ( "ptpip/oprequest", (char*)request, len);
	ret = write (params->cmdfd, request, len);
	free (request);
	if (ret == -1)
		perror ("sendreq/write to cmdfd");
	if (ret != len) {
		gp_log (GP_LOG_ERROR, "ptpip","ptp_ptpip_sendreq() len =%d but ret=%d", len, ret);
		return PTP_RC_OK;
	}
	return PTP_RC_OK;
}
Ejemplo n.º 8
0
uint16_t
ptp_ptpip_senddata(PTPParams *params, PTPContainer *ptp,
                   unsigned long size, PTPDataHandler *handler
                  )
{
    unsigned char   request[0x14];
    ssize_t ret;
    unsigned long       curwrite, towrite;
    unsigned char  *xdata;

    htod32a(&request[ptpip_type],PTPIP_START_DATA_PACKET);
    htod32a(&request[ptpip_len],sizeof(request));
    htod32a(&request[ptpip_startdata_transid  + 8],ptp->Transaction_ID);
    htod32a(&request[ptpip_startdata_totallen + 8],(uint32_t)size);
    htod32a(&request[ptpip_startdata_unknown  + 8],0);
    VitaMTP_Log(VitaMTP_DEBUG, "ptpip/senddata\n");

    if (MASK_SET(g_VitaMTP_logmask, VitaMTP_DEBUG))
    {
        VitaMTP_hex_dump(request, sizeof(request), 16);
    }

    ret = write(params->cmdfd, request, sizeof(request));

    if (ret == -1)
        perror("sendreq/write to cmdfd");

    if (ret != sizeof(request))
    {
        VitaMTP_Log(VitaMTP_ERROR, "ptpip/senddata: ptp_ptpip_senddata() len=%d but ret=%zd\n", (int)sizeof(request), ret);
        return PTP_RC_GeneralError;
    }

    xdata = malloc(WRITE_BLOCKSIZE+8+4);

    if (!xdata) return PTP_RC_GeneralError;

    curwrite = 0;

    while (curwrite < size)
    {
        unsigned long type, written, towrite2, xtowrite;

        //ptp_ptpip_check_event (params);

        towrite = size - curwrite;

        if (towrite > WRITE_BLOCKSIZE)
        {
            towrite = WRITE_BLOCKSIZE;
            type    = PTPIP_DATA_PACKET;
        }
        else
        {
            type    = PTPIP_END_DATA_PACKET;
        }

        ret = handler->getfunc(params, handler->priv, towrite, &xdata[ptpip_data_payload+8], &xtowrite);

        if (ret == -1)
        {
            perror("getfunc in senddata failed");
            free(xdata);
            return PTP_RC_GeneralError;
        }

        towrite2 = xtowrite + 12;
        htod32a(&xdata[ptpip_type], (uint32_t)type);
        htod32a(&xdata[ptpip_len], (uint32_t)towrite2);
        htod32a(&xdata[ptpip_data_transid+8], ptp->Transaction_ID);
        VitaMTP_Log(VitaMTP_DEBUG, "ptpip/senddata\n");

        if (MASK_SET(g_VitaMTP_logmask, VitaMTP_DEBUG))
        {
            VitaMTP_hex_dump(xdata, (unsigned int)towrite2, 16);
        }

        written = 0;

        while (written < towrite2)
        {
            ret = write(params->cmdfd, xdata+written, towrite2-written);

            if (ret == -1)
            {
                perror("write in senddata failed");
                free(xdata);
                return PTP_RC_GeneralError;
            }

            written += ret;
        }

        curwrite += towrite;
    }

    free(xdata);
    return PTP_RC_OK;
}