blob: 8e425dac3debc7ad495bb29e7f08a54679f1f6c2 [file] [log] [blame]
Linus Walleijeb8c6fe2006-02-03 09:46:22 +00001#include "common.h"
Linus Walleijf6bc1782006-03-24 15:12:47 +00002#include <unistd.h>
Linus Walleijfa1374c2006-02-27 07:41:46 +00003#include <stdlib.h>
Linus Walleijf6bc1782006-03-24 15:12:47 +00004#include <stdio.h>
5#include <string.h>
Linus Walleijeb8c6fe2006-02-03 09:46:22 +00006
Linus Walleij91405592006-05-05 14:22:51 +00007#define XML_BUFSIZE 0x10000
8
9static 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 Walleijeb8c6fe2006-02-03 09:46:22 +000036int main (int argc, char **argv)
37{
Linus Walleij6d6d8f62006-02-13 13:21:57 +000038 LIBMTP_mtpdevice_t *device;
Linus Walleijf6bc1782006-03-24 15:12:47 +000039 LIBMTP_file_t *files;
40 uint32_t xmlfileid = 0;
Linus Walleijfa1374c2006-02-27 07:41:46 +000041 uint64_t totalbytes;
42 uint64_t freebytes;
43 char *storage_description;
44 char *volume_label;
Linus Walleijfae27482006-08-19 20:13:25 +000045 char *friendlyname;
46 char *syncpartner;
Linus Walleij12401642006-06-13 15:22:12 +000047 char *sectime;
48 char *devcert;
Linus Walleij8ab54262006-06-21 07:12:28 +000049 uint16_t *filetypes;
50 uint16_t filetypes_len;
Linus Walleijfa1374c2006-02-27 07:41:46 +000051 uint8_t maxbattlevel;
52 uint8_t currbattlevel;
53 int ret;
Linus Walleij1fd2d272006-05-08 09:22:01 +000054 int probeonly = 0;
Linus Walleijeb8c6fe2006-02-03 09:46:22 +000055
56 LIBMTP_Init();
Linus Walleij1fd2d272006-05-08 09:22:01 +000057
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 Walleijeb8c6fe2006-02-03 09:46:22 +000075 device = LIBMTP_Get_First_Device();
76 if (device == NULL) {
77 printf("No devices.\n");
78 exit (0);
79 }
Linus Walleij8c45b292006-04-26 14:12:44 +000080
81 LIBMTP_Dump_Device_Info(device);
Linus Walleij6d6d8f62006-02-13 13:21:57 +000082
Linus Walleij8c45b292006-04-26 14:12:44 +000083 printf("MTP-specific device properties:\n");
Linus Walleijfae27482006-08-19 20:13:25 +000084 // The friendly name
Linus Walleij30658792006-08-19 22:18:55 +000085 friendlyname = LIBMTP_Get_Friendlyname(device);
Linus Walleijfae27482006-08-19 20:13:25 +000086 if (friendlyname == NULL) {
87 printf(" Friendly name: (NULL)\n");
Linus Walleij6d6d8f62006-02-13 13:21:57 +000088 } else {
Linus Walleijfae27482006-08-19 20:13:25 +000089 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 Walleij6d6d8f62006-02-13 13:21:57 +000098 }
99
Linus Walleijfa1374c2006-02-27 07:41:46 +0000100 // Some storage info
101 ret = LIBMTP_Get_Storageinfo(device, &totalbytes, &freebytes, &storage_description, &volume_label);
102 if (ret == 0) {
103#ifdef __WIN32__
Linus Walleij8c45b292006-04-26 14:12:44 +0000104 printf(" Total bytes on device: %I64u (%I64u MB)\n",
Linus Walleijfa1374c2006-02-27 07:41:46 +0000105 totalbytes, totalbytes/(1024*1024));
Linus Walleij8c45b292006-04-26 14:12:44 +0000106 printf(" Free bytes on device: %I64u (%I64u MB)\n",
Linus Walleijfa1374c2006-02-27 07:41:46 +0000107 freebytes, freebytes/(1024*1024));
108#else
Linus Walleij8c45b292006-04-26 14:12:44 +0000109 printf(" Total bytes on device: %llu (%llu MB)\n",
Linus Walleijfa1374c2006-02-27 07:41:46 +0000110 totalbytes, totalbytes/(1024*1024));
Linus Walleij8c45b292006-04-26 14:12:44 +0000111 printf(" Free bytes on device: %llu (%llu MB)\n",
Linus Walleijfa1374c2006-02-27 07:41:46 +0000112 freebytes, freebytes/(1024*1024));
113#endif
114 if (storage_description != NULL) {
Linus Walleij8c45b292006-04-26 14:12:44 +0000115 printf(" Storage description: \"%s\"\n", storage_description);
Linus Walleijfa1374c2006-02-27 07:41:46 +0000116 free(storage_description);
117 }
118 if (volume_label != NULL) {
Linus Walleij8c45b292006-04-26 14:12:44 +0000119 printf(" Volume label: \"%s\"\n", volume_label);
Linus Walleijfa1374c2006-02-27 07:41:46 +0000120 free(volume_label);
121 }
122 } else {
Linus Walleij8c45b292006-04-26 14:12:44 +0000123 printf(" Error getting disk info...\n");
Linus Walleijfa1374c2006-02-27 07:41:46 +0000124 }
125
126 // Some battery info
127 ret = LIBMTP_Get_Batterylevel(device, &maxbattlevel, &currbattlevel);
128 if (ret == 0) {
Linus Walleij8c45b292006-04-26 14:12:44 +0000129 printf(" Battery level %d of %d (%d%%)\n",currbattlevel, maxbattlevel,
Linus Walleijb7473eb2006-06-21 07:28:49 +0000130 (int) ((float) currbattlevel/ (float) maxbattlevel * 100.0));
Linus Walleijfa1374c2006-02-27 07:41:46 +0000131 } else {
Linus Walleij8c45b292006-04-26 14:12:44 +0000132 printf(" Error getting battery info...\n");
Linus Walleijfa1374c2006-02-27 07:41:46 +0000133 }
134
Linus Walleij8ab54262006-06-21 07:12:28 +0000135 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 Walleij12401642006-06-13 15:22:12 +0000145 // Secure time XML fragment
146 ret = LIBMTP_Get_Secure_Time(device, &sectime);
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 Walleijf6bc1782006-03-24 15:12:47 +0000159 // 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 Walleijcf223e62006-06-19 09:31:53 +0000174 FILE *xmltmp = tmpfile();
175 int tmpfile = fileno(xmltmp);
176
Linus Walleijf6bc1782006-03-24 15:12:47 +0000177 if (tmpfile != -1) {
178 int ret = LIBMTP_Get_Track_To_File_Descriptor(device, xmlfileid, tmpfile, NULL, NULL);
179 if (ret == 0) {
Linus Walleij91405592006-05-05 14:22:51 +0000180 uint8_t *buf = NULL;
181 uint32_t readbytes;
Linus Walleijf6bc1782006-03-24 15:12:47 +0000182
Linus Walleij91405592006-05-05 14:22:51 +0000183 buf = malloc(XML_BUFSIZE);
184 if (buf == NULL) {
185 printf("Could not allocate %08x bytes...\n", XML_BUFSIZE);
186 exit(1);
Linus Walleijf6bc1782006-03-24 15:12:47 +0000187 }
Linus Walleij91405592006-05-05 14:22:51 +0000188 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 Walleijf6bc1782006-03-24 15:12:47 +0000195 }
Linus Walleijcf223e62006-06-19 09:31:53 +0000196 fclose(xmltmp);
Linus Walleijf6bc1782006-03-24 15:12:47 +0000197 }
198 }
199
Linus Walleijfa1374c2006-02-27 07:41:46 +0000200 // King Fisher of Triad rocks your world!
Linus Walleijeb8c6fe2006-02-03 09:46:22 +0000201 LIBMTP_Release_Device(device);
202 printf("OK.\n");
203 exit (0);
204}