- Timestamp:
- Nov 12, 2003, 3:05:47 PM (22 years ago)
- Location:
- trunk/src/shell32
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/resources/shell32_Ca.orc
r8594 r10314 1 /* $Id: shell32_Ca.orc,v 1. 1 2002-06-08 07:26:59sandervl Exp $ */1 /* $Id: shell32_Ca.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Quant a %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "D'Acord", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin ha estat construit per:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin ha estat construit per:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Cs.orc
r8594 r10314 1 /* $Id: shell32_Cs.orc,v 1. 1 2002-06-08 07:26:59sandervl Exp $ */1 /* $Id: shell32_Cs.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_CZECH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "O aplikaci %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Da.orc
r8594 r10314 1 /* $Id: shell32_Da.orc,v 1. 1 2002-06-08 07:26:59sandervl Exp $ */1 /* $Id: shell32_Da.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_DANISH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Om %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin havde ikke været mulig uden hjælp fra disse personer:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin havde ikke været mulig uden hjælp fra disse personer:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_De.orc
r8594 r10314 1 /* $Id: shell32_De.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_De.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Info über %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin wurde entwickelt von:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin wurde entwickelt von:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 32 STRINGTABLE DISCARDABLE 33 { 34 IDS_ABOUTBOX "&About FolderPicker Test" 35 IDS_DOCUMENTFOLDERS "Dokumenten Ordner" 36 IDS_PERSONAL "Meine Dokumente" 37 IDS_FAVORITES "Meine Favoriten" 38 IDS_PATH "System Path" 39 IDS_DESKTOP "Arbeitsplatz" 40 IDS_FONTS "Fonts" 41 IDS_MYCOMPUTER "Mein Computer" 42 IDS_SYSTEMFOLDERS "System Ordner" 43 IDS_LOCALHARDRIVES "Lokal Festplatten" 44 IDS_FILENOTFOUND "Datei nicht gefunden" 45 IDS_35FLOPPY "3.5 disk" 46 IDS_525FLOPPY "5.25 disk" 47 } 48 49 STRINGTABLE DISCARDABLE 50 { 51 IDS_CREATEFOLDER_DENIED "Kann den neuen Ordner nicht anlegen: Zugriff abgelehnt." 52 IDS_CREATEFOLDER_CAPTION "Fehler beim Ordneranlegen" 53 IDS_DELETEITEM_CAPTION "Bestätige Löschen der Datei" 54 IDS_DELETEFOLDER_CAPTION "Bestätige Löschen des Ordners" 55 IDS_DELETEITEM_TEXT "Sind Sie sicher, daß Sie '%1' löschen möchten?" 56 IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?" 57 IDS_OVERWRITEFILE_TEXT "Soll Datei '%1' überschrieben werden?" 58 IDS_OVERWRITEFILE_CAPTION "Bestätigen Sie das Überschreiben der Datei" 59 IDS_COPY_X_OF_TEXT "Kopie%svon %s" 60 } 61 -
trunk/src/shell32/resources/shell32_En.orc
r8640 r10314 1 /* $Id: shell32_En.orc,v 1. 2 2002-06-11 06:30:56sandervl Exp $ */1 /* $Id: shell32_En.orc,v 1.3 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT 3 3 … … 81 81 IDS_525FLOPPY "5.25 disk" 82 82 } 83 #if 0 84 STRINGTABLE DISCARDABLE 85 { 86 IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied." 87 IDS_CREATEFOLDER_CAPTION "Error during creating a new folder" 88 IDS_DELETEITEM_CAPTION "Confirm file delete" 89 IDS_DELETEFOLDER_CAPTION "Confirm folder delete" 90 IDS_DELETEITEM_TEXT "Are you sure you want to delete '%1'?" 91 IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?" 92 #ifdef __WIN32OS2__ 93 IDS_OVERWRITEFILE_TEXT "OverWrite File %1?" 94 IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite" 95 IDS_COPY_X_OF_TEXT "Copy () of " 96 #endif 97 } 98 #endif 83 99 -
trunk/src/shell32/resources/shell32_Eo.orc
r8594 r10314 1 /* $Id: shell32_Eo.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_Eo.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */ 2 2 LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Pri %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Es.orc
r8594 r10314 1 /* $Id: shell32_Es.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_Es.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Acerca de %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin es disponible gracias a:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin es disponible gracias a:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Fi.orc
r8594 r10314 1 /* $Id: shell32_Fi.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_Fi.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Tietoja: %s" 8 FONT 10, "Järjestelmä" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin:n tekijät:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin:n tekijät:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Fr.orc
r8594 r10314 1 /* $Id: shell32_Fr.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_Fr.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "A propos de %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin est une ralisation de:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin est une ralisation de:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Hu.orc
r8594 r10314 1 /* $Id: shell32_Hu.orc,v 1. 1 2002-06-08 07:27:00sandervl Exp $ */1 /* $Id: shell32_Hu.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "A %s-rõl" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_It.orc
r8594 r10314 1 /* $Id: shell32_It.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_It.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Informazioni su %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Nl.orc
r8594 r10314 1 /* $Id: shell32_Nl.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_Nl.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Info %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin is geschreven door:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin is geschreven door:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_No.orc
r8594 r10314 1 /* $Id: shell32_No.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_No.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_NORWEGIAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Om %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Pl.orc
r8594 r10314 1 /* $Id: shell32_Pl.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_Pl.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */ 2 2 LANGUAGE LANG_POLISH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "O %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin was brought to you by:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Pt.orc
r8594 r10314 1 /* $Id: shell32_Pt.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_Pt.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */ 2 2 LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Sobre %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin foi disponibilizado por:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin foi disponibilizado por:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 16 32 -
trunk/src/shell32/resources/shell32_Ru.orc
r8594 r10314 1 /* $Id: shell32_Ru.orc,v 1. 1 2002-06-08 07:27:01sandervl Exp $ */1 /* $Id: shell32_Ru.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */ 2 2 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Î %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Ðàçðàáîò÷èêè Odin :", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Ðàçðàáîò÷èêè Odin :", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Sv.orc
r8594 r10314 1 /* $Id: shell32_Sv.orc,v 1. 1 2002-06-08 07:27:02sandervl Exp $ */1 /* $Id: shell32_Sv.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */ 2 2 LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT 3 3 4 #if 1 5 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 6 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 7 CAPTION "Om %s" 8 FONT 10, "System" 9 { 10 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 11 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 12 ICON "", 1088, 189, 50, 14, 16 13 LTEXT "", 100, 8, 50, 137, 33 14 LTEXT "Odin hade inte varit möjligt utan dessa personer:", 98, 8, 75, 90, 10 15 LTEXT "", 2002, 100, 75, 90, 10 16 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 17 } 18 #else 4 19 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 5 20 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 13 28 LTEXT "Odin hade inte varit möjligt utan dessa personer:", 98, 8, 55, 137, 10 14 29 } 30 #endif 15 31 -
trunk/src/shell32/resources/shell32_Wa.orc
r8594 r10314 1 /* $Id: shell32_Wa.orc,v 1. 1 2002-06-08 07:27:02sandervl Exp $ */1 /* $Id: shell32_Wa.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */ 2 2 LANGUAGE LANG_WALON, SUBLANG_DEFAULT 3 3 … … 7 7 */ 8 8 9 #if 1 10 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170 11 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 12 CAPTION "Å dfait di %s" 13 FONT 10, "System" 14 { 15 DEFPUSHBUTTON "OK", IDOK, 156, 147, 50, 12, WS_TABSTOP 16 LISTBOX 99, 8, 85, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER 17 ICON "", 1088, 189, 50, 14, 16 18 LTEXT "", 100, 8, 50, 137, 33 19 LTEXT "Odin a estu fwait par:", 98, 8, 75, 90, 10 20 LTEXT "", 2002, 100, 75, 90, 10 21 CONTROL "",2001,"Static",SS_BITMAP,8,2,148,26 22 } 23 #else 9 24 SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 10 25 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU … … 18 33 LTEXT "Odin a estu fwait par:", 98, 8, 55, 137, 10 19 34 } 35 #endif 20 36 -
trunk/src/shell32/sh.cpp
r8586 r10314 1 /* $Id: sh.cpp,v 1.1 5 2002-06-07 08:21:43 sandervl Exp $ */1 /* $Id: sh.cpp,v 1.16 2003-11-12 14:05:13 sandervl Exp $ */ 2 2 3 3 /* … … 132 132 133 133 /***************************************************************************** 134 * Name : DWORD SHFreeNameMappings135 * Purpose :136 * Parameters:137 * Variables :138 * Result :139 * Remark : SHELL32.246140 * Status : UNTESTED STUB UNKNOWN141 *142 * Author : Patrick Haller [Tue, 1998/06/15 03:00]143 *****************************************************************************/144 145 DWORD WIN32API SHFreeNameMappings(DWORD x1)146 {147 dprintf(("SHELL32: SHFreeNameMappings not implemented.\n"));148 149 return 0;150 }151 152 153 /*****************************************************************************154 134 * Name : DWORD SHGetNewLinkInfo 155 135 * Purpose : -
trunk/src/shell32/shlfileop.c
r10162 r10314 4 4 * Copyright 2000 Juergen Schmied 5 5 * Copyright 2002 Andriy Palamarchuk 6 * Copyright 2002 Dietrich Teickner (from Odin)7 * Copyright 2002 Rolf Kalbermatter6 * Copyright 2002-2003 Dietrich Teickner (from Odin) 7 * Copyright 2002-2003 Rolf Kalbermatter 8 8 * 9 9 * This library is free software; you can redistribute it and/or … … 22 22 * 23 23 * !!! shlfileop.c is shared source between wine and odin, do not remove 24 * #ifdef __ win32os2__ .. lines24 * #ifdef __WIN32OS2__ .. lines 25 25 */ 26 26 … … 28 28 #include "wine/port.h" 29 29 30 #include <stdarg.h> 30 31 #include <string.h> 31 32 #include <ctype.h> 32 33 34 #include "windef.h" 35 #include "winbase.h" 33 36 #include "winreg.h" 34 37 #include "shellapi.h" 38 #include "wingdi.h" 39 #include "winuser.h" 35 40 #include "shlobj.h" 36 41 #include "shresdef.h" … … 44 49 WINE_DEFAULT_DEBUG_CHANNEL(shell); 45 50 46 #define W98_FO_FUNCTION /* makes shlfileop W98-like */ 47 #undef W98_FO_FUNCTION /* makes shlfileop W2K-like */ 48 #define W98_FO_FUNCTION /* makes shlfileop W98-like */ 49 50 #define IsAttribFile(x) (!(x & FILE_ATTRIBUTE_DIRECTORY)) 51 #define IsAttribDir(x) (!(x == -1) && (x & FILE_ATTRIBUTE_DIRECTORY)) 51 #define IsAttribFile(x) (!((x) & FILE_ATTRIBUTE_DIRECTORY)) 52 #define IsAttrib(x,y) ((INVALID_FILE_ATTRIBUTES != (x)) && ((x) & (y))) 53 #define IsAttribDir(x) IsAttrib(x,FILE_ATTRIBUTE_DIRECTORY) 52 54 53 55 #define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) … … 57 59 #define HIGH_ADR (LPWSTR)0xffffffff 58 60 59 CHAR aWildcardFile[] = {'*','.','*',0}; 61 #define FOI_NeverOverwrite 2 62 63 CHAR aWildcardFile[] = {'*',0}; 60 64 WCHAR wWildcardChars[] = {'?','*',0}; 61 65 #define wWildcardFile &wWildcardChars[1] 62 66 WCHAR wBackslash[] = {'\\',0}; 63 64 static BOOL SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec); 65 static BOOL SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec); 66 static BOOL SHNotifyRemoveDirectoryA(LPCSTR path); 67 static BOOL SHNotifyRemoveDirectoryW(LPCWSTR path); 68 static BOOL SHNotifyDeleteFileA(LPCSTR path); 69 static BOOL SHNotifyDeleteFileW(LPCWSTR path); 70 static BOOL SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest); 71 static BOOL SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bRenameIfExists); 67 enum { none = 0, w95, w95b, nt351, nt40, w98, w98se, wMe, w2k, wXp}; 68 static int WOsVers = none; /* for versionsdepended conditions */ 69 static int retCodeIsInvalid = 0x75; /* w95?,w98se, nt <= 4? */ 70 static LPCSTR cFO_String [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"}; 71 72 static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec); 73 static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec); 74 static DWORD SHNotifyRemoveDirectoryA(LPCSTR path); 75 static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path); 76 static DWORD SHNotifyDeleteFileA(LPCSTR path); 77 static DWORD SHNotifyDeleteFileW(LPCWSTR path); 78 static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest); 79 static DWORD SHNotifyCopyFileW(LPCWSTR, LPCWSTR, BOOL); 72 80 73 81 typedef struct … … 166 174 ret = SHELL_DeleteDirectoryA(szTemp, FALSE); 167 175 else 168 ret = SHNotifyDeleteFileA(szTemp);176 ret = (SHNotifyDeleteFileA(szTemp) == ERROR_SUCCESS); 169 177 } while (ret && FindNextFileA(hFind, &wfd)); 170 178 } 171 179 FindClose(hFind); 172 180 if (ret) 173 ret = SHNotifyRemoveDirectoryA(pszDir);181 ret = (SHNotifyRemoveDirectoryA(pszDir) == ERROR_SUCCESS); 174 182 return ret; 175 183 } … … 189 197 190 198 if (!bShowUI || SHELL_ConfirmDialogW(ASK_DELETE_FOLDER, pszDir)) 199 191 200 { 192 201 do … … 201 210 ret = SHELL_DeleteDirectoryW(szTemp, FALSE); 202 211 else 203 ret = SHNotifyDeleteFileW(szTemp);212 ret = (SHNotifyDeleteFileW(szTemp) == ERROR_SUCCESS); 204 213 } while (ret && FindNextFileW(hFind, &wfd)); 205 214 } 206 215 FindClose(hFind); 207 216 if (ret) 208 ret = SHNotifyRemoveDirectoryW(pszDir);217 ret = (SHNotifyRemoveDirectoryW(pszDir) == ERROR_SUCCESS); 209 218 return ret; 210 219 } … … 218 227 return FALSE; 219 228 220 return SHNotifyDeleteFileA(pszFile);229 return (SHNotifyDeleteFileA(pszFile) == ERROR_SUCCESS); 221 230 } 222 231 … … 226 235 return FALSE; 227 236 228 return SHNotifyDeleteFileW(pszFile);237 return (SHNotifyDeleteFileW(pszFile) == ERROR_SUCCESS); 229 238 } 230 239 … … 244 253 * This is Unicode on NT/2000 245 254 */ 246 static BOOLSHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec)247 { 248 BOOL ret;255 static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec) 256 { 257 WCHAR wPath[MAX_PATH]; 249 258 TRACE("(%s, %p)\n", debugstr_a(path), sec); 250 259 251 ret = CreateDirectoryA(path, sec); 252 if (ret) 253 { 254 SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHA, path, NULL); 255 } 256 return ret; 257 } 258 259 static BOOL SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec) 260 { 261 BOOL ret; 260 MultiByteToWideChar(CP_ACP, 0, path, -1, wPath, MAX_PATH); 261 return SHNotifyCreateDirectoryW(wPath, sec); 262 } 263 264 static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec) 265 { 262 266 TRACE("(%s, %p)\n", debugstr_w(path), sec); 263 267 264 ret = CreateDirectoryW(path, sec); 265 if (ret) 268 if (StrPBrkW(path, wWildcardChars)) 269 { 270 /* FIXME: This test is necessary since our CreateDirectory implementation 271 does create directories with wildcard chars without objection. Once this 272 is fixed, this can go away. */ 273 SetLastError(ERROR_INVALID_NAME); 274 if (w98se >= WOsVers) /* wMe ? */ 275 return ERROR_FILE_NOT_FOUND; /* w98se */ 276 return ERROR_INVALID_NAME; /* w2k */ 277 } 278 279 if (CreateDirectoryW(path, sec)) 266 280 { 267 281 SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHW, path, NULL); 268 } 269 return ret; 282 return ERROR_SUCCESS; 283 } 284 return GetLastError(); 270 285 } 271 286 … … 273 288 { 274 289 if (SHELL_OsIsUnicode()) 275 return SHNotifyCreateDirectoryW(path, sec);276 return SHNotifyCreateDirectoryA(path, sec);290 return (SHNotifyCreateDirectoryW(path, sec) == ERROR_SUCCESS); 291 return (SHNotifyCreateDirectoryA(path, sec) == ERROR_SUCCESS); 277 292 } 278 293 … … 286 301 * 287 302 * RETURNS 288 * TRUE if successful, FALSE otherwise303 * ERROR_SUCCESS if successful 289 304 * 290 305 * NOTES: … … 292 307 * This is Unicode on NT/2000 293 308 */ 294 static BOOL SHNotifyRemoveDirectoryA(LPCSTR path) 295 { 296 BOOL ret; 309 310 static DWORD SHNotifyRemoveDirectoryA(LPCSTR path) 311 { 312 WCHAR wPath[MAX_PATH]; 297 313 TRACE("(%s)\n", debugstr_a(path)); 298 314 299 ret = RemoveDirectoryA(path); 300 if (!ret) 301 { 302 /* Directory may be write protected */ 303 DWORD dwAttr = GetFileAttributesA(path); 304 if (dwAttr != -1 && dwAttr & FILE_ATTRIBUTE_READONLY) 305 if (SetFileAttributesA(path, dwAttr & ~FILE_ATTRIBUTE_READONLY)) 306 ret = RemoveDirectoryA(path); 307 } 308 if (ret) 309 SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHA, path, NULL); 310 return ret; 311 } 312 313 static BOOL SHNotifyRemoveDirectoryW(LPCWSTR path) 315 MultiByteToWideChar(CP_ACP, 0, path, -1, wPath, MAX_PATH); 316 return SHNotifyRemoveDirectoryW(wPath); 317 } 318 319 /***********************************************************************/ 320 321 static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path) 314 322 { 315 323 BOOL ret; … … 321 329 /* Directory may be write protected */ 322 330 DWORD dwAttr = GetFileAttributesW(path); 323 if ( dwAttr != -1 && dwAttr & FILE_ATTRIBUTE_READONLY)331 if (IsAttrib(dwAttr,FILE_ATTRIBUTE_READONLY)) 324 332 if (SetFileAttributesW(path, dwAttr & ~FILE_ATTRIBUTE_READONLY)) 325 333 ret = RemoveDirectoryW(path); 326 334 } 327 335 if (ret) 336 { 328 337 SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW, path, NULL); 329 return ret; 330 } 338 return ERROR_SUCCESS; 339 } 340 return GetLastError(); 341 } 342 343 /***********************************************************************/ 331 344 332 345 BOOL WINAPI Win32RemoveDirectoryAW(LPCVOID path) 333 346 { 334 347 if (SHELL_OsIsUnicode()) 335 return SHNotifyRemoveDirectoryW(path);336 return SHNotifyRemoveDirectoryA(path);348 return (SHNotifyRemoveDirectoryW(path) == ERROR_SUCCESS); 349 return (SHNotifyRemoveDirectoryA(path) == ERROR_SUCCESS); 337 350 } 338 351 … … 352 365 * This is Unicode on NT/2000 353 366 */ 354 static BOOL SHNotifyDeleteFileA(LPCSTR path) 355 { 356 BOOL ret; 357 367 368 static DWORD SHNotifyDeleteFileA(LPCSTR path) 369 { 370 WCHAR wPath[MAX_PATH]; 358 371 TRACE("(%s)\n", debugstr_a(path)); 359 372 360 ret = DeleteFileA(path); 361 if (!ret) 362 { 363 /* File may be write protected or a system file */ 364 DWORD dwAttr = GetFileAttributesA(path); 365 if ((dwAttr != -1) && (dwAttr & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) 366 if (SetFileAttributesA(path, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) 367 ret = DeleteFileA(path); 368 } 369 if (ret) 370 SHChangeNotify(SHCNE_DELETE, SHCNF_PATHA, path, NULL); 371 return ret; 372 } 373 374 static BOOL SHNotifyDeleteFileW(LPCWSTR path) 373 MultiByteToWideChar(CP_ACP, 0, path, -1, wPath, MAX_PATH); 374 return SHNotifyDeleteFileW(wPath); 375 } 376 377 /***********************************************************************/ 378 379 static DWORD SHNotifyDeleteFileW(LPCWSTR path) 375 380 { 376 381 BOOL ret; … … 383 388 /* File may be write protected or a system file */ 384 389 DWORD dwAttr = GetFileAttributesW(path); 385 if ( (dwAttr != -1) && (dwAttr & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)))390 if (IsAttrib(dwAttr,FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) 386 391 if (SetFileAttributesW(path, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) 387 392 ret = DeleteFileW(path); 388 393 } 389 394 if (ret) 395 { 390 396 SHChangeNotify(SHCNE_DELETE, SHCNF_PATHW, path, NULL); 391 return ret; 392 } 397 return ERROR_SUCCESS; 398 } 399 return GetLastError(); 400 } 401 402 /***********************************************************************/ 393 403 394 404 DWORD WINAPI Win32DeleteFileAW(LPCVOID path) 395 405 { 396 406 if (SHELL_OsIsUnicode()) 397 return SHNotifyDeleteFileW(path);398 return SHNotifyDeleteFileA(path);407 return (SHNotifyDeleteFileW(path) == ERROR_SUCCESS); 408 return (SHNotifyDeleteFileA(path) == ERROR_SUCCESS); 399 409 } 400 410 … … 409 419 * 410 420 * RETURNS 411 * TRUE if successful, FALSEotherwise412 */ 413 static BOOLSHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest)414 { 415 BOOL ret ;421 * NO_ERROR if successful, or an error code otherwise 422 */ 423 static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) 424 { 425 BOOL ret = FALSE; 416 426 417 427 TRACE("(%s %s)\n", debugstr_w(src), debugstr_w(dest)); 428 429 if (StrPBrkW(dest, wWildcardChars)) 430 { 431 /* FIXME: This test is currently necessary since our MoveFile 432 implementation does create files with wildcard characters 433 without objection!! Once this is fixed, this here can go away. */ 434 SetLastError(ERROR_INVALID_NAME); 435 if (w98se >= WOsVers) /* wMe ? */ 436 return ERROR_FILE_NOT_FOUND; /* w98se */ 437 return ERROR_INVALID_NAME; /* w2k,wXp */ 438 } 418 439 419 440 ret = MoveFileW(src, dest); … … 422 443 /* Source file may be write protected or a system file */ 423 444 DWORD dwAttr = GetFileAttributesW(src); 424 if ( (dwAttr != -1) && (dwAttr & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)))445 if (IsAttrib(dwAttr,FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) 425 446 if (SetFileAttributesW(src, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) 426 447 ret = MoveFileW(src, dest); 427 448 } 428 449 if (ret) 450 { 429 451 SHChangeNotify(SHCNE_RENAMEITEM, SHCNF_PATHW, src, dest); 430 return ret; 452 return ERROR_SUCCESS; 453 } 454 return GetLastError(); 431 455 } 432 456 … … 439 463 * src [I] path to source file to move 440 464 * dest [I] path to target file to move to 441 * b Rename [I] if TRUE, the target file will be renamedif a465 * b_nOverWrt [I] if TRUE, the target file will not be overwritten, if a 442 466 * file with this name already exists 443 467 * 444 468 * RETURNS 445 * TRUE if successful, FALSEotherwise446 */ 447 static BOOL SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bRename)469 * NO_ERROR if successful, or an error code otherwise 470 */ 471 static DWORD SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL b_nOverWrt) 448 472 { 449 473 BOOL ret; 450 474 451 TRACE("(%s %s %s)\n", debugstr_w(src), debugstr_w(dest), bRename ? "renameIfExists" : ""); 452 453 ret = CopyFileW(src, dest, TRUE); 454 if (!ret && bRename) 455 { 456 /* Destination file probably exists */ 457 DWORD dwAttr = GetFileAttributesW(dest); 458 if (dwAttr != -1) 459 { 460 FIXME("Rename on copy to existing file not implemented!"); 461 } 462 } 475 TRACE("(%s %s %s)\n", debugstr_w(src), debugstr_w(dest), b_nOverWrt ? "OverWriteIfExists" : ""); 476 477 ret = CopyFileW(src, dest, b_nOverWrt); 463 478 if (ret) 479 { 464 480 SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, dest, NULL); 465 return ret; 466 } 481 return ERROR_SUCCESS; 482 } 483 return GetLastError(); 484 } 485 467 486 468 487 /************************************************************************* … … 478 497 * ERRROR_SUCCESS or one of the following values: 479 498 * ERROR_BAD_PATHNAME if the path is relative 480 * ERROR_ FILE_EXISTS when a file with that name exists499 * ERROR_INVLID_NAME if the path contains invalid chars 481 500 * ERROR_ALREADY_EXISTS when the directory already exists 482 501 * ERROR_FILENAME_EXCED_RANGE if the filename was to long to process … … 506 525 * RETURNS 507 526 * ERRROR_SUCCESS or one of the following values: 508 * ERROR_BAD_PATHNAME if the path is relative 509 * ERROR_FILE_EXISTS when a file with that name exists 527 * ERROR_BAD_PATHNAME or ERROR_PATH_NOT_FOUND if the path is relative 528 * ERROR_INVLID_NAME if the path contains invalid chars 529 * ? ERROR_FILE_EXISTS when a file with that name exists 510 530 * ERROR_ALREADY_EXISTS when the directory already exists 511 531 * ERROR_FILENAME_EXCED_RANGE if the filename was to long to process … … 521 541 522 542 /************************************************************************* 523 * SHTryFind [intern] 524 * Try for existing names 525 */ 526 DWORD SHTryFindW(LPCWSTR pName) 527 { 528 WCHAR szName [MAX_PATH + 4]; 529 DWORD retCode = ERROR_FILE_NOT_FOUND; 543 * SHCreateDirectoryExW [SHELL32.@] 544 */ 545 DWORD WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec) 546 { 547 DWORD ret = ERROR_BAD_PATHNAME; 548 TRACE("(%p, %s, %p)\n",hWnd, debugstr_w(path), sec); 549 550 if (PathIsRelativeW(path)) 551 { 552 SetLastError(ret); 553 } 554 else 555 { 556 ret = SHNotifyCreateDirectoryW(path, sec); 557 if (ret && ret != ERROR_FILE_EXISTS && 558 ret != ERROR_ALREADY_EXISTS && 559 ret != ERROR_FILENAME_EXCED_RANGE) 560 { 561 /* handling network file names? 562 lstrcpynW(pathName, path, MAX_PATH); 563 lpStr = PathAddBackslashW(pathName);*/ 564 FIXME("Semi-stub, creating path %s, failed with error %ld?\n", debugstr_w(path), ret); 565 } 566 } 567 return ret; 568 } 569 570 /************************************************************************* 571 * SHFreeNameMappings [shell32.246] 572 * 573 * Free the mapping handle returned by SHFileoperation if FOF_WANTSMAPPINGHANDLE 574 * was specified. 575 * 576 * PARAMS 577 * hNameMapping [I] handle to the name mappings used during renaming of files 578 * 579 */ 580 void WINAPI SHFreeNameMappings(HANDLE hNameMapping) 581 { 582 if (hNameMapping) 583 { 584 LPSHNAMEMAPPINGW lp; 585 UINT i = 0; 586 587 while (NULL != (lp = DSA_GetItemPtr((struct _DSA* const)hNameMapping, i++))) 588 { 589 SHFree(lp->pszOldPath); 590 SHFree(lp->pszNewPath); 591 } 592 DSA_Destroy((struct _DSA*)hNameMapping); 593 } 594 } 595 596 static BOOL SetIfPointer(LPWSTR pToSlash, WCHAR x) 597 { 598 if (pToSlash) *pToSlash = x; 599 return (BOOL)pToSlash; 600 } 601 /************************************************************************* 602 * SHFindAttrW [internal] 603 * 604 * Get the Attributes for a file or directory. The difference to GetAttributes() 605 * is that this function will also work for paths containing wildcard characters 606 * in its filename. 607 608 * PARAMS 609 * path [I] path of directory or file to check 610 * fileOnly [I] TRUE if only files should be found 611 * 612 * RETURNS 613 * INVALID_FILE_ATTRIBUTES if the path does not exist, the actual attributes of 614 * the first file or directory found otherwise 615 */ 616 static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly) 617 { 530 618 WIN32_FIND_DATAW wfd; 531 HANDLE hFind; 532 LPCWSTR pFileName = StrRChrW(pName,NULL,'\\'); 533 if ((!pFileName) || \ 534 /* we must isolate the part befor '\' */ 535 (lstrcpynW(&szName[0],pName,(pFileName-pName)), 536 NULL != StrPBrkW(&szName[0], wWildcardChars))) 537 { 538 return ERROR_INVALID_NAME; 539 } 540 hFind = FindFirstFileW(pName, &wfd); 619 BOOL b_FileMask = fileOnly && (NULL != StrPBrkW(pName, wWildcardChars)); 620 DWORD dwAttr = INVALID_FILE_ATTRIBUTES; 621 HANDLE hFind = FindFirstFileW(pName, &wfd); 622 623 TRACE("%s %d\n", debugstr_w(pName), fileOnly); 541 624 if (INVALID_HANDLE_VALUE != hFind) 542 625 { 626 do 627 { 628 if (b_FileMask && IsAttribDir(wfd.dwFileAttributes)) 629 continue; 630 dwAttr = wfd.dwFileAttributes; 631 break; 632 } 633 while (FindNextFileW(hFind, &wfd)); 543 634 FindClose(hFind); 544 retCode = ERROR_ALREADY_EXISTS; 545 } 546 return retCode; 547 } 548 /************************************************************************* 549 * SHCreateDirectoryExW [SHELL32.@] 550 */ 551 DWORD WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES sec) 552 { 553 DWORD ret = SHTryFindW(path); 554 TRACE("(%p, %s, %p)\n",hWnd, debugstr_w(path), sec); 555 556 if (ERROR_FILE_NOT_FOUND == ret) 557 { 558 ret = ERROR_SUCCESS; 559 if (PathIsRelativeW(path)) 560 { 561 ret = ERROR_BAD_PATHNAME; 562 } 563 } 564 SetLastError(ret); 565 if (ERROR_SUCCESS == ret) 566 { 567 if (!SHNotifyCreateDirectoryW(path, sec)) 568 { 569 ret = GetLastError(); 570 if (ret != ERROR_FILE_EXISTS && 571 ret != ERROR_ALREADY_EXISTS && 572 ret != ERROR_FILENAME_EXCED_RANGE) 573 { 574 /* handling network file names? 575 lstrcpynW(pathName, path, MAX_PATH); 576 lpStr = PathAddBackslashW(pathName);*/ 577 FIXME("Semi-stub, non zero hWnd should be used somehow?"); 578 } 579 } 580 } 581 return ret; 635 } 636 return dwAttr; 582 637 } 583 638 … … 587 642 * 588 643 */ 589 BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End)644 static BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End) 590 645 { 591 646 WCHAR C1 = '\0'; 592 647 WCHAR C2 = '\0'; 593 int i_Temp = -1;648 int i_Temp = 0 - (toupperW(p1[0]) == toupperW(p2[0])); 594 649 int i_len1 = lstrlenW(p1); 595 650 int i_len2 = lstrlenW(p2); 596 651 652 if (!i_Temp) return FALSE; /* driveletters are different */ 597 653 if (p1End && (&p1[i_len1] >= p1End) && ('\\' == p1End[0])) 598 654 { … … 634 690 * 635 691 */ 636 LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr)692 static LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr) 637 693 { 638 694 LPWSTR pToFile = NULL; … … 645 701 { 646 702 i_len = lstrlenW(pTo); 647 if ((i_len) && ( pTo[--i_len] != '\\'))703 if ((i_len) && ('\\' != pTo[--i_len])) 648 704 i_len++; 649 705 pTo[i_len] = '\\'; 650 if ( pCatStr[0] == '\\')706 if ('\\' == pCatStr[0]) 651 707 pCatStr++; \ 652 708 lstrcpyW(&pTo[i_len+1], pCatStr); 653 709 } 654 710 pToFile = StrRChrW(pTo,NULL,'\\'); 655 /* !!termination of the new string-group */711 /* termination of the new string-group */ 656 712 pTo[(lstrlenW(pTo)) + 1] = '\0'; 657 713 } … … 665 721 * files in both lists is the same, and checks also if source-name exists. 666 722 */ 667 BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc)723 static BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc) 668 724 { 669 725 LPWSTR pszTemp; 726 727 TRACE("%s %s %d\n", debugstr_w(pszFiles1), debugstr_w(pszFiles2), bOnlySrc); 728 670 729 while ((pszFiles1[0] != '\0') && 671 730 (bOnlySrc || (pszFiles2[0] != '\0'))) … … 678 737 if (pszTemp) 679 738 { 680 WCHAR szMask [MAX_PATH + 4]; 681 strncpyW(&szMask[0],pszFiles1,(pszTemp - pszFiles1)); 682 pszTemp = StrRChrW(&szMask[0],NULL,'\\'); 739 WCHAR szMask [MAX_PATH]; 740 pszTemp = StrRChrW(pszFiles1, pszTemp, '\\'); 683 741 if (!pszTemp) 684 742 return FALSE; 685 pszTemp[0] = '\0';686 743 lstrcpynW(szMask, pszFiles1, (pszTemp - pszFiles1) + 1); 744 /* we will check the root of the mask as valid dir */ 687 745 if (!IsAttribDir(GetFileAttributesW(&szMask[0]))) 688 746 return FALSE; … … 690 748 else 691 749 { 692 if ( -1== GetFileAttributesW(pszFiles1))750 if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(pszFiles1)) 693 751 return FALSE; 694 752 } … … 701 759 702 760 /************************************************************************* 703 *704 * SHName(s)Translate HelperFunction for SHFileOperationW705 *706 * Translates a list of 0 terminated ASCI strings into Unicode. If *wString707 * is NULL, only the necessary size of the string is determined and returned,708 * otherwise the ASCII strings are copied into it and the buffer is increased709 * to point to the location after the final 0 termination char.710 */711 DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more)712 {713 DWORD size = 0, aSize = 0;714 LPCSTR aString = (LPCSTR)*pWToFrom;715 716 if (aString)717 {718 do719 {720 size = lstrlenA(aString) + 1;721 aSize += size;722 aString += size;723 } while ((size != 1) && more);724 /* The two sizes might be different in the case of multibyte chars */725 size = MultiByteToWideChar(CP_ACP, 0, aString, aSize, *wString, 0);726 if (*wString) /* only in the second loop */727 {728 MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*pWToFrom, aSize, *wString, size);729 *pWToFrom = *wString;730 *wString += size;731 }732 }733 return size;734 }735 /*************************************************************************736 * SHFileOperationA [SHELL32.@]737 *738 * Function to copy, move, delete and create one or more files with optional739 * user prompts.740 *741 * PARAMS742 * lpFileOp [I/O] pointer to a structure containing all the necessary information743 *744 * NOTES745 * exported by name746 */747 DWORD WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp)748 {749 SHFILEOPSTRUCTW nFileOp = *((LPSHFILEOPSTRUCTW)lpFileOp);750 DWORD retCode = 0, size;751 LPWSTR ForFree = NULL, /* we change wString in SHNameTranslate and can't use it for freeing */752 wString = NULL; /* we change this in SHNameTranslate */753 754 #ifdef __WIN32OS2__755 TRACE("SHFileOperationA");756 #else757 TRACE("\n");758 #endif759 if (FO_DELETE == (nFileOp.wFunc & FO_MASK))760 nFileOp.pTo = NULL; /* we need a NULL or a valid pointer for translation */761 if (!(nFileOp.fFlags & FOF_SIMPLEPROGRESS))762 nFileOp.lpszProgressTitle = NULL; /* we need a NULL or a valid pointer for translation */763 while (1) /* every loop calculate size, second translate also, if we have storage for this */764 {765 size = SHNameTranslate(&wString, &nFileOp.lpszProgressTitle, FALSE); /* no loop */766 size += SHNameTranslate(&wString, &nFileOp.pFrom, TRUE); /* internal loop */767 size += SHNameTranslate(&wString, &nFileOp.pTo, TRUE); /* internal loop */768 769 if (ForFree)770 {771 retCode = SHFileOperationW(&nFileOp);772 HeapFree(GetProcessHeap(), 0, ForFree); /* we can not use wString, it was changed */773 lpFileOp->hNameMappings = nFileOp.hNameMappings;774 lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted;775 return retCode;776 }777 else778 {779 wString = ForFree = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));780 if (ForFree) continue;781 retCode = ERROR_OUTOFMEMORY;782 SetLastError(retCode);783 return retCode;784 }785 }786 }787 /*************************************************************************788 761 * SHFileOperationCheck 789 762 */ 790 DWORD SHFileOperationCheck(LPSHFILEOPSTRUCTW lpFileOp, LPCSTR* cFO_Name)763 static DWORD SHFileOperationCheck(LPSHFILEOPSTRUCTW lpFileOp, LPCSTR* cFO_Name) 791 764 { 792 765 FILEOP_FLAGS OFl = (FILEOP_FLAGS)lpFileOp->fFlags; 793 LPCSTR cFO_Temp [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"};794 766 long retCode = NO_ERROR; 795 767 long FuncSwitch = (lpFileOp->wFunc & FO_MASK); 796 768 797 769 /* default no error */ 798 770 if (none == WOsVers) { 771 OSVERSIONINFOA info; 772 info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); 773 GetVersionExA(&info); 774 WOsVers = wMe; /* <= wMe, tested with w98se and partialy nt4,w95 */ 775 /* this cases must be more different */ 776 if ((VER_PLATFORM_WIN32_WINDOWS == info.dwPlatformId) && 777 (4 == info.dwMajorVersion) && (10 == info.dwMinorVersion)) { 778 WOsVers = w98se; 779 retCodeIsInvalid = 0x75; /* <= W98se, what is with wMe? */ 780 } 781 if (VER_PLATFORM_WIN32_NT == info.dwPlatformId) 782 { 783 if (4 > info.dwMajorVersion) 784 { 785 WOsVers = nt351; 786 retCodeIsInvalid = 0x75; 787 } 788 if (4 == info.dwMajorVersion) 789 { 790 WOsVers = nt40; 791 retCodeIsInvalid = 0x75; 792 } 793 if (5 == info.dwMajorVersion) 794 { 795 WOsVers = w2k; 796 if (0 < info.dwMinorVersion) 797 WOsVers = wXp; /* Longhorn also ? */ 798 retCodeIsInvalid = 0x4c7; /* >= W2K */ 799 } 800 if (5 < info.dwMajorVersion) 801 { 802 WOsVers = wXp; /* Longhorn ? */ 803 retCodeIsInvalid = 0x4c7; /* >= W2K */ 804 } 805 } 806 TRACE("WOsVers:%d Id: %ld Ver: %ld.%ld.%ld, %s\n\n", WOsVers, info.dwPlatformId, 807 info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.szCSDVersion); 808 } 799 809 if ((FuncSwitch < FO_MOVE) || (FuncSwitch > FO_RENAME)) 800 810 { … … 802 812 retCode = ERROR_INVALID_PARAMETER; 803 813 } 804 cFO_Name[0] = cFO_ Temp[FuncSwitch];814 cFO_Name[0] = cFO_String [FuncSwitch]; 805 815 806 816 if (!(~FO_MASK & lpFileOp->wFunc)) /* ? Level == 0 */ 807 { 817 { 818 lpFileOp->hNameMappings = 0; 808 819 lpFileOp->fAnyOperationsAborted = FALSE; 809 820 TRACE("%s: flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s%s \n",cFO_Name[0], OFl, … … 821 832 OFl & FOF_NOCOPYSECURITYATTRIBS ? "FOF_NOCOPYSECURITYATTRIBS" : "", 822 833 OFl & 0xf000 ? "MORE-UNKNOWN-Flags" : ""); 823 OFl &= (~(FOF_MULTIDESTFILES | FOF_NOCONFIRMATION | FOF_FILESONLY)); /* implemented */ 834 OFl &= (~(FOF_FILESONLY | FOF_WANTMAPPINGHANDLE | FOF_NOCONFIRMATION | 835 FOF_RENAMEONCOLLISION | FOF_MULTIDESTFILES)); /* implemented */ 824 836 OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */ 825 837 OFl &= (~FOF_SIMPLEPROGRESS); /* ignored, only with FOF_SILENT */ 826 838 if (OFl) 827 839 { 828 if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION |840 if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | 829 841 FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS))) 830 842 { … … 840 852 return retCode; 841 853 } 854 855 /************************************************************************* 856 * 857 * SHCreateMappingElement internal HelperFunction for SHRenameOnCollision 858 * 859 * Old/New MappingNameElement 860 */ 861 static LPWSTR SHCreateMappingElement(PINT size, LPWSTR pName) 862 { 863 LPWSTR pMapName = NULL; 864 CHAR TempPath [MAX_PATH]; 865 int isize = lstrlenW(pName)+1; 866 int oldsize = isize; 867 if ((w98se >= WOsVers) && (nt40 != WOsVers) && (nt351 != WOsVers)) 868 { 869 isize = WideCharToMultiByte( CP_ACP, 0, pName, oldsize, TempPath, MAX_PATH, NULL, NULL ); 870 if (0 < isize) 871 pName = (LPWSTR)&TempPath[0]; 872 } 873 else 874 { 875 oldsize = oldsize*sizeof(WCHAR); 876 } 877 pMapName = SHAlloc(oldsize); 878 memcpy(pMapName,pName,oldsize); 879 *size = isize-1; 880 return pMapName; 881 } 882 883 /************************************************************************* 884 * 885 * SHRenameOnCollision internal HelperFunction for SHFileOperationW 886 * 887 * Creates new Names and Checks for existance. 888 * 889 * w98 has problems with some remames on collision, if the original target-name, 890 * or the root of the target-name is equal any former orginal target-name, 891 * and if the root-dir of the target differs from the partiell root-dir of the source. 892 * If we have different target-names or has all target the same root of hear source, 893 * we have the problem not, root of target can be shorter as the full root of source. 894 * I think, that is a mapping-problem. 895 * Move within the same or shorter root can made from fo_rename, 896 * that works every in w98, only move/copy in other roots has this problem, 897 * this must be done in fo_move/fo_copy, there we have the problem. 898 * we ignore this problem, it is solved in w2k. 899 */ 900 static WCHAR wStrFormat[] = {' ','(','%','d',')',' ',0}; 901 902 static DWORD SHRenameOnCollision(LPWSTR pTempTo, LPWSTR pToFile, LPCWSTR pFromFile, LPSHFILEOPSTRUCTW lpFileOp) 903 { 904 /* todo ERROR_FILENAME_EXCED_RANGE ?? */ 905 static WCHAR wCopy_x_of[40] = {0}; 906 LPWSTR pszTemp = wStrFormat + 5; 907 DWORD ToAttr; 908 WCHAR szNumber[16]; 909 WCHAR szOldToName [MAX_PATH]; 910 int number = 0; 911 912 while (ToAttr = SHFindAttrW(pTempTo, FALSE), 913 (INVALID_FILE_ATTRIBUTES != ToAttr) && (FOF_RENAMEONCOLLISION & lpFileOp->fFlags)) 914 { 915 if (!number) 916 { 917 if (!*wCopy_x_of && !LoadStringW(shell32_hInstance, IDS_COPY_X_OF_TEXT, wCopy_x_of, sizeof(wCopy_x_of)-1)) 918 break; /* should never be */ 919 lstrcpyW(szOldToName, pTempTo); 920 } 921 number++; 922 if (1 < number) 923 { 924 pszTemp = szNumber; 925 wsprintfW(szNumber, wStrFormat, number); 926 } 927 wsprintfW(pToFile + 1,wCopy_x_of, pszTemp, pFromFile + 1); 928 pToFile[lstrlenW(pToFile)+1] = 0; 929 930 } /* endwhile */ 931 if (number) 932 { 933 SHNAMEMAPPINGW shm; 934 shm.pszOldPath = SHCreateMappingElement(&shm.cchOldPath, szOldToName); 935 shm.pszNewPath = SHCreateMappingElement(&shm.cchNewPath, pTempTo); 936 if (!lpFileOp->hNameMappings) 937 lpFileOp->hNameMappings = DSA_Create(sizeof(SHNAMEMAPPINGW),1); 938 DSA_InsertItem (lpFileOp->hNameMappings, ((HDSA)lpFileOp->hNameMappings)->nItemCount, &shm); 939 } 940 return ToAttr; 941 } 842 942 /************************************************************************* 843 943 * … … 849 949 * also FO_RENAME does not contains FO_MOVE, only common Parts. 850 950 */ 851 DWORD SHFileOperationMove(LPSHFILEOPSTRUCTW lpFileOp) 852 { 853 DWORD retCode; 951 static DWORD SHFileOperationMove(LPSHFILEOPSTRUCTW lpFileOp) 952 { 854 953 WCHAR szToName [MAX_PATH + 4]; 855 LPWSTR pToFile; 856 if (NULL != StrPBrkW(lpFileOp->pTo, wWildcardChars)) 857 { 858 #ifdef W98_FO_FUNCTION /* W98 */ 859 return ERROR_FILE_NOT_FOUND; 860 #else 861 return ERROR_INVALID_NAME; 862 #endif 863 } 864 retCode = SHTryFindW(lpFileOp->pTo); 954 LPCWSTR pTo = lpFileOp->pTo; 955 int i_lenTo; 956 if (NULL != StrPBrkW(pTo, wWildcardChars)) 957 { 958 if (w98se >= WOsVers) /* wMe? */ 959 return ERROR_FILE_NOT_FOUND; /* w98se */ 960 return ERROR_INVALID_NAME; /* w2k */ 961 } 962 865 963 /* FOF_NOCONFIRMATION, FOF_RENAMEONCOLLISION ? */ 866 if (retCode != ERROR_FILE_NOT_FOUND) 867 { 868 return retCode; 869 } 870 lstrcpyW(&szToName[0],lpFileOp->pTo); 871 pToFile = StrRChrW(&szToName[0],NULL,'\\'); 872 if (!pToFile[1]) 873 { 874 pToFile[0] = '\0'; 875 } 876 /* we use SHNotifyMoveFile() instead MoveFileW */ 877 if (!SHNotifyMoveFileW(lpFileOp->pFrom, &szToName[0])) 878 { 879 /* we need still the value for the returncode */ 880 return GetLastError(); 881 } 882 return ERROR_SUCCESS; 964 i_lenTo = lstrlenW(pTo); 965 if (i_lenTo && ('\\' == pTo[--i_lenTo])) 966 { 967 lstrcpynW(szToName, pTo, i_lenTo + 1); 968 pTo = &szToName[0]; 969 } 970 if (INVALID_FILE_ATTRIBUTES != SHFindAttrW(pTo, FALSE)) 971 { 972 return ERROR_ALREADY_EXISTS; 973 } 974 /* we use SHNotifyMoveFile() instead of MoveFileW */ 975 return SHNotifyMoveFileW(lpFileOp->pFrom, pTo); 883 976 } 884 977 /************************************************************************* … … 895 988 LPCWSTR pFrom = pNextFrom; 896 989 LPCWSTR pTo = NULL; 897 #ifdef __WIN32OS2__898 #ifdef DEBUG899 #define _SHFO_DEBUGSTR_900 #ifdef _SHFO_DEBUGSTR_901 CHAR Debug_pFrom [MAX_PATH + 4];902 CHAR Debug_pTo [MAX_PATH + 4];903 #endif904 #endif905 #endif906 990 HANDLE hFind = INVALID_HANDLE_VALUE; 907 991 WIN32_FIND_DATAW wfd; … … 915 999 DWORD ToPathAttr; 916 1000 DWORD FromAttr; 917 DWORD FromPathAttr;918 1001 919 BOOL b_Multi = (nFileOp.fFlags & FOF_MULTIDESTFILES); 920 921 BOOL b_MultiTo = (FO_DELETE != (lpFileOp->wFunc & FO_MASK)); 922 BOOL b_MultiPaired = FALSE; 1002 long FuncSwitch = (nFileOp.wFunc & FO_MASK); 1003 long level= nFileOp.wFunc>>FO_LevelShift; 1004 1005 BOOL b_Multi = (0 != (nFileOp.fFlags & FOF_MULTIDESTFILES)); 1006 1007 BOOL b_MultiTo = (FO_DELETE != FuncSwitch); 1008 BOOL b_MultiPaired = (0 < level) /* FALSE only at Level 0 */; 923 1009 BOOL b_MultiFrom = FALSE; 924 BOOL not_overwrite; 925 BOOL ask_overwrite; 1010 BOOL b_RenamOnColl = (0 != (nFileOp.fFlags & FOF_RENAMEONCOLLISION)); 1011 BOOL b_NoConfirm = (0 != (nFileOp.fFlags & FOF_NOCONFIRMATION)); 1012 BOOL b_ask_overwrite = (!b_NoConfirm && !b_RenamOnColl); 1013 BOOL b_not_overwrite = (!b_NoConfirm || b_RenamOnColl); 1014 BOOL b_DELETE = (FO_DELETE == FuncSwitch); 926 1015 BOOL b_SameRoot; 927 1016 BOOL b_SameRoot_MOVE; 928 1017 BOOL b_ToMask = FALSE; 929 1018 BOOL b_FromMask; 930 931 long FuncSwitch = (nFileOp.wFunc & FO_MASK); 932 long level= nFileOp.wFunc>>FO_LevelShift; 1019 BOOL b_FileMask; 933 1020 934 1021 LPCSTR cFO_Name; … … 937 1024 if (retCode) 938 1025 { 939 #ifdef W98_FO_FUNCTION /* W98 returns NO_ERROR */ 940 if ('?' == cFO_Name[3]) 941 retCode = NO_ERROR; 942 #endif 1026 if (('?' == cFO_Name[3]) && (/* wMe ?*/ w98se >= WOsVers)) 1027 retCode = NO_ERROR; /* nt4.0, w95, w98se returns no error, w2k, wXp not */ 943 1028 goto shfileop_exit; /* no valid FunctionCode */ 944 1029 } … … 972 1057 if ((pNextFrom) && (!(b_MultiTo) || (pNextTo))) 973 1058 { 974 nFileOp.pFrom = pTempFrom = HeapAlloc(GetProcessHeap(), 0,((1 + 2 * (b_MultiTo)) * MAX_PATH + 6) * sizeof(WCHAR));1059 nFileOp.pFrom = pTempFrom = SHAlloc(((1 + 2 * (b_MultiTo)) * MAX_PATH + 6) * sizeof(WCHAR)); 975 1060 if (!pTempFrom) 976 1061 { … … 982 1067 pTempTo = &pTempFrom[MAX_PATH + 4]; 983 1068 nFileOp.pTo = pTempTo; 984 ask_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) && !(nFileOp.fFlags & FOF_RENAMEONCOLLISION)); 985 not_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) || (nFileOp.fFlags & FOF_RENAMEONCOLLISION)); 1069 if (0 == level) 1070 { 1071 if ((0 != (nFileOp.fFlags & FOF_NOCONFIRMATION)) && b_RenamOnColl) 1072 nFileOp.fAnyOperationsAborted |= FOI_NeverOverwrite; 1073 } 986 1074 } 987 1075 else 988 1076 { 989 retCode = 0x402; /* 1026 */ 1077 retCode = 0x402; /* 1026 */ 990 1078 goto shfileop_exit; 991 1079 } … … 1000 1088 pTo = pNextTo; 1001 1089 pNextTo = &pNextTo[lstrlenW(pTo)+1]; 1002 b_MultiTo = (b_Multi && pNextTo[0]);1090 b_MultiTo = (b_Multi && (0 != pNextTo[0])); 1003 1091 } 1004 1092 1005 1093 pFrom = pNextFrom; 1006 #ifdef _SHFO_DEBUGSTR_ 1007 /* for seeing in debugger outside from TRACE */ 1008 strcpy(&Debug_pFrom[0],debugstr_w(pFrom)); 1009 strcpy(&Debug_pTo[0],debugstr_w(pTo)); 1010 TRACE("%s level=%ld with %s %s%s\n", 1011 cFO_Name, level, &Debug_pFrom[0], pTo ? "-> ":"", &Debug_pTo[0]); 1012 #endif 1013 pNextFrom = &pNextFrom[lstrlenW(pNextFrom)+1]; 1094 pNextFrom = &pNextFrom[lstrlenW(pNextFrom) + 1]; 1014 1095 if (!b_MultiFrom && !b_MultiTo) 1015 b_MultiFrom = ( pNextFrom[0]);1096 b_MultiFrom = (0 != pNextFrom[0]); 1016 1097 1017 1098 pFromFile = SHFileStrCpyCatW(pTempFrom, pFrom, NULL); … … 1028 1109 if (b_MultiTo || b_MultiFrom || (b_FromMask && !b_ToMask)) 1029 1110 { 1030 #define retCodeIsInvalid 0x075 /* W98 */ 1031 #ifndef W98_FO_FUNCTION /* is W2K */ 1032 #undef retCodeIsInvalid 1033 #define retCodeIsInvalid 0x4c7 /* W2K */ 1034 retCode = 0x1f; /* value 31 in W2K, W98 no work, only RC=0 */ 1035 #endif 1111 if (/* wMe? */ w2k <= WOsVers) 1112 retCode = ERROR_GEN_FAILURE; /* W2K ERROR_GEN_FAILURE, w95,W98,NT40 returns no error */ 1036 1113 goto shfileop_exit; 1037 1114 } … … 1042 1119 b_MultiPaired = 1043 1120 SHELL_FileNamesMatch(lpFileOp->pFrom, 1044 lpFileOp->pTo, ( (FO_DELETE == FuncSwitch)|| !b_Multi || b_MultiFrom));1121 lpFileOp->pTo, (b_DELETE || !b_Multi || b_MultiFrom)); 1045 1122 } /* endif */ 1046 1123 if (!(b_MultiPaired) || !(pFromFile) || !(pFromFile[1]) || ((pTo) && !(pToFile))) 1047 1124 { 1048 retCode = 0x402; /* 1026 */ 1125 if (nt40 < WOsVers) 1126 retCode = 0x402; /* 1026, nt40 returns 0 */ 1049 1127 goto shfileop_exit; 1050 1128 } 1051 1129 1052 if (FO_DELETE == FuncSwitch) 1130 b_FileMask = b_FromMask && (FOF_FILESONLY & nFileOp.fFlags); 1131 if (!b_DELETE) 1132 { 1133 b_SameRoot = (toupperW(pTempFrom[0]) == toupperW(pTempTo[0])); 1134 b_SameRoot_MOVE = (b_SameRoot && (FO_MOVE == FuncSwitch)); 1135 } 1136 FromAttr = SHFindAttrW(pTempFrom, b_FileMask); 1137 if (INVALID_FILE_ATTRIBUTES == FromAttr) 1138 { 1139 retCode = GetLastError(); 1140 if (ERROR_FILE_NOT_FOUND == retCode || ERROR_NO_MORE_FILES == retCode) /* only tested in wXp,w2k,w98 */ 1141 { 1142 if (b_FromMask) 1143 { 1144 retCode = NO_ERROR; 1145 } 1146 else 1147 if (!b_SameRoot_MOVE && !b_DELETE) 1148 goto shfileop_IsInvalid; 1149 } 1150 continue; 1151 } /* endif */ 1152 1153 if (b_DELETE) 1053 1154 { 1054 1155 hFind = FindFirstFileW(pFrom, &wfd); 1055 1156 if (INVALID_HANDLE_VALUE == hFind) 1056 /* no problem for FO_DELETE */ 1057 continue; 1157 { 1158 goto shfileop_IsInvalid; 1159 } 1058 1160 do 1059 1161 { … … 1062 1164 lpFileName = wfd.cFileName; 1063 1165 if (IsDotDir(lpFileName) || 1064 ( (b_FromMask) && IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY)))1166 (b_FileMask && IsAttribDir(wfd.dwFileAttributes))) 1065 1167 continue; 1066 1168 SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); … … 1068 1170 if (IsAttribFile(wfd.dwFileAttributes)) 1069 1171 { 1070 if ( !SHNotifyDeleteFileW(pTempFrom))1172 if (SHNotifyDeleteFileW(pTempFrom)) 1071 1173 retCode = 0x78; /* value unknown */ 1072 1174 } … … 1085 1187 { 1086 1188 pToFile[0] = '\0'; 1087 lpFileName = StrRChrW(pTempTo, NULL,'\\');1189 lpFileName = StrRChrW(pTempTo, NULL, '\\'); 1088 1190 if (lpFileName) 1089 1191 { … … 1093 1195 } 1094 1196 ToPathAttr = ToAttr = GetFileAttributesW(pTempTo); 1095 FromAttr = GetFileAttributesW(pTempFrom); 1096 b_SameRoot = (toupperW(pTempFrom[0]) == toupperW(pTempTo[0])); 1097 b_SameRoot_MOVE = (b_SameRoot && (FO_MOVE == FuncSwitch)); 1098 if ((pToFile) && !IsAttribDir(ToAttr)) 1099 { 1100 pToFile[0] = '\0'; 1197 if (!IsAttribDir(ToAttr) && SetIfPointer(pToFile, '\0')) 1198 { 1101 1199 ToPathAttr = GetFileAttributesW(pTempTo); 1102 pToFile[0]= '\\';1200 *pToFile = '\\'; 1103 1201 } 1104 if (pToTailSlash) 1105 { 1106 pToTailSlash[0] = '\\'; 1107 } 1108 if (!b_FromMask && b_SameRoot && \ 1109 SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL)) 1110 { /* target is the same as source ? W98 has 0x71, W2K also */ 1111 retCode = 0x71; /* is no error with FOF_RENAMEONCOLLISION */ 1112 goto shfileop_exit; 1113 } /* endif */ 1202 SetIfPointer(pToTailSlash,'\\'); 1203 1114 1204 /* FO_RENAME is not only a Filter for FO_MOVE */ 1115 1205 if (FO_RENAME == FuncSwitch) 1116 1206 { 1117 if (b_FromMask || !b_SameRoot || \ 1207 if (!(b_FromMask) && (b_SameRoot) && SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL)) 1208 { 1209 if (!b_RenamOnColl) /* neu */ 1210 /* target is the same as source ? W98 has 0x71, W2K also */ 1211 retCode = 0x71; 1212 goto shfileop_exit; 1213 } /* endif */ 1214 if ((nt40 == WOsVers) && (b_FromMask)) 1215 { 1216 retCode = 0x72; /* only found in nt40, not w98se or w2k */ 1217 goto shfileop_exit; 1218 } /* endif */ 1219 if ((b_FromMask && !b_ToMask) || !b_SameRoot || \ 1118 1220 !SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL) || \ 1119 1221 SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, HIGH_ADR)) … … 1122 1224 goto shfileop_exit; 1123 1225 } 1124 #ifdef W98_FO_FUNCTION /* not in W2K, later in SHFileOperationMove */ 1125 if (!pToTailSlash && IsAttribDir(ToAttr)) 1226 if (!(b_ToMask) && !(pToTailSlash) && IsAttribDir(ToAttr)) 1126 1227 { 1127 retCode = ERROR_INVALID_NAME; /* FOF_NOCONFIRMATION, FOF_RENAMEONCOLLISION ? */ 1228 if (IsAttribDir(FromAttr)) 1229 ToAttr = SHRenameOnCollision(pTempTo, pToFile, pFromFile, &nFileOp); 1230 if ((w98se >= WOsVers) && IsAttribDir(ToAttr /* can be changed from SHRenameOnCollision */)) 1231 { 1232 /* never in W2K */ 1233 retCode = ERROR_INVALID_NAME; /* FOF_NOCONFIRMATION ? */ 1234 goto shfileop_exit; 1235 } 1236 } /* endif */ 1237 if ((INVALID_FILE_ATTRIBUTES != ToPathAttr) || (b_ToMask && (w98se >= WOsVers))) 1238 /* w2k only (INVALID_FILE_ATTRIBUTES != ToPathAttr) */ 1239 { 1240 retCode = SHFileOperationMove(&nFileOp); 1241 } 1242 else 1243 /* W98 returns 0x75, W2K 0x4c7 */ 1244 retCode = retCodeIsInvalid; 1245 goto shfileop_exit; 1246 } /* FO_RENAME ends, only FO_MOVE or FO_COPY valid from here */ 1247 1248 if (b_FromMask) 1249 { 1250 /* FO_COPY/FO_MOVE with mask, FO_DELETE are solved long before */ 1251 hFind = FindFirstFileW(pFrom, &wfd); 1252 if (INVALID_HANDLE_VALUE == hFind) 1253 { 1254 /* the retcode for this case is unknown */ 1255 goto shfileop_IsInvalid; 1256 } 1257 SetIfPointer(pToTailSlash, '\0'); 1258 ToAttr = SHFindAttrW(pTempTo, FALSE); 1259 if (b_ToMask && !b_Multi) 1260 nFileOp.fFlags &= ~FOF_RENAMEONCOLLISION; 1261 nFileOp.fFlags &= ~FOF_MULTIDESTFILES; 1262 pToFile = SHFileStrCpyCatW(pTempTo, NULL, wBackslash); 1263 do 1264 { 1265 lpFileName = wfd.cAlternateFileName; 1266 if (!lpFileName[0]) 1267 lpFileName = wfd.cFileName; 1268 if (IsDotDir(lpFileName) || 1269 (b_FileMask && IsAttribDir(wfd.dwFileAttributes))) 1270 continue; /* next name in pTempFrom(dir) */ 1271 if (INVALID_FILE_ATTRIBUTES == ToAttr) 1272 { 1273 if (b_MultiTo) 1274 { 1275 retCode = retCodeIsInvalid; 1276 break; /* we need the FindClose */ 1277 } 1278 if (b_ToMask) 1279 { 1280 if ((w2k <= WOsVers) && IsAttribDir(wfd.dwFileAttributes)) /* w2k,wXp is tested */ 1281 { 1282 if (w2k == WOsVers) 1283 retCode = ERROR_ALREADY_EXISTS; /* no root for target exist, and w2k send this, kind of mad */ 1284 else 1285 retCode = ERROR_INVALID_NAME; /* wXp */ 1286 nFileOp.fAnyOperationsAborted |= TRUE; 1287 break; 1288 } 1289 } 1290 else 1291 { 1292 nFileOp.fFlags |= FOF_MULTIDESTFILES; 1293 SHFileStrCpyCatW(&pToFile[1], lpFileName, NULL); 1294 } 1295 } 1296 SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); 1297 retCode = SHFileOperationW (&nFileOp); 1298 } while(!retCode && FindNextFileW(hFind, &wfd)); 1299 FindClose(hFind); 1300 if (retCodeIsInvalid == retCode) 1301 goto shfileop_IsInvalid; 1302 continue; 1303 } 1304 1305 if ((INVALID_FILE_ATTRIBUTES != (FromAttr | ToAttr)) && b_RenamOnColl && !(b_ToMask) && !(pToTailSlash)) 1306 { 1307 if (b_SameRoot_MOVE && !(b_Multi) && IsAttribDir(FromAttr & ToAttr) && SHFileStrICmpW(pTempFrom, pTempTo, HIGH_ADR, HIGH_ADR)) 1308 { 1309 retCode = ERROR_FILENAME_EXCED_RANGE; /* in w98/w2k recursive move, we does this not */ 1310 if (w98se >= WOsVers) retCode |= 0x10000; /* unexpected, seen in w98se and nt40sp6 */ 1128 1311 goto shfileop_exit; 1129 1312 } 1130 if (-1 != ToPathAttr || b_ToMask) 1131 #else 1132 if (-1 != ToPathAttr) 1133 #endif 1313 if ( /* i-means indifferent */ 1314 // /*bad*/ ( b_SameRoot_MOVE && !(b_Multi) && !(b_MultiFrom) && IsAttribDir(ToAttr) && !(SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL))) 1315 // /*bad*/ ( b_SameRoot_MOVE && !(b_Multi) && (b_MultiFrom) && IsAttribDir(ToAttr) && !(SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL))) 1316 /*ok*/ ( b_SameRoot_MOVE && (b_Multi) && !(b_MultiFrom) && IsAttribDir(ToAttr) && !(SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL))) 1317 // /*bad*/|| ( b_SameRoot_MOVE && (b_Multi) && (b_MultiFrom) && IsAttribDir(ToAttr) && !(SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL))) 1318 // 1319 // /*bad*/|| (!b_SameRoot_MOVE && !(b_Multi) && !(b_MultiFrom) && IsAttribDir(ToAttr) && IsAttribDir(FromAttr)) 1320 // /*i*/ || (!b_SameRoot_MOVE && !(b_Multi) && (b_MultiFrom) && IsAttribDir(ToAttr) && IsAttribDir(FromAttr)) 1321 /*ok*/ || (!b_SameRoot_MOVE && (b_Multi) && !(b_MultiFrom) && IsAttribDir(ToAttr) && IsAttribDir(FromAttr)) 1322 // /*i*/ || (!b_SameRoot_MOVE && (b_Multi) && (b_MultiFrom) && IsAttribDir(ToAttr) && IsAttribDir(FromAttr)) 1323 // 1324 /*ok*/ || ( b_SameRoot_MOVE && IsAttribFile(FromAttr | ToAttr) && !(SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL))) 1325 // 1326 /*ok*/ || (!b_SameRoot_MOVE && IsAttribFile(FromAttr | ToAttr)) 1327 /*ok*/ || ((FO_COPY == FuncSwitch) && IsAttribDir(FromAttr) && IsAttribFile(ToAttr)) 1328 ) 1134 1329 { 1135 retCode = SHFileOperationMove(&nFileOp); 1136 goto shfileop_exit; 1137 } 1330 ToAttr = SHRenameOnCollision(pTempTo, pToFile, pFromFile, &nFileOp); 1331 } /* endif */ 1332 } /* endif */ 1333 if ((b_SameRoot) && !(b_MultiFrom) && (!b_RenamOnColl || b_SameRoot_MOVE) 1334 && SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL)) 1335 { 1336 if (!b_RenamOnColl && (IsAttribFile(FromAttr))) /* neu */ 1337 /* target is the same as source ? W98 has 0x71, W2K also */ 1338 retCode = 0x71; 1339 goto shfileop_exit; 1340 } /* endif */ 1341 1342 /* Analycing for moving SourceName to as TargetName */ 1343 if ((b_MultiFrom || !b_Multi) && ( 1344 (IsAttribFile(FromAttr) && IsAttribDir(ToAttr)) 1345 || (!b_MultiTo && IsAttribDir(ToAttr)) 1346 || (!b_MultiTo && IsAttribDir(FromAttr) && b_MultiFrom && !b_SameRoot_MOVE) 1347 )) 1348 { 1349 SHFileStrCpyCatW(pTempTo, NULL, pFromFile); 1350 /* without FOF_MULTIDESTFILES shlfileop will create dir's recursive */ 1351 nFileOp.fFlags |= FOF_MULTIDESTFILES; 1352 retCode = SHFileOperationW(&nFileOp); 1353 continue; 1138 1354 } 1139 else \ 1140 if (!b_FromMask) 1141 { 1142 if (IsAttribDir(ToPathAttr)) 1355 /* What can we do with one pair and FO_MOVE/FO_COPY ? */ 1356 /* w98se, nt40 can create recursive dirs, W2K not! wMe ist not tested */ 1357 if (IsAttribDir(ToPathAttr) || !b_SameRoot_MOVE || (w98se >= WOsVers)) 1358 if (!b_MultiFrom) 1359 { 1360 if (IsAttribFile(FromAttr)) 1143 1361 { 1144 /* Analycing for moving SourceName to as TargetName */ 1145 if (!b_MultiTo && IsAttribDir(ToAttr) && (b_MultiFrom || !b_Multi)) 1362 if (b_SameRoot_MOVE && 1363 /* IsAttribDir(ToPathAttr) && !pToTailSlash && (bug) */ 1364 /* windows-bug, MOVE for File also with pToTailSlash, COPY not for this */ 1365 (!(IsAttribFile(ToAttr)) || (!(b_ask_overwrite) && b_not_overwrite)) && 1366 (IsAttribDir(ToPathAttr) || b_ToMask)) 1146 1367 { 1147 SHFileStrCpyCatW(pTempTo, NULL, pFromFile);1148 /* without FOF_MULTIDESTFILES shlfileop will create dir's recursive */1149 nFileOp.fFlags |= FOF_MULTIDESTFILES;1150 retCode = SHFileOperationW(&nFileOp);1368 /* At the same drive, we can move for FO_MOVE, dir to dir is solved later */ 1369 retCode = SHFileOperationMove(&nFileOp); 1370 if ((nt40 == WOsVers) && (ERROR_ALREADY_EXISTS == retCode)) 1371 retCode = 0x10005; 1151 1372 continue; 1152 } 1153 } 1154 /* What can we do with one pair and FO_MOVE/FO_COPY ? */ 1155 #ifndef W98_FO_FUNCTION /* W2K */ 1156 if (!b_SameRoot_MOVE || IsAttribDir(ToPathAttr)) 1157 #endif 1158 if (!b_MultiFrom) 1159 // if ((!b_MultiFrom) && (!b_SameRoot_MOVE || IsAttribDir(ToPathAttr) || b_ToMask)) 1160 1161 { 1162 if (IsAttribFile(FromAttr)) 1373 } /* endif */ 1374 if (IsAttribDir(ToPathAttr) && !pToTailSlash && !IsAttribDir(ToAttr)) 1163 1375 { 1164 if (b_SameRoot_MOVE \ 1165 /* IsAttribDir(ToPathAttr) && !pToTailSlash && (bug) */ 1166 /* windos-bug, MOVE for File also with pToTailSlash, COPY not for this */ 1167 // && IsAttribDir(ToPathAttr)) 1168 && (IsAttribDir(ToPathAttr) || b_ToMask)) 1376 if (!(FOI_NeverOverwrite & nFileOp.fAnyOperationsAborted)) 1169 1377 { 1170 /* At the same drive, we can move for FO_MOVE, dir to dir was solved later */ 1171 retCode = SHFileOperationMove(&nFileOp); 1172 continue; 1378 if (!b_not_overwrite) 1379 ToAttr = INVALID_FILE_ATTRIBUTES; 1380 if (IsAttribFile(ToAttr) && b_not_overwrite) 1381 { 1382 if (b_ask_overwrite) 1383 { 1384 /* we must change the dialog in the future for return 3-4 cases, 1385 * 'Yes','No','Yes for all','Never ?' */ 1386 if ((INVALID_FILE_ATTRIBUTES != ToAttr) && !SHELL_ConfirmDialogW(ASK_OVERWRITE_FILE, pTempTo)) 1387 { 1388 retCode = 0x10008; 1389 nFileOp.fAnyOperationsAborted |= TRUE; 1390 continue; 1391 } 1392 ToAttr = INVALID_FILE_ATTRIBUTES; 1393 } /* endif */ 1394 } /* endif */ 1173 1395 } /* endif */ 1174 if (I sAttribDir(ToPathAttr) && !pToTailSlash && !IsAttribDir(ToAttr))1396 if (INVALID_FILE_ATTRIBUTES == ToAttr) 1175 1397 { 1176 if ( IsAttribFile(ToAttr) && not_overwrite)1398 if (SHNotifyCopyFileW(pTempFrom, pTempTo, nFileOp.fFlags & FOF_RENAMEONCOLLISION)) 1177 1399 { 1178 /* Rename on Collision ? */ 1179 if (!ask_overwrite) 1180 { 1181 /* the retcode for this case is unknown */ 1182 retCode = 0x10008; 1183 goto shfileop_exit; 1184 } 1185 /* we must change the dialog in the future for return 3-4 cases, 1186 * 'Yes','No','Yes for all','Never ?' */ 1187 if (!SHELL_ConfirmDialogW(ASK_OVERWRITE_FILE, pTempTo)) 1188 { 1189 nFileOp.fAnyOperationsAborted = TRUE; 1190 continue; 1191 } 1192 } 1193 if (!(SHNotifyCopyFileW(pTempFrom, pTempTo, nFileOp.fFlags & FOF_RENAMEONCOLLISION))) 1194 { 1195 /* the retcode for this case is unknown */ 1400 /* the retcode for this case is unknown */ 1196 1401 retCode = 0x10009; 1197 1402 } … … 1203 1408 } 1204 1409 } 1205 if (IsAttribDir(FromAttr)) 1410 } 1411 if (IsAttribDir(FromAttr)) 1412 { 1413 if (INVALID_FILE_ATTRIBUTES == ToAttr) 1206 1414 { 1207 #ifdef W98_FO_FUNCTION /* not in W2K, -> retCode = retCodeIsInvalid */ 1208 if ( (-1 == ToAttr) && (!b_SameRoot_MOVE || IsAttribDir(ToPathAttr) || b_ToMask))1415 SetIfPointer(pToTailSlash, '\0'); 1416 if (w2k <= WOsVers) /* if w2k,wxp not in w98se, nt40sp6 */ 1209 1417 { 1210 if (-1 == ToPathAttr) 1418 ToAttr = SHRenameOnCollision(pTempTo, pToFile, pFromFile, &nFileOp); 1419 if (INVALID_FILE_ATTRIBUTES != ToAttr) 1211 1420 { 1212 pToFile[0] = '\0'; 1213 retCode = SHCreateDirectoryExW(NULL,pTempTo, NULL); 1214 ToPathAttr = GetFileAttributesW(pTempTo); 1215 pToFile[0] = '\\'; 1216 if (retCode) 1217 goto shfileop_exit; 1218 } 1219 #else 1220 if (-1 == ToAttr) 1221 { 1222 #endif 1223 if (IsAttribDir(ToPathAttr)) 1224 { 1225 if (pToTailSlash) 1226 pToTailSlash[0] = '\0'; 1227 retCode = SHCreateDirectoryExW(NULL,pTempTo, NULL); 1228 ToAttr = GetFileAttributesW(pTempTo); /* for continuing */ 1229 if (pToTailSlash) 1230 pToTailSlash[0] = '\\'; 1231 #ifndef W98_FO_FUNCTION /* W2k */ 1232 if (retCode) 1233 goto shfileop_exit; 1234 #endif 1235 } 1236 if (-1 == ToAttr) 1237 { 1238 retCode = 0x10003; 1421 if (w2k == WOsVers) 1422 retCode = ERROR_ALREADY_EXISTS; /* w2k */ 1423 else 1424 retCode = ERROR_INVALID_NAME; /* wXp */ 1425 nFileOp.fAnyOperationsAborted |= TRUE; 1239 1426 goto shfileop_exit; 1240 1427 } 1428 lpFileName = &pToFile[lstrlenW(pToFile)]; 1429 if (pToTailSlash) 1430 { 1431 pToTailSlash = lpFileName; 1432 lpFileName++; 1433 } 1434 ((DWORD*)lpFileName)[0] = '\0'; 1435 retCode = SHCreateDirectoryExW(NULL,pTempTo, NULL); 1241 1436 } 1242 if (IsAttribDir(ToAttr)) 1437 else 1438 { /* only for < w2k, tested with w98se,nt40sp6 */ 1439 if (IsAttribDir(ToPathAttr) || !b_SameRoot_MOVE || b_ToMask) 1440 { /* tested with w98se, partially nt40sp6, w2k(wXp). only w98se,nt40sp6 can loop */ 1441 lpFileName = NULL; 1442 while ((lpFileName = StrRChrW(pTempTo,lpFileName, '\\'), 1443 INVALID_FILE_ATTRIBUTES == ToAttr) && 1444 (':' != lpFileName[-1])) /* not begin with root, or end with root */ 1445 { 1446 SetIfPointer(lpFileName, '\0'); 1447 ToAttr = GetFileAttributesW(pTempTo); /* for continuing */ 1448 SetIfPointer(lpFileName--, '\\'); 1449 } 1450 while (lpFileName && lpFileName[1] && !retCode) 1451 { 1452 SetIfPointer(lpFileName,'\\'); 1453 lpFileName = StrChrW(++lpFileName,'\\'); 1454 SetIfPointer(lpFileName,'\0'); 1455 retCode = SHCreateDirectoryExW(NULL,pTempTo, NULL); 1456 } 1457 } 1458 } 1459 if (retCode) 1243 1460 { 1244 /* both are existing dirs, we (FO_)MOVE/COPY the contence */ 1245 pToFile = SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); 1246 nFileOp.fFlags &= ~FOF_MULTIDESTFILES; 1247 retCode = SHFileOperationW(&nFileOp); 1248 if ((FO_COPY == FuncSwitch) || retCode) 1249 continue; 1250 ((DWORD*)pToFile)[0] = '\0'; 1251 nFileOp.wFunc = ((level+1) << FO_LevelShift) + FO_DELETE; 1252 retCode = SHFileOperationW(&nFileOp); 1461 retCode = (ERROR_PATH_NOT_FOUND | 0x10000); /* nt40,w98se,w2k,wxp */ 1462 goto shfileop_exit; 1463 } 1464 ToAttr = GetFileAttributesW(pTempTo); 1465 SetIfPointer(pToTailSlash,'\\'); 1466 nFileOp.fFlags &= ~FOF_RENAMEONCOLLISION; 1467 } 1468 if (IsAttribDir(ToAttr)) 1469 { 1470 /* both are existing dirs, we (FO_)MOVE/COPY the content */ 1471 pToFile = SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); 1472 nFileOp.fFlags &= ~FOF_MULTIDESTFILES; 1473 retCode = SHFileOperationW(&nFileOp); 1474 if ((FO_COPY == FuncSwitch) || retCode) 1253 1475 continue; 1254 } 1476 ((DWORD*)pToFile)[0] = '\0'; 1477 nFileOp.wFunc = ((level+1) << FO_LevelShift) + FO_DELETE; 1478 retCode = SHFileOperationW(&nFileOp); 1479 continue; 1255 1480 } 1256 } /* end-!b_MultiFrom */1257 }1258 1259 #ifdef W98_FO_FUNCTION /* not in W2K, -> retCode = retCodeIsInvalid */1260 if (b_FromMask && \1261 /* we do not know, why (b_SameRoot_MOVE && b_ToMask && (-1 != ToPathAttr)) */1262 (IsAttribDir(ToAttr) || (b_SameRoot_MOVE && b_ToMask)))1263 #else1264 if (b_FromMask && (-1 != ToPathAttr) && \1265 /* we do not know, why (b_SameRoot_MOVE && b_ToMask && (-1 != ToPathAttr)) */1266 (IsAttribDir(ToAttr) || (b_SameRoot_MOVE && b_ToMask)))1267 #endif1268 {1269 /* FO_COPY/FO_MOVE with mask, FO_DELETE are solved lang before */1270 hFind = FindFirstFileW(pFrom, &wfd);1271 if (INVALID_HANDLE_VALUE == hFind)1272 {1273 /* the retcode for this case is unknown */1274 retCode = 0x10007;1275 goto shfileop_exit;1276 1481 } 1277 nFileOp.fFlags &= ~FOF_MULTIDESTFILES; 1278 pToFile = SHFileStrCpyCatW(pTempTo, NULL, wBackslash); 1279 do 1280 { 1281 lpFileName = wfd.cAlternateFileName; 1282 if (!lpFileName[0]) 1283 lpFileName = wfd.cFileName; 1284 if (IsDotDir(lpFileName) || 1285 (IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY))) 1286 continue; /* next name in pTempFrom(dir) */ 1287 SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); 1288 retCode = SHFileOperationW (&nFileOp); 1289 } while(!retCode && FindNextFileW(hFind, &wfd)); 1290 FindClose(hFind); 1291 continue; 1292 } 1293 /* W98 returns 0x75, W2K 0x4c7 */ 1482 } /* end-!b_MultiFrom */ 1483 1484 shfileop_IsInvalid: 1485 if (!(b_SameRoot_MOVE) && (nt40 < WOsVers)) 1486 { 1487 nFileOp.fAnyOperationsAborted |= TRUE; 1488 } /* endif */ 1489 /* NT4.0,W98 returns 0x75, W2K,WXP 0x4c7 */ 1294 1490 retCode = retCodeIsInvalid; 1295 1491 break; … … 1299 1495 shfileop_exit: 1300 1496 if (pTempFrom) 1301 HeapFree(GetProcessHeap(), 0,pTempFrom);1497 SHFree(pTempFrom); 1302 1498 TRACE("%s level=%ld AnyOpsAborted=%s ret=0x%lx, with %s %s%s\n", 1303 cFO_Name, level, nFileOp.fAnyOperationsAborted? "TRUE":"FALSE",1499 cFO_Name, level, (TRUE & nFileOp.fAnyOperationsAborted) ? "TRUE":"FALSE", 1304 1500 retCode, debugstr_w(pFrom), pTo ? "-> ":"", debugstr_w(pTo)); 1305 1501 1502 if (0 == level) 1503 { 1504 nFileOp.fAnyOperationsAborted &= TRUE; 1505 if (!(nFileOp.fFlags & FOF_WANTMAPPINGHANDLE)) 1506 { 1507 SHFreeNameMappings((HANDLE)nFileOp.hNameMappings); 1508 nFileOp.hNameMappings = 0; 1509 } 1510 } 1306 1511 lpFileOp->hNameMappings = nFileOp.hNameMappings; 1307 1512 lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted; 1308 1513 return retCode; 1514 } 1515 1516 /************************************************************************* 1517 * 1518 * SHNameTranslate HelperFunction for SHFileOperationA 1519 * 1520 * Translates a list of 0 terminated ASCII strings into Unicode. If *wString 1521 * is NULL, only the necessary size of the string is determined and returned, 1522 * otherwise the ASCII strings are copied into it and the buffer is increased 1523 * to point to the location after the final 0 termination char. 1524 */ 1525 DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) 1526 { 1527 DWORD size = 0, aSize = 0; 1528 LPCSTR aString = (LPCSTR)*pWToFrom; 1529 1530 if (aString) 1531 { 1532 do 1533 { 1534 size = lstrlenA(aString) + 1; 1535 aSize += size; 1536 aString += size; 1537 } while ((size != 1) && more); 1538 /* The two sizes might be different in the case of multibyte chars */ 1539 size = MultiByteToWideChar(CP_ACP, 0, aString, aSize, *wString, 0); 1540 if (*wString) /* only in the second loop */ 1541 { 1542 MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*pWToFrom, aSize, *wString, size); 1543 *pWToFrom = *wString; 1544 *wString += size; 1545 } 1546 } 1547 return size; 1548 } 1549 1550 /************************************************************************* 1551 * SHFileOperationA [SHELL32.@] 1552 * 1553 * Function to copy, move, delete and create one or more files with optional 1554 * user prompts. 1555 * 1556 * PARAMS 1557 * lpFileOp [I/O] pointer to a structure containing all the necessary information 1558 * 1559 * NOTES 1560 * exported by name 1561 */ 1562 DWORD WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) 1563 { 1564 SHFILEOPSTRUCTW nFileOp = *((LPSHFILEOPSTRUCTW)lpFileOp); 1565 DWORD retCode = 0, size; 1566 LPWSTR ForFree = NULL, /* we change wString in SHNameTranslate and can't use it for freeing */ 1567 wString = NULL; /* we change this in SHNameTranslate */ 1568 1569 TRACE("\n"); 1570 for (;;) /* every loop calculate size, second translate also, if we have storage for this */ 1571 { 1572 size = SHNameTranslate(&wString, &nFileOp.pFrom, TRUE); /* internal loop */ 1573 if (FO_DELETE != (nFileOp.wFunc & FO_MASK)) 1574 size += SHNameTranslate(&wString, &nFileOp.pTo, TRUE); /* internal loop */ 1575 if ((nFileOp.fFlags & FOF_SIMPLEPROGRESS)) 1576 size += SHNameTranslate(&wString, &nFileOp.lpszProgressTitle, FALSE); /* no loop */ 1577 1578 if (ForFree) 1579 { 1580 retCode = SHFileOperationW(&nFileOp); 1581 SHFree(ForFree); /* we can not use wString, it was changed */ 1582 lpFileOp->hNameMappings = nFileOp.hNameMappings; 1583 lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted; 1584 } 1585 else 1586 { 1587 wString = ForFree = SHAlloc(size * sizeof(WCHAR)); 1588 if (ForFree) continue; 1589 retCode = ERROR_OUTOFMEMORY; 1590 SetLastError(retCode); 1591 } 1592 return retCode; 1593 } 1309 1594 } 1310 1595 -
trunk/src/shell32/shres.orc
r8594 r10314 1 /* $Id: shres.orc,v 1.1 4 2002-06-08 07:26:59sandervl Exp $ */1 /* $Id: shres.orc,v 1.15 2003-11-12 14:05:13 sandervl Exp $ */ 2 2 /* 3 3 * Top level resource file for Common Dialogs … … 134 134 IDS_OPEN "Open" 135 135 } 136 136 #if 1 137 137 STRINGTABLE DISCARDABLE 138 138 { … … 146 146 IDS_OVERWRITEFILE_TEXT "OverWrite File %1?" 147 147 IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite" 148 IDS_COPY_X_OF_TEXT "Copy%sof %s" 148 149 #endif 149 150 } 151 #endif 150 152 151 153 shv_accel ACCELERATORS … … 272 274 */ 273 275 274 //#include "shell32_Ca.orc"275 //#include "shell32_Cs.orc"276 //#include "shell32_Da.orc"277 //#include "shell32_De.orc"278 //#include "shell32_Eo.orc"279 //#include "shell32_Es.orc"280 //#include "shell32_Fi.orc"281 //#include "shell32_Fr.orc"282 //#include "shell32_Hu.orc"283 //#include "shell32_It.orc"284 //#include " shell32_Ko.orc"285 //#include "shell32_Nl.orc"286 //#include "shell32_No.orc"287 //#include "shell32_Pl.orc"288 //#include "shell32_Pt.orc"289 //#include "shell32_Ru.orc"290 //#include "shell32_Sv.orc"291 //#include "shell32_Wa.orc"292 276 #include "resources\shell32_Ca.orc" 277 #include "resources\shell32_Cs.orc" 278 #include "resources\shell32_Da.orc" 279 #include "resources\shell32_De.orc" 280 #include "resources\shell32_Eo.orc" 281 #include "resources\shell32_Es.orc" 282 #include "resources\shell32_Fi.orc" 283 #include "resources\shell32_Fr.orc" 284 #include "resources\shell32_Hu.orc" 285 #include "resources\shell32_It.orc" 286 //#include "resources\shell32_Ko.orc" 287 #include "resources\shell32_Nl.orc" 288 #include "resources\shell32_No.orc" 289 #include "resources\shell32_Pl.orc" 290 #include "resources\shell32_Pt.orc" 291 #include "resources\shell32_Ru.orc" 292 #include "resources\shell32_Sv.orc" 293 #include "resources\shell32_Wa.orc" 294 -
trunk/src/shell32/shresdef.h
r8048 r10314 1 /* $Id: shresdef.h,v 1.1 0 2002-03-08 11:01:03sandervl Exp $ */1 /* $Id: shresdef.h,v 1.11 2003-11-12 14:05:14 sandervl Exp $ */ 2 2 3 3 /* … … 54 54 #define IDS_OVERWRITEFILE_CAPTION 37 55 55 #endif 56 #ifdef __WIN32OS2__ 57 #define IDS_COPY_X_OF_TEXT 200 58 #endif 56 59 57 60 #define IDS_SHV_INVALID_FILENAME_TITLE 28
Note:
See TracChangeset
for help on using the changeset viewer.