static int ptpfs_open(struct inode *ino, struct file *filp) { //printk(KERN_INFO "%s flags: %X\n", __FUNCTION__, filp->f_flags); struct ptp_data_buffer *data=(struct ptp_data_buffer*)kmalloc(sizeof(struct ptp_data_buffer), GFP_KERNEL); int retval; memset(data,0,sizeof(struct ptp_data_buffer)); switch (filp->f_flags & O_ACCMODE) { case O_RDWR: return -EFAULT; case O_RDONLY: retval = ptp_getobject(PTPFSSB(ino->i_sb),ino->i_ino,data); if (retval == PTP_RC_OK) { filp->private_data = data; return 0; } break; case O_WRONLY: filp->private_data = data; return 0; } kfree(data); return -EFAULT; }
/** * Gets a MTP object from the device. * * @param device a pointer to the device. * @param handle the handle of the object. * @param p_meta a metadata structure to create for the object. * Dynamically allocated. * @param p_data a pointer to the data to recieve. * Dynamically allocated. */ void VitaMTP_GetObject(LIBMTP_mtpdevice_t *device, uint32_t handle, metadata_t** p_meta, unsigned char** p_data){ MTPProperties* props = NULL; int nProps = 0; int i = 0; unsigned char* data = NULL; metadata_t* meta = NULL; VitaMTP_GetObjectPropList(device, handle, &props, &nProps); ptp_getobject((PTPParams*)device->params, handle, &data); meta = (metadata_t*)malloc(sizeof(metadata_t)); memset(meta, 0x0, sizeof(metadata_t)); for(i=0; i<nProps; i++){ // [u16]property [u16]datatype [u32]handle data if(props[i].property == PTP_OPC_ObjectFormat){ if(props[i].propval.u16 == PTP_OFC_Association){ meta->dataType = Folder; }else{ meta->dataType = File; } } if(meta->dataType == File){ if(props[i].property == PTP_OPC_ObjectSize){ meta->size = props[i].propval.u64; } } if(props[i].property == PTP_OPC_ObjectFileName){ meta->title = malloc(strlen(props[i].propval.str)+1); meta->data.file.name = malloc(strlen(props[i].propval.str)+1); strcpy(meta->title, props[i].propval.str); strcpy(meta->data.file.name, props[i].propval.str); if(strchr(meta->title, '.')){ strchr(meta->title, '.')[0] = 0x0; } } if(props[i].property == PTP_OPC_DateModified){ meta->dateTimeCreated = ptp_unpack_MTPTime(props[i].propval.str); } } free(props); *p_meta = meta; *p_data = data; }