Changeset 9552 for trunk/src


Ignore:
Timestamp:
Dec 28, 2002, 11:08:16 AM (23 years ago)
Author:
sandervl
Message:

DT: FO_RENAME updates for shell file operations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shlfileop.c

    r9424 r9552  
    2020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    2121 */
     22
     23#include "config.h"
     24#include "wine/port.h"
     25
    2226#include <string.h>
     27
    2328#include "winreg.h"
    2429#include "shellapi.h"
     
    3237WINE_DEFAULT_DEBUG_CHANNEL(shell);
    3338
    34 #ifdef __WIN32OS2__
    3539BOOL SHELL_ConfirmDialog (int nKindOfDialog, LPCSTR szDir)
    3640{
     
    5761                break;
    5862        default:
    59                 FIXME(__FUNCTION__" Unhandled nKindOfDialog %d stub\n", nKindOfDialog);
     63          FIXME(" Unhandled nKindOfDialog %d stub\n", nKindOfDialog);
    6064                return FALSE;
    6165        }
     
    6367        LoadStringA(shell32_hInstance, caption_resource_id, szCaption, sizeof(szCaption));
    6468        LoadStringA(shell32_hInstance, text_resource_id, szText, sizeof(szText));
    65 #else
    66 BOOL SHELL_WarnItemDelete (int nKindOfDialog, LPCSTR szDir)
    67 {
    68         char szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
    69 
    70         if(nKindOfDialog == ASK_DELETE_FILE)
    71         {
    72           LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText,
    73                 sizeof(szText));
    74           LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION,
    75                 szCaption, sizeof(szCaption));
    76         }
    77         else if(nKindOfDialog == ASK_DELETE_FOLDER)
    78         {
    79           LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText,
    80                 sizeof(szText));
    81           LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION,
    82                 szCaption, sizeof(szCaption));
    83         }
    84         else if(nKindOfDialog == ASK_DELETE_MULTIPLE_ITEM)
    85         {
    86           LoadStringA(shell32_hInstance, IDS_DELETEMULTIPLE_TEXT, szText,
    87                 sizeof(szText));
    88           LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION,
    89                 szCaption, sizeof(szCaption));
    90         }
    91         else {
    92           FIXME("Called without a valid nKindOfDialog specified!\n");
    93           LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText,
    94                 sizeof(szText));
    95           LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION,
    96                 szCaption, sizeof(szCaption));
    97         }         
    98 #endif
     69
    9970        FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
    10071            szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir);
     
    12091        strcat(szTemp, "*.*");
    12192
    122         if (bShowUI && !SHELL_WarnItemDelete(ASK_DELETE_FOLDER, pszDir))
     93        if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FOLDER, pszDir))
    12394          return FALSE;
    124        
     95
    12596        if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(szTemp, &wfd)))
    12697        {
     
    132103              PathAddBackslashA(szTemp);
    133104              strcat(szTemp, wfd.cFileName);
    134        
     105
    135106              if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)
    136107                SHELL_DeleteDirectoryA(szTemp, FALSE);
     
    153124BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI)
    154125{
    155         if (bShowUI && !SHELL_WarnItemDelete(ASK_DELETE_FILE, pszFile))
     126        if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FILE, pszFile))
    156127                return FALSE;
    157  
     128
    158129        return DeleteFileA(pszFile);
    159130}
     
    178149
    179150/************************************************************************
    180  *      Win32DeleteFile                         [SHELL32.164] 
     151 *      Win32DeleteFile                         [SHELL32.164]
    181152 *
    182153 * Deletes a file.  Also triggers a change notify if one exists.
     
    197168}
    198169
    199 #ifdef __WIN32OS2__
    200170/*************************************************************************
    201171 *
     
    224194        if (i_len == 0) return                            TypisUnkn;
    225195        strcpy(pTemp,pFromTo);
     196        if (pTemp[1] == ':' && pTemp[0] >= 'a' && pTemp[0] <= 'z') pTemp[0] = (pTemp[0] & (0xff - ' '));
    226197        *pFile = i_pFile = &pTemp[i_len];
    227198        pTemp[i_len+1] = '\0';
     
    269240                        if (-1 == i_PathAttr || !(i_PathAttr & FILE_ATTRIBUTE_DIRECTORY)) Typ = TypisBad;
    270241                }
    271                 strcpy(pTemp,pFromTo);
     242                strcpy(&pTemp[1],&pFromTo[1]);
    272243                if (Typ == TypisUnkn && i_PathAttr != -1 && (i_PathAttr & FILE_ATTRIBUTE_DIRECTORY)) {
    273244                        if (NULL == strpbrk(i_pFile,"*?\0")) {
     
    283254        return Typ;
    284255}
    285 #else
    286 /**************************************************************************
    287  *      SHELL_FileNamesMatch()
    288  *
    289  * Accepts two \0 delimited lists of the file names. Checks whether number of
    290  * files in the both lists is the same.
    291  */
    292 BOOL SHELL_FileNamesMatch(LPCSTR pszFiles1, LPCSTR pszFiles2)
    293 {
    294     while ((pszFiles1[strlen(pszFiles1) + 1] != '\0') &&
    295            (pszFiles2[strlen(pszFiles2) + 1] != '\0'))
    296     {
    297         pszFiles1 += strlen(pszFiles1) + 1;
    298         pszFiles2 += strlen(pszFiles2) + 1;
    299     }
    300 
    301     return
    302         ((pszFiles1[strlen(pszFiles1) + 1] == '\0') &&
    303          (pszFiles2[strlen(pszFiles2) + 1] == '\0')) ||
    304         ((pszFiles1[strlen(pszFiles1) + 1] != '\0') &&
    305          (pszFiles2[strlen(pszFiles2) + 1] != '\0'));
    306 }
    307 #endif
    308256
    309257/*************************************************************************
    310  * SHFileOperationA                             [SHELL32.243]
     258 * SHFileOperationA                             [SHELL32.@]
    311259 *
    312260 * NOTES
    313261 *     exported by name
    314262 */
    315 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp)   
     263DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp)
    316264{
    317265        LPSTR pFrom = (LPSTR)lpFileOp->pFrom;
    318266        LPSTR pTo = (LPSTR)lpFileOp->pTo;
    319267        LPSTR pTempTo;
    320 #ifdef __WIN32OS2__
    321268        DWORD FromAttr;
    322269        DWORD ToAttr;
     
    359306        nlpFileOp.wFunc =  (level<<4) + FuncSwitch;
    360307        if (level == 1)
    361 #endif
    362         TRACE("flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s \n", lpFileOp->fFlags,
     308        TRACE("flags (0x%04x) : %s%s%s%s%s%s%s%s%s%s%s%s \n", lpFileOp->fFlags,
    363309                lpFileOp->fFlags & FOF_MULTIDESTFILES ? "FOF_MULTIDESTFILES " : "",
    364310                lpFileOp->fFlags & FOF_CONFIRMMOUSE ? "FOF_CONFIRMMOUSE " : "",
     
    373319                lpFileOp->fFlags & FOF_NOERRORUI ? "FOF_NOERRORUI " : "",
    374320                lpFileOp->fFlags & 0xf800 ? "MORE-UNKNOWN-Flags" : "");
    375 #ifdef __WIN32OS2__
    376321        switch(FuncSwitch) {
    377322        case FO_MOVE:
    378323                retCode = 0xb7;
    379324                pToFuncTXT = "FO_MOVE";
    380 #else
    381         switch(lpFileOp->wFunc) {
    382         case FO_MOVE:
    383 #endif
    384325        case FO_COPY:
    385326        {
     
    398339                 *                         ---------------
    399340                 * copy files to dir       1 0 1 1 0 0 1 0
    400                  * create dir              0 0 0 0 0 0 1 0 
     341                 * create dir              0 0 0 0 0 0 1 0
    401342                 */
    402 #ifdef __WIN32OS2__
    403343                        nlpFileOp.pFrom = pTempFrom = HeapAlloc(GetProcessHeap(), 0, 3 * MAX_PATH+6);
    404344                        nlpFileOp.pTo   = pTempTo   = &pTempFrom[MAX_PATH+4];
     
    438378                                } /* endif */
    439379
    440                                 TRACE(__FUNCTION__" %s level=%d From='%s' To='%s'\n", pToFuncTXT, level, pFrom, pTo);
    441 
    442380                FromTyp = SHFileTyp(pFrom, &lenFrom,
    443381                                                                        pTempFrom, &lenTempFrom,
     
    445383                                                                        &FromPathAttr, &FromAttr);
    446384
    447 // Check Source
     385                                zTyp  = ToTyp;
     386                ToTyp = SHFileTyp(pTo, &lenTo,
     387                                                                        pTempTo, &lenTempTo,
     388                                                                        &pToFile,
     389                                                                        &ToPathAttr, &ToAttr);
     390
     391                                TRACE(__FUNCTION__" %s level=%d From='%s'(%d,%d,%d) To='%s'(%d,%d,%d)\n", pToFuncTXT,
     392                                        level, pTempFrom, FromTyp, lenFrom, lenTempFrom, pTempTo, ToTyp, lenTo, lenTempTo);
     393
     394/* Check Source */
    448395                                if (FromTyp != TypisDir
    449396                                 && FromTyp != TypisFile
     
    454401                                                break;
    455402                                } /* endif */
    456                                 zTyp  = ToTyp;
    457                 ToTyp = SHFileTyp(pTo, &lenTo,
    458                                                                         pTempTo, &lenTempTo,
    459                                                                         &pToFile,
    460                                                                         &ToPathAttr, &ToAttr);
    461 
    462 // fix for more then one source for one target
     403/* fix for more then one source for one target */
    463404                                if (ToTyp == TypisUnkn
    464405                                 && zTyp  <  TypisFile
     
    469410                                        lenTo = strlen(pTempTo);
    470411                                } /* endif */
    471 // recursiv creating from directorys are not valid for FO_MOVE.
     412/* recursiv creating from directorys are not valid for FO_MOVE. */
    472413                                if (FuncSwitch == FO_MOVE && ToTyp == TypisNewPath) ToTyp = TypisUnkn;
    473 // Check Target
     414/* Check Target */
    474415                                if (ToTyp == TypisMask) {
    475416                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     
    532473                                case TypisDir: { /* Source is Dir  */
    533474                                                if (TargetisDir) {
    534 // From Root to Root not full tested, also no Comparsion in W98
     475/* From Root to Root not full tested, also no Comparsion in W98 */
    535476                                                        MakeDir = (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && ToTyp != TypisRoot);
    536477                                                        break;
     
    545486                                                nlpFileOp.fAnyOperationsAborted=TRUE;
    546487                                                where = 210 + FromTyp;
    547 //                                              retCode=0x750;
     488/*                                              retCode=0x750; */
    548489                                                break;
    549490                                        }
     
    564505                                        PathRemoveFileSpecA(pTempFrom);
    565506                                        lenTempTo = strlen(pTempFrom);
    566                                         strcpy(pTempFrom,pFrom);
     507                                        strcpy(&pTempFrom[1],&pFrom[1]);
    567508                                        if (pTempFrom[lenTempTo-1] == '\\') lenTempTo--;
    568509                                        strcpy(pToFile,&pFrom[lenTempTo]);
     
    654595                        }
    655596                        break;
    656 #else
    657                 int multifrom = pFrom[strlen(pFrom) + 1] != '\0';
    658                 int destisdir = PathIsDirectoryA( pTo );
    659                 int todir = 0;
    660 
    661                 if (lpFileOp->wFunc == FO_COPY)
    662                     TRACE("File Copy:\n");
    663                 else
    664                     TRACE("File Move:\n");
    665 
    666                 if( destisdir ) {
    667                     if ( !((lpFileOp->fFlags & FOF_MULTIDESTFILES) && !multifrom))
    668                         todir = 1;
    669                 } else {
    670                     if ( !(lpFileOp->fFlags & FOF_MULTIDESTFILES) && multifrom)
    671                         todir = 1;
    672                 }
    673 
    674                 if ((pTo[strlen(pTo) + 1] != '\0') &&
    675                     !(lpFileOp->fFlags & FOF_MULTIDESTFILES))
    676                 {
    677                     WARN("Attempt to use multiple file names as a destination "
    678                          "without specifying FOF_MULTIDESTFILES\n");
    679                     return 1;
    680                 }
    681 
    682                 if ((lpFileOp->fFlags & FOF_MULTIDESTFILES) &&
    683                     !SHELL_FileNamesMatch(pTo, pFrom))
    684                 {
    685                     WARN("Attempt to use multiple file names as a destination "
    686                          "with mismatching number of files in the source and "
    687                          "destination lists\n");
    688                     return 1;
    689                 }
    690 
    691                 if ( todir ) {
    692                     char szTempFrom[MAX_PATH];
    693                     char *fromfile;
    694                     int lenPTo;
    695                     if ( ! destisdir) {
    696                         TRACE("   creating directory %s\n",pTo);
    697                         SHCreateDirectory(NULL,pTo);
    698                     }
    699                     lenPTo = strlen(pTo);
    700                     while(1) {
    701                         HANDLE hFind;
    702                         WIN32_FIND_DATAA wfd;
    703 
    704                         if(!pFrom[0]) break;
    705                         TRACE("   From Pattern='%s'\n", pFrom);
    706                         if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(pFrom, &wfd)))
    707                         {
    708                           do
    709                           {
    710                             if(strcasecmp(wfd.cFileName, ".") && strcasecmp(wfd.cFileName, ".."))
    711                             {
    712                               strcpy(szTempFrom, pFrom);
    713 
    714                               pTempTo = HeapAlloc(GetProcessHeap(), 0,
    715                                                   lenPTo + strlen(wfd.cFileName) + 5);
    716                               if (pTempTo) {
    717                                   strcpy(pTempTo,pTo);
    718                                   PathAddBackslashA(pTempTo);
    719                                   strcat(pTempTo,wfd.cFileName);
    720 
    721                                   fromfile = PathFindFileNameA(szTempFrom);
    722                                   fromfile[0] = '\0';
    723                                   PathAddBackslashA(szTempFrom);
    724                                   strcat(szTempFrom, wfd.cFileName);
    725                                   TRACE("   From='%s' To='%s'\n", szTempFrom, pTempTo);
    726                                   if(lpFileOp->wFunc == FO_COPY)
    727                                   {
    728                                       if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)
    729                                       {
    730                                           /* copy recursively */
    731                                           if(!(lpFileOp->fFlags & FOF_FILESONLY))
    732                                           {
    733                                               SHFILEOPSTRUCTA shfo;
    734 
    735                                               SHCreateDirectory(NULL,pTempTo);
    736                                               PathAddBackslashA(szTempFrom);
    737                                               strcat(szTempFrom, "*.*");
    738                                               szTempFrom[strlen(szTempFrom) + 1] = '\0';
    739                                               pTempTo[strlen(pTempTo) + 1] = '\0';
    740                                               memcpy(&shfo, lpFileOp, sizeof(shfo));
    741                                               shfo.pFrom = szTempFrom;
    742                                               shfo.pTo = pTempTo;
    743                                               SHFileOperationA(&shfo);
    744 
    745                                               szTempFrom[strlen(szTempFrom) - 4] = '\0';
    746                                           }
    747                                       }
    748                                       else
    749                                           CopyFileA(szTempFrom, pTempTo, FALSE);
    750                                   }
    751                                   else
    752                                   {
    753                                       /* move file/directory */
    754                                       MoveFileA(szTempFrom, pTempTo);
    755                                   }
    756                                   HeapFree(GetProcessHeap(), 0, pTempTo);
    757                               }
    758                             }
    759                           } while(FindNextFileA(hFind, &wfd));
    760                           FindClose(hFind);
    761                         }
    762                         else
    763                         {
    764                             /* can't find file with specified name */
    765                             break;
    766                         }
    767                         pFrom += strlen(pFrom) + 1;
    768                     }
    769                 } else {
    770                 while(1) {
    771                         if(!pFrom[0]) break;
    772                         if(!pTo[0]) break;
    773                         TRACE("   From='%s' To='%s'\n", pFrom, pTo);
    774 
    775                         pTempTo = HeapAlloc(GetProcessHeap(), 0, strlen(pTo)+1);
    776                         if (pTempTo)
    777                         {
    778                             strcpy( pTempTo, pTo );
    779                             PathRemoveFileSpecA(pTempTo);
    780                             TRACE("   Creating Directory '%s'\n", pTempTo);
    781                             SHCreateDirectory(NULL,pTempTo);
    782                             HeapFree(GetProcessHeap(), 0, pTempTo);
    783                         }
    784                             if (lpFileOp->wFunc == FO_COPY)
    785                         CopyFileA(pFrom, pTo, FALSE);
    786                             else
    787                                 MoveFileA(pFrom, pTo);
    788 
    789                         pFrom += strlen(pFrom) + 1;
    790                         pTo += strlen(pTo) + 1;
    791                 }
    792                 }
    793                 TRACE("Setting AnyOpsAborted=FALSE\n");
    794                 lpFileOp->fAnyOperationsAborted=FALSE;
    795                 return 0;
    796 #endif
    797597        }
    798598
    799599        case FO_DELETE:
    800 #ifdef __WIN32OS2__
    801600                TRACE(__FUNCTION__" FO_DELETE level=%d\n",level);
    802 // need break at error before change sourcepointer
     601/* need break at error before change sourcepointer */
    803602                while(!nlpFileOp.fAnyOperationsAborted && (pFrom+=lenFrom+1)[0]) {
    804603                                lenFrom=strlen(pFrom);
     
    808607                                        if (DeleteFileA(pFrom)) continue;
    809608                                        nlpFileOp.fAnyOperationsAborted=TRUE;
    810 //                                      retCode = 0x71;
     609/*                                      retCode = 0x71; */
    811610                                        where = 301;
    812611                                        break;
     
    818617                                if (!(FromAttr & FILE_ATTRIBUTE_DIRECTORY) ) {
    819618                                        nlpFileOp.fAnyOperationsAborted=TRUE;
    820 //                                      retCode = 0x71;
     619/*                                      retCode = 0x71; */
    821620                                        where = 302;
    822621                                        break;
    823622                                }
    824 // is Source an existing directory\*.* ?
     623/* is Source an existing directory\*.* ? */
    825624                                if (FromAttr == -1) {
    826625                                        PathRemoveFileSpecA(pTempFrom);
     
    844643                                lenTempFrom = strlen(pTempFrom);
    845644                                if (lenFrom < lenTempFrom) {
    846 // Source is without \*.*
     645/* Source is without \*.* */
    847646                                        pTempFrom[lenTempFrom+1]='\0';
    848647                                        nlpFileOp.pFrom = pTempFrom;
     
    852651
    853652                                        if (nlpFileOp.fAnyOperationsAborted) {break;}
    854 // Call SHELL_DeleteDirectoryA ?
     653/* Call SHELL_DeleteDirectoryA ? */
    855654                                        if (RemoveDirectoryA(pFrom)) continue;
    856655                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     
    896695        case 0:
    897696                        break;
    898 #else
    899         {
    900                 HANDLE          hFind;
    901                 WIN32_FIND_DATAA wfd;
    902                 char            szTemp[MAX_PATH];
    903                 char            *file_name;
    904 
    905                 TRACE("File Delete:\n");
    906                 while(1) {
    907                         if(!pFrom[0]) break;
    908                         TRACE("   Pattern='%s'\n", pFrom);
    909                         if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(pFrom, &wfd)))
    910                         {
    911                           do
    912                           {
    913                             if(strcasecmp(wfd.cFileName, ".") && strcasecmp(wfd.cFileName, ".."))
    914                             {
    915                               strcpy(szTemp, pFrom);
    916                               file_name = PathFindFileNameA(szTemp);
    917                               file_name[0] = '\0';
    918                               PathAddBackslashA(szTemp);
    919                               strcat(szTemp, wfd.cFileName);
    920 
    921                               TRACE("   File='%s'\n", szTemp);
    922                               if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)
    923                               {
    924                                 if(!(lpFileOp->fFlags & FOF_FILESONLY))
    925                                     SHELL_DeleteDirectoryA(szTemp, FALSE);
    926                               }
    927                               else
    928                                 DeleteFileA(szTemp);
    929                             }
    930                           } while(FindNextFileA(hFind, &wfd));
    931 
    932                           FindClose(hFind);
    933                         }
    934                         pFrom += strlen(pFrom) + 1;
    935                 }
    936                 TRACE("Setting AnyOpsAborted=FALSE\n");
    937                 lpFileOp->fAnyOperationsAborted=FALSE;
    938                 return 0;
    939         }
    940 #endif
    941697        case FO_RENAME:
    942698            TRACE("File Rename:\n");
     
    944700            {
    945701                WARN("Attempt to rename more than one file\n");
    946                 return 1;
     702                                lpFileOp->fAnyOperationsAborted=TRUE;
     703                                retCode=0;
     704                                break;
    947705            }
    948             lpFileOp->fAnyOperationsAborted = FALSE;
    949706            TRACE("From %s, To %s\n", pFrom, pTo);
    950             return !MoveFileA(pFrom, pTo);
     707                        pTempFrom = HeapAlloc(GetProcessHeap(), 0, 2 * MAX_PATH+6);
     708                        pTempTo   = &pTempFrom[MAX_PATH+4];
     709
     710            FromTyp = SHFileTyp(pFrom, &lenFrom,
     711                                                        pTempFrom, &lenTempFrom,
     712                                                        &pFromFile,
     713                                                        &FromPathAttr, &FromAttr);
     714
     715                        ToTyp = SHFileTyp(pTo, &lenTo,
     716                                                        pTempTo, &lenTempTo,
     717                                                        &pToFile,
     718                                                        &ToPathAttr, &ToAttr);
     719
     720                        TRACE(__FUNCTION__" FO_RENAME level=%d From='%s'(%d,%d,%d) To='%s'(%d,%d,%d)\n",
     721                                 level, pTempFrom, FromTyp, lenFrom, lenTempFrom, pTempTo, ToTyp, lenTo, lenTempTo);
     722
     723/* Check Target, Target = Dir is invalid, must be befor the next SourceCheck  */
     724                        if (FromTyp == TypisDir && ToTyp == TypisDir) {                 
     725                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     726                                        retCode=0x7b;
     727                                        break;
     728                        } /* endif */
     729/* Check Source */
     730                        if (FromTyp == TypisDirS || FromTyp == TypisName
     731/* for (FromTyp == TypisNewPath) to many, all are invalid and not are retCode 0x402  */
     732                        || (FromTyp == TypisNewPath && (ToTyp != TypisDir && ToTyp != TypisName))) {                   
     733                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     734                                        retCode=0x402;
     735                                        break;
     736                        } /* endif */
     737/* Check Target, Target = NewDir is invalid, must be after 0x402 ? */
     738                        if (ToTyp == TypisNewPath) {                   
     739                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     740                                        retCode=0x75;
     741                                        break;
     742                        } /* endif */
     743                        if (ToTyp == TypisDirS) {                       
     744                                        nlpFileOp.fAnyOperationsAborted=TRUE;
     745                                        retCode=0xb7;
     746                                        break;
     747                        } /* endif */
     748/* What is with existing Target, can we replace it ? */
     749                        if (((FromTyp == TypisFile || FromTyp == TypisDir) && ToTyp == TypisName)
     750                          || (FromTyp == TypisDir && ToTyp == TypisNameS)) {
     751                                if (ToTyp == TypisNameS) pTempTo[--lenTo] = '\0';
     752                                lenTempTo = lenTempFrom = 2;
     753/* FileRename only in the same path !! ?? */
     754                                if (FromTyp == TypisFile) {
     755                                        pFromFile = strrchr(pTempFrom,'\\');
     756                                        pToFile = strrchr(pTempTo,'\\');
     757                                        if (pFromFile == NULL || pToFile == NULL) {
     758                                                if (ToTyp == TypisNameS) pTempTo[lenTo++] = '\\';
     759                                                break;
     760                                        }
     761                                        pFromFile[0] = '\0';
     762                                        pToFile[0] = '\0';
     763                                        lenTempTo = strlen(pTempTo);
     764                                        lenTempFrom = strlen(pTempFrom);
     765                                        pFromFile[0] = '\\';
     766                                        pToFile[0] = '\\';
     767                                }
     768                                if (lenTempTo == lenTempFrom && 0 == memcmp(pTempTo,pTempFrom,lenTempTo)) {
     769                        retCode = !MoveFileA(pTempFrom, pTempTo);
     770                                        if (ToTyp == TypisNameS) pTempTo[lenTo++] = '\\';
     771                                        if (retCode) nlpFileOp.fAnyOperationsAborted=TRUE;
     772                                        break;
     773                                }
     774                        }
     775
     776                        retCode=0x73;
     777                        nlpFileOp.fAnyOperationsAborted=TRUE;
     778                        break;
    951779
    952780        default:
    953 #ifdef __WIN32OS2__
    954781                TRACE(__FUNCTION__" Unhandled shell file operation %d at level=%d stub\n",(lpFileOp->wFunc & 15), level );
    955782                lpFileOp->fAnyOperationsAborted=TRUE;
    956 #else
    957                 FIXME("Unhandled shell file operation %d\n", lpFileOp->wFunc);
    958         }
    959 #endif
    960            return 1;
    961 
    962 #ifdef __WIN32OS2__
     783        return 1;
    963784        }
    964785        if (pTempFrom) HeapFree(GetProcessHeap(), 0, pTempFrom);
     
    981802        return 0;
    982803
    983 #endif
    984804}
    985805
    986806/*************************************************************************
    987  * SHFileOperationW                             [SHELL32.244]
     807 * SHFileOperationW                             [SHELL32.@]
    988808 *
    989809 * NOTES
    990810 *     exported by name
    991811 */
    992 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp)   
     812DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp)
    993813{
    994814        FIXME("(%p):stub.\n", lpFileOp);
     
    997817
    998818/*************************************************************************
    999  * SHFileOperation                              [SHELL32.242]
     819 * SHFileOperation                              [SHELL32.@]
    1000820 *
    1001821 */
     
    1036856}
    1037857
    1038 
Note: See TracChangeset for help on using the changeset viewer.