Changeset 5576 for trunk/src


Ignore:
Timestamp:
Apr 23, 2001, 12:47:23 PM (24 years ago)
Author:
sandervl
Message:

Updates and fixes for SHFileOperationA (FO_COPY)

Location:
trunk/src/shell32
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/shell32/shell32_main.h

    r5544 r5576  
    1 /* $Id: shell32_main.h,v 1.7 2001-04-19 08:32:18 sandervl Exp $ */
     1/* $Id: shell32_main.h,v 1.8 2001-04-23 10:47:23 sandervl Exp $ */
    22/*
    33 *      internal Shell32 Library definitions
     
    183183#define ASK_DELETE_FOLDER        2
    184184#define ASK_DELETE_MULTIPLE_ITEM 3
     185#ifdef __WIN32OS2__
     186#define ASK_CREATE FOLDER        4
     187#define ASK_OVERWRITE_FILE       5
     188#endif
    185189
    186190BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI);
    187191BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI);
     192#ifdef __WIN32OS2__
     193#define SHELL_WarnItemDelete SHELL_ConfirmDialog
     194BOOL SHELL_ConfirmDialog(int nKindOfDialog, LPCSTR szDir);
     195#else
    188196BOOL SHELL_WarnItemDelete(int nKindOfDialog, LPCSTR szDir);
     197#endif
    189198
    190199#ifdef __WIN32OS2__
     
    211220
    212221#endif
     222
  • trunk/src/shell32/shlfileop.c

    r5544 r5576  
    1919DEFAULT_DEBUG_CHANNEL(shell);
    2020
     21
     22#ifdef __WIN32OS2__
     23BOOL SHELL_ConfirmDialog (int nKindOfDialog, LPCSTR szDir)
     24{
     25        char szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
     26        UINT caption_resource_id, text_resource_id;
     27
     28        switch(nKindOfDialog) {
     29
     30        case ASK_DELETE_FILE:
     31                caption_resource_id     = IDS_DELETEITEM_CAPTION;
     32                text_resource_id        = IDS_DELETEITEM_TEXT;
     33                break;
     34        case ASK_DELETE_FOLDER:
     35                caption_resource_id     = IDS_DELETEFOLDER_CAPTION;
     36                text_resource_id        = IDS_DELETEITEM_TEXT;
     37                break;
     38        case ASK_DELETE_MULTIPLE_ITEM:
     39                caption_resource_id     = IDS_DELETEITEM_CAPTION;
     40                text_resource_id        = IDS_DELETEMULTIPLE_TEXT;
     41                break;
     42        case ASK_OVERWRITE_FILE:
     43                caption_resource_id     = IDS_OVERWRITEFILE_CAPTION;
     44                text_resource_id        = IDS_OVERWRITEFILE_TEXT;
     45                break;
     46        default:
     47                FIXME(__FUNCTION__" Unhandled nKindOfDialog %d stub\n", nKindOfDialog);
     48                return FALSE;
     49        }
     50
     51        LoadStringA(shell32_hInstance, caption_resource_id, szCaption, sizeof(szCaption));
     52        LoadStringA(shell32_hInstance, text_resource_id, szText, sizeof(szText));
     53#else
    2154BOOL SHELL_WarnItemDelete (int nKindOfDialog, LPCSTR szDir)
    2255{
     
    5184                szCaption, sizeof(szCaption));
    5285        }         
    53 
     86#endif
    5487        FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
    5588            szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir);
     
    152185}
    153186
     187#ifdef __WIN32OS2__
     188/************************************************************************
     189 *      Creation from dir for SHFileOperation (FO_COPY)
     190 *
     191 */
     192
     193LPSTR DirForFileOperationA (LPSTR pTo, DWORD *dwAttr, LPSHFILEOPSTRUCTA lpFileOp, BOOL toSingle)
     194{
     195
     196        LPSTR pTempTo = NULL;
     197        long lenTo;
     198        BOOL withFileName = FALSE;
     199        if(pTo[0]) {
     200                lenTo = strlen(pTo);
     201                pTempTo = HeapAlloc(GetProcessHeap(), 0, lenTo + MAX_PATH);
     202
     203        }
     204        *dwAttr = -1;
     205        if (pTempTo) {
     206                strcpy(pTempTo,pTo);
     207                PathRemoveBackslashA(pTempTo);
     208                *dwAttr = GetFileAttributesA(pTempTo);
     209                if (*(dwAttr) == -1 || !(*(dwAttr) & FILE_ATTRIBUTE_DIRECTORY)) {
     210                        withFileName = ((lenTo == strlen(pTempTo)) || !toSingle);
     211                        if (withFileName) {
     212// Target must not be an directory
     213                                PathRemoveFileSpecA(pTempTo);
     214                                *(dwAttr) = GetFileAttributesA(pTempTo);
     215                        }
     216                }
     217                if ((*(dwAttr) == -1) ||
     218                  ( !(*(dwAttr) & FILE_ATTRIBUTE_DIRECTORY) || (!withFileName && !toSingle) )) {
     219// !toSingle == !(&pTo[strlen(pTo)+1]=="\0") redundant ?
     220                        if (!withFileName && !toSingle) {
     221                                FIXME(__FUNCTION__" FO_COPY tagetdir and FOF_MULTIDESTFILES not implemented ? ,stub\n");
     222                        };
     223// never Create directory at this time
     224                                HeapFree(GetProcessHeap(), 0, pTempTo);
     225                                pTempTo = NULL;
     226//                      }
     227                }
     228        }
     229        if (!pTempTo) lpFileOp->fAnyOperationsAborted=TRUE;
     230        return pTempTo;
     231}
     232#endif
     233
    154234/*************************************************************************
    155235 * SHFileOperationA                             [SHELL32.243]
     
    162242        LPSTR pFrom = (LPSTR)lpFileOp->pFrom;
    163243        LPSTR pTo = (LPSTR)lpFileOp->pTo;
     244#ifdef __WIN32OS2__
     245        DWORD ToAttr;
     246        DWORD FromAttr;
     247        LPSTR pToFile;
     248        LPSTR pTempTo = NULL;
     249        LPSTR pTempFrom;
     250
     251        FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0x7ff);
     252        BOOL Multi = (lpFileOp->fFlags & FOF_MULTIDESTFILES);
     253        BOOL withFileName = FALSE;
     254        BOOL not_overwrite;
     255        BOOL copyOk;
     256        long lenTo;
     257/* default no error
     258*/
     259        lpFileOp->fAnyOperationsAborted=FALSE;
     260#else
    164261        LPSTR pTempTo;
     262#endif
    165263       
    166264        switch(lpFileOp->wFunc) {
    167265        case FO_COPY:
    168266                TRACE("File Copy:\n");
     267#ifdef __WIN32OS2__
     268/*
     269 * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION                               are     implemented
     270 * FOF_CONFIRMMOUSE, FOF_SILENT, FOF_NOCONFIRMMKDIR, FOF_SIMPLEPROGRESS are not implemented and ignored
     271 * if any other flag set, an error occurs
     272 */ 
     273                OFl = (OFl & (-1 - (FOF_MULTIDESTFILES)));
     274                OFl = (OFl ^ (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR));
     275                if (OFl) {
     276                        if (OFl & (-1 - (FOF_CONFIRMMOUSE | FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR))) {
     277                                FIXME(__FUNCTION__" FO_COPY with this fFlags not implemented:%2x ,stub\n",lpFileOp->fFlags);
     278                                lpFileOp->fAnyOperationsAborted=TRUE;
     279                        } else {
     280// not FOF_SILENT, not FOF_SIMPLEPROGRESS, not FOF_NOCONFIRMMKDIR
     281                                FIXME(__FUNCTION__" FO_COPY with this fFlags not full implemented:%2x ,stub\n",lpFileOp->fFlags);
     282                        } /* endif */             
     283                } /* endif */
     284
     285                not_overwrite = (!(lpFileOp->fFlags & FOF_NOCONFIRMATION));
     286                while(!Multi && !lpFileOp->fAnyOperationsAborted) {
     287// single targetdir
     288                        pTempTo = DirForFileOperationA(pTo, &ToAttr, lpFileOp, TRUE);
     289
     290                        if (!pTempTo) break;
     291
     292                        lenTo = strlen(pTempTo);
     293                        withFileName = (((lenTo + 1) <  strlen(pTo)) || (PathIsRootA(pTo) && lenTo < strlen(pTo)));
     294                        PathAddBackslashA(pTempTo);
     295                        break;
     296                }
     297                if (!lpFileOp->fAnyOperationsAborted) {
     298                        TRACE("File Copy:\n");
     299#ifdef __WIN32OS2__
     300                  while(pFrom[0]) {
     301#endif
     302                                if(!pTo[0]) break;
     303
     304                                TRACE("   From='%s' To='%s'\n", pFrom, pTo);
     305
     306                                if (Multi) {
     307// multi target, each one for one source. ? last
     308                                        pTempTo = DirForFileOperationA(pTo, &ToAttr, lpFileOp, FALSE);
     309                                        if (pTempTo) {
     310
     311                                                lenTo = strlen(pTempTo);
     312                                                withFileName = (((lenTo + 1) <  strlen(pTo)) || (PathIsRootA(pTo) && lenTo < strlen(pTo)));
     313                                                PathAddBackslashA(pTempTo);
     314                                        }
     315                                }
     316                                if (pTempTo) {
     317                                        lenTo = strlen(pTempTo);
     318                                        pToFile = &pTempTo[lenTo];
     319// target name in target or from source
     320                                        if (withFileName) {
     321                                           if ((pFrom[strlen(pFrom)+1]=='\0') ||
     322                                               (Multi && !(pTo[strlen(pTo)+1]=='\0'))) {
     323                                                pTempFrom = pTo;
     324                                           } else {
     325// more then one source for one targetfile
     326                                                lpFileOp->fAnyOperationsAborted=TRUE;
     327                                                break;
     328                                           } /* endif */
     329                                        } else {
     330                                                pTempFrom = pFrom;
     331                                        } /* endif */
     332// isolate target filename
     333                                        strcpy(pToFile,pTempFrom);
     334                                        PathRemoveFileSpecA(pToFile);
     335                                        PathAddBackslashA(pToFile);
     336                                        lenTo = strlen(pToFile);
     337
     338                                        strcpy(pToFile,&pTempFrom[lenTo]);
     339                                        FromAttr = GetFileAttributesA(pFrom);
     340                                        if (FromAttr & FILE_ATTRIBUTE_DIRECTORY) {
     341                                           if (!(FromAttr == -1)) {
     342                                                FIXME(__FUNCTION__" FO_COPY only with sourcedir not implemented ,stub\n");
     343                                           };
     344                                           lpFileOp->fAnyOperationsAborted=TRUE;
     345                                           break;
     346                                        }
     347                                        ToAttr = GetFileAttributesA(pTempTo);
     348                                        if (!(ToAttr == -1) && (ToAttr & FILE_ATTRIBUTE_DIRECTORY)) {
     349                                           lpFileOp->fAnyOperationsAborted=TRUE;
     350                                           break;
     351                                        }
     352// first try to copy
     353                                        copyOk = CopyFileA(pFrom, pTempTo, not_overwrite);
     354
     355                                        if (!copyOk && not_overwrite) {
     356                                                if (SHELL_ConfirmDialog (ASK_OVERWRITE_FILE, pTempTo))
     357// second try to copy after confirm
     358                                                        copyOk = CopyFileA(pFrom, pTempTo, FALSE);
     359                                        } /* endif */
     360                                        if (!copyOk) lpFileOp->fAnyOperationsAborted=TRUE;
     361// fix for mor then one source for one target
     362                                        pToFile[0] = '\0';
     363
     364                                        if (!withFileName && Multi && (pTo[strlen(pTo)+1]=='\0')) {
     365// Win Bug ?
     366                                                Multi = FALSE;
     367                                        } /* endif */
     368                                        if (Multi) HeapFree(GetProcessHeap(), 0, pTempTo);
     369                                }                               
     370
     371                                pFrom += strlen(pFrom) + 1;
     372                               
     373                                if (Multi) pTo += strlen(pTo) + 1;
     374
     375                        }
     376                } /* endif */
     377                if (!Multi && pTempTo) HeapFree(GetProcessHeap(), 0, pTempTo);
     378
     379                if (lpFileOp->fAnyOperationsAborted==TRUE) {
     380                        TRACE(__FUNCTION__" Setting AnyOpsAborted=TRUE\n");
     381                        return 0x75l;
     382                } else {
     383                      TRACE(__FUNCTION__" Setting AnyOpsAborted=FALSE\n");
     384                } /* endif */
     385                return 0;
     386#else
    169387                while(1) {
    170388                        if(!pFrom[0]) break;
     
    189407                lpFileOp->fAnyOperationsAborted=FALSE;
    190408                return 0;
     409#endif
    191410
    192411        case FO_DELETE:
  • trunk/src/shell32/shres.orc

    r5544 r5576  
    1 /* $Id: shres.orc,v 1.11 2001-04-19 08:32:18 sandervl Exp $ */
     1/* $Id: shres.orc,v 1.12 2001-04-23 10:47:23 sandervl Exp $ */
    22/*
    33 * Top level resource file for Common Dialogs
     
    142142        IDS_DELETEITEM_TEXT "Are you sure you want to delete '%1'?"
    143143        IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?"
     144#ifdef __WIN32OS2__
     145        IDS_OVERWRITEFILE_TEXT "OverWrite File %1?"
     146        IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite"
     147#endif
    144148}
    145149
     
    285289//#include "shell32_Sv.orc"
    286290//#include "shell32_Wa.orc"
     291
  • trunk/src/shell32/shresdef.h

    r5544 r5576  
    1 /* $Id: shresdef.h,v 1.8 2001-04-19 08:32:19 sandervl Exp $ */
     1/* $Id: shresdef.h,v 1.9 2001-04-23 10:47:23 sandervl Exp $ */
    22
    33/*
     
    4545#define IDS_DELETEITEM_TEXT     34
    4646#define IDS_DELETEMULTIPLE_TEXT 35
     47#ifdef __WIN32OS2__
     48#define IDS_OVERWRITEFILE_TEXT 36
     49#define IDS_OVERWRITEFILE_CAPTION 37
     50#endif
    4751
    4852#define IDS_SHV_INVALID_FILENAME_TITLE 28
     
    8185#endif /* __WINE_SHELL_RES_H */
    8286
     87
Note: See TracChangeset for help on using the changeset viewer.