/**
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* muCommander 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.commons.file.util;
import com.mucommander.commons.runtime.JavaVersion;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import java.util.Arrays;
import java.util.List;
/**
* Exposes parts of the Windows Shell32 API using the JNA (Java Native Access) library.
* The {@link Shell32} class should be used to retrieve an instance of this interface.
*
* @see Shell32
* @author Maxence Bernard
*/
public interface Shell32API extends W32API {
//
// Note that the C header "shellapi.h" includes "pshpack1.h", which disables automatic alignment of structure fields.
//
/** Custom alignment of structures. */
int STRUCTURE_ALIGNMENT = JavaVersion.isAmd64Architecture() ? Structure.ALIGN_DEFAULT : Structure.ALIGN_NONE;
//////////////////////////////
// SHFileOperation function //
//////////////////////////////
// Allowed wFunc values
/** Copies the files specified in the pFrom member to the location specified in the pTo member. */
int FO_MOVE = 1;
/** Copies the files specified in the pFrom member to the location specified in the pTo member. */
int FO_COPY = 2;
/** Deletes the files specified in pFrom. */
int FO_DELETE = 3;
/** Renames the file specified in pFrom. You cannot use this flag to rename multiple files with a single
* function call. Use FO_MOVE instead. */
int FO_RENAME = 4;
// Allowed fFlags values
/** Not supported. */
int FOF_MULTIDESTFILES = 1;
/** Not supported. */
int FOF_CONFIRMMOUSE = 2;
/** Do not display a progress dialog box. */
int FOF_SILENT = 4;
/** Give the file being operated on a new name in a move, copy, or rename operation if a file with the target
* name already exists. */
int FOF_RENAMEONCOLLISION = 8;
/** Respond with "Yes to All" for any dialog box that is displayed. */
int FOF_NOCONFIRMATION = 16;
/** Not supported. */
int FOF_WANTMAPPINGHANDLE = 32;
/** Preserve Undo information, if possible. If pFrom does not contain fully qualified path and file names, this
* flag is ignored. */
int FOF_ALLOWUNDO = 64;
/** Not supported. */
int FOF_FILESONLY = 128;
/** Display a progress dialog box but do not show the file names. */
int FOF_SIMPLEPROGRESS = 256;
/** Do not confirm the creation of a new directory if the operation requires one to be created. */
int FOF_NOCONFIRMMKDIR = 512;
/** Do not display a user interface if an error occurs. */
int FOF_NOERRORUI = 1024;
/** Not supported. */
int FOF_NOCOPYSECURITYATTRIBS = 2048;
/**
* This structure contains information that the SHFileOperation function uses to perform file operations.
*/
public static class SHFILEOPSTRUCT extends Structure {
/** Window handle to the dialog box to display information about the status of the file operation. */
public HANDLE hwnd;
/** Value that indicates which operation to perform. The following values are accepted:
* FO_COPY, FO_DELETE, FO_MOVE or FO_RENAME */
public int wFunc;
/** Specifies one or more source file names. These names must be fully qualified paths. Standard
* Microsoft MS-DOS wildcards, such as "*", are permitted in the file name position. Although this member
* is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file
* name must be terminated by a single NULL character. An additional NULL character must be appended to the
* end of the final name to indicate the end of pFrom. */
public String pFrom;
/** Contain the name of the destination file or directory. This parameter must be set to NULL if it is not
* used. Like pFrom, the pTo member is also a double-null terminated string and is handled in much the same
* way. */
public String pTo;
/** Flags that control the file operation (see constant fields for allowed values). */
public short fFlags;
/** Not supported. */
public boolean fAnyOperationsAborted;
/** Not supported. */
public Pointer pNameMappings;
/** String to use as the title of a progress dialog box. This member is used only if fFlags includes the
* FOF_SIMPLEPROGRESS flag. */
public String lpszProgressTitle;
/**
* Encodes <code>pFrom/pTo</code> paths, terminating them with NUL characters as required.
*
* @param paths a list of paths to encode
* @return the encoded path
*/
public String encodePaths(String[] paths) {
StringBuffer encodedPaths = new StringBuffer();
for (String path : paths) {
encodedPaths.append(path);
encodedPaths.append('\0');
}
encodedPaths.append('\0');
return encodedPaths.toString();
}
@Override
protected List getFieldOrder() {
return Arrays.asList(
"hwnd", "wFunc", "pFrom", "pTo", "fFlags", "fAnyOperationsAborted",
"pNameMappings", "lpszProgressTitle");
}
}
/**
* This function can be used to copy, move, rename, or delete a file system object.
*
* <p>Remarks: You should use fully qualified path names with this function. Using it with relative path names
* is not thread-safe.</br>
* When used to delete a file, SHFileOperation attempts to place the deleted file in the Recycle Bin. If you
* wish to delete a file and guarantee that it is not placed in the Recycle Bin, use the DeleteFile function.
* </p>
*
* @param lpFileOp a SHFILEOPSTRUCT structure that contains information this function needs to carry out the
* specified operation.
* @return Returns zero if successful, or nonzero otherwise.
*/
int SHFileOperation(SHFILEOPSTRUCT lpFileOp);
////////////////////////////////
// SHEmptyRecycleBin function //
////////////////////////////////
/** No dialog box confirming the deletion of the objects will be displayed. */
int SHERB_NOCONFIRMATION = 0x00000001;
/** No dialog box indicating the progress will be displayed. */
int SHERB_NOPROGRESSUI = 0x00000002;
/** No sound will be played when the operation is complete. */
int SHERB_NOSOUND = 0x00000004;
/**
* Empties the Recycle Bin on the specified drive.
*
* @param hwnd A handle to the parent window of any dialog boxes that might be displayed during the operation.
* This parameter can be NULL.
* @param pszRootPath a null-terminated string of maximum length MAX_PATH that contains the path of the root
* drive on which the Recycle Bin is located. This parameter can contain a string formatted with the drive,
* folder, and subfolder names, for example c:\windows\system\, etc. It can also contain an empty string or
* NULL. If this value is an empty string or NULL, all Recycle Bins on all drives will be emptied.
* @param dwFlags a bitwise combination of SHERB_NOCONFIRMATION, SHERB_NOPROGRESSUI and SHERB_NOSOUND.
* @return Returns S_OK (0) if successful, or a COM-defined error value otherwise.
*/
int SHEmptyRecycleBin(HANDLE hwnd, String pszRootPath, int dwFlags);
////////////////////////////////
// SHQueryRecycleBin function //
////////////////////////////////
/**
* Contains the size and item count information retrieved by the SHQueryRecycleBin function.
*/
public static class SHQUERYRBINFO extends Structure {
/** The size of the structure, in bytes. This member must be filled in prior to calling SHQueryRecycleBin. */
public int cbSize = 20; // 1 DWORD + 2 DWORDLONG = 4 + 2*8 = 20 bytes
/** The total size of all the objects in the specified Recycle Bin, in bytes. */
public long i64Size;
/** The total number of items in the specified Recycle Bin. */
public long i64NumItems;
@Override
protected List getFieldOrder() {
return Arrays.asList("cbSize", "i64Size", "i64NumItems");
}
}
/**
* Retrieves the size of the Recycle Bin and the number of items in it, for a specified drive.
*
* <p>Remarks: With Microsoft Windows 2000, if NULL is passed in the pszRootPath parameter, the function fails
* and returns an E_INVALIDARG error code. In earlier versions of the operating system, you can pass an empty
* string or NULL. If pszRootPath contains an empty string or NULL, information is retrieved for all
* Recycle Bins on all drives.</p>
*
* @param pszRootPath a null-terminated string of maximum length MAX_PATH to contain the path of the root drive
* on which the Recycle Bin is located. This parameter can contain a string formatted with the drive, folder,
* and subfolder names (C:\Windows\System...).
* @param pSHQueryRBInfo a SHQUERYRBINFO structure that receives the Recycle Bin information. The cbSize member
* of the structure must be set to the size of the structure before calling this API.
* @return Returns S_OK (0) if successful, or a COM-defined error value otherwise.
*/
int SHQueryRecycleBin(String pszRootPath, SHQUERYRBINFO pSHQueryRBInfo);
}