examples: files: retire cached code

The new uncached device access interface is obviously the way
forward for all applications, start retiring the old method of
traversing the devices in the examples.

The output looks the same after this change, it just uses the
raw device interface to get the track listing iteratively.

Signed-off-by: Linus Walleij <triad@df.lth.se>
diff --git a/examples/files.c b/examples/files.c
index 11b0c04..62c4c1a 100644
--- a/examples/files.c
+++ b/examples/files.c
@@ -46,16 +46,48 @@
   printf("   Filetype: %s\n", LIBMTP_Get_Filetype_Description(file->filetype));
 }
 
-int main (int argc, char **argv)
+void dump_files(LIBMTP_mtpdevice_t *device, uint32_t storageid, int leaf)
 {
-  LIBMTP_mtpdevice_t *device_list, *device;
   LIBMTP_file_t *files;
 
+  /* Get file listing. */
+  files = LIBMTP_Get_Files_And_Folders(device,
+				       storageid,
+				       leaf);
+  if (files == NULL) {
+    LIBMTP_Dump_Errorstack(device);
+    LIBMTP_Clear_Errorstack(device);
+  } else {
+    LIBMTP_file_t *file, *tmp;
+    file = files;
+    while (file != NULL) {
+      /* Please don't print these */
+      if (file->filetype == LIBMTP_FILETYPE_FOLDER) {
+	dump_files(device, storageid, file->item_id);
+      } else {
+	dump_fileinfo(file);
+      }
+      tmp = file;
+      file = file->next;
+      LIBMTP_destroy_file_t(tmp);
+    }
+  }
+}
+
+int main(int argc, char **argv)
+{
+  LIBMTP_raw_device_t *rawdevices;
+  int numrawdevices;
+  LIBMTP_file_t *files;
+  LIBMTP_error_number_t err;
+  int i;
+
   fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
 
   LIBMTP_Init();
 
-  switch(LIBMTP_Get_Connected_Devices(&device_list))
+  err = LIBMTP_Detect_Raw_Devices(&rawdevices, &numrawdevices);
+  switch(err)
   {
   case LIBMTP_ERROR_NO_DEVICE_ATTACHED:
     fprintf(stdout, "mtp-files: No Devices have been found\n");
@@ -72,19 +104,27 @@
   default:
     fprintf(stderr, "mtp-files: Unknown error, please report "
                     "this to the libmtp developers\n");
-  return 1;
+    return 1;
 
   /* Successfully connected at least one device, so continue */
   case LIBMTP_ERROR_NONE:
     fprintf(stdout, "mtp-files: Successfully connected\n");
     fflush(stdout);
+    break;
   }
 
   /* iterate through connected MTP devices */
-  for(device = device_list; device != NULL; device = device->next)
-  {
+  for (i = 0; i < numrawdevices; i++) {
+    LIBMTP_mtpdevice_t *device;
+    LIBMTP_devicestorage_t *storage;
     char *friendlyname;
 
+    device = LIBMTP_Open_Raw_Device_Uncached(&rawdevices[i]);
+    if (device == NULL) {
+      fprintf(stderr, "Unable to open raw device %d\n", i);
+      continue;
+    }
+
     /* Echo the friendly name so we know which device we are working with */
     friendlyname = LIBMTP_Get_Friendlyname(device);
     if (friendlyname == NULL) {
@@ -94,25 +134,18 @@
       free(friendlyname);
     }
 
-	  /* Get track listing. */
-	  files = LIBMTP_Get_Filelisting_With_Callback(device, NULL, NULL);
-	  if (files == NULL) {
-	    printf("No files.\n");
-	    LIBMTP_Dump_Errorstack(device);
-	    LIBMTP_Clear_Errorstack(device);
-	  } else {
-	    LIBMTP_file_t *file, *tmp;
-	    file = files;
-	    while (file != NULL) {
-	      dump_fileinfo(file);
-	      tmp = file;
-	      file = file->next;
-	      LIBMTP_destroy_file_t(tmp);
-      }
-	  }
+    LIBMTP_Dump_Errorstack(device);
+    LIBMTP_Clear_Errorstack(device);
+
+    /* Loop over storages */
+    for (storage = device->storage; storage != 0; storage = storage->next) {
+      dump_files(device, storage->id, 0);
+    }
+    LIBMTP_Release_Device(device);
   }
 
-  LIBMTP_Release_Device_List(device_list);
+  free(rawdevices);
+
   printf("OK.\n");
   exit (0);
 }