/* * Copyright 2004 - 2009 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * PowerFolder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id: ChooseDiskLocationPanel.java 9522 2009-09-11 16:47:01Z harry $ */ package de.dal33t.powerfolder.util; import java.io.File; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import java.util.logging.Logger; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.Feature; import de.dal33t.powerfolder.disk.Folder; import de.dal33t.powerfolder.util.os.OSUtil; import de.dal33t.powerfolder.util.os.Win32.WinUtils; /** * Utility class to find common user directories. * * @author sprajc */ public class UserDirectories { private static final Map<String, UserDirectory> userDirectories = new TreeMap<String, UserDirectory>(); // Some standard user directory names from various OS. private static final String USER_DIR_DOCUMENTS_DEFAULT = "Documents"; private static final String USER_DIR_MUSIC_DEFAULT = "Music"; private static final String USER_DIR_PICTURES_DEFAULT = "Pictures"; private static final String USER_DIR_VIDEOS_DEFAULT = "Videos"; private static final String USER_DIR_FAVORITES_DEFAULT = "Favorites"; private static final String USER_DIR_LINKS = "Links"; private static final String USER_DIR_RECENT_DOCUMENTS = "Recent Documents"; private static final String USER_DIR_CONTACTS = "Contacts"; private static final String USER_DIR_DESKTOP = "Desktop"; // Vista has issues with these, so instantiate separately private static final String USER_DIR_DOCUMENTS_REPORTED; private static final String USER_DIR_MUSIC_REPORTED; private static final String USER_DIR_PICTURES_REPORTED; private static final String USER_DIR_VIDEOS_REPORTED; private static final String USER_DIR_FAVORITES_REPORTED; private static final String APPS_DIR_OUTLOOK; private static final String APPS_DIR_WINDOWS_MAIL; // Ubuntu mail client private static final String USER_DIR_EVOLUTION = ".evolution"; // Mac additionals private static final String USER_DIR_MOVIES = "Movies"; private static final String USER_DIR_DOWNLOADS = "Downloads"; private static final String USER_DIR_PUBLIC = "Public"; private static final String USER_DIR_SITES = "Sites"; private static final String USER_DIR_DROPBOX = "My Dropbox"; private static final String APPS_DIR_FIREFOX = "Mozilla" + File.separator + "Firefox"; private static final String APPS_DIR_SUNBIRD = "Mozilla" + File.separator + "Sunbird"; private static final String APPS_DIR_THUNDERBIRD = "Thunderbird"; private static final String APPS_DIR_FIREFOX2 = "firefox"; // Linux private static final String APPS_DIR_SUNBIRD2 = "sunbird"; // Linux private static final String APPS_DIR_THUNDERBIRD2 = "thunderbird"; // Linux static { if (WinUtils.getInstance() != null) { if (Feature.USER_DIRECTORIES_EMAIL_CLIENTS.isEnabled()) { APPS_DIR_OUTLOOK = WinUtils.getInstance().getSystemFolderPath( WinUtils.CSIDL_LOCAL_APP_DATA, false) + File.separator + "Microsoft" + File.separator + "Outlook"; } else { APPS_DIR_OUTLOOK = null; } USER_DIR_DOCUMENTS_REPORTED = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_PERSONAL, false); USER_DIR_MUSIC_REPORTED = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_MYMUSIC, false); USER_DIR_PICTURES_REPORTED = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_MYPICTURES, false); USER_DIR_VIDEOS_REPORTED = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_MYVIDEO, false); USER_DIR_FAVORITES_REPORTED = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_FAVORITES, false); if (Feature.USER_DIRECTORIES_EMAIL_CLIENTS.isEnabled()) { APPS_DIR_WINDOWS_MAIL = WinUtils.getInstance() .getSystemFolderPath(WinUtils.CSIDL_LOCAL_APP_DATA, false) + File.separator + "Microsoft" + File.separator + "Windows Mail"; } else { APPS_DIR_WINDOWS_MAIL = null; } } else { USER_DIR_DOCUMENTS_REPORTED = null; USER_DIR_MUSIC_REPORTED = null; USER_DIR_PICTURES_REPORTED = null; USER_DIR_VIDEOS_REPORTED = null; USER_DIR_FAVORITES_REPORTED = null; APPS_DIR_OUTLOOK = null; APPS_DIR_WINDOWS_MAIL = null; } } /** * @return the "Documents" or "My documents" directory. Only available on * Windows. */ public static String getDocumentsReported() { return USER_DIR_DOCUMENTS_REPORTED; } /** * @return the "Musci" or "My music" directory. Only available on Windows. */ public static String getMusicReported() { return USER_DIR_MUSIC_REPORTED; } /** * @return the "Videos" or "My videos" directory. Only available on Windows. */ public static String getVideosReported() { return USER_DIR_VIDEOS_REPORTED; } /** * @return the "Pictures" or "My pictures" directory. Only available on * Windows. */ public static String getPicturesReported() { return USER_DIR_PICTURES_REPORTED; } /** * @return all user directories name -> target location on disk. */ public static Map<String, UserDirectory> getUserDirectories() { if (userDirectories.isEmpty()) { synchronized (userDirectories) { findUserDirectories(); } } return userDirectories; } /** * @param controller * @return @return user directories that are not setup as folder yet. name * -> target location on disk. */ public static Map<String, UserDirectory> getUserDirectoriesFiltered( Controller controller, boolean includeAppData) { Map<String, UserDirectory> filteredDirs = new TreeMap<String, UserDirectory>( getUserDirectories()); for (Iterator<UserDirectory> it = filteredDirs.values().iterator(); it .hasNext();) { UserDirectory userDir = it.next(); // #2398 if (!includeAppData && "APP DATA".equalsIgnoreCase(userDir.getTranslatedName())) { it.remove(); continue; } File directory = userDir.getDirectory(); // See if any folders already exists for this directory. // No reason to show if already subscribed. for (Folder folder : controller.getFolderRepository().getFolders()) { if (folder.getLocalBase().equals(directory)) { it.remove(); break; } } } return filteredDirs; } /** * Find some generic user directories. Not all will be valid for all os, but * that is okay. */ private static void findUserDirectories() { File userHome = new File(System.getProperty("user.home")); addTargetDirectory(userHome, USER_DIR_CONTACTS, "user.dir.contacts", false); addTargetDirectory(userHome, USER_DIR_DESKTOP, "user.dir.desktop", false); addTargetDirectory(userHome, USER_DIR_EVOLUTION, "user.dir.evolution", true); addTargetDirectory(userHome, USER_DIR_LINKS, "user.dir.links", false); addTargetDirectory(userHome, USER_DIR_MOVIES, "user.dir.movies", false); addTargetDirectory(userHome, USER_DIR_DOWNLOADS, "user.dir.downloads", false); addTargetDirectory(userHome, USER_DIR_PUBLIC, "user.dir.public", false); addTargetDirectory(userHome, USER_DIR_SITES, "user.dir.sites", false); addTargetDirectory(userHome, USER_DIR_DROPBOX, "user.dir.dropbox", false); boolean foundDocuments = false; boolean foundMusic = false; boolean foundPictures = false; boolean foundVideos = false; // Hidden by Vista and 7 if (OSUtil.isWindowsSystem()) { if (USER_DIR_DOCUMENTS_REPORTED != null) { // #2203 Use same placeholder as on Vista or Win 7 foundDocuments = addTargetDirectory(new File( USER_DIR_DOCUMENTS_REPORTED), "user.dir.documents", false, "user.dir.documents"); } if (USER_DIR_MUSIC_REPORTED != null) { // #2203 Use same placeholder as on Vista or Win 7 foundMusic = addTargetDirectory(new File( USER_DIR_MUSIC_REPORTED), "user.dir.music", false, "user.dir.music"); } if (USER_DIR_PICTURES_REPORTED != null) { // #2203 Use same placeholder as on Vista or Win 7 foundPictures = addTargetDirectory(new File( USER_DIR_PICTURES_REPORTED), "user.dir.pictures", false, "user.dir.pictures"); } if (USER_DIR_VIDEOS_REPORTED != null) { // #2203 Use same placeholder as on Vista or Win 7 foundVideos = addTargetDirectory(new File( USER_DIR_VIDEOS_REPORTED), "user.dir.videos", false, "user.dir.videos"); } if (USER_DIR_FAVORITES_REPORTED != null) { // #2203 Use same placeholder as on Vista or Win 7 foundVideos = addTargetDirectory(new File( USER_DIR_FAVORITES_REPORTED), "user.dir.favorites", false); } } if (!foundDocuments) { addTargetDirectory(userHome, USER_DIR_DOCUMENTS_DEFAULT, "user.dir.documents", false); } if (!foundMusic) { addTargetDirectory(userHome, USER_DIR_MUSIC_DEFAULT, "user.dir.music", false); } if (!foundPictures) { addTargetDirectory(userHome, USER_DIR_PICTURES_DEFAULT, "user.dir.pictures", false); } if (!foundVideos) { addTargetDirectory(userHome, USER_DIR_VIDEOS_DEFAULT, "user.dir.videos", false); } boolean foundFavorites = false; if (!foundFavorites) { addTargetDirectory(userHome, USER_DIR_FAVORITES_DEFAULT, "user.dir.favorites", false); } addTargetDirectory(userHome, USER_DIR_RECENT_DOCUMENTS, "user.dir.recent_documents", false); addTargetDirectory(userHome, USER_DIR_VIDEOS_DEFAULT, "user.dir.videos", false); if (OSUtil.isWindowsSystem()) { String appDataname = WinUtils.getAppDataCurrentUser(); if (appDataname != null) { File appData = new File(appDataname); addTargetDirectory(appData, "apps.dir", true); addTargetDirectory(appData, APPS_DIR_FIREFOX, "apps.dir.firefox", false); addTargetDirectory(appData, APPS_DIR_SUNBIRD, "apps.dir.sunbird", false); if (Feature.USER_DIRECTORIES_EMAIL_CLIENTS.isEnabled()) { addTargetDirectory(appData, APPS_DIR_THUNDERBIRD, "apps.dir.thunderbird", false); } if (APPS_DIR_OUTLOOK != null) { addTargetDirectory(new File(APPS_DIR_OUTLOOK), "apps.dir.outlook", false); } if (APPS_DIR_WINDOWS_MAIL != null) { addTargetDirectory(new File(APPS_DIR_WINDOWS_MAIL), "apps.dir.windows_mail", false); } } else { Logger.getAnonymousLogger().severe( "Application data directory not found."); } } else if (OSUtil.isLinux()) { File appData = new File("/etc"); addTargetDirectory(appData, APPS_DIR_FIREFOX2, "apps.dir.firefox", false); addTargetDirectory(appData, APPS_DIR_SUNBIRD2, "apps.dir.sunbird", false); if (Feature.USER_DIRECTORIES_EMAIL_CLIENTS.isEnabled()) { addTargetDirectory(appData, APPS_DIR_THUNDERBIRD2, "apps.dir.thunderbird", false); } } else if (OSUtil.isMacOS()) { File appData = new File(userHome, "Library"); addTargetDirectory(appData, APPS_DIR_FIREFOX, "apps.dir.firefox", false); addTargetDirectory(appData, APPS_DIR_SUNBIRD, "apps.dir.sunbird", false); if (Feature.USER_DIRECTORIES_EMAIL_CLIENTS.isEnabled()) { addTargetDirectory(appData, APPS_DIR_THUNDERBIRD, "apps.dir.thunderbird", false); } } } /** * Adds a generic user directory if if exists for this os. * * @param root * @param subdir * @param translationId * @param allowHidden * allow display of hidden dirs */ private static void addTargetDirectory(File root, String subdir, String translationId, boolean allowHidden) { File directory = joinFile(root, subdir); addTargetDirectory(directory, translationId, allowHidden); } private static File joinFile(File root, String subdir) { return new File(root + File.separator + subdir); } /** * Adds a generic user directory if if exists for this os. * * @param translationId * @param allowHidden * allow display of hidden dirs */ private static boolean addTargetDirectory(File directory, String translationId, boolean allowHidden) { return addTargetDirectory(directory, translationId, allowHidden, translationId); } /** * Adds a generic user directory if if exists for this os. */ private static boolean addTargetDirectory(File directory, String translationId, boolean allowHidden, String placeholder) { if (directory.exists() && directory.isDirectory() && (allowHidden || !directory.isHidden())) { String translation = Translation.getTranslation(translationId); UserDirectory userDir = new UserDirectory(translation, '$' + placeholder, directory); userDirectories.put(translation, userDir); return true; } return false; } }