VirtualBox

Ignore:
Timestamp:
Jul 10, 2023 2:53:16 PM (19 months ago)
Author:
vboxsync
Message:

Shared Clipboard: Renamed shClConvertFileCreateFlags() -> ShClTransferConvertFileCreateFlags() and moved ShClTransferConvertFileCreateFlags() + ShClTransferResolvePathAbs() to the generic transfers module. bugref:9437

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r100426 r100467  
    31383138}
    31393139
     3140/**
     3141 * Resolves a relative path of a specific transfer to its absolute path.
     3142 *
     3143 * @returns VBox status code.
     3144 * @param   pTransfer           Clipboard transfer to resolve path for.
     3145 * @param   pszPath             Relative path to resolve.
     3146 *                              Paths have to end with a (back-)slash, otherwise this is considered to be a file.
     3147 * @param   fFlags              Resolve flags. Currently not used and must be 0.
     3148 * @param   ppszResolved        Where to store the allocated resolved path. Must be free'd by the called using RTStrFree().
     3149 */
     3150int ShClTransferResolvePathAbs(PSHCLTRANSFER pTransfer, const char *pszPath, uint32_t fFlags, char **ppszResolved)
     3151{
     3152    AssertPtrReturn(pTransfer,    VERR_INVALID_POINTER);
     3153    AssertPtrReturn(pszPath,      VERR_INVALID_POINTER);
     3154    AssertReturn   (fFlags == 0,  VERR_INVALID_PARAMETER);
     3155    AssertPtrReturn(ppszResolved, VERR_INVALID_POINTER);
     3156
     3157    LogFlowFunc(("pszPath=%s, fFlags=%#x (pszPathRootAbs=%s, cRootListEntries=%RU64)\n",
     3158                 pszPath, fFlags, pTransfer->pszPathRootAbs, pTransfer->lstRoots.Hdr.cEntries));
     3159
     3160    int rc = ShClTransferValidatePath(pszPath, false /* fMustExist */);
     3161    if (RT_SUCCESS(rc))
     3162    {
     3163        rc = VERR_PATH_NOT_FOUND; /* Play safe by default. */
     3164
     3165        PSHCLLISTENTRY pEntry;
     3166        RTListForEach(&pTransfer->lstRoots.lstEntries, pEntry, SHCLLISTENTRY, Node)
     3167        {
     3168            LogFlowFunc(("\tpEntry->pszName=%s\n", pEntry->pszName));
     3169
     3170            if (RTStrStartsWith(pszPath, pEntry->pszName)) /* Case-sensitive! */
     3171            {
     3172                rc = VINF_SUCCESS;
     3173                break;
     3174            }
     3175        }
     3176
     3177        if (RT_SUCCESS(rc))
     3178        {
     3179            char *pszPathAbs = RTPathJoinA(pTransfer->pszPathRootAbs, pszPath);
     3180            if (pszPathAbs)
     3181            {
     3182                char   szResolved[RTPATH_MAX];
     3183                size_t cbResolved = sizeof(szResolved);
     3184                rc = RTPathAbsEx(pTransfer->pszPathRootAbs, pszPathAbs, RTPATH_STR_F_STYLE_HOST, szResolved, &cbResolved);
     3185
     3186                RTStrFree(pszPathAbs);
     3187                pszPathAbs = NULL;
     3188
     3189                if (RT_SUCCESS(rc))
     3190                {
     3191                    LogRel2(("Shared Clipboard: Resolved: '%s' -> '%s'\n", pszPath, szResolved));
     3192
     3193                    *ppszResolved = RTStrDup(szResolved);
     3194                }
     3195            }
     3196            else
     3197                rc = VERR_NO_MEMORY;
     3198        }
     3199    }
     3200
     3201    if (RT_FAILURE(rc))
     3202        LogRel(("Shared Clipboard: Resolving absolute path for '%s' failed, rc=%Rrc\n", pszPath, rc));
     3203
     3204    LogFlowFuncLeaveRC(rc);
     3205    return rc;
     3206}
     3207
     3208/**
     3209 * Converts Shared Clipboard create flags (see SharedClipboard-transfers.h) into IPRT create flags.
     3210 *
     3211 * @returns IPRT status code.
     3212 * @param       fShClFlags  Shared clipboard create flags.
     3213 * @param[out]  pfOpen      Where to store the RTFILE_O_XXX flags for
     3214 *                          RTFileOpen.
     3215 *
     3216 * @sa Initially taken from vbsfConvertFileOpenFlags().
     3217 */
     3218int ShClTransferConvertFileCreateFlags(uint32_t fShClFlags, uint64_t *pfOpen)
     3219{
     3220    AssertMsgReturnStmt(!(fShClFlags & ~SHCL_OBJ_CF_VALID_MASK), ("%#x4\n", fShClFlags), *pfOpen = 0, VERR_INVALID_FLAGS);
     3221
     3222    uint64_t fOpen = 0;
     3223
     3224    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_RW)
     3225    {
     3226        case SHCL_OBJ_CF_ACCESS_NONE:
     3227        {
     3228#ifdef RT_OS_WINDOWS
     3229            if ((fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR) != SHCL_OBJ_CF_ACCESS_ATTR_NONE)
     3230                fOpen |= RTFILE_O_OPEN | RTFILE_O_ATTR_ONLY;
     3231            else
     3232#endif
     3233                fOpen |= RTFILE_O_OPEN | RTFILE_O_READ;
     3234            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_NONE\n"));
     3235            break;
     3236        }
     3237
     3238        case SHCL_OBJ_CF_ACCESS_READ:
     3239        {
     3240            fOpen |= RTFILE_O_OPEN | RTFILE_O_READ;
     3241            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_READ\n"));
     3242            break;
     3243        }
     3244
     3245        default:
     3246            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     3247    }
     3248
     3249    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_ATTR)
     3250    {
     3251        case SHCL_OBJ_CF_ACCESS_ATTR_NONE:
     3252        {
     3253            fOpen |= RTFILE_O_ACCESS_ATTR_DEFAULT;
     3254            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_NONE\n"));
     3255            break;
     3256        }
     3257
     3258        case SHCL_OBJ_CF_ACCESS_ATTR_READ:
     3259        {
     3260            fOpen |= RTFILE_O_ACCESS_ATTR_READ;
     3261            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_ATTR_READ\n"));
     3262            break;
     3263        }
     3264
     3265        default:
     3266            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     3267    }
     3268
     3269    /* Sharing mask */
     3270    switch (fShClFlags & SHCL_OBJ_CF_ACCESS_MASK_DENY)
     3271    {
     3272        case SHCL_OBJ_CF_ACCESS_DENYNONE:
     3273            fOpen |= RTFILE_O_DENY_NONE;
     3274            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYNONE\n"));
     3275            break;
     3276
     3277        case SHCL_OBJ_CF_ACCESS_DENYWRITE:
     3278            fOpen |= RTFILE_O_DENY_WRITE;
     3279            LogFlowFunc(("SHCL_OBJ_CF_ACCESS_DENYWRITE\n"));
     3280            break;
     3281
     3282        default:
     3283            AssertFailedReturn(VERR_IPE_NOT_REACHED_DEFAULT_CASE);
     3284    }
     3285
     3286    *pfOpen = fOpen;
     3287
     3288    LogFlowFuncLeaveRC(VINF_SUCCESS);
     3289    return VINF_SUCCESS;
     3290}
     3291
Note: See TracChangeset for help on using the changeset viewer.

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