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