Paste: send-to-trash
        
	
	
	
		| Author:  | mrjbq7 | 
		| Mode:  | factor | 
		| Date:  | Mon, 9 Aug 2010 23:37:16 | 
	
	Plain Text |
	
	
LIBRARY: shell32
STRUCT: SHFILEOPSTRUCTW
    { hwnd HWND }
    { wFunc UINT }
    { pFrom LPCWSTR }
    { pTo LPCWSTR }
    { fFlags FILEOP_FLAGS }
    { fAnyOperationsAborted BOOL }
    { hNameMappings LPVOID }
    { lpszProgressTitle LPCWSTR } ;
FUNCTION: int SHFileOperationW (
    SHFILEOPSTRUCTW lpFileOp
) ;
CONSTANT: FO_MOVE HEX: 0001
CONSTANT: FO_COPY HEX: 0002
CONSTANT: FO_DELETE HEX: 0003
CONSTANT: FO_RENAME HEX: 0004
CONSTANT: FOF_MULTIDESTFILES HEX: 0001
CONSTANT: FOF_CONFIRMMOUSE HEX: 0002
CONSTANT: FOF_SILENT HEX: 0004
CONSTANT: FOF_RENAMEONCOLLISION HEX: 0008
CONSTANT: FOF_NOCONFIRMATION HEX: 0010
CONSTANT: FOF_WANTMAPPINGHANDLE HEX: 0020
CONSTANT: FOF_ALLOWUNDO HEX: 0040
CONSTANT: FOF_FILESONLY HEX: 0080
CONSTANT: FOF_SIMPLEPROGRESS HEX: 0100
CONSTANT: FOF_NOCONFIRMMKDIR HEX: 0200
CONSTANT: FOF_NOERRORUI HEX: 0400
CONSTANT: FOF_NOCOPYSECURITYATTRIBS HEX: 0800
CONSTANT: FOF_NORECURSION HEX: 1000
CONSTANT: FOF_NO_CONNECTED_ELEMENTS HEX: 2000
CONSTANT: FOF_WANTNUKEWARNING HEX: 4000
CONSTANT: FOF_NORECURSEREPARSE HEX: 8000
M: windows send-to-trash ( path -- )
    SHFILEOPSTRUCTW <struct>
        f >>hwnd
        FO_DELETE >>wFunc
        swap >>pFrom
        f >>pTo
        FOF_ALLOWUNDO
        FOF_NOCONFIRMATION bitor
        FOF_NOERRORUI bitor
        FOF_SILENT bitor >>flags
    SHFileOperationW win32-error=0/f ;
	
		
		
			| Author:  | mrjbq7 | 
			| Mode:  | factor | 
			| Date:  | Tue, 10 Aug 2010 03:09:59 | 
		
		Plain Text |
		
		
USING: accessors alien.c-types alien.data alien.strings
alien.syntax classes.struct destructors io.encodings.string
io.encodings.utf16n io.pathnames kernel libc math math.parser
sequences system trash windows windows.errors windows.types ;
IN: trash.windows
LIBRARY: shell32
TYPEDEF: WORD FILEOP_FLAGS
STRUCT: SHFILEOPSTRUCTW
    { hwnd HWND }
    { wFunc UINT }
    { pFrom LPCWSTR }
    { pTo LPCWSTR }
    { fFlags FILEOP_FLAGS }
    { fAnyOperationsAborted BOOL }
    { hNameMappings LPVOID }
    { lpszProgressTitle LPCWSTR } ;
FUNCTION: int SHFileOperationW (
    SHFILEOPSTRUCTW lpFileOp
) ;
CONSTANT: FO_MOVE HEX: 0001
CONSTANT: FO_COPY HEX: 0002
CONSTANT: FO_DELETE HEX: 0003
CONSTANT: FO_RENAME HEX: 0004
CONSTANT: FOF_MULTIDESTFILES HEX: 0001
CONSTANT: FOF_CONFIRMMOUSE HEX: 0002
CONSTANT: FOF_SILENT HEX: 0004
CONSTANT: FOF_RENAMEONCOLLISION HEX: 0008
CONSTANT: FOF_NOCONFIRMATION HEX: 0010
CONSTANT: FOF_WANTMAPPINGHANDLE HEX: 0020
CONSTANT: FOF_ALLOWUNDO HEX: 0040
CONSTANT: FOF_FILESONLY HEX: 0080
CONSTANT: FOF_SIMPLEPROGRESS HEX: 0100
CONSTANT: FOF_NOCONFIRMMKDIR HEX: 0200
CONSTANT: FOF_NOERRORUI HEX: 0400
CONSTANT: FOF_NOCOPYSECURITYATTRIBS HEX: 0800
CONSTANT: FOF_NORECURSION HEX: 1000
CONSTANT: FOF_NO_CONNECTED_ELEMENTS HEX: 2000
CONSTANT: FOF_WANTNUKEWARNING HEX: 4000
CONSTANT: FOF_NORECURSEREPARSE HEX: 8000
M: windows send-to-trash ( path -- )
    [
        absolute-path 
        utf16n string>alien B{ 0 0 0 0 } append
        malloc-byte-array &free
        SHFILEOPSTRUCTW <struct>
            f >>hwnd
            FO_DELETE >>wFunc
            swap >>pFrom
            f >>pTo
            FOF_ALLOWUNDO
            FOF_NOCONFIRMATION bitor
            FOF_NOERRORUI bitor
            FOF_SILENT bitor >>fFlags
        SHFileOperationW dup 0 > [
            number>string "Error: " prepend throw
        ] [ drop ] if
    ] with-destructors ;
	
		
		
			| Author:  | mrjbq7 | 
			| Mode:  | c++ | 
			| Date:  | Tue, 10 Aug 2010 22:34:30 | 
		
		Plain Text |
		
		// cl -EHsc hello.cpp
#include <iostream>
#include <windows.h>
int main( )
{
    std::cout << "Hello, World!\n";
    std::cout << "SHFILEOPSTRUCTA: " << sizeof(SHFILEOPSTRUCTA) << "\n";
    std::cout << "SHFILEOPSTRUCTW: " << sizeof(SHFILEOPSTRUCTW) << "\n";
    std::cout << "HWND: " << sizeof(HWND) << "\n";
    std::cout << "UINT: " << sizeof(UINT) << "\n";
    std::cout << "LPCTSTR: " << sizeof(LPCTSTR) << "\n";
    std::cout << "LPCWSTR: " << sizeof(LPCWSTR) << "\n";
    std::cout << "FILEOP_FLAGS: " << sizeof(FILEOP_FLAGS) << "\n";
    std::cout << "BOOL: " << sizeof(BOOL) << "\n";
    std::cout << "LPVOID: " << sizeof(LPVOID) << "\n";
    return 0;
}
	
		
		
			| Author:  | mrjbq7 | 
			| Mode:  | text | 
			| Date:  | Tue, 10 Aug 2010 22:35:37 | 
		
		Plain Text |
		
		C:\>hello
Hello, World!
SHFILEOPSTRUCTA: 30
SHFILEOPSTRUCTW: 30
HWND: 4
UINT: 4
LPCTSTR: 4
LPCWSTR: 4
FILEOP_FLAGS: 2
BOOL: 4
LPVOID: 4
	
		
		
			| Author:  | mrjbq7 | 
			| Mode:  | factor | 
			| Date:  | Tue, 10 Aug 2010 22:36:12 | 
		
		Plain Text |
		
		
( scratchpad ) SHFILEOPSTRUCTW <struct> byte-length .
32
	
	
		New Annotation