• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * \file emptyfolders.c
3  * Example program that prunes empty folders.
4  *
5  * Copyright (C) 2006 Andy Kelk <andy@mopoke.co.uk>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22 #include "common.h"
23 #include <stdlib.h>
24 
prune_empty_folders(LIBMTP_mtpdevice_t * device,LIBMTP_file_t * files,LIBMTP_folder_t * folderlist,int do_delete)25 static void prune_empty_folders(LIBMTP_mtpdevice_t *device, LIBMTP_file_t *files, LIBMTP_folder_t *folderlist, int do_delete)
26 {
27   if(folderlist==NULL)
28     return;
29 
30   if(folderlist->child == NULL) { // this *might* be empty
31     // therefore, check every file for this parent_id
32     int found = 0;
33     LIBMTP_file_t *file;
34     file = files;
35     while (file != NULL) {
36       if(file->parent_id == folderlist->folder_id) { // folder has a child
37         found = 1;
38         break;
39       }
40       file = file->next;
41     }
42 
43     if(found == 0) { // no files claim this as a parent
44       printf("empty folder %u (%s)\n",folderlist->folder_id,folderlist->name);
45       if(do_delete) {
46         if (LIBMTP_Delete_Object(device,folderlist->folder_id) != 0) {
47           printf("Couldn't delete folder %u\n",folderlist->folder_id);
48 	  LIBMTP_Dump_Errorstack(device);
49 	  LIBMTP_Clear_Errorstack(device);
50         }
51       }
52     }
53   }
54 
55   prune_empty_folders(device,files,folderlist->child,do_delete); // recurse down
56   prune_empty_folders(device,files,folderlist->sibling,do_delete); // recurse along
57 }
58 
main(int argc,char ** argv)59 int main (int argc, char **argv)
60 {
61   // check if we're doing a dummy run
62   int do_delete = 0;
63   int opt;
64 
65   fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
66 
67   while ( (opt = getopt(argc, argv, "d")) != -1 ) {
68     switch (opt) {
69     case 'd':
70       do_delete = 1;
71       break;
72     default:
73       break;
74     }
75   }
76 
77   if(do_delete == 0) {
78     printf("This is a dummy run. No folders will be deleted.\n");
79     printf("To delete folders, use the '-d' option.\n");
80   }
81 
82   LIBMTP_mtpdevice_t *device;
83   LIBMTP_folder_t *folders;
84   LIBMTP_file_t *files;
85 
86   LIBMTP_Init();
87   device = LIBMTP_Get_First_Device();
88   if (device == NULL) {
89     printf("No devices.\n");
90     exit (0);
91   }
92 
93   // Get file listing.
94   files = LIBMTP_Get_Filelisting_With_Callback(device,NULL,NULL);
95 
96   // Get folder listing.
97   folders = LIBMTP_Get_Folder_List(device);
98 
99   if(folders == NULL) {
100     printf("No folders found\n");
101   } else {
102     prune_empty_folders(device,files,folders,do_delete);
103   }
104 
105   LIBMTP_destroy_folder_t(folders);
106   LIBMTP_destroy_file_t(files);
107 
108   LIBMTP_Release_Device(device);
109   printf("OK.\n");
110   exit (0);
111 }
112 
113