VirtualBox

Changeset 87068 in vbox


Ignore:
Timestamp:
Dec 9, 2020 2:53:08 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
141837
Message:

Shared Clipboard/Transfers: More code for HTTP instance creation / destruction. bugref:9874

Location:
trunk
Files:
3 edited

Legend:

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

    r87067 r87068  
    913913int ShClTransferHttpServerCreateEx(PSHCLHTTPSERVER pSrv, uint16_t uPort);
    914914int ShClTransferHttpServerDestroy(PSHCLHTTPSERVER pSrv);
     915void ShClTransferHttpServerInit(PSHCLHTTPSERVER pSrv);
    915916int ShClTransferHttpServerRegisterTransfer(PSHCLHTTPSERVER pSrv, PSHCLTRANSFER pTransfer);
    916917int ShClTransferHttpServerUnregisterTransfer(PSHCLHTTPSERVER pSrv, PSHCLTRANSFER pTransfer);
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers-http.cpp

    r87067 r87068  
    182182}
    183183
     184/**
     185 * Destroys a Shared Clipboard HTTP server instance, internal version.
     186 *
     187 * @returns VBox status code.
     188 * @param   pSrv                Shared Clipboard HTTP server instance to destroy.
     189 */
    184190int shClTransferHttpServerDestroyInternal(PSHCLHTTPSERVER pSrv)
    185191{
     
    195201    RTHttpServerResponseDestroy(&pSrv->Resp);
    196202
     203    pSrv->hHTTPServer = NIL_RTHTTPSERVER;
     204
    197205    return RTCritSectDelete(&pSrv->CritSect);
    198206}
    199207
     208/**
     209 * Locks the critical section of a Shared Clipboard HTTP server instance.
     210 *
     211 * @param   pSrv                Shared Clipboard HTTP server instance to lock.
     212 */
    200213DECLINLINE(void) shClTransferHttpServerLock(PSHCLHTTPSERVER pSrv)
    201214{
     
    204217}
    205218
     219/**
     220 * Unlocks the critical section of a Shared Clipboard HTTP server instance.
     221 *
     222 * @param   pSrv                Shared Clipboard HTTP server instance to unlock.
     223 */
    206224DECLINLINE(void) shClTransferHttpServerUnlock(PSHCLHTTPSERVER pSrv)
    207225{
     
    209227    AssertRC(rc2);
    210228}
    211 
    212 
    213 /*********************************************************************************************************************************
    214 *   Public functions                                                                                                             *
    215 *********************************************************************************************************************************/
    216229
    217230/**
     
    230243}
    231244
     245
     246/*********************************************************************************************************************************
     247*   Public functions                                                                                                             *
     248*********************************************************************************************************************************/
     249
     250/**
     251 * Initializes a new Shared Clipboard HTTP server instance.
     252 *
     253 * @param   pSrv                HTTP server instance to initialize.
     254 */
     255void ShClTransferHttpServerInit(PSHCLHTTPSERVER pSrv)
     256{
     257    AssertPtrReturnVoid(pSrv);
     258
     259    shClTransferHttpServerInitInternal(pSrv);
     260}
     261
    232262/**
    233263 * Creates a new Shared Clipboard HTTP server instance, extended version.
     
    240270{
    241271    AssertPtrReturn(pSrv, VERR_INVALID_POINTER);
    242 
    243     shClTransferHttpServerInitInternal(pSrv);
    244272
    245273    RTHTTPSERVERCALLBACKS Callbacks;
     
    374402            AssertReturn(cch, VERR_BUFFER_OVERFLOW);
    375403
     404            pSrvTx->pTransfer = pTransfer;
     405
    376406            RTListAppend(&pSrv->lstTransfers, &pSrvTx->Node);
    377 
    378407            pSrv->cTransfers++;
     408
     409            LogFunc(("pTransfer=%p, idTransfer=%RU16, szPath=%s -> %RU32 transfers\n",
     410                     pSrvTx->pTransfer, pSrvTx->pTransfer->State.uID, pSrvTx->szPathVirtual, pSrv->cTransfers));
     411
     412            LogRel2(("Shared Clipboard: Registered HTTP transfer %RU16, now %RU32 HTTP transfers total\n",
     413                     pTransfer->State.uID, pSrv->cTransfers));
    379414        }
    380415    }
     
    385420    shClTransferHttpServerUnlock(pSrv);
    386421
     422    LogFlowFuncLeaveRC(rc);
    387423    return rc;
    388424}
     
    403439
    404440    AssertReturn(pSrv->cTransfers, VERR_WRONG_ORDER);
     441
     442    int rc = VINF_SUCCESS;
    405443
    406444    PSHCLHTTPSERVERTRANSFER pSrvTx;
     
    418456            pSrv->cTransfers--;
    419457
    420             shClTransferHttpServerUnlock(pSrv);
    421             return VINF_SUCCESS;
     458            LogFunc(("pTransfer=%p, idTransfer=%RU16, szPath=%s -> %RU32 transfers\n",
     459                     pSrvTx->pTransfer, pSrvTx->pTransfer->State.uID, pSrvTx->szPathVirtual, pSrv->cTransfers));
     460
     461            LogRel2(("Shared Clipboard: Unregistered HTTP transfer %RU16, now %RU32 HTTP transfers total\n",
     462                     pTransfer->State.uID, pSrv->cTransfers));
     463
     464            rc = VINF_SUCCESS;
     465            break;
    422466        }
    423467    }
    424468
    425469    shClTransferHttpServerUnlock(pSrv);
    426     return VERR_NOT_FOUND;
     470
     471    LogFlowFuncLeaveRC(rc);
     472    return rc;
    427473}
    428474
  • trunk/src/VBox/GuestHost/SharedClipboard/clipboard-transfers.cpp

    r87036 r87068  
    11421142
    11431143/**
    1144  * Creates an Clipboard transfer.
     1144 * Creates a clipboard transfer.
    11451145 *
    11461146 * @returns VBox status code.
     
    12081208
    12091209/**
    1210  * Destroys an Clipboard transfer context struct.
     1210 * Destroys a clipboard transfer context struct.
    12111211 *
    12121212 * @returns VBox status code.
     
    26602660        RT_ZERO(pTransferCtx->bmTransferIds);
    26612661
     2662#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP
     2663        ShClTransferHttpServerInit(&pTransferCtx->HttpServer);
     2664#endif
    26622665        ShClTransferCtxReset(pTransferCtx);
    26632666    }
     
    27092712    RTListForEach(&pTransferCtx->List, pTransfer, SHCLTRANSFER, Node)
    27102713        ShClTransferReset(pTransfer);
     2714
     2715#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP
     2716    /* @todo Anything to do here? */
     2717#endif
    27112718}
    27122719
     
    28132820    pTransferCtx->cTransfers++;
    28142821
     2822    int rc = VINF_SUCCESS;
     2823
     2824#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP
     2825    if (!ShClTransferHttpServerIsRunning(&pTransferCtx->HttpServer)) /* Only one HTTP server per transfer context. */
     2826        rc = ShClTransferHttpServerCreate(&pTransferCtx->HttpServer, NULL /* puPort */);
     2827
     2828    if (RT_SUCCESS(rc))
     2829        rc = ShClTransferHttpServerRegisterTransfer(&pTransferCtx->HttpServer, pTransfer);
     2830#endif
     2831
    28152832    if (pidTransfer)
    28162833        *pidTransfer = idTransfer;
    28172834
    2818     return VINF_SUCCESS;
     2835    LogFlowFuncLeaveRC(rc);
     2836    return rc;
    28192837}
    28202838
     
    28512869
    28522870/**
     2871 * Removes a transfer from a transfer context.
     2872 *
     2873 * @param   pTransferCtx        Transfer context to remove transfer from.
     2874 * @param   pTransfer           Transfer to remove.
     2875 */
     2876static void shclTransferCtxTransferRemove(PSHCLTRANSFERCTX pTransferCtx, PSHCLTRANSFER pTransfer)
     2877{
     2878    RTListNodeRemove(&pTransfer->Node);
     2879
     2880    Assert(pTransferCtx->cTransfers);
     2881    pTransferCtx->cTransfers--;
     2882
     2883    Assert(pTransferCtx->cTransfers >= pTransferCtx->cRunning);
     2884
     2885    LogFlowFunc(("Now %RU32 transfers left\n", pTransferCtx->cTransfers));
     2886
     2887#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS_HTTP
     2888    if (ShClTransferHttpServerIsRunning(&pTransferCtx->HttpServer))
     2889    {
     2890        /* Try unregistering transfer (if it was registered before). */
     2891        int rc2 = ShClTransferHttpServerUnregisterTransfer(&pTransferCtx->HttpServer, pTransfer);
     2892        if (RT_SUCCESS(rc2))
     2893        {
     2894            /* No more registered transfers left? Tear down the HTTP server instance then. */
     2895            if (pTransferCtx->cTransfers == 0)
     2896                rc2 = ShClTransferHttpServerDestroy(&pTransferCtx->HttpServer);
     2897        }
     2898        AssertRC(rc2);
     2899    }
     2900#endif
     2901}
     2902
     2903/**
    28532904 * Unregisters a transfer from an Transfer context.
    28542905 *
    28552906 * @retval  VINF_SUCCESS on success.
    28562907 * @retval  VERR_NOT_FOUND if the transfer ID was not found.
    2857  * @param   pTransferCtx                Transfer context to unregister transfer from.
     2908 * @param   pTransferCtx        Transfer context to unregister transfer from.
    28582909 * @param   idTransfer          Transfer ID to unregister.
    28592910 */
     
    28682919    if (pTransfer)
    28692920    {
    2870         RTListNodeRemove(&pTransfer->Node);
    2871 
    2872         Assert(pTransferCtx->cTransfers);
    2873         pTransferCtx->cTransfers--;
    2874 
    2875         Assert(pTransferCtx->cTransfers >= pTransferCtx->cRunning);
    2876 
    2877         LogFlowFunc(("Now %RU32 transfers left\n", pTransferCtx->cTransfers));
     2921        shclTransferCtxTransferRemove(pTransferCtx, pTransfer);
    28782922    }
    28792923    else
     
    28882932 * This can be due to transfers which only have been announced but not / never being run.
    28892933 *
    2890  * @param   pTransferCtx                Transfer context to cleanup transfers for.
     2934 * @param   pTransferCtx        Transfer context to cleanup transfers for.
    28912935 */
    28922936void ShClTransferCtxCleanup(PSHCLTRANSFERCTX pTransferCtx)
     
    29062950        if (ShClTransferGetStatus(pTransfer) != SHCLTRANSFERSTATUS_STARTED)
    29072951        {
     2952            shclTransferCtxTransferRemove(pTransferCtx, pTransfer);
     2953
    29082954            ShClTransferDestroy(pTransfer);
    2909             RTListNodeRemove(&pTransfer->Node);
    29102955
    29112956            RTMemFree(pTransfer);
    29122957            pTransfer = NULL;
    2913 
    2914             Assert(pTransferCtx->cTransfers);
    2915             pTransferCtx->cTransfers--;
    29162958        }
    29172959    }
     
    29222964 *
    29232965 * @returns \c if maximum has been reached, \c false if not.
    2924  * @param   pTransferCtx                Transfer context to determine value for.
     2966 * @param   pTransferCtx        Transfer context to determine value for.
    29252967 */
    29262968bool ShClTransferCtxTransfersMaximumReached(PSHCLTRANSFERCTX pTransferCtx)
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