From: James J. <me...@do...> - 2022-01-16 23:08:41
|
Apologies, my code was messed up: int LIBMTP__Copy_Object(LIBMTP_mtpdevice_t *src_device, uint32_t const src_id, LIBMTP_mtpdevice_t *dest_device, LIBMTP_file_t *dest_file, LIBMTP_progressfunc_t const callback, void const * const data) { int fildes[2]; if (pipe(fildes) == -1) { add_error_to_errorstack(src_device, LIBMTP_ERROR_GENERAL, "_LIBMTP_Copy_Object(): Could not create pipe."); return -1; } if (fork() == 0) { uint16_t ret = LIBMTP_Send_File_From_File_Descriptor(dest_device, fildes[0], dest_file, callback, data); close(fildes[0]); if (ret == -1) { add_ptp_error_to_errorstack(dest_device, ret, "_LIBMTP_Copy_Object(): could not write to destination object."); return -1; } } else { uint16_t ret = LIBMTP_Get_File_To_File_Descriptor(src_device, src_id, fildes[1], callback, data); close(fildes[1]); if (ret == -1) { add_ptp_error_to_errorstack(src_device, ret, "_LIBMTP_Copy_Object(): could not copy object."); return -1; } } return 0; } On 16/01/2022 21:48, James John wrote: > Hello, > > I am trying to implement object copy into this library using Linux pipes. > > Since objects cannot be copied to except downloaded to a file and read > back into an MTP file, which will take a lot of time. I played around > pipes instead by concurrently writing to pipe and reading from pipe > back to another MTP file. But I read that MTP is not multiplexed, so > operations cannot be performed concurrently. > > I have tried to implement this but I am getting some weird error. > Because I assumed each transaction waits for the current to finish. > This is what I have: > > > int LIBMTP__Copy_Object(LIBMTP_mtpdevice_t *src_device, > uint32_t > const src_id, > LIBMTP_mtpdevice_t *dest_device, > LIBMTP_file_t > *dest_file, > LIBMTP_progressfunc_t const callback, > void const * > const data) > { > int fildes[2]; > > if (pipe(fildes) == -1) { > > add_error_to_errorstack(src_device, LIBMTP_ERROR_GENERAL, > "_LIBMTP_Copy_Object(): Could not create pipe."); > return -1; > } > > > if (fork() == 0) { > uint16_t ret = > LIBMTP_Send_File_From_File_Descriptor(dest_device, fildes[0], > dest_file, callback, data); > close(fildes[0]); > if (ret == -1) { > > add_ptp_error_to_errorstack(dest_device, ret, "_LIBMTP_Copy_Object(): > could not write to destination object."); > return -1; > } > } else { > > uint16_t ret = LIBMTP_Get_File_To_File_Descriptor(src_device, > src_id, fildes[1], callback, data); > close(fildes[1]); > if (ret == > -1) { > add_ptp_error_to_errorstack(src_device, ret, > "_LIBMTP_Copy_Object(): could not copy object."); > return -1; > } > } > > > return 0; > } > > > I need a help in finding why it > LIBMTP_Send_File_From_File_Descriptoris not working. Or it can't work > because it is not multiplexed? > > A bit of a newbie here, still getting familiar with this library and > the whole low-level thing. It's for the passion :) > > > Thank you > > James > > > > _______________________________________________ > Libmtp-discuss mailing list > Lib...@li... > https://lists.sourceforge.net/lists/listinfo/libmtp-discuss |