Changeset 43892 in vbox
- Timestamp:
- Nov 16, 2012 8:55:44 AM (12 years ago)
- Location:
- trunk/src/VBox
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/HostChannel/HostChannel.cpp
r43785 r43892 316 316 VBOXHOSTCHINSTANCE *pInstance = NULL; 317 317 318 if (pvChannel == NULL) 319 { 320 return NULL; 321 } 322 318 323 int rc = vboxHostChannelLock(); 319 324 -
trunk/src/VBox/Main/include/ConsoleVRDPServer.h
r43888 r43892 302 302 const void *pvParm, uint32_t cbParm, 303 303 const void *pvData, uint32_t cbData, uint32_t *pcbDataReturned); 304 int tsmfLock(void); 305 void tsmfUnlock(void); 306 RTCRITSECT mTSMFLock; 304 307 }; 305 308 -
trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp
r43888 r43892 1381 1381 RT_ZERO(m_interfaceTSMF); 1382 1382 RT_ZERO(m_interfaceCallbacksTSMF); 1383 1384 rc = RTCritSectInit(&mTSMFLock); 1385 AssertRC(rc); 1383 1386 } 1384 1387 … … 1409 1412 RTCritSectDelete(&mCritSect); 1410 1413 memset(&mCritSect, 0, sizeof(mCritSect)); 1414 } 1415 1416 if (RTCritSectIsInitialized(&mTSMFLock)) 1417 { 1418 RTCritSectDelete(&mTSMFLock); 1419 memset(&mTSMFLock, 0, sizeof(mTSMFLock)); 1411 1420 } 1412 1421 } … … 2099 2108 } 2100 2109 2101 typedef struct TSMFHOSTCHANNELCTX 2110 2111 struct TSMFHOSTCHCTX; 2112 struct TSMFVRDPCTX; 2113 2114 typedef struct TSMFHOSTCHCTX 2102 2115 { 2103 2116 ConsoleVRDPServer *pThis; 2104 2117 2105 VBOXHOSTCHANNELCALLBACKS *pCallbacks; 2106 void *pvCallbacks; 2107 2108 uint32_t u32ChannelHandle; 2118 struct TSMFVRDPCTX *pVRDPCtx; /* NULL if no corresponding host channel context. */ 2109 2119 2110 2120 void *pvDataReceived; 2111 2121 uint32_t cbDataReceived; 2112 2122 uint32_t cbDataAllocated; 2113 } TSMFHOSTCHANNELCTX; 2123 } TSMFHOSTCHCTX; 2124 2125 typedef 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 2137 static 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 2157 int ConsoleVRDPServer::tsmfLock(void) 2158 { 2159 int rc = RTCritSectEnter(&mTSMFLock); 2160 AssertRC(rc); 2161 return rc; 2162 } 2163 2164 void ConsoleVRDPServer::tsmfUnlock(void) 2165 { 2166 RTCritSectLeave(&mTSMFLock); 2167 } 2114 2168 2115 2169 /* static */ DECLCALLBACK(int) ConsoleVRDPServer::tsmfHostChannelAttach(void *pvProvider, … … 2123 2177 ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvProvider); 2124 2178 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); 2136 2198 2137 2199 if (RT_SUCCESS(rc)) 2138 2200 { 2139 2201 /* @todo contexts should be in a list for accounting. */ 2140 *ppvChannel = p Ctx;2202 *ppvChannel = pHostChCtx; 2141 2203 } 2142 2204 else 2143 2205 { 2144 RTMemFree(pCtx); 2206 RTMemFree(pHostChCtx); 2207 RTMemFree(pVRDPCtx); 2145 2208 } 2146 2209 … … 2152 2215 LogFlowFunc(("\n")); 2153 2216 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 } 2158 2248 } 2159 2249 … … 2162 2252 uint32_t cbData) 2163 2253 { 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 } 2169 2280 2170 2281 return rc; … … 2177 2288 uint32_t *pcbRemaining) 2178 2289 { 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; 2205 2322 } 2206 2323 … … 2213 2330 uint32_t *pcbDataReturned) 2214 2331 { 2215 LogFlowFunc(("\n")); 2332 LogFlowFunc(("u32Code %u\n", u32Code)); 2333 2216 2334 if (!pvChannel) 2217 2335 { … … 2296 2414 uint32_t cbParm) 2297 2415 { 2416 int rc = VINF_SUCCESS; 2417 2298 2418 ConsoleVRDPServer *pThis = static_cast<ConsoleVRDPServer*>(pvContext); 2299 2419 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) 2305 2431 { 2306 2432 case VRDE_TSMF_N_CREATE_ACCEPTED: … … 2309 2435 Assert(cbParm == sizeof(VRDETSMFNOTIFYCREATEACCEPTED)); 2310 2436 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); 2318 2445 } break; 2319 2446 2320 2447 case VRDE_TSMF_N_CREATE_DECLINED: 2321 2448 { 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); 2325 2454 } break; 2326 2455 … … 2331 2460 Assert(cbParm == sizeof(VRDETSMFNOTIFYDATA)); 2332 2461 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)); 2352 2463 2353 2464 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)); 2359 2506 } break; 2360 2507 2361 2508 case VRDE_TSMF_N_DISCONNECTED: 2362 2509 { 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 } 2366 2535 } break; 2367 2536
Note:
See TracChangeset
for help on using the changeset viewer.