Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 1 | #include "common.h" |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 2 | #include <unistd.h> |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 3 | #include <stdlib.h> |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 4 | #include <stdio.h> |
| 5 | #include <string.h> |
Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 6 | |
Linus Walleij | 9140559 | 2006-05-05 14:22:51 +0000 | [diff] [blame] | 7 | #define XML_BUFSIZE 0x10000 |
| 8 | |
| 9 | static void dump_xml_fragment(uint8_t *buf, uint32_t len) |
| 10 | { |
| 11 | static int endianness = 0; // 0 = LE, 1 = BE |
| 12 | uint32_t bp = 0; |
| 13 | |
| 14 | while (bp < len) { |
| 15 | if (buf[bp+0] == 0xFF && buf[bp+1] == 0xFE) { |
| 16 | endianness = 0; |
| 17 | } else if (buf[bp+0] == 0xFE && buf[bp+1] == 0xff) { |
| 18 | endianness = 1; |
| 19 | } else { |
| 20 | uint16_t tmp; |
| 21 | |
| 22 | if (endianness == 0) { |
| 23 | tmp = buf[bp+1] << 8 | buf[bp+0]; |
| 24 | } else { |
| 25 | tmp = buf[bp+0] << 8 | buf[bp+1]; |
| 26 | } |
| 27 | // Fix this some day, we only print ISO 8859-1 correctly here, |
| 28 | // should atleast support UTF-8. |
| 29 | printf("%c", (uint8_t) tmp); |
| 30 | } |
| 31 | bp += 2; |
| 32 | } |
| 33 | printf("\n"); |
| 34 | } |
| 35 | |
Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 36 | int main (int argc, char **argv) |
| 37 | { |
Linus Walleij | 6d6d8f6 | 2006-02-13 13:21:57 +0000 | [diff] [blame] | 38 | LIBMTP_mtpdevice_t *device; |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 39 | LIBMTP_file_t *files; |
| 40 | uint32_t xmlfileid = 0; |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 41 | uint64_t totalbytes; |
| 42 | uint64_t freebytes; |
| 43 | char *storage_description; |
| 44 | char *volume_label; |
Linus Walleij | fae2748 | 2006-08-19 20:13:25 +0000 | [diff] [blame] | 45 | char *friendlyname; |
| 46 | char *syncpartner; |
Linus Walleij | 1240164 | 2006-06-13 15:22:12 +0000 | [diff] [blame] | 47 | char *sectime; |
| 48 | char *devcert; |
Linus Walleij | 8ab5426 | 2006-06-21 07:12:28 +0000 | [diff] [blame] | 49 | uint16_t *filetypes; |
| 50 | uint16_t filetypes_len; |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 51 | uint8_t maxbattlevel; |
| 52 | uint8_t currbattlevel; |
| 53 | int ret; |
Linus Walleij | 1fd2d27 | 2006-05-08 09:22:01 +0000 | [diff] [blame] | 54 | int probeonly = 0; |
Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 55 | |
| 56 | LIBMTP_Init(); |
Linus Walleij | 1fd2d27 | 2006-05-08 09:22:01 +0000 | [diff] [blame] | 57 | |
| 58 | if (argc > 1 && !strcmp(argv[1], "-p")) { |
| 59 | probeonly = 1; |
| 60 | } |
| 61 | |
| 62 | if (probeonly) { |
| 63 | uint16_t vid; |
| 64 | uint16_t pid; |
| 65 | |
| 66 | ret = LIBMTP_Detect_Descriptor(&vid, &pid); |
| 67 | if (ret > 0) { |
| 68 | printf("DETECTED MTP DEVICE WITH VID:%04x, PID:%04X\n", vid, pid); |
| 69 | exit(0); |
| 70 | } else { |
| 71 | exit(1); |
| 72 | } |
| 73 | } |
| 74 | |
Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 75 | device = LIBMTP_Get_First_Device(); |
| 76 | if (device == NULL) { |
| 77 | printf("No devices.\n"); |
| 78 | exit (0); |
| 79 | } |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 80 | |
| 81 | LIBMTP_Dump_Device_Info(device); |
Linus Walleij | 6d6d8f6 | 2006-02-13 13:21:57 +0000 | [diff] [blame] | 82 | |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 83 | printf("MTP-specific device properties:\n"); |
Linus Walleij | fae2748 | 2006-08-19 20:13:25 +0000 | [diff] [blame] | 84 | // The friendly name |
Linus Walleij | 3065879 | 2006-08-19 22:18:55 +0000 | [diff] [blame] | 85 | friendlyname = LIBMTP_Get_Friendlyname(device); |
Linus Walleij | fae2748 | 2006-08-19 20:13:25 +0000 | [diff] [blame] | 86 | if (friendlyname == NULL) { |
| 87 | printf(" Friendly name: (NULL)\n"); |
Linus Walleij | 6d6d8f6 | 2006-02-13 13:21:57 +0000 | [diff] [blame] | 88 | } else { |
Linus Walleij | fae2748 | 2006-08-19 20:13:25 +0000 | [diff] [blame] | 89 | printf(" Friendly name: %s\n", friendlyname); |
| 90 | free(friendlyname); |
| 91 | } |
| 92 | syncpartner = LIBMTP_Get_Syncpartner(device); |
| 93 | if (syncpartner == NULL) { |
| 94 | printf(" Synchronization partner: (NULL)\n"); |
| 95 | } else { |
| 96 | printf(" Synchronization partner: %s\n", syncpartner); |
| 97 | free(syncpartner); |
Linus Walleij | 6d6d8f6 | 2006-02-13 13:21:57 +0000 | [diff] [blame] | 98 | } |
| 99 | |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 100 | // Some storage info |
| 101 | ret = LIBMTP_Get_Storageinfo(device, &totalbytes, &freebytes, &storage_description, &volume_label); |
| 102 | if (ret == 0) { |
| 103 | #ifdef __WIN32__ |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 104 | printf(" Total bytes on device: %I64u (%I64u MB)\n", |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 105 | totalbytes, totalbytes/(1024*1024)); |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 106 | printf(" Free bytes on device: %I64u (%I64u MB)\n", |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 107 | freebytes, freebytes/(1024*1024)); |
| 108 | #else |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 109 | printf(" Total bytes on device: %llu (%llu MB)\n", |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 110 | totalbytes, totalbytes/(1024*1024)); |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 111 | printf(" Free bytes on device: %llu (%llu MB)\n", |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 112 | freebytes, freebytes/(1024*1024)); |
| 113 | #endif |
| 114 | if (storage_description != NULL) { |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 115 | printf(" Storage description: \"%s\"\n", storage_description); |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 116 | free(storage_description); |
| 117 | } |
| 118 | if (volume_label != NULL) { |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 119 | printf(" Volume label: \"%s\"\n", volume_label); |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 120 | free(volume_label); |
| 121 | } |
| 122 | } else { |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 123 | printf(" Error getting disk info...\n"); |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 124 | } |
| 125 | |
| 126 | // Some battery info |
| 127 | ret = LIBMTP_Get_Batterylevel(device, &maxbattlevel, &currbattlevel); |
| 128 | if (ret == 0) { |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 129 | printf(" Battery level %d of %d (%d%%)\n",currbattlevel, maxbattlevel, |
Linus Walleij | b7473eb | 2006-06-21 07:28:49 +0000 | [diff] [blame] | 130 | (int) ((float) currbattlevel/ (float) maxbattlevel * 100.0)); |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 131 | } else { |
Linus Walleij | 8c45b29 | 2006-04-26 14:12:44 +0000 | [diff] [blame] | 132 | printf(" Error getting battery info...\n"); |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 133 | } |
| 134 | |
Linus Walleij | 8ab5426 | 2006-06-21 07:12:28 +0000 | [diff] [blame] | 135 | ret = LIBMTP_Get_Supported_Filetypes(device, &filetypes, &filetypes_len); |
| 136 | if (ret == 0) { |
| 137 | uint16_t i; |
| 138 | |
| 139 | printf("libmtp supported (playable) filetypes:\n"); |
| 140 | for (i = 0; i < filetypes_len; i++) { |
| 141 | printf(" %s\n", LIBMTP_Get_Filetype_Description(filetypes[i])); |
| 142 | } |
| 143 | } |
| 144 | |
Linus Walleij | 1240164 | 2006-06-13 15:22:12 +0000 | [diff] [blame] | 145 | // Secure time XML fragment |
| 146 | ret = LIBMTP_Get_Secure_Time(device, §ime); |
| 147 | if (ret == 0 && sectime != NULL) { |
| 148 | printf("\nSecure Time:\n%s\n", sectime); |
| 149 | free(sectime); |
| 150 | } |
| 151 | |
| 152 | // Device certificate XML fragment |
| 153 | ret = LIBMTP_Get_Device_Certificate(device, &devcert); |
| 154 | if (ret == 0 && devcert != NULL) { |
| 155 | printf("\nDevice Certificate:\n%s\n", devcert); |
| 156 | free(devcert); |
| 157 | } |
| 158 | |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 159 | // Try to get device info XML file... |
| 160 | files = LIBMTP_Get_Filelisting(device); |
| 161 | if (files != NULL) { |
| 162 | LIBMTP_file_t *file, *tmp; |
| 163 | file = files; |
| 164 | while (file != NULL) { |
| 165 | if (!strcmp(file->filename, "WMPInfo.xml")) { |
| 166 | xmlfileid = file->item_id; |
| 167 | } |
| 168 | tmp = file; |
| 169 | file = file->next; |
| 170 | LIBMTP_destroy_file_t(tmp); |
| 171 | } |
| 172 | } |
| 173 | if (xmlfileid != 0) { |
Linus Walleij | cf223e6 | 2006-06-19 09:31:53 +0000 | [diff] [blame] | 174 | FILE *xmltmp = tmpfile(); |
| 175 | int tmpfile = fileno(xmltmp); |
| 176 | |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 177 | if (tmpfile != -1) { |
| 178 | int ret = LIBMTP_Get_Track_To_File_Descriptor(device, xmlfileid, tmpfile, NULL, NULL); |
| 179 | if (ret == 0) { |
Linus Walleij | 9140559 | 2006-05-05 14:22:51 +0000 | [diff] [blame] | 180 | uint8_t *buf = NULL; |
| 181 | uint32_t readbytes; |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 182 | |
Linus Walleij | 9140559 | 2006-05-05 14:22:51 +0000 | [diff] [blame] | 183 | buf = malloc(XML_BUFSIZE); |
| 184 | if (buf == NULL) { |
| 185 | printf("Could not allocate %08x bytes...\n", XML_BUFSIZE); |
| 186 | exit(1); |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 187 | } |
Linus Walleij | 9140559 | 2006-05-05 14:22:51 +0000 | [diff] [blame] | 188 | lseek(tmpfile, 0, SEEK_SET); |
| 189 | readbytes = read(tmpfile, (void*) buf, XML_BUFSIZE); |
| 190 | |
| 191 | if (readbytes >= 2 && readbytes < XML_BUFSIZE) { |
| 192 | printf("\nDevice description WMPInfo.xml file:\n"); |
| 193 | dump_xml_fragment(buf, readbytes); |
| 194 | } |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 195 | } |
Linus Walleij | cf223e6 | 2006-06-19 09:31:53 +0000 | [diff] [blame] | 196 | fclose(xmltmp); |
Linus Walleij | f6bc178 | 2006-03-24 15:12:47 +0000 | [diff] [blame] | 197 | } |
| 198 | } |
| 199 | |
Linus Walleij | fa1374c | 2006-02-27 07:41:46 +0000 | [diff] [blame] | 200 | // King Fisher of Triad rocks your world! |
Linus Walleij | eb8c6fe | 2006-02-03 09:46:22 +0000 | [diff] [blame] | 201 | LIBMTP_Release_Device(device); |
| 202 | printf("OK.\n"); |
| 203 | exit (0); |
| 204 | } |