Changeset 10314 for trunk/src


Ignore:
Timestamp:
Nov 12, 2003, 3:05:47 PM (22 years ago)
Author:
sandervl
Message:

DT: Resource updates ; Shell file operations updates

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:59 sandervl Exp $ */
     1/* $Id: shell32_Ca.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_CATALAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Quant a %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin ha estat construit per:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Cs.orc

    r8594 r10314  
    1 /* $Id: shell32_Cs.orc,v 1.1 2002-06-08 07:26:59 sandervl Exp $ */
     1/* $Id: shell32_Cs.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "O aplikaci %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Da.orc

    r8594 r10314  
    1 /* $Id: shell32_Da.orc,v 1.1 2002-06-08 07:26:59 sandervl Exp $ */
     1/* $Id: shell32_Da.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Om %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin havde ikke været mulig uden hjælp fra disse personer:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_De.orc

    r8594 r10314  
    1 /* $Id: shell32_De.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_De.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Info über %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin wurde entwickelt von:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
     32STRINGTABLE 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
     49STRINGTABLE 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:56 sandervl Exp $ */
     1/* $Id: shell32_En.orc,v 1.3 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
    33
     
    8181    IDS_525FLOPPY           "5.25 disk"
    8282}
     83#if 0
     84STRINGTABLE 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
    8399
  • trunk/src/shell32/resources/shell32_Eo.orc

    r8594 r10314  
    1 /* $Id: shell32_Eo.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_Eo.orc,v 1.2 2003-11-12 14:04:53 sandervl Exp $ */
    22LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Pri %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Es.orc

    r8594 r10314  
    1 /* $Id: shell32_Es.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_Es.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Acerca de %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin es disponible gracias a:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Fi.orc

    r8594 r10314  
    1 /* $Id: shell32_Fi.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_Fi.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Tietoja: %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin:n tekijät:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Fr.orc

    r8594 r10314  
    1 /* $Id: shell32_Fr.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_Fr.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "A propos de %s"
     8FONT 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 r‚alisation 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin est une r‚alisation de:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Hu.orc

    r8594 r10314  
    1 /* $Id: shell32_Hu.orc,v 1.1 2002-06-08 07:27:00 sandervl Exp $ */
     1/* $Id: shell32_Hu.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "A %s-rõl"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_It.orc

    r8594 r10314  
    1 /* $Id: shell32_It.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_It.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_ITALIAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Informazioni su %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Nl.orc

    r8594 r10314  
    1 /* $Id: shell32_Nl.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_Nl.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_DUTCH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Info %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin is geschreven door:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_No.orc

    r8594 r10314  
    1 /* $Id: shell32_No.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_No.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_NORWEGIAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Om %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Pl.orc

    r8594 r10314  
    1 /* $Id: shell32_Pl.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_Pl.orc,v 1.2 2003-11-12 14:04:54 sandervl Exp $ */
    22LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "O %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin was brought to you by:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Pt.orc

    r8594 r10314  
    1 /* $Id: shell32_Pt.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_Pt.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */
    22LANGUAGE LANG_PORTUGUESE, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Sobre %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin foi disponibilizado por:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
    1632
  • trunk/src/shell32/resources/shell32_Ru.orc

    r8594 r10314  
    1 /* $Id: shell32_Ru.orc,v 1.1 2002-06-08 07:27:01 sandervl Exp $ */
     1/* $Id: shell32_Ru.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */
    22LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Î %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Ðàçðàáîò÷èêè Odin :", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Sv.orc

    r8594 r10314  
    1 /* $Id: shell32_Sv.orc,v 1.1 2002-06-08 07:27:02 sandervl Exp $ */
     1/* $Id: shell32_Sv.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */
    22LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
    33
     4#if 1
     5SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     6STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     7CAPTION "Om %s"
     8FONT 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
    419SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    520STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1328 LTEXT "Odin hade inte varit möjligt utan dessa personer:", 98, 8, 55, 137, 10
    1429}
     30#endif
    1531
  • trunk/src/shell32/resources/shell32_Wa.orc

    r8594 r10314  
    1 /* $Id: shell32_Wa.orc,v 1.1 2002-06-08 07:27:02 sandervl Exp $ */
     1/* $Id: shell32_Wa.orc,v 1.2 2003-11-12 14:04:55 sandervl Exp $ */
    22LANGUAGE LANG_WALON, SUBLANG_DEFAULT
    33
     
    77 */
    88
     9#if 1
     10SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 216, 170
     11STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     12CAPTION "Å dfait di %s"
     13FONT 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
    924SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152
    1025STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
     
    1833 LTEXT "Odin a estu fwait par:", 98, 8, 55, 137, 10
    1934}
     35#endif
    2036
  • trunk/src/shell32/sh.cpp

    r8586 r10314  
    1 /* $Id: sh.cpp,v 1.15 2002-06-07 08:21:43 sandervl Exp $ */
     1/* $Id: sh.cpp,v 1.16 2003-11-12 14:05:13 sandervl Exp $ */
    22
    33/*
     
    132132
    133133/*****************************************************************************
    134  * Name      : DWORD SHFreeNameMappings
    135  * Purpose   :
    136  * Parameters:
    137  * Variables :
    138  * Result    :
    139  * Remark    : SHELL32.246
    140  * Status    : UNTESTED STUB UNKNOWN
    141  *
    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 /*****************************************************************************
    154134 * Name      : DWORD SHGetNewLinkInfo
    155135 * Purpose   :
  • trunk/src/shell32/shlfileop.c

    r10162 r10314  
    44 * Copyright 2000 Juergen Schmied
    55 * Copyright 2002 Andriy Palamarchuk
    6  * Copyright 2002 Dietrich Teickner (from Odin)
    7  * Copyright 2002 Rolf Kalbermatter
     6 * Copyright 2002-2003 Dietrich Teickner (from Odin)
     7 * Copyright 2002-2003 Rolf Kalbermatter
    88 *
    99 * This library is free software; you can redistribute it and/or
     
    2222 *
    2323 * !!! shlfileop.c is shared source between wine and odin, do not remove
    24  * #ifdef __win32os2__ .. lines
     24 * #ifdef __WIN32OS2__ .. lines
    2525 */
    2626
     
    2828#include "wine/port.h"
    2929
     30#include <stdarg.h>
    3031#include <string.h>
    3132#include <ctype.h>
    3233
     34#include "windef.h"
     35#include "winbase.h"
    3336#include "winreg.h"
    3437#include "shellapi.h"
     38#include "wingdi.h"
     39#include "winuser.h"
    3540#include "shlobj.h"
    3641#include "shresdef.h"
     
    4449WINE_DEFAULT_DEBUG_CHANNEL(shell);
    4550
    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)
    5254
    5355#define IsDotDir(x)     ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0))))
     
    5759#define HIGH_ADR (LPWSTR)0xffffffff
    5860
    59 CHAR aWildcardFile[] = {'*','.','*',0};
     61#define FOI_NeverOverwrite 2
     62
     63CHAR aWildcardFile[] = {'*',0};
    6064WCHAR wWildcardChars[] = {'?','*',0};
    6165#define wWildcardFile &wWildcardChars[1]
    6266WCHAR 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);
     67enum { none = 0, w95, w95b, nt351, nt40, w98, w98se, wMe, w2k, wXp};
     68static int WOsVers = none; /* for versionsdepended conditions */
     69static int retCodeIsInvalid = 0x75; /* w95?,w98se, nt <= 4? */
     70static LPCSTR cFO_String [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"};
     71
     72static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec);
     73static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec);
     74static DWORD SHNotifyRemoveDirectoryA(LPCSTR path);
     75static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path);
     76static DWORD SHNotifyDeleteFileA(LPCSTR path);
     77static DWORD SHNotifyDeleteFileW(LPCWSTR path);
     78static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest);
     79static DWORD SHNotifyCopyFileW(LPCWSTR, LPCWSTR, BOOL);
    7280
    7381typedef struct
     
    166174              ret = SHELL_DeleteDirectoryA(szTemp, FALSE);
    167175            else
    168               ret = SHNotifyDeleteFileA(szTemp);
     176              ret = (SHNotifyDeleteFileA(szTemp) == ERROR_SUCCESS);
    169177          } while (ret && FindNextFileA(hFind, &wfd));
    170178        }
    171179        FindClose(hFind);
    172180        if (ret)
    173           ret = SHNotifyRemoveDirectoryA(pszDir);
     181          ret = (SHNotifyRemoveDirectoryA(pszDir) == ERROR_SUCCESS);
    174182        return ret;
    175183}
     
    189197
    190198        if (!bShowUI || SHELL_ConfirmDialogW(ASK_DELETE_FOLDER, pszDir))
     199
    191200        {
    192201          do
     
    201210              ret = SHELL_DeleteDirectoryW(szTemp, FALSE);
    202211            else
    203               ret = SHNotifyDeleteFileW(szTemp);
     212              ret = (SHNotifyDeleteFileW(szTemp) == ERROR_SUCCESS);
    204213          } while (ret && FindNextFileW(hFind, &wfd));
    205214        }
    206215        FindClose(hFind);
    207216        if (ret)
    208           ret = SHNotifyRemoveDirectoryW(pszDir);
     217          ret = (SHNotifyRemoveDirectoryW(pszDir) == ERROR_SUCCESS);
    209218        return ret;
    210219}
     
    218227          return FALSE;
    219228
    220         return SHNotifyDeleteFileA(pszFile);
     229        return (SHNotifyDeleteFileA(pszFile) == ERROR_SUCCESS);
    221230}
    222231
     
    226235          return FALSE;
    227236
    228         return SHNotifyDeleteFileW(pszFile);
     237        return (SHNotifyDeleteFileW(pszFile) == ERROR_SUCCESS);
    229238}
    230239
     
    244253 *  This is Unicode on NT/2000
    245254 */
    246 static BOOL SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec)
    247 {
    248         BOOL ret;
     255static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec)
     256{
     257        WCHAR wPath[MAX_PATH];
    249258        TRACE("(%s, %p)\n", debugstr_a(path), sec);
    250259
    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
     264static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
     265{
    262266        TRACE("(%s, %p)\n", debugstr_w(path), sec);
    263267
    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))
    266280        {
    267281          SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHW, path, NULL);
    268         }
    269         return ret;
     282          return ERROR_SUCCESS;
     283        }
     284        return GetLastError();
    270285}
    271286
     
    273288{
    274289        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);
    277292}
    278293
     
    286301 *
    287302 * RETURNS
    288  *  TRUE if successful, FALSE otherwise
     303 *  ERROR_SUCCESS if successful
    289304 *
    290305 * NOTES:
     
    292307 *  This is Unicode on NT/2000
    293308 */
    294 static BOOL SHNotifyRemoveDirectoryA(LPCSTR path)
    295 {
    296         BOOL ret;
     309
     310static DWORD SHNotifyRemoveDirectoryA(LPCSTR path)
     311{
     312        WCHAR wPath[MAX_PATH];
    297313        TRACE("(%s)\n", debugstr_a(path));
    298314
    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
     321static DWORD SHNotifyRemoveDirectoryW(LPCWSTR path)
    314322{
    315323        BOOL ret;
     
    321329          /* Directory may be write protected */
    322330          DWORD dwAttr = GetFileAttributesW(path);
    323           if (dwAttr != -1 && dwAttr & FILE_ATTRIBUTE_READONLY)
     331          if (IsAttrib(dwAttr,FILE_ATTRIBUTE_READONLY))
    324332            if (SetFileAttributesW(path, dwAttr & ~FILE_ATTRIBUTE_READONLY))
    325333              ret = RemoveDirectoryW(path);
    326334        }
    327335        if (ret)
     336        {
    328337          SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW, path, NULL);
    329         return ret;
    330 }
     338          return ERROR_SUCCESS;
     339        }
     340        return GetLastError();
     341}
     342
     343/***********************************************************************/
    331344
    332345BOOL WINAPI Win32RemoveDirectoryAW(LPCVOID path)
    333346{
    334347        if (SHELL_OsIsUnicode())
    335           return SHNotifyRemoveDirectoryW(path);
    336         return SHNotifyRemoveDirectoryA(path);
     348          return (SHNotifyRemoveDirectoryW(path) == ERROR_SUCCESS);
     349        return (SHNotifyRemoveDirectoryA(path) == ERROR_SUCCESS);
    337350}
    338351
     
    352365 *  This is Unicode on NT/2000
    353366 */
    354 static BOOL SHNotifyDeleteFileA(LPCSTR path)
    355 {
    356         BOOL ret;
    357 
     367
     368static DWORD SHNotifyDeleteFileA(LPCSTR path)
     369{
     370        WCHAR wPath[MAX_PATH];
    358371        TRACE("(%s)\n", debugstr_a(path));
    359372
    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
     379static DWORD SHNotifyDeleteFileW(LPCWSTR path)
    375380{
    376381        BOOL ret;
     
    383388          /* File may be write protected or a system file */
    384389          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))
    386391            if (SetFileAttributesW(path, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)))
    387392              ret = DeleteFileW(path);
    388393        }
    389394        if (ret)
     395        {
    390396          SHChangeNotify(SHCNE_DELETE, SHCNF_PATHW, path, NULL);
    391         return ret;
    392 }
     397          return ERROR_SUCCESS;
     398        }
     399        return GetLastError();
     400}
     401
     402/***********************************************************************/
    393403
    394404DWORD WINAPI Win32DeleteFileAW(LPCVOID path)
    395405{
    396406        if (SHELL_OsIsUnicode())
    397           return SHNotifyDeleteFileW(path);
    398         return SHNotifyDeleteFileA(path);
     407          return (SHNotifyDeleteFileW(path) == ERROR_SUCCESS);
     408        return (SHNotifyDeleteFileA(path) == ERROR_SUCCESS);
    399409}
    400410
     
    409419 *
    410420 * RETURNS
    411  *  TRUE if successful, FALSE otherwise
    412  */
    413 static BOOL SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest)
    414 {
    415         BOOL ret;
     421 *  NO_ERROR if successful, or an error code otherwise
     422 */
     423static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest)
     424{
     425        BOOL ret = FALSE;
    416426
    417427        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        }
    418439
    419440        ret = MoveFileW(src, dest);
     
    422443          /* Source file may be write protected or a system file */
    423444          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))
    425446            if (SetFileAttributesW(src, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)))
    426447              ret = MoveFileW(src, dest);
    427448        }
    428449        if (ret)
     450        {
    429451          SHChangeNotify(SHCNE_RENAMEITEM, SHCNF_PATHW, src, dest);
    430         return ret;
     452          return ERROR_SUCCESS;
     453        }
     454        return GetLastError();
    431455}
    432456
     
    439463 *  src        [I]   path to source file to move
    440464 *  dest       [I]   path to target file to move to
    441  *  bRename    [I]   if TRUE, the target file will be renamed if a
     465 *  b_nOverWrt [I]   if TRUE, the target file will not be overwritten, if a
    442466 *                   file with this name already exists
    443467 *
    444468 * RETURNS
    445  *  TRUE if successful, FALSE otherwise
    446  */
    447 static BOOL SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bRename)
     469 *  NO_ERROR if successful, or an error code otherwise
     470 */
     471static DWORD SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL b_nOverWrt)
    448472{
    449473        BOOL ret;
    450474
    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);
    463478        if (ret)
     479        {
    464480          SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, dest, NULL);
    465         return ret;
    466 }
     481          return ERROR_SUCCESS;
     482        }
     483        return GetLastError();
     484}
     485
    467486
    468487/*************************************************************************
     
    478497 *  ERRROR_SUCCESS or one of the following values:
    479498 *  ERROR_BAD_PATHNAME if the path is relative
    480  *  ERROR_FILE_EXISTS when a file with that name exists
     499 *  ERROR_INVLID_NAME if the path contains invalid chars
    481500 *  ERROR_ALREADY_EXISTS when the directory already exists
    482501 *  ERROR_FILENAME_EXCED_RANGE if the filename was to long to process
     
    506525 * RETURNS
    507526 *  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
    510530 *  ERROR_ALREADY_EXISTS when the directory already exists
    511531 *  ERROR_FILENAME_EXCED_RANGE if the filename was to long to process
     
    521541
    522542/*************************************************************************
    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 */
     545DWORD 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 */
     580void 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
     596static 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 */
     616static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly)
     617{
    530618        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);
    541624        if (INVALID_HANDLE_VALUE != hFind)
    542625        {
     626          do
     627          {
     628            if (b_FileMask && IsAttribDir(wfd.dwFileAttributes))
     629               continue;
     630            dwAttr = wfd.dwFileAttributes;
     631            break;
     632          }
     633          while (FindNextFileW(hFind, &wfd));
    543634          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;
    582637}
    583638
     
    587642 *
    588643 */
    589 BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End)
     644static BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End)
    590645{
    591646        WCHAR C1 = '\0';
    592647        WCHAR C2 = '\0';
    593         int i_Temp = -1;
     648        int i_Temp = 0 - (toupperW(p1[0]) == toupperW(p2[0]));
    594649        int i_len1 = lstrlenW(p1);
    595650        int i_len2 = lstrlenW(p2);
    596651
     652        if (!i_Temp) return FALSE; /* driveletters are different */
    597653        if (p1End && (&p1[i_len1] >= p1End) && ('\\' == p1End[0]))
    598654        {
     
    634690 *
    635691 */
    636 LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr)
     692static LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr)
    637693{
    638694        LPWSTR pToFile = NULL;
     
    645701          {
    646702            i_len = lstrlenW(pTo);
    647             if ((i_len) && (pTo[--i_len] != '\\'))
     703            if ((i_len) && ('\\' != pTo[--i_len]))
    648704              i_len++;
    649705            pTo[i_len] = '\\';
    650             if (pCatStr[0] == '\\')
     706            if ('\\' == pCatStr[0])
    651707              pCatStr++; \
    652708            lstrcpyW(&pTo[i_len+1], pCatStr);
    653709          }
    654710          pToFile = StrRChrW(pTo,NULL,'\\');
    655 /* !! termination of the new string-group */
     711          /* termination of the new string-group */
    656712          pTo[(lstrlenW(pTo)) + 1] = '\0';
    657713        }
     
    665721 * files in both lists is the same, and checks also if source-name exists.
    666722 */
    667 BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc)
     723static BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc)
    668724{
    669725        LPWSTR pszTemp;
     726
     727        TRACE("%s %s %d\n", debugstr_w(pszFiles1), debugstr_w(pszFiles2), bOnlySrc);
     728
    670729        while ((pszFiles1[0] != '\0') &&
    671730               (bOnlySrc || (pszFiles2[0] != '\0')))
     
    678737          if (pszTemp)
    679738          {
    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, '\\');
    683741            if (!pszTemp)
    684742              return FALSE;
    685             pszTemp[0] = '\0';
    686         /* we will check the root of the mask as valid dir */
     743            lstrcpynW(szMask, pszFiles1, (pszTemp - pszFiles1) + 1);
     744            /* we will check the root of the mask as valid dir */
    687745            if (!IsAttribDir(GetFileAttributesW(&szMask[0])))
    688746              return FALSE;
     
    690748          else
    691749          {
    692             if (-1 == GetFileAttributesW(pszFiles1))
     750            if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(pszFiles1))
    693751              return FALSE;
    694752          }
     
    701759
    702760/*************************************************************************
    703  *
    704  * SHName(s)Translate HelperFunction for SHFileOperationW
    705  *
    706  * Translates a list of 0 terminated ASCI strings into Unicode. If *wString
    707  * 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 increased
    709  * 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           do
    719           {
    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 optional
    739  * user prompts.
    740  *
    741  * PARAMS
    742  *  lpFileOp   [I/O] pointer to a structure containing all the necessary information
    743  *
    744  * NOTES
    745  *  exported by name
    746  */
    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 #else
    757         TRACE("\n");
    758 #endif
    759         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           else
    778           {
    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 /*************************************************************************
    788761 * SHFileOperationCheck
    789762 */
    790 DWORD SHFileOperationCheck(LPSHFILEOPSTRUCTW lpFileOp, LPCSTR* cFO_Name)
     763static DWORD SHFileOperationCheck(LPSHFILEOPSTRUCTW lpFileOp, LPCSTR* cFO_Name)
    791764{
    792765        FILEOP_FLAGS OFl = (FILEOP_FLAGS)lpFileOp->fFlags;
    793         LPCSTR cFO_Temp [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"};
    794766        long retCode = NO_ERROR;
    795767        long FuncSwitch = (lpFileOp->wFunc & FO_MASK);
    796768
    797769        /*  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        }
    799809        if ((FuncSwitch < FO_MOVE) || (FuncSwitch > FO_RENAME))
    800810        {
     
    802812          retCode = ERROR_INVALID_PARAMETER;
    803813        }
    804         cFO_Name[0] = cFO_Temp [FuncSwitch];
     814        cFO_Name[0] = cFO_String [FuncSwitch];
    805815
    806816        if (!(~FO_MASK & lpFileOp->wFunc)) /* ? Level == 0 */
    807         {
     817        {
     818          lpFileOp->hNameMappings = 0;
    808819          lpFileOp->fAnyOperationsAborted = FALSE;
    809820          TRACE("%s: flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s%s \n",cFO_Name[0], OFl,
     
    821832                      OFl & FOF_NOCOPYSECURITYATTRIBS ? "FOF_NOCOPYSECURITYATTRIBS" : "",
    822833                      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 */
    824836          OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */
    825837          OFl &= (~FOF_SIMPLEPROGRESS);                      /* ignored, only with FOF_SILENT */
    826838          if (OFl)
    827839          {
    828             if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION |
     840            if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT |
    829841                         FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS)))
    830842            {
     
    840852        return retCode;
    841853}
     854
     855/*************************************************************************
     856 *
     857 * SHCreateMappingElement internal HelperFunction for SHRenameOnCollision
     858 *
     859 * Old/New MappingNameElement
     860 */
     861static 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 */
     900static WCHAR wStrFormat[] = {' ','(','%','d',')',' ',0};
     901
     902static 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}
    842942/*************************************************************************
    843943 *
     
    849949 * also FO_RENAME does not contains FO_MOVE, only common Parts.
    850950 */
    851 DWORD SHFileOperationMove(LPSHFILEOPSTRUCTW lpFileOp)
    852 {
    853         DWORD retCode;
     951static DWORD SHFileOperationMove(LPSHFILEOPSTRUCTW lpFileOp)
     952{
    854953        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
    865963        /* 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);
    883976}
    884977/*************************************************************************
     
    895988        LPCWSTR pFrom = pNextFrom;
    896989        LPCWSTR pTo = NULL;
    897 #ifdef __WIN32OS2__
    898 #ifdef DEBUG
    899 #define _SHFO_DEBUGSTR_
    900 #ifdef _SHFO_DEBUGSTR_
    901         CHAR Debug_pFrom [MAX_PATH + 4];
    902         CHAR Debug_pTo [MAX_PATH + 4];
    903 #endif
    904 #endif
    905 #endif
    906990        HANDLE hFind = INVALID_HANDLE_VALUE;
    907991        WIN32_FIND_DATAW wfd;
     
    915999        DWORD ToPathAttr;
    9161000        DWORD FromAttr;
    917         DWORD FromPathAttr;
    9181001       
    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 */;
    9231009        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);
    9261015        BOOL b_SameRoot;
    9271016        BOOL b_SameRoot_MOVE;
    9281017        BOOL b_ToMask = FALSE;
    9291018        BOOL b_FromMask;
    930 
    931         long FuncSwitch = (nFileOp.wFunc & FO_MASK);
    932         long level= nFileOp.wFunc>>FO_LevelShift;
     1019        BOOL b_FileMask;
    9331020
    9341021        LPCSTR cFO_Name;
     
    9371024        if (retCode)
    9381025        {
    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 */
    9431028          goto shfileop_exit; /* no valid FunctionCode */
    9441029        }
     
    9721057          if ((pNextFrom) && (!(b_MultiTo) || (pNextTo)))
    9731058          {
    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));
    9751060            if (!pTempFrom)
    9761061            {
     
    9821067              pTempTo = &pTempFrom[MAX_PATH + 4];
    9831068            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            }
    9861074          }
    9871075          else
    9881076          {
    989             retCode = 0x402;      /* 1026 */
     1077            retCode = 0x402;      /* 1026 */ 
    9901078            goto shfileop_exit;
    9911079          }
     
    10001088              pTo = pNextTo;
    10011089              pNextTo = &pNextTo[lstrlenW(pTo)+1];
    1002               b_MultiTo = (b_Multi && pNextTo[0]);
     1090              b_MultiTo = (b_Multi && (0 != pNextTo[0]));
    10031091            }
    10041092
    10051093            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];
    10141095            if (!b_MultiFrom && !b_MultiTo)
    1015               b_MultiFrom = (pNextFrom[0]);
     1096              b_MultiFrom = (0 != pNextFrom[0]);
    10161097
    10171098            pFromFile = SHFileStrCpyCatW(pTempFrom, pFrom, NULL);
     
    10281109              if (b_MultiTo || b_MultiFrom || (b_FromMask && !b_ToMask))
    10291110              {
    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 */
    10361113                goto shfileop_exit;
    10371114              }
     
    10421119              b_MultiPaired =
    10431120                SHELL_FileNamesMatch(lpFileOp->pFrom,
    1044                       lpFileOp->pTo, ((FO_DELETE == FuncSwitch) || !b_Multi || b_MultiFrom));
     1121                      lpFileOp->pTo, (b_DELETE || !b_Multi || b_MultiFrom));
    10451122            } /* endif */
    10461123            if (!(b_MultiPaired) || !(pFromFile) || !(pFromFile[1]) || ((pTo) && !(pToFile)))
    10471124            {
    1048               retCode = 0x402;      /* 1026 */
     1125              if (nt40 < WOsVers)
     1126                retCode = 0x402;      /* 1026, nt40 returns 0 */
    10491127              goto shfileop_exit;
    10501128            }
    10511129
    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)
    10531154            {
    10541155              hFind = FindFirstFileW(pFrom, &wfd);
    10551156              if (INVALID_HANDLE_VALUE == hFind)
    1056                 /* no problem for FO_DELETE */
    1057                 continue;
     1157              {
     1158                goto shfileop_IsInvalid;
     1159              }
    10581160              do
    10591161              {
     
    10621164                   lpFileName = wfd.cFileName;
    10631165                if (IsDotDir(lpFileName) ||
    1064                     ((b_FromMask) && IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY)))
     1166                    (b_FileMask && IsAttribDir(wfd.dwFileAttributes)))
    10651167                  continue;
    10661168                SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL);
     
    10681170                if (IsAttribFile(wfd.dwFileAttributes))
    10691171                {
    1070                   if (!SHNotifyDeleteFileW(pTempFrom))
     1172                  if (SHNotifyDeleteFileW(pTempFrom))
    10711173                    retCode = 0x78; /* value unknown */
    10721174                }
     
    10851187            {
    10861188              pToFile[0] = '\0';
    1087               lpFileName = StrRChrW(pTempTo,NULL,'\\');
     1189              lpFileName = StrRChrW(pTempTo, NULL, '\\');
    10881190              if (lpFileName)
    10891191              {
     
    10931195            }
    10941196            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            {
    11011199              ToPathAttr = GetFileAttributesW(pTempTo);
    1102               pToFile[0] = '\\';
     1200              *pToFile = '\\';
    11031201            }
    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
    11141204            /* FO_RENAME is not only a Filter for FO_MOVE */
    11151205            if (FO_RENAME == FuncSwitch)
    11161206            {
    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 || \
    11181220                !SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL) || \
    11191221                 SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, HIGH_ADR))
     
    11221224                goto shfileop_exit;
    11231225              }
    1124 #ifdef W98_FO_FUNCTION /* not in W2K, later in SHFileOperationMove */
    1125               if (!pToTailSlash && IsAttribDir(ToAttr))
     1226              if (!(b_ToMask) && !(pToTailSlash) && IsAttribDir(ToAttr))
    11261227              {
    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 */
    11281311                goto shfileop_exit;
    11291312              }
    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                  )
    11341329              {
    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;
    11381354            }
    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))
    11431361              {
    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))
    11461367                {
    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;
    11511372                  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))
    11631375                {
    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))
    11691377                  {
    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 */
    11731395                  } /* endif */
    1174                   if (IsAttribDir(ToPathAttr) && !pToTailSlash && !IsAttribDir(ToAttr))
     1396                  if (INVALID_FILE_ATTRIBUTES == ToAttr)
    11751397                  {
    1176                     if (IsAttribFile(ToAttr) && not_overwrite)
     1398                    if (SHNotifyCopyFileW(pTempFrom, pTempTo, nFileOp.fFlags & FOF_RENAMEONCOLLISION))
    11771399                    {
    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 */
    11961401                      retCode = 0x10009;
    11971402                    }
     
    12031408                  }
    12041409                }
    1205                 if (IsAttribDir(FromAttr))
     1410              }
     1411              if (IsAttribDir(FromAttr))
     1412              {
     1413                if (INVALID_FILE_ATTRIBUTES == ToAttr)
    12061414                {
    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 */
    12091417                  {
    1210                     if (-1 == ToPathAttr)
     1418                    ToAttr = SHRenameOnCollision(pTempTo, pToFile, pFromFile, &nFileOp);
     1419                    if (INVALID_FILE_ATTRIBUTES != ToAttr)
    12111420                    {
    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;
    12391426                      goto shfileop_exit;
    12401427                    }
     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);
    12411436                  }
    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)
    12431460                  {
    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)
    12531475                    continue;
    1254                   }
     1476                  ((DWORD*)pToFile)[0] = '\0';
     1477                  nFileOp.wFunc =  ((level+1) << FO_LevelShift) + FO_DELETE;
     1478                  retCode = SHFileOperationW(&nFileOp);
     1479                  continue;
    12551480                }
    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 #else
    1264             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 #endif
    1268             {
    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;
    12761481              }
    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
     1484shfileop_IsInvalid:
     1485            if (!(b_SameRoot_MOVE) && (nt40 < WOsVers))
     1486            {
     1487              nFileOp.fAnyOperationsAborted |= TRUE;
     1488            } /* endif */
     1489            /* NT4.0,W98 returns 0x75, W2K,WXP 0x4c7 */
    12941490            retCode = retCodeIsInvalid;
    12951491            break;
     
    12991495shfileop_exit:
    13001496        if (pTempFrom)
    1301           HeapFree(GetProcessHeap(), 0, pTempFrom);
     1497          SHFree(pTempFrom);
    13021498        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",
    13041500              retCode, debugstr_w(pFrom), pTo ? "-> ":"", debugstr_w(pTo));
    13051501
     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        }
    13061511        lpFileOp->hNameMappings         = nFileOp.hNameMappings;
    13071512        lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted;
    13081513        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 */
     1525DWORD 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 */
     1562DWORD 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        }
    13091594}
    13101595
  • trunk/src/shell32/shres.orc

    r8594 r10314  
    1 /* $Id: shres.orc,v 1.14 2002-06-08 07:26:59 sandervl Exp $ */
     1/* $Id: shres.orc,v 1.15 2003-11-12 14:05:13 sandervl Exp $ */
    22/*
    33 * Top level resource file for Common Dialogs
     
    134134        IDS_OPEN                "Open"
    135135}
    136 
     136#if 1
    137137STRINGTABLE DISCARDABLE
    138138{
     
    146146        IDS_OVERWRITEFILE_TEXT "OverWrite File %1?"
    147147        IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite"
     148        IDS_COPY_X_OF_TEXT "Copy%sof %s"
    148149#endif
    149150}
     151#endif
    150152
    151153shv_accel ACCELERATORS
     
    272274*/
    273275
    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.10 2002-03-08 11:01:03 sandervl Exp $ */
     1/* $Id: shresdef.h,v 1.11 2003-11-12 14:05:14 sandervl Exp $ */
    22
    33/*
     
    5454#define IDS_OVERWRITEFILE_CAPTION 37
    5555#endif
     56#ifdef __WIN32OS2__
     57#define IDS_COPY_X_OF_TEXT  200
     58#endif
    5659
    5760#define IDS_SHV_INVALID_FILENAME_TITLE 28
Note: See TracChangeset for help on using the changeset viewer.