VirtualBox

Changeset 82465 in vbox


Ignore:
Timestamp:
Dec 6, 2019 3:44:15 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135316
Message:

Shared Clipboard/Transfers: Reduced SHCL_OBJ_CF_ flags / options to a bare minimum.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/GuestHost/SharedClipboard-transfers.h

    r81768 r82465  
    111111#define SHCL_OBJ_CF_DIRECTORY             (0x00000004)
    112112
    113 /** Open/create action to do if object exists
    114  *  and if the object does not exists.
    115  *  REPLACE file means atomically DELETE and CREATE.
    116  *  OVERWRITE file means truncating the file to 0 and
    117  *  setting new size.
    118  *  When opening an existing directory REPLACE and OVERWRITE
    119  *  actions are considered invalid, and cause returning
    120  *  FILE_EXISTS with NIL handle.
    121  */
    122 #define SHCL_OBJ_CF_ACT_MASK_IF_EXISTS      (0x000000F0)
    123 #define SHCL_OBJ_CF_ACT_MASK_IF_NEW         (0x00000F00)
    124 
    125 /** What to do if object exists. */
    126 #define SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS      (0x00000000)
    127 #define SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS      (0x00000010)
    128 #define SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS   (0x00000020)
    129 #define SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS (0x00000030)
    130 
    131 /** What to do if object does not exist. */
    132 #define SHCL_OBJ_CF_ACT_CREATE_IF_NEW       (0x00000000)
    133 #define SHCL_OBJ_CF_ACT_FAIL_IF_NEW         (0x00000100)
    134 
    135113/** Read/write requested access for the object. */
    136 #define SHCL_OBJ_CF_ACCESS_MASK_RW          (0x00003000)
     114#define SHCL_OBJ_CF_ACCESS_MASK_RW          (0x00001000)
    137115
    138116/** No access requested. */
     
    140118/** Read access requested. */
    141119#define SHCL_OBJ_CF_ACCESS_READ             (0x00001000)
    142 /** Write access requested. */
    143 #define SHCL_OBJ_CF_ACCESS_WRITE            (0x00002000)
    144 /** Read/Write access requested. */
    145 #define SHCL_OBJ_CF_ACCESS_READWRITE        (SHCL_OBJ_CF_ACCESS_READ | SHCL_OBJ_CF_ACCESS_WRITE)
    146120
    147121/** Requested share access for the object. */
     
    164138/** Read access requested. */
    165139#define SHCL_OBJ_CF_ACCESS_ATTR_READ        (0x00010000)
    166 /** Write access requested. */
    167 #define SHCL_OBJ_CF_ACCESS_ATTR_WRITE       (0x00020000)
    168 /** Read/Write access requested. */
    169 #define SHCL_OBJ_CF_ACCESS_ATTR_READWRITE   (SHCL_OBJ_CF_ACCESS_ATTR_READ | SHCL_OBJ_CF_ACCESS_ATTR_WRITE)
    170 
    171 /** The file is opened in append mode. Ignored if SHCL_OBJ_CF_ACCESS_WRITE is not set. */
    172 #define SHCL_OBJ_CF_ACCESS_APPEND           (0x00040000)
    173140
    174141/** @} */
    175142
    176 /** Result of an open/create request.
     143/** Result of an open request.
    177144 *  Along with handle value the result code
    178145 *  identifies what has happened while
     
    186153    /** Path to file exists, but the last component does not. */
    187154    SHCL_CREATERESULT_FILE_NOT_FOUND,
    188     /** File already exists and either has been opened or not. */
    189     SHCL_CREATERESULT_FILE_EXISTS,
    190     /** New file was created. */
    191     SHCL_CREATERESULT_FILE_CREATED,
    192     /** Existing file was replaced or overwritten. */
    193     SHCL_CREATERESULT_FILE_REPLACED,
    194155    /** Blow the type up to 32-bit. */
    195156    SHCL_CREATERESULT_32BIT_HACK = 0x7fffffff
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r82462 r82465  
    815815    if (pTransfer->State.enmSource == SHCLSOURCE_LOCAL)
    816816    {
    817         /*
    818          * Make sure the transfer direction matches the open/create parameters.
    819          */
    820         if (pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE)
    821         {
    822             if (pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_READ) /* Read access wanted? */
     817        PSHCLOBJHANDLEINFO pInfo
     818            = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
     819        if (pInfo)
     820        {
     821            rc = ShClTransferObjHandleInfoInit(pInfo);
     822            if (RT_SUCCESS(rc))
    823823            {
    824                 AssertMsgFailed(("Is not a write transfer, but object open flags are set to read access (0x%x)\n",
    825                                  pOpenCreateParms->fCreate)); /* Should never happen. */
    826                 rc = VERR_INVALID_PARAMETER;
    827             }
    828         }
    829         else if (pTransfer->State.enmDir == SHCLTRANSFERDIR_TO_REMOTE)
    830         {
    831             if (pOpenCreateParms->fCreate & SHCL_OBJ_CF_ACCESS_WRITE) /* Write access wanted? */
    832             {
    833                 AssertMsgFailed(("Is not a read transfer, but object open flags are set to write access (0x%x)\n",
    834                                  pOpenCreateParms->fCreate)); /* Should never happen. */
    835                 rc = VERR_INVALID_PARAMETER;
    836             }
    837         }
    838         else
    839         {
    840             AssertFailed();
    841             rc = VERR_NOT_SUPPORTED;
    842         }
    843 
    844         if (RT_SUCCESS(rc))
    845         {
    846             PSHCLOBJHANDLEINFO pInfo
    847                 = (PSHCLOBJHANDLEINFO)RTMemAllocZ(sizeof(SHCLOBJHANDLEINFO));
    848             if (pInfo)
    849             {
    850                 rc = ShClTransferObjHandleInfoInit(pInfo);
     824
     825                /* Only if this is a read transfer (locally) we're able to actually write to files
     826                 * (we're reading from the source). */
     827                const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE;
     828
     829                uint64_t fOpen;
     830                rc = shClConvertFileCreateFlags(fWritable,
     831                                                pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
     832                                                SHCLOBJHANDLE_INVALID, &fOpen);
    851833                if (RT_SUCCESS(rc))
    852834                {
    853 
    854                     /* Only if this is a read transfer (locally) we're able to actually write to files
    855                      * (we're reading from the source). */
    856                     const bool fWritable = pTransfer->State.enmDir == SHCLTRANSFERDIR_FROM_REMOTE;
    857 
    858                     uint64_t fOpen;
    859                     rc = shClConvertFileCreateFlags(fWritable,
    860                                                     pOpenCreateParms->fCreate, pOpenCreateParms->ObjInfo.Attr.fMode,
    861                                                     SHCLOBJHANDLE_INVALID, &fOpen);
     835                    rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */,
     836                                                    &pInfo->pszPathLocalAbs);
    862837                    if (RT_SUCCESS(rc))
    863838                    {
    864                         rc = shClTransferResolvePathAbs(pTransfer, pOpenCreateParms->pszPath, 0 /* fFlags */,
    865                                                         &pInfo->pszPathLocalAbs);
     839                        rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
    866840                        if (RT_SUCCESS(rc))
    867841                        {
    868                             rc = RTFileOpen(&pInfo->u.Local.hFile, pInfo->pszPathLocalAbs, fOpen);
    869                             if (RT_SUCCESS(rc))
    870                             {
    871                                 LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
    872                             }
    873                             else
    874                                 LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
     842                            LogRel2(("Shared Clipboard: Opened file '%s'\n", pInfo->pszPathLocalAbs));
    875843                        }
     844                        else
     845                            LogRel(("Shared Clipboard: Error opening file '%s', rc=%Rrc\n", pInfo->pszPathLocalAbs, rc));
    876846                    }
    877847                }
    878 
    879                 if (RT_SUCCESS(rc))
    880                 {
    881                     pInfo->hObj    = pTransfer->uObjHandleNext++;
    882                     pInfo->enmType = SHCLOBJTYPE_FILE;
    883 
    884                     RTListAppend(&pTransfer->lstObj, &pInfo->Node);
    885                     pTransfer->cObjHandles++;
    886 
    887                     LogFlowFunc(("cObjHandles=%RU32\n", pTransfer->cObjHandles));
    888 
    889                     *phObj = pInfo->hObj;
    890                 }
    891                 else
    892                 {
    893                     ShClTransferObjHandleInfoDestroy(pInfo);
    894                     RTMemFree(pInfo);
    895                 }
     848            }
     849
     850            if (RT_SUCCESS(rc))
     851            {
     852                pInfo->hObj    = pTransfer->uObjHandleNext++;
     853                pInfo->enmType = SHCLOBJTYPE_FILE;
     854
     855                RTListAppend(&pTransfer->lstObj, &pInfo->Node);
     856                pTransfer->cObjHandles++;
     857
     858                LogFlowFunc(("cObjHandles=%RU32\n", pTransfer->cObjHandles));
     859
     860                *phObj = pInfo->hObj;
    896861            }
    897862            else
    898                 rc = VERR_NO_MEMORY;
    899         }
     863            {
     864                ShClTransferObjHandleInfoDestroy(pInfo);
     865                RTMemFree(pInfo);
     866            }
     867        }
     868        else
     869            rc = VERR_NO_MEMORY;
    900870    }
    901871    else if (pTransfer->State.enmSource == SHCLSOURCE_REMOTE)
     
    30983068    {
    30993069        default:
     3070            RT_FALL_THROUGH();
    31003071        case SHCL_OBJ_CF_ACCESS_NONE:
    31013072        {
     
    31163087            break;
    31173088        }
    3118 
    3119         case SHCL_OBJ_CF_ACCESS_WRITE:
    3120         {
    3121             fOpen |= RTFILE_O_WRITE;
    3122             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_WRITE\n"));
    3123             break;
    3124         }
    3125 
    3126         case SHCL_OBJ_CF_ACCESS_READWRITE:
    3127         {
    3128             fOpen |= RTFILE_O_READWRITE;
    3129             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_READWRITE\n"));
    3130             break;
    3131         }
    3132     }
    3133 
    3134     if (fShClFlags & SHCL_OBJ_CF_ACCESS_APPEND)
    3135     {
    3136         fOpen |= RTFILE_O_APPEND;
    31373089    }
    31383090
     
    31403092    {
    31413093        default:
     3094            RT_FALL_THROUGH();
    31423095        case SHCL_OBJ_CF_ACCESS_ATTR_NONE:
    31433096        {
     
    31513104            fOpen |= RTFILE_O_ACCESS_ATTR_READ;
    31523105            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READ\n"));
    3153             break;
    3154         }
    3155 
    3156         case SHCL_OBJ_CF_ACCESS_ATTR_WRITE:
    3157         {
    3158             fOpen |= RTFILE_O_ACCESS_ATTR_WRITE;
    3159             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_WRITE\n"));
    3160             break;
    3161         }
    3162 
    3163         case SHCL_OBJ_CF_ACCESS_ATTR_READWRITE:
    3164         {
    3165             fOpen |= RTFILE_O_ACCESS_ATTR_READWRITE;
    3166             LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READWRITE\n"));
    31673106            break;
    31683107        }
     
    31923131            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYALL\n"));
    31933132            break;
    3194     }
    3195 
    3196     /* Open/Create action mask */
    3197     switch ((fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_EXISTS))
    3198     {
    3199         case SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS:
    3200             if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3201             {
    3202                 fOpen |= RTFILE_O_OPEN_CREATE;
    3203                 LogFlowFunc(("SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));
    3204             }
    3205             else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3206             {
    3207                 fOpen |= RTFILE_O_OPEN;
    3208                 LogFlowFunc(("SHCL_OBJ_CF_ACT_OPEN_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));
    3209             }
    3210             else
    3211             {
    3212                 LogFlowFunc(("invalid open/create action combination\n"));
    3213                 rc = VERR_INVALID_PARAMETER;
    3214             }
    3215             break;
    3216         case SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS:
    3217             if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3218             {
    3219                 fOpen |= RTFILE_O_CREATE;
    3220                 LogFlowFunc(("SHCL_OBJ_CF_ACT_FAIL_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));
    3221             }
    3222             else
    3223             {
    3224                 LogFlowFunc(("invalid open/create action combination\n"));
    3225                 rc = VERR_INVALID_PARAMETER;
    3226             }
    3227             break;
    3228         case SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS:
    3229             if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3230             {
    3231                 fOpen |= RTFILE_O_CREATE_REPLACE;
    3232                 LogFlowFunc(("SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));
    3233             }
    3234             else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3235             {
    3236                 fOpen |= RTFILE_O_OPEN | RTFILE_O_TRUNCATE;
    3237                 LogFlowFunc(("SHCL_OBJ_CF_ACT_REPLACE_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));
    3238             }
    3239             else
    3240             {
    3241                 LogFlowFunc(("invalid open/create action combination\n"));
    3242                 rc = VERR_INVALID_PARAMETER;
    3243             }
    3244             break;
    3245         case SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS:
    3246             if (SHCL_OBJ_CF_ACT_CREATE_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3247             {
    3248                 fOpen |= RTFILE_O_CREATE_REPLACE;
    3249                 LogFlowFunc(("SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS and SHCL_OBJ_CF_ACT_CREATE_IF_NEW\n"));
    3250             }
    3251             else if (SHCL_OBJ_CF_ACT_FAIL_IF_NEW == (fShClFlags & SHCL_OBJ_CF_ACT_MASK_IF_NEW))
    3252             {
    3253                 fOpen |= RTFILE_O_OPEN | RTFILE_O_TRUNCATE;
    3254                 LogFlowFunc(("SHCL_OBJ_CF_ACT_OVERWRITE_IF_EXISTS and SHCL_OBJ_CF_ACT_FAIL_IF_NEW\n"));
    3255             }
    3256             else
    3257             {
    3258                 LogFlowFunc(("invalid open/create action combination\n"));
    3259                 rc = VERR_INVALID_PARAMETER;
    3260             }
    3261             break;
    3262         default:
    3263         {
    3264             rc = VERR_INVALID_PARAMETER;
    3265             LogFlowFunc(("SHCL_OBJ_CF_ACT_MASK_IF_EXISTS - invalid parameter\n"));
    3266             break;
    3267         }
    32683133    }
    32693134
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette