VirtualBox

Ignore:
Timestamp:
Apr 12, 2024 8:51:39 AM (10 months ago)
Author:
vboxsync
Message:

Shared Clipboard/http-server: Cleaned up shClTransferHttpQueryInfo() a little. bugref:9437

File:
1 edited

Legend:

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

    r104305 r104306  
    465465    if (RT_SUCCESS(rc))
    466466    {
    467         char        *pszPath = RTUriParsedPath(pszUrl, &Parsed);
    468         AssertPtrReturn(pszPath, VERR_NO_MEMORY); /* Should be okay, as we succeeded RTUriParse() above. */
    469         size_t const cchPath = strlen(pszPath);
     467        char        *pszParsedPath = RTUriParsedPath(pszUrl, &Parsed);
     468        AssertPtrReturn(pszParsedPath, VERR_NO_MEMORY); /* Should be okay, as we succeeded RTUriParse() above. */
     469        size_t const cchParsedPath = strlen(pszParsedPath);
    470470
    471471        /* For now we only know the transfer -- now we need to figure out the entry we want to serve. */
     
    473473        if (pSrvTx)
    474474        {
    475             size_t const cchBase = strlen(pSrvTx->szPathVirtual) + 1 /* Skip slash separating the base from the rest */;
    476             AssertReturn(cchPath >= cchBase, VERR_INVALID_PARAMETER);
    477 
    478             SHCLOBJOPENCREATEPARMS openParms;
    479             rc = ShClTransferObjOpenParmsInit(&openParms);
     475            size_t const cchRoot = strlen(pSrvTx->szPathVirtual) + 1 /* Skip slash separating the base from the rest */;
     476            AssertStmt(cchParsedPath >= cchRoot, rc = VERR_INVALID_PARAMETER);
     477            const char  *pszRoot = pszParsedPath + cchRoot; /* Marks the actual root path. */
     478            AssertStmt(RT_VALID_PTR(pszRoot), rc = VERR_INVALID_POINTER);
     479            AssertStmt(*pszRoot != '\0',      rc = VERR_INVALID_PARAMETER);
     480
    480481            if (RT_SUCCESS(rc))
    481482            {
    482                 openParms.fCreate = SHCL_OBJ_CF_ACCESS_READ
    483                                   | SHCL_OBJ_CF_ACCESS_DENYWRITE;
    484 
    485                 PSHCLTRANSFER pTx = pSrvTx->pTransfer;
    486                 AssertPtr(pTx);
    487 
    488                 rc = VERR_NOT_FOUND; /* Must find the matching root entry first. */
    489 
    490                 uint64_t const cRoots = ShClTransferRootsCount(pTx);
    491                 for (uint32_t i = 0; i < cRoots; i++)
     483                SHCLOBJOPENCREATEPARMS openParms;               
     484                rc = ShClTransferObjOpenParmsInit(&openParms);
     485                if (RT_SUCCESS(rc))
    492486                {
    493                     PCSHCLLISTENTRY pEntry = ShClTransferRootsEntryGet(pTx, i);
    494                     AssertPtrBreakStmt(pEntry, rc = VERR_NOT_FOUND);
    495 
    496                     Log3Func(("pszPath=%s vs. pEntry=%s\n", pszPath, pEntry->pszName));
    497 
    498                     if (RTStrCmp(pEntry->pszName, pszPath + cchBase)) /* Case-sensitive! */
    499                         continue;
    500 
    501                     rc = RTStrCopy(openParms.pszPath, openParms.cbPath, pEntry->pszName);
    502                     if (RT_SUCCESS(rc))
     487                    openParms.fCreate = SHCL_OBJ_CF_ACCESS_READ
     488                                      | SHCL_OBJ_CF_ACCESS_DENYWRITE;
     489
     490                    PSHCLTRANSFER pTx = pSrvTx->pTransfer;
     491                    AssertPtr(pTx);
     492
     493                    rc = VERR_NOT_FOUND; /* Must find the matching root entry first. */
     494
     495                    Log3Func(("pszParsedPath=%s\n", pszParsedPath));
     496
     497                    uint64_t const cRoots = ShClTransferRootsCount(pTx);
     498                    for (uint32_t i = 0; i < cRoots; i++)
    503499                    {
    504                         rc = ShClTransferObjOpen(pTx, &openParms, &pSrvTx->hObj);
     500                        PCSHCLLISTENTRY pEntry = ShClTransferRootsEntryGet(pTx, i);
     501                        AssertPtrBreakStmt(pEntry, rc = VERR_NOT_FOUND);
     502
     503                        Log3Func(("pszRoot=%s vs. pEntry=%s\n", pszRoot, pEntry->pszName));
     504
     505                        if (RTStrCmp(pszRoot, pEntry->pszName)) /* Case-sensitive! */
     506                            continue;
     507
     508                        rc = RTStrCopy(openParms.pszPath, openParms.cbPath, pEntry->pszName);
    505509                        if (RT_SUCCESS(rc))
    506510                        {
    507                             rc = VERR_NOT_SUPPORTED; /* Play safe by default. */
    508 
    509                             if (   pEntry->fInfo & VBOX_SHCL_INFO_F_FSOBJINFO
    510                                 && pEntry->cbInfo == sizeof(SHCLFSOBJINFO))
     511                            rc = ShClTransferObjOpen(pTx, &openParms, &pSrvTx->hObj);
     512                            if (RT_SUCCESS(rc))
    511513                            {
    512                                 PCSHCLFSOBJINFO pSrcObjInfo = (PSHCLFSOBJINFO)pEntry->pvInfo;
    513 
    514                                 LogFlowFunc(("pszName=%s, cbInfo=%RU32, fMode=%#x (type %#x)\n",
    515                                              pEntry->pszName, pEntry->cbInfo, pSrcObjInfo->Attr.fMode, (pSrcObjInfo->Attr.fMode & RTFS_TYPE_MASK)));
    516 
    517                                 LogRel2(("Shared Clipboard: HTTP object info: fMode=%#x, cbObject=%zu\n", pSrcObjInfo->Attr.fMode, pSrcObjInfo->cbObject));
    518 
    519                                 if (RTFS_IS_FILE(pSrcObjInfo->Attr.fMode))
     514                                rc = VERR_NOT_SUPPORTED; /* Play safe by default. */
     515
     516                                if (   pEntry->fInfo & VBOX_SHCL_INFO_F_FSOBJINFO
     517                                    && pEntry->cbInfo == sizeof(SHCLFSOBJINFO))
    520518                                {
    521                                     memcpy(pObjInfo, pSrcObjInfo, sizeof(SHCLFSOBJINFO));
    522                                     rc = VINF_SUCCESS;
     519                                    PCSHCLFSOBJINFO pSrcObjInfo = (PSHCLFSOBJINFO)pEntry->pvInfo;
     520
     521                                    LogFlowFunc(("pszName=%s, cbInfo=%RU32, fMode=%#x (type %#x)\n",
     522                                                 pEntry->pszName, pEntry->cbInfo, pSrcObjInfo->Attr.fMode, (pSrcObjInfo->Attr.fMode & RTFS_TYPE_MASK)));
     523
     524                                    LogRel2(("Shared Clipboard: HTTP object info: fMode=%#x, cbObject=%zu\n", pSrcObjInfo->Attr.fMode, pSrcObjInfo->cbObject));
     525
     526                                    if (RTFS_IS_FILE(pSrcObjInfo->Attr.fMode))
     527                                    {
     528                                        memcpy(pObjInfo, pSrcObjInfo, sizeof(SHCLFSOBJINFO));
     529                                        rc = VINF_SUCCESS;
     530                                    }
    523531                                }
     532                                else
     533                                    LogRel2(("Shared Clipboard: Supplied entry information for '%s' not supported (fInfo=%#x, cbInfo=%RU32\n",
     534                                             pEntry->pszName, pEntry->fInfo, pEntry->cbInfo));
     535                                /* Note: Directories / symlinks or other fancy stuff is not supported here (yet) -- would require using WebDAV. */                           
    524536                            }
    525                             else
    526                                 LogRel2(("Shared Clipboard: Supplied entry information for '%s' not supported (fInfo=%#x, cbInfo=%RU32\n",
    527                                          pEntry->pszName, pEntry->fInfo, pEntry->cbInfo));
    528537                        }
    529                         /* Note: Directories are not supported here (yet) -- would require using WebDAV. */
     538
     539                        break;
    530540                    }
    531541
    532                     break;
     542                    ShClTransferObjOpenParmsDestroy(&openParms);
    533543                }
    534 
    535                 ShClTransferObjOpenParmsDestroy(&openParms);
    536544            }
    537545
    538             RTStrFree(pszPath);
    539             pszPath = NULL;
     546            RTStrFree(pszParsedPath);
     547            pszParsedPath = NULL;
    540548        }
    541549        else
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