13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/**
23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * \file emptyfolders.c
33aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Example program that prunes empty folders.
43aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
53aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2006 Andy Kelk <andy@mopoke.co.uk>
63aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
73aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is free software; you can redistribute it and/or
83aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * modify it under the terms of the GNU Lesser General Public
93aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License as published by the Free Software Foundation; either
103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * version 2 of the License, or (at your option) any later version.
113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is distributed in the hope that it will be useful,
133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of
143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Lesser General Public License for more details.
163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev *
173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * You should have received a copy of the GNU Lesser General Public
183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License along with this library; if not, write to the
193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Boston, MA 02111-1307, USA.
213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */
223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "common.h"
233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdlib.h>
243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevstatic void prune_empty_folders(LIBMTP_mtpdevice_t *device, LIBMTP_file_t *files, LIBMTP_folder_t *folderlist, int do_delete)
263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if(folderlist==NULL)
283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    return;
293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if(folderlist->child == NULL) { // this *might* be empty
313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    // therefore, check every file for this parent_id
323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    int found = 0;
333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    LIBMTP_file_t *file;
343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    file = files;
353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    while (file != NULL) {
363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      if(file->parent_id == folderlist->folder_id) { // folder has a child
373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        found = 1;
383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        break;
393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      }
403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      file = file->next;
413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    }
423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    if(found == 0) { // no files claim this as a parent
443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      printf("empty folder %u (%s)\n",folderlist->folder_id,folderlist->name);
453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      if(do_delete) {
463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        if (LIBMTP_Delete_Object(device,folderlist->folder_id) != 0) {
473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev          printf("Couldn't delete folder %u\n",folderlist->folder_id);
483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	  LIBMTP_Dump_Errorstack(device);
493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev	  LIBMTP_Clear_Errorstack(device);
503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev        }
513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      }
523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    }
533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  }
543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  prune_empty_folders(device,files,folderlist->child,do_delete); // recurse down
563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  prune_empty_folders(device,files,folderlist->sibling,do_delete); // recurse along
573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevint main (int argc, char **argv)
603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{
613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  // check if we're doing a dummy run
623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  int do_delete = 0;
633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  int opt;
643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  while ( (opt = getopt(argc, argv, "d")) != -1 ) {
683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    switch (opt) {
693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    case 'd':
703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      do_delete = 1;
713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      break;
723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    default:
733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev      break;
743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    }
753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  }
763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if(do_delete == 0) {
783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    printf("This is a dummy run. No folders will be deleted.\n");
793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    printf("To delete folders, use the '-d' option.\n");
803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  }
813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_mtpdevice_t *device;
833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_folder_t *folders;
843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_file_t *files;
853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_Init();
873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  device = LIBMTP_Get_First_Device();
883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if (device == NULL) {
893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    printf("No devices.\n");
903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    exit (0);
913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  }
923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  // Get file listing.
943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  files = LIBMTP_Get_Filelisting_With_Callback(device,NULL,NULL);
953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  // Get folder listing.
973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  folders = LIBMTP_Get_Folder_List(device);
983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  if(folders == NULL) {
1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    printf("No folders found\n");
1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  } else {
1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev    prune_empty_folders(device,files,folders,do_delete);
1033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  }
1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_destroy_folder_t(folders);
1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_destroy_file_t(files);
1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
1083aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  LIBMTP_Release_Device(device);
1093aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  printf("OK.\n");
1103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev  exit (0);
1113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev}
1123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev
113