summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Schemel <holger.schemel@virtion.de>2020-10-26 16:00:10 +0100
committerHolger Schemel <holger.schemel@virtion.de>2020-10-27 15:24:22 +0100
commitac80717d9b73d34ba5560e79ae14cbba27b2bedb (patch)
tree3fb50bddbe9766ec0844ba1d9d12252bf1f34e08
parentec9b2cd9996bfeb367abddfc160ec47c16dd69ff (diff)
downloadlibmtp-ac80717d9b73d34ba5560e79ae14cbba27b2bedb.tar.gz
added functions to get device by serial number
-rw-r--r--src/libmtp.c74
-rw-r--r--src/libmtp.h.in2
-rw-r--r--src/libmtp.sym2
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