VirtualBox

Ignore:
Timestamp:
Dec 7, 2017 1:02:36 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119483
Message:

IPRT/vfs: Implemented RTVFsFileSetSize, RTVfsFileGetMaxSize and RTvfsFileQueryMaxSize.

Location:
trunk/src/VBox/Runtime/common/vfs
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/vfs/vfsbase.cpp

    r69955 r69977  
    41964196
    41974197
     4198RTDECL(int)         RTVfsFileSetSize(RTVFSFILE hVfsFile, uint64_t cbSize, uint32_t fFlags)
     4199{
     4200    RTVFSFILEINTERNAL *pThis = hVfsFile;
     4201    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     4202    AssertReturn(pThis->uMagic == RTVFSFILE_MAGIC, VERR_INVALID_HANDLE);
     4203    AssertReturn(RTVFSFILE_SIZE_F_IS_VALID(fFlags), VERR_INVALID_FLAGS);
     4204    AssertReturn(pThis->Stream.fFlags & RTFILE_O_WRITE, VERR_ACCESS_DENIED);
     4205
     4206    int rc;
     4207    if (pThis->pOps->pfnSetSize)
     4208    {
     4209        RTVfsLockAcquireWrite(pThis->Stream.Base.hLock);
     4210        rc = pThis->pOps->pfnSetSize(pThis->Stream.Base.pvThis, cbSize, fFlags);
     4211        RTVfsLockReleaseWrite(pThis->Stream.Base.hLock);
     4212    }
     4213    else
     4214        rc = VERR_WRITE_PROTECT;
     4215    return rc;
     4216}
     4217
     4218
     4219RTDECL(RTFOFF)      RTVfsFileGetMaxSize(RTVFSFILE hVfsFile)
     4220{
     4221    uint64_t cbMax;
     4222    int rc = RTVfsFileQueryMaxSize(hVfsFile, &cbMax);
     4223    return RT_SUCCESS(rc) ? (RTFOFF)RT_MIN(cbMax, (uint64_t)RTFOFF_MAX) : -1;
     4224}
     4225
     4226
     4227RTDECL(int)         RTVfsFileQueryMaxSize(RTVFSFILE hVfsFile, uint64_t *pcbMax)
     4228{
     4229    RTVFSFILEINTERNAL *pThis = hVfsFile;
     4230    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     4231    AssertReturn(pThis->uMagic == RTVFSFILE_MAGIC, VERR_INVALID_HANDLE);
     4232    AssertPtrReturn(pcbMax, VERR_INVALID_POINTER);
     4233    *pcbMax = RTFOFF_MAX;
     4234
     4235    int rc;
     4236    if (pThis->pOps->pfnQueryMaxSize)
     4237    {
     4238        RTVfsLockAcquireWrite(pThis->Stream.Base.hLock);
     4239        rc = pThis->pOps->pfnQueryMaxSize(pThis->Stream.Base.pvThis, pcbMax);
     4240        RTVfsLockReleaseWrite(pThis->Stream.Base.hLock);
     4241    }
     4242    else
     4243        rc = VERR_WRITE_PROTECT;
     4244    return rc;
     4245}
     4246
     4247
    41984248RTDECL(uint64_t) RTVfsFileGetOpenFlags(RTVFSFILE hVfsFile)
    41994249{
  • trunk/src/VBox/Runtime/common/vfs/vfsmemory.cpp

    r69942 r69977  
    676676    PRTVFSMEMFILE pThis = (PRTVFSMEMFILE)pvThis;
    677677    *pcbFile = pThis->Base.ObjInfo.cbObject;
     678    return VINF_SUCCESS;
     679}
     680
     681
     682/**
     683 * @interface_method_impl{RTVFSFILEOPS,pfnSetSize}
     684 */
     685static DECLCALLBACK(int) rtVfsMemFile_SetSize(void *pvThis, uint64_t cbFile, uint32_t fFlags)
     686{
     687    NOREF(pvThis); NOREF(cbFile); NOREF(fFlags);
     688    AssertMsgFailed(("Lucky you! You get to implement this (or bug bird about it).\n"));
     689    return VERR_NOT_IMPLEMENTED;
     690}
     691
     692
     693/**
     694 * @interface_method_impl{RTVFSFILEOPS,pfnQueryMaxSize}
     695 */
     696static DECLCALLBACK(int) rtVfsMemFile_QueryMaxSize(void *pvThis, uint64_t *pcbMax)
     697{
     698    RT_NOREF(pvThis);
     699    *pcbMax = ~(size_t)0 >> 1;
    678700    return VINF_SUCCESS;
    679701}
     
    717739    rtVfsMemFile_Seek,
    718740    rtVfsMemFile_QuerySize,
     741    rtVfsMemFile_SetSize,
     742    rtVfsMemFile_QueryMaxSize,
    719743    RTVFSFILEOPS_VERSION
    720744};
  • trunk/src/VBox/Runtime/common/vfs/vfsprogress.cpp

    r69219 r69977  
    404404    return RTVfsFileGetSize(pThis->hVfsFile, pcbFile);
    405405}
     406
     407
     408/**
     409 * @interface_method_impl{RTVFSFILEOPS,pfnSetSize}
     410 */
     411static DECLCALLBACK(int) rtVfsProgressFile_SetSize(void *pvThis, uint64_t cbFile, uint32_t fFlags)
     412{
     413    PRTVFSPROGRESSFILE pThis = (PRTVFSPROGRESSFILE)pvThis;
     414    return RTVfsFileSetSize(pThis->hVfsFile, cbFile, fFlags);
     415}
     416
     417
     418/**
     419 * @interface_method_impl{RTVFSFILEOPS,pfnQueryMaxSize}
     420 */
     421static DECLCALLBACK(int) rtVfsProgressFile_QueryMaxSize(void *pvThis, uint64_t *pcbMax)
     422{
     423    PRTVFSPROGRESSFILE pThis = (PRTVFSPROGRESSFILE)pvThis;
     424    return RTVfsFileQueryMaxSize(pThis->hVfsFile, pcbMax);
     425}
     426
    406427
    407428
     
    443464    rtVfsProgressFile_Seek,
    444465    rtVfsProgressFile_QuerySize,
     466    rtVfsProgressFile_SetSize,
     467    rtVfsProgressFile_QueryMaxSize,
    445468    RTVFSFILEOPS_VERSION
    446469};
  • trunk/src/VBox/Runtime/common/vfs/vfsreadahead.cpp

    r69111 r69977  
    486486    RTCritSectEnter(&pThis->IoCritSect); /* paranoia */
    487487    int rc = RTVfsFileGetSize(pThis->hFile, pcbFile);
     488    RTCritSectLeave(&pThis->IoCritSect);
     489
     490    return rc;
     491}
     492
     493
     494/**
     495 * @interface_method_impl{RTVFSFILEOPS,pfnSetSize}
     496 */
     497static DECLCALLBACK(int) rtVfsReadAhead_SetSize(void *pvThis, uint64_t cbFile, uint32_t fFlags)
     498{
     499    PRTVFSREADAHEAD pThis = (PRTVFSREADAHEAD)pvThis;
     500    AssertReturn(pThis->hFile != NIL_RTVFSFILE, VERR_NOT_SUPPORTED);
     501
     502    RTCritSectEnter(&pThis->IoCritSect); /* paranoia */
     503    int rc = RTVfsFileSetSize(pThis->hFile, cbFile, fFlags);
     504    RTCritSectLeave(&pThis->IoCritSect);
     505
     506    return rc;
     507}
     508
     509
     510/**
     511 * @interface_method_impl{RTVFSFILEOPS,pfnQueryMaxSize}
     512 */
     513static DECLCALLBACK(int) rtVfsReadAhead_QueryMaxSize(void *pvThis, uint64_t *pcbMax)
     514{
     515    PRTVFSREADAHEAD pThis = (PRTVFSREADAHEAD)pvThis;
     516    AssertReturn(pThis->hFile != NIL_RTVFSFILE, VERR_NOT_SUPPORTED);
     517
     518    RTCritSectEnter(&pThis->IoCritSect); /* paranoia */
     519    int rc = RTVfsFileQueryMaxSize(pThis->hFile, pcbMax);
    488520    RTCritSectLeave(&pThis->IoCritSect);
    489521
     
    555587    rtVfsReadAhead_Seek,
    556588    rtVfsReadAhead_QuerySize,
     589    rtVfsReadAhead_SetSize,
     590    rtVfsReadAhead_QueryMaxSize,
    557591    RTVFSFILEOPS_VERSION
    558592};
  • trunk/src/VBox/Runtime/common/vfs/vfsstdfile.cpp

    r69592 r69977  
    384384    PRTVFSSTDFILE pThis = (PRTVFSSTDFILE)pvThis;
    385385    return RTFileGetSize(pThis->hFile, pcbFile);
     386}
     387
     388
     389/**
     390 * @interface_method_impl{RTVFSFILEOPS,pfnSetSize}
     391 */
     392static DECLCALLBACK(int) rtVfsStdFile_SetSize(void *pvThis, uint64_t cbFile, uint32_t fFlags)
     393{
     394    PRTVFSSTDFILE pThis = (PRTVFSSTDFILE)pvThis;
     395    switch (fFlags & RTVFSFILE_SIZE_F_ACTION_MASK)
     396    {
     397        case RTVFSFILE_SIZE_F_NORMAL:
     398            return RTFileSetSize(pThis->hFile, cbFile);
     399        case RTVFSFILE_SIZE_F_GROW:
     400            return RTFileSetAllocationSize(pThis->hFile, cbFile, RTFILE_ALLOC_SIZE_F_DEFAULT);
     401        case RTVFSFILE_SIZE_F_GROW_KEEP_SIZE:
     402            return RTFileSetAllocationSize(pThis->hFile, cbFile, RTFILE_ALLOC_SIZE_F_KEEP_SIZE);
     403        default:
     404            return VERR_NOT_SUPPORTED;
     405    }
     406}
     407
     408
     409/**
     410 * @interface_method_impl{RTVFSFILEOPS,pfnQueryMaxSize}
     411 */
     412static DECLCALLBACK(int) rtVfsStdFile_QueryMaxSize(void *pvThis, uint64_t *pcbMax)
     413{
     414    PRTVFSSTDFILE pThis = (PRTVFSSTDFILE)pvThis;
     415    RTFOFF cbMax = 0;
     416    int rc = RTFileGetMaxSizeEx(pThis->hFile, &cbMax);
     417    if (RT_SUCCESS(rc))
     418        *pcbMax = cbMax;
     419    return rc;
    386420}
    387421
     
    424458    rtVfsStdFile_Seek,
    425459    rtVfsStdFile_QuerySize,
     460    rtVfsStdFile_SetSize,
     461    rtVfsStdFile_QueryMaxSize,
    426462    RTVFSFILEOPS_VERSION
    427463};
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