diff options
author | Holger Schemel <holger.schemel@virtion.de> | 2020-10-26 16:00:10 +0100 |
---|---|---|
committer | Holger Schemel <holger.schemel@virtion.de> | 2020-10-27 15:24:22 +0100 |
commit | ac80717d9b73d34ba5560e79ae14cbba27b2bedb (patch) | |
tree | 3fb50bddbe9766ec0844ba1d9d12252bf1f34e08 /src | |
parent | ec9b2cd9996bfeb367abddfc160ec47c16dd69ff (diff) | |
download | libmtp-ac80717d9b73d34ba5560e79ae14cbba27b2bedb.tar.gz |
added functions to get device by serial number
Diffstat (limited to 'src')
-rw-r--r-- | src/libmtp.c | 74 | ||||
-rw-r--r-- | src/libmtp.h.in | 2 | ||||
-rw-r--r-- | src/libmtp.sym | 2 |
3 files changed, 78 insertions, 0 deletions
diff --git a/src/libmtp.c b/src/libmtp.c index ae9a557..0cfd2be 100644 --- a/src/libmtp.c +++ b/src/libmtp.c @@ -1722,6 +1722,80 @@ LIBMTP_mtpdevice_t *LIBMTP_Get_First_Device(void) } /** + * Get connected MTP device by serial number. + * @return a device pointer. + * @see LIBMTP_Get_Connected_Devices() + */ +LIBMTP_mtpdevice_t *LIBMTP_Get_Device_By_SerialNumber(char *serial_number) +{ + LIBMTP_mtpdevice_t *device = NULL; + LIBMTP_raw_device_t *devices; + int numdevs; + LIBMTP_error_number_t ret; + PTPParams *params; + int found_device = 0; + int i; + + if (serial_number == NULL || *serial_number == '\0') + return NULL; + + ret = LIBMTP_Detect_Raw_Devices(&devices, &numdevs); + if (ret != LIBMTP_ERROR_NONE) + return NULL; + + if (devices == NULL || numdevs == 0) { + free(devices); + return NULL; + } + + for (i = 0; i < numdevs; i++) { + device = LIBMTP_Open_Raw_Device(&devices[i]); + if (device == NULL) + continue; + + params = (PTPParams *) device->params; + if (strcmp(params->deviceinfo.SerialNumber, serial_number) == 0) { + found_device = 1; + break; + } + + LIBMTP_Release_Device(device); + } + + free(devices); + + if (!found_device) + return NULL; + + return device; +} + +/** + * Get connected MTP device by list position or serial number. + * @return a device pointer. + * @see LIBMTP_Get_Connected_Devices() + */ +LIBMTP_mtpdevice_t *LIBMTP_Get_Device_By_ID(char *device_id) +{ + uint32_t device_nr; + char *endptr; + + if (device_id == NULL || *device_id == '\0') + return NULL; + + // 1st try: serial number + if (strlen(device_id) > 3 && strncmp(device_id, "SN:", 3) == 0) + return LIBMTP_Get_Device_By_SerialNumber(device_id + 3); + + // 2nd try: device number + device_nr = strtoul(device_id, &endptr, 10); + if (*endptr == '\0') + return LIBMTP_Get_Device(device_nr); + + return NULL; +} + +/** * Overriding debug function. * This way we can disable debug prints. */ diff --git a/src/libmtp.h.in b/src/libmtp.h.in index 8df68c5..409e6f7 100644 --- a/src/libmtp.h.in +++ b/src/libmtp.h.in @@ -844,6 +844,8 @@ LIBMTP_mtpdevice_t *LIBMTP_Open_Raw_Device_Uncached(LIBMTP_raw_device_t *); /* Begin old, legacy interface */ LIBMTP_mtpdevice_t *LIBMTP_Get_Device(int); LIBMTP_mtpdevice_t *LIBMTP_Get_First_Device(void); +LIBMTP_mtpdevice_t *LIBMTP_Get_Device_By_SerialNumber(char *); +LIBMTP_mtpdevice_t *LIBMTP_Get_Device_By_ID(char *); LIBMTP_error_number_t LIBMTP_Get_Connected_Devices(LIBMTP_mtpdevice_t **); uint32_t LIBMTP_Number_Devices_In_List(LIBMTP_mtpdevice_t *); void LIBMTP_Release_Device_List(LIBMTP_mtpdevice_t*); diff --git a/src/libmtp.sym b/src/libmtp.sym index fec6e58..4bece67 100644 --- a/src/libmtp.sym +++ b/src/libmtp.sym @@ -7,6 +7,8 @@ LIBMTP_Open_Raw_Device LIBMTP_Open_Raw_Device_Uncached LIBMTP_Get_Device LIBMTP_Get_First_Device +LIBMTP_Get_Device_By_SerialNumber +LIBMTP_Get_Device_By_ID LIBMTP_Get_Connected_Devices LIBMTP_Number_Devices_In_List LIBMTP_Release_Device_List |