VirtualBox

Changeset 43892 in vbox


Ignore:
Timestamp:
Nov 16, 2012 8:55:44 AM (12 years ago)
Author:
vboxsync
Message:

HostServices/HostChannel,Main: updates.

Location:
trunk/src/VBox
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/HostChannel/HostChannel.cpp

    r43785 r43892  
    316316    VBOXHOSTCHINSTANCE *pInstance = NULL;
    317317
     318    if (pvChannel == NULL)
     319    {
     320        return NULL;
     321    }
     322
    318323    int rc = vboxHostChannelLock();
    319324
  • trunk/src/VBox/Main/include/ConsoleVRDPServer.h

    r43888 r43892  
    302302                                                    const void *pvParm, uint32_t cbParm,
    303303                                                    const void *pvData, uint32_t cbData, uint32_t *pcbDataReturned);
     304    int tsmfLock(void);
     305    void tsmfUnlock(void);
     306    RTCRITSECT mTSMFLock;
    304307};
    305308
  • trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp

    r43888 r43892  
    13811381    RT_ZERO(m_interfaceTSMF);
    13821382    RT_ZERO(m_interfaceCallbacksTSMF);
     1383
     1384    rc = RTCritSectInit(&mTSMFLock);
     1385    AssertRC(rc);
    13831386}
    13841387
     
    14091412        RTCritSectDelete(&mCritSect);
    14101413        memset(&mCritSect, 0, sizeof(mCritSect));
     1414    }
     1415
     1416    if (RTCritSectIsInitialized(&mTSMFLock))
     1417    {
     1418        RTCritSectDelete(&mTSMFLock);
     1419        memset(&mTSMFLock, 0, sizeof(mTSMFLock));
    14111420    }
    14121421}
     
    20992108}
    21002109
    2101 typedef struct TSMFHOSTCHANNELCTX
     2110
     2111struct TSMFHOSTCHCTX;
     2112struct TSMFVRDPCTX;
     2113
     2114typedef struct TSMFHOSTCHCTX
    21022115{
    21032116    ConsoleVRDPServer *pThis;
    21042117
    2105     VBOXHOSTCHANNELCALLBACKS *pCallbacks;
    2106     void *pvCallbacks;
    2107 
    2108     uint32_t u32ChannelHandle;
     2118    struct TSMFVRDPCTX *pVRDPCtx; /* NULL if no corresponding host channel context. */
    21092119
    21102120    void *pvDataReceived;
    21112121    uint32_t cbDataReceived;
    21122122    uint32_t cbDataAllocated;
    2113 } TSMFHOSTCHANNELCTX;
     2123} TSMFHOSTCHCTX;
     2124
     2125typedef struct TSMFVRDPCTX
     2126{
     2127    ConsoleVRDPServer *pThis;
     2128
     2129    VBOXHOSTCHANNELCALLBACKS *pCallbacks;
     2130    void *pvCallbacks;
     2131
     2132    TSMFHOSTCHCTX *pHostChCtx; /* NULL if no corresponding host channel context. */
     2133
     2134    uint32_t u32ChannelHandle;
     2135} TSMFVRDPCTX;
     2136
     2137static int tsmfContextsAlloc(TSMFHOSTCHCTX **ppHostChCtx, TSMFVRDPCTX **ppVRDPCtx)
     2138{
     2139    TSMFHOSTCHCTX *pHostChCtx = (TSMFHOSTCHCTX *)RTMemAllocZ(sizeof(TSMFHOSTCHCTX));
     2140    if (!pHostChCtx)
     2141    {
     2142        return VERR_NO_MEMORY;
     2143    }
     2144
     2145    TSMFVRDPCTX *pVRDPCtx = (TSMFVRDPCTX *)RTMemAllocZ(sizeof(TSMFVRDPCTX));
     2146    if (!pVRDPCtx)
     2147    {
     2148        RTMemFree(pHostChCtx);
     2149        return VERR_NO_MEMORY;
     2150    }
     2151
     2152    *ppHostChCtx = pHostChCtx;
     2153    *ppVRDPCtx = pVRDPCtx;
     2154    return VINF_SUCCESS;
     2155}
     2156
     2157int ConsoleVRDPServer::tsmfLock(void)
     2158{
     2159    int rc = RTCritSectEnter(&mTSMFLock);
     2160    AssertRC(rc);
     2161    return rc;
     2162}
     2163
     2164void ConsoleVRDPServer::tsmfUnlock(void)
     2165{
     2166    RTCritSectLeave(&mTSMFLock);
     2167}
    21142168
    21152169/* static */ DECLCALLBACK(int) ConsoleVRDPServer::tsmfHostChannelAttach(void *pvProvider,
     
    21232177    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvProvider);
    21242178
    2125     TSMFHOSTCHANNELCTX *pCtx = (TSMFHOSTCHANNELCTX *)RTMemAllocZ(sizeof(TSMFHOSTCHANNELCTX));
    2126     if (!pCtx)
    2127     {
    2128         return VERR_NO_MEMORY;
    2129     }
    2130 
    2131     pCtx->pThis = pThis;
    2132     pCtx->pCallbacks = pCallbacks;
    2133     pCtx->pvCallbacks = pvCallbacks;
    2134 
    2135     int rc = pThis->m_interfaceTSMF.VRDETSMFChannelCreate(pThis->mhServer, pCtx, u32Flags);
     2179    /* Create 2 context structures: for the VRDP server and for the host service. */
     2180    TSMFHOSTCHCTX *pHostChCtx = NULL;
     2181    TSMFVRDPCTX *pVRDPCtx = NULL;
     2182
     2183    int rc = tsmfContextsAlloc(&pHostChCtx, &pVRDPCtx);
     2184    if (RT_FAILURE(rc))
     2185    {
     2186        return rc;
     2187    }
     2188
     2189    pHostChCtx->pThis = pThis;
     2190    pHostChCtx->pVRDPCtx = pVRDPCtx;
     2191
     2192    pVRDPCtx->pThis = pThis;
     2193    pVRDPCtx->pCallbacks = pCallbacks;
     2194    pVRDPCtx->pvCallbacks = pvCallbacks;
     2195    pVRDPCtx->pHostChCtx = pHostChCtx;
     2196
     2197    rc = pThis->m_interfaceTSMF.VRDETSMFChannelCreate(pThis->mhServer, pVRDPCtx, u32Flags);
    21362198
    21372199    if (RT_SUCCESS(rc))
    21382200    {
    21392201        /* @todo contexts should be in a list for accounting. */
    2140         *ppvChannel = pCtx;
     2202        *ppvChannel = pHostChCtx;
    21412203    }
    21422204    else
    21432205    {
    2144         RTMemFree(pCtx);
     2206        RTMemFree(pHostChCtx);
     2207        RTMemFree(pVRDPCtx);
    21452208    }
    21462209
     
    21522215    LogFlowFunc(("\n"));
    21532216
    2154     TSMFHOSTCHANNELCTX *pCtx = (TSMFHOSTCHANNELCTX *)pvChannel;
    2155 
    2156     pCtx->pThis->m_interfaceTSMF.VRDETSMFChannelClose(pCtx->pThis->mhServer, pCtx->u32ChannelHandle);
    2157     /* @todo */
     2217    TSMFHOSTCHCTX *pHostChCtx = (TSMFHOSTCHCTX *)pvChannel;
     2218    ConsoleVRDPServer *pThis = pHostChCtx->pThis;
     2219
     2220    int rc = pThis->tsmfLock();
     2221    if (RT_SUCCESS(rc))
     2222    {
     2223        bool fClose = false;
     2224        uint32_t u32ChannelHandle = 0;
     2225
     2226        if (pHostChCtx->pVRDPCtx)
     2227        {
     2228            /* There is still a VRDP context for this channel. */
     2229            pHostChCtx->pVRDPCtx->pHostChCtx = NULL;
     2230            u32ChannelHandle = pHostChCtx->pVRDPCtx->u32ChannelHandle;
     2231            fClose = true;
     2232        }
     2233
     2234        pThis->tsmfUnlock();
     2235
     2236        RTMemFree(pHostChCtx);
     2237
     2238        if (fClose)
     2239        {
     2240            LogFlowFunc(("Closing VRDE channel %d.\n", u32ChannelHandle));
     2241            pThis->m_interfaceTSMF.VRDETSMFChannelClose(pThis->mhServer, u32ChannelHandle);
     2242        }
     2243        else
     2244        {
     2245            LogFlowFunc(("No VRDE channel.\n"));
     2246        }
     2247    }
    21582248}
    21592249
     
    21622252                                                                      uint32_t cbData)
    21632253{
    2164     LogFlowFunc(("\n"));
    2165     TSMFHOSTCHANNELCTX *pCtx = (TSMFHOSTCHANNELCTX *)pvChannel;
    2166 
    2167     int rc = pCtx->pThis->m_interfaceTSMF.VRDETSMFChannelSend(pCtx->pThis->mhServer, pCtx->u32ChannelHandle,
    2168                                                               pvData, cbData);
     2254    LogFlowFunc(("cbData %d\n", cbData));
     2255
     2256    TSMFHOSTCHCTX *pHostChCtx = (TSMFHOSTCHCTX *)pvChannel;
     2257    ConsoleVRDPServer *pThis = pHostChCtx->pThis;
     2258
     2259    int rc = pThis->tsmfLock();
     2260    if (RT_SUCCESS(rc))
     2261    {
     2262        bool fSend = false;
     2263        uint32_t u32ChannelHandle = 0;
     2264
     2265        if (pHostChCtx->pVRDPCtx)
     2266        {
     2267            u32ChannelHandle = pHostChCtx->pVRDPCtx->u32ChannelHandle;
     2268            fSend = true;
     2269        }
     2270
     2271        pThis->tsmfUnlock();
     2272
     2273        if (fSend)
     2274        {
     2275            LogFlowFunc(("Send to VRDE channel %d.\n", u32ChannelHandle));
     2276            rc = pThis->m_interfaceTSMF.VRDETSMFChannelSend(pThis->mhServer, u32ChannelHandle,
     2277                                                            pvData, cbData);
     2278        }
     2279    }
    21692280
    21702281    return rc;
     
    21772288                                                                      uint32_t *pcbRemaining)
    21782289{
    2179     LogFlowFunc(("\n"));
    2180 
    2181     TSMFHOSTCHANNELCTX *pCtx = (TSMFHOSTCHANNELCTX *)pvChannel;
    2182     int rc = VINF_SUCCESS;
    2183 
    2184     uint32_t cbToCopy = RT_MIN(cbData, pCtx->cbDataReceived);
    2185     uint32_t cbRemaining = pCtx->cbDataReceived - cbToCopy;
    2186 
    2187     LogFlowFunc(("cbToCopy %d, cbRemaining %d\n", cbToCopy, cbRemaining));
    2188 
    2189     if (cbToCopy != 0)
    2190     {
    2191         memcpy(pvData, pCtx->pvDataReceived, cbToCopy);
    2192 
    2193         if (cbRemaining != 0)
    2194         {
    2195             memmove(pCtx->pvDataReceived, (uint8_t *)pCtx->pvDataReceived + cbToCopy, cbRemaining);
    2196         }
    2197 
    2198         pCtx->cbDataReceived = cbRemaining;
    2199     }
    2200 
    2201     *pcbRemaining = cbRemaining;
    2202     *pcbReceived = cbToCopy;
    2203 
    2204     return VINF_SUCCESS;
     2290    LogFlowFunc(("cbData %d\n", cbData));
     2291
     2292    TSMFHOSTCHCTX *pHostChCtx = (TSMFHOSTCHCTX *)pvChannel;
     2293    ConsoleVRDPServer *pThis = pHostChCtx->pThis;
     2294
     2295    int rc = pThis->tsmfLock();
     2296    if (RT_SUCCESS(rc))
     2297    {
     2298        uint32_t cbToCopy = RT_MIN(cbData, pHostChCtx->cbDataReceived);
     2299        uint32_t cbRemaining = pHostChCtx->cbDataReceived - cbToCopy;
     2300
     2301        LogFlowFunc(("cbToCopy %d, cbRemaining %d\n", cbToCopy, cbRemaining));
     2302
     2303        if (cbToCopy != 0)
     2304        {
     2305            memcpy(pvData, pHostChCtx->pvDataReceived, cbToCopy);
     2306
     2307            if (cbRemaining != 0)
     2308            {
     2309                memmove(pHostChCtx->pvDataReceived, (uint8_t *)pHostChCtx->pvDataReceived + cbToCopy, cbRemaining);
     2310            }
     2311
     2312            pHostChCtx->cbDataReceived = cbRemaining;
     2313        }
     2314
     2315        pThis->tsmfUnlock();
     2316
     2317        *pcbRemaining = cbRemaining;
     2318        *pcbReceived = cbToCopy;
     2319    }
     2320
     2321    return rc;
    22052322}
    22062323
     
    22132330                                                                         uint32_t *pcbDataReturned)
    22142331{
    2215     LogFlowFunc(("\n"));
     2332    LogFlowFunc(("u32Code %u\n", u32Code));
     2333
    22162334    if (!pvChannel)
    22172335    {
     
    22962414                                                                    uint32_t cbParm)
    22972415{
     2416    int rc = VINF_SUCCESS;
     2417
    22982418    ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvContext);
    22992419
    2300     TSMFHOSTCHANNELCTX *pCtx = (TSMFHOSTCHANNELCTX *)pvChannel;
    2301 
    2302     Assert(pCtx->pThis == pThis);
    2303 
    2304     switch(u32Notification)
     2420    TSMFVRDPCTX *pVRDPCtx = (TSMFVRDPCTX *)pvChannel;
     2421
     2422    Assert(pVRDPCtx->pThis == pThis);
     2423
     2424    if (pVRDPCtx->pCallbacks == NULL)
     2425    {
     2426        LogFlowFunc(("tsmfHostChannel: Channel disconnected. Skipping.\n"));
     2427        return;
     2428    }
     2429
     2430    switch (u32Notification)
    23052431    {
    23062432        case VRDE_TSMF_N_CREATE_ACCEPTED:
     
    23092435            Assert(cbParm == sizeof(VRDETSMFNOTIFYCREATEACCEPTED));
    23102436
    2311             LogFlowFunc(("VRDE_TSMF_N_CREATE_ACCEPTED: p->u32ChannelHandle %d\n", p->u32ChannelHandle));
    2312 
    2313             pCtx->u32ChannelHandle = p->u32ChannelHandle;
    2314 
    2315             pCtx->pCallbacks->HostChannelCallbackEvent(pCtx->pvCallbacks, pCtx,
    2316                                                        VBOX_TSMF_HCH_CREATE_ACCEPTED,
    2317                                                        NULL, 0);
     2437            LogFlowFunc(("tsmfHostChannel: VRDE_TSMF_N_CREATE_ACCEPTED(%p): p->u32ChannelHandle %d\n",
     2438                          pVRDPCtx, p->u32ChannelHandle));
     2439
     2440            pVRDPCtx->u32ChannelHandle = p->u32ChannelHandle;
     2441
     2442            pVRDPCtx->pCallbacks->HostChannelCallbackEvent(pVRDPCtx->pvCallbacks, pVRDPCtx->pHostChCtx,
     2443                                                           VBOX_TSMF_HCH_CREATE_ACCEPTED,
     2444                                                           NULL, 0);
    23182445        } break;
    23192446
    23202447        case VRDE_TSMF_N_CREATE_DECLINED:
    23212448        {
    2322             pCtx->pCallbacks->HostChannelCallbackEvent(pCtx->pvCallbacks, pCtx,
    2323                                                        VBOX_TSMF_HCH_CREATE_DECLINED,
    2324                                                        NULL, 0);
     2449            LogFlowFunc(("tsmfHostChannel: VRDE_TSMF_N_CREATE_DECLINED(%p)\n", pVRDPCtx));
     2450
     2451            pVRDPCtx->pCallbacks->HostChannelCallbackEvent(pVRDPCtx->pvCallbacks, pVRDPCtx->pHostChCtx,
     2452                                                           VBOX_TSMF_HCH_CREATE_DECLINED,
     2453                                                           NULL, 0);
    23252454        } break;
    23262455
     
    23312460            Assert(cbParm == sizeof(VRDETSMFNOTIFYDATA));
    23322461
    2333             LogFlowFunc(("VRDE_TSMF_N_DATA: p->cbData %d\n", p->cbData));
    2334 
    2335             if (pCtx->pvDataReceived)
    2336             {
    2337                 uint32_t cbAlloc = p->cbData + pCtx->cbDataReceived;
    2338                 pCtx->pvDataReceived = RTMemRealloc(pCtx->pvDataReceived, cbAlloc);
    2339                 memcpy((uint8_t *)pCtx->pvDataReceived + pCtx->cbDataReceived, p->pvData, p->cbData);
    2340 
    2341                 pCtx->cbDataReceived += p->cbData;
    2342                 pCtx->cbDataAllocated = cbAlloc;
    2343             }
    2344             else
    2345             {
    2346                 pCtx->pvDataReceived = RTMemAlloc(p->cbData);
    2347                 memcpy(pCtx->pvDataReceived, p->pvData, p->cbData);
    2348 
    2349                 pCtx->cbDataReceived = p->cbData;
    2350                 pCtx->cbDataAllocated = p->cbData;
    2351             }
     2462            LogFlowFunc(("tsmfHostChannel: VRDE_TSMF_N_DATA(%p): p->cbData %d\n", pVRDPCtx, p->cbData));
    23522463
    23532464            VBOXHOSTCHANNELEVENTRECV ev;
    2354             ev.u32SizeAvailable = p->cbData;
    2355 
    2356             pCtx->pCallbacks->HostChannelCallbackEvent(pCtx->pvCallbacks, pCtx,
    2357                                                        VBOX_HOST_CHANNEL_EVENT_RECV,
    2358                                                        &ev, sizeof(ev));
     2465            ev.u32SizeAvailable = 0;
     2466
     2467            rc = pThis->tsmfLock();
     2468
     2469            if (RT_SUCCESS(rc))
     2470            {
     2471                TSMFHOSTCHCTX *pHostChCtx = pVRDPCtx->pHostChCtx;
     2472
     2473                if (pHostChCtx)
     2474                {
     2475                    if (pHostChCtx->pvDataReceived)
     2476                    {
     2477                        uint32_t cbAlloc = p->cbData + pHostChCtx->cbDataReceived;
     2478                        pHostChCtx->pvDataReceived = RTMemRealloc(pHostChCtx->pvDataReceived, cbAlloc);
     2479                        memcpy((uint8_t *)pHostChCtx->pvDataReceived + pHostChCtx->cbDataReceived, p->pvData, p->cbData);
     2480
     2481                        pHostChCtx->cbDataReceived += p->cbData;
     2482                        pHostChCtx->cbDataAllocated = cbAlloc;
     2483                    }
     2484                    else
     2485                    {
     2486                        pHostChCtx->pvDataReceived = RTMemAlloc(p->cbData);
     2487                        memcpy(pHostChCtx->pvDataReceived, p->pvData, p->cbData);
     2488
     2489                        pHostChCtx->cbDataReceived = p->cbData;
     2490                        pHostChCtx->cbDataAllocated = p->cbData;
     2491                    }
     2492
     2493                    ev.u32SizeAvailable = p->cbData;
     2494                }
     2495                else
     2496                {
     2497                    LogFlowFunc(("tsmfHostChannel: VRDE_TSMF_N_DATA: no host channel. Skipping\n"));
     2498                }
     2499
     2500                pThis->tsmfUnlock();
     2501            }
     2502
     2503            pVRDPCtx->pCallbacks->HostChannelCallbackEvent(pVRDPCtx->pvCallbacks, pVRDPCtx->pHostChCtx,
     2504                                                           VBOX_HOST_CHANNEL_EVENT_RECV,
     2505                                                           &ev, sizeof(ev));
    23592506        } break;
    23602507
    23612508        case VRDE_TSMF_N_DISCONNECTED:
    23622509        {
    2363             pCtx->pCallbacks->HostChannelCallbackEvent(pCtx->pvCallbacks, pCtx,
    2364                                                        VBOX_TSMF_HCH_DISCONNECTED,
    2365                                                        NULL, 0);
     2510            LogFlowFunc(("tsmfHostChannel: VRDE_TSMF_N_DISCONNECTED(%p)\n", pVRDPCtx));
     2511
     2512            pVRDPCtx->pCallbacks->HostChannelCallbackEvent(pVRDPCtx->pvCallbacks, pVRDPCtx->pHostChCtx,
     2513                                                           VBOX_TSMF_HCH_DISCONNECTED,
     2514                                                           NULL, 0);
     2515
     2516            /* The callback context will not be used anymore. */
     2517            pVRDPCtx->pCallbacks->HostChannelCallbackDeleted(pVRDPCtx->pvCallbacks, pVRDPCtx->pHostChCtx);
     2518            pVRDPCtx->pCallbacks = NULL;
     2519            pVRDPCtx->pvCallbacks = NULL;
     2520
     2521            rc = pThis->tsmfLock();
     2522            if (RT_SUCCESS(rc))
     2523            {
     2524                if (pVRDPCtx->pHostChCtx)
     2525                {
     2526                    /* There is still a host channel context for this channel. */
     2527                    pVRDPCtx->pHostChCtx->pVRDPCtx = NULL;
     2528                }
     2529
     2530                pThis->tsmfUnlock();
     2531
     2532                memset(pVRDPCtx, 0, sizeof(*pVRDPCtx));
     2533                RTMemFree(pVRDPCtx);
     2534            }
    23662535        } break;
    23672536
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