Changeset 45568 in vbox
- Timestamp:
- Apr 16, 2013 12:26:50 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 85059
- Location:
- trunk/src/VBox/Main
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h
r45415 r45568 46 46 class GuestProcessStreamBlock; 47 47 class GuestSession; 48 49 50 /**51 * Base class for a all guest control callbacks/events.52 */53 class GuestCtrlEvent54 {55 public:56 57 GuestCtrlEvent(void);58 59 virtual ~GuestCtrlEvent(void);60 61 /** @todo Copy/comparison operator? */62 63 public:64 65 int Cancel(void);66 67 bool Canceled(void);68 69 virtual void Destroy(void);70 71 int Init(void);72 73 virtual int Signal(int rc = VINF_SUCCESS);74 75 int GetResultCode(void) { return mRC; }76 77 int Wait(ULONG uTimeoutMS);78 79 protected:80 81 /** Was the callback canceled? */82 bool fCanceled;83 /** Did the callback complete? */84 bool fCompleted;85 /** The event semaphore for triggering86 * the actual event. */87 RTSEMEVENT hEventSem;88 /** The waiting mutex. */89 RTSEMMUTEX hEventMutex;90 /** Overall result code. */91 int mRC;92 };93 94 95 /*96 * Enumeration holding the host callback types.97 */98 enum CALLBACKTYPE99 {100 CALLBACKTYPE_UNKNOWN = 0,101 /** Guest session status. */102 CALLBACKTYPE_SESSION_NOTIFY = 10,103 /** Guest process status. */104 CALLBACKTYPE_PROC_STATUS = 100,105 /** Guest process output notification. */106 CALLBACKTYPE_PROC_OUTPUT = 105,107 /** Guest process input notification. */108 CALLBACKTYPE_PROC_INPUT = 106,109 /** Guest file notification. */110 CALLBACKTYPE_FILE_NOTIFY = 210111 };112 113 114 /*115 * Class representing a guest control callback.116 */117 class GuestCtrlCallback : public GuestCtrlEvent118 {119 120 public:121 122 GuestCtrlCallback(void);123 124 GuestCtrlCallback(CALLBACKTYPE enmType);125 126 virtual ~GuestCtrlCallback(void);127 128 public:129 130 void Destroy(void);131 132 int Init(CALLBACKTYPE enmType);133 134 CALLBACKTYPE GetType(void) { return mType; }135 136 const void* GetDataRaw(void) const { return pvData; }137 138 size_t GetDataSize(void) { return cbData; }139 140 const void* GetPayloadRaw(void) const { return pvPayload; }141 142 size_t GetPayloadSize(void) { return cbPayload; }143 144 int SetData(const void *pvCallback, size_t cbCallback);145 146 int SetPayload(const void *pvToWrite, size_t cbToWrite);147 148 protected:149 150 /** Pointer to actual callback data. */151 void *pvData;152 /** Size of user-supplied data. */153 size_t cbData;154 /** The callback type. */155 CALLBACKTYPE mType;156 /** Callback flags. */157 uint32_t uFlags;158 /** Payload which will be available on successful159 * waiting (optional). */160 void *pvPayload;161 /** Size of the payload (optional). */162 size_t cbPayload;163 };164 typedef std::map < uint32_t, GuestCtrlCallback* > GuestCtrlCallbacks;165 166 167 /*168 * Class representing a guest control process waiting169 * event.170 */171 class GuestProcessWaitEvent : public GuestCtrlEvent172 {173 public:174 175 GuestProcessWaitEvent(void);176 177 GuestProcessWaitEvent(uint32_t uWaitFlags);178 179 virtual ~GuestProcessWaitEvent(void);180 181 public:182 183 void Destroy(void);184 185 int Init(uint32_t uWaitFlags);186 187 uint32_t GetWaitFlags(void) { return ASMAtomicReadU32(&mFlags); }188 189 ProcessWaitResult_T GetWaitResult(void) { return mResult; }190 191 int GetWaitRc(void) { return mRC; }192 193 int Signal(ProcessWaitResult_T enmResult, int rc = VINF_SUCCESS);194 195 protected:196 197 /** The waiting flag(s). The specifies what to198 * wait for. See ProcessWaitFlag_T. */199 uint32_t mFlags;200 /** Structure containing the overall result. */201 ProcessWaitResult_T mResult;202 };203 204 205 /*206 * Class representing a guest control session waiting207 * event.208 */209 class GuestSessionWaitEvent : public GuestCtrlEvent210 {211 public:212 213 GuestSessionWaitEvent(void);214 215 GuestSessionWaitEvent(uint32_t uWaitFlags);216 217 virtual ~GuestSessionWaitEvent(void);218 219 public:220 221 void Destroy(void);222 223 int Init(uint32_t uWaitFlags);224 225 uint32_t GetWaitFlags(void) { return ASMAtomicReadU32(&mFlags); }226 227 GuestSessionWaitResult_T GetWaitResult(void) { return mResult; }228 229 int GetWaitRc(void) { return mRC; }230 231 int Signal(GuestSessionWaitResult_T enmResult, int rc = VINF_SUCCESS);232 233 protected:234 235 /** The waiting flag(s). The specifies what to236 * wait for. See GuestSessionWaitFlag_T. */237 uint32_t mFlags;238 /** Structure containing the overall result. */239 GuestSessionWaitResult_T mResult;240 };241 48 242 49 -
trunk/src/VBox/Main/include/GuestFileImpl.h
r45434 r45568 116 116 struct Data 117 117 { 118 /** All related callbacks to this file. */119 GuestCtrlCallbacks mCallbacks;120 118 /** The file's open info. */ 121 119 GuestFileOpenInfo mOpenInfo; -
trunk/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
r45415 r45568 39 39 * Structures and Typedefs * 40 40 ******************************************************************************/ 41 42 GuestCtrlEvent::GuestCtrlEvent(void)43 : fCanceled(false),44 fCompleted(false),45 hEventSem(NIL_RTSEMEVENT),46 mRC(VINF_SUCCESS)47 {48 }49 50 GuestCtrlEvent::~GuestCtrlEvent(void)51 {52 Destroy();53 }54 55 int GuestCtrlEvent::Cancel(void)56 {57 int rc = VINF_SUCCESS;58 if (!ASMAtomicReadBool(&fCompleted))59 {60 if (!ASMAtomicReadBool(&fCanceled))61 {62 ASMAtomicXchgBool(&fCanceled, true);63 64 LogFlowThisFunc(("Cancelling event ...\n"));65 rc = hEventSem != NIL_RTSEMEVENT66 ? RTSemEventSignal(hEventSem) : VINF_SUCCESS;67 }68 }69 70 return rc;71 }72 73 bool GuestCtrlEvent::Canceled(void)74 {75 return ASMAtomicReadBool(&fCanceled);76 }77 78 void GuestCtrlEvent::Destroy(void)79 {80 int rc = Cancel();81 AssertRC(rc);82 83 if (hEventSem != NIL_RTSEMEVENT)84 {85 RTSemEventDestroy(hEventSem);86 hEventSem = NIL_RTSEMEVENT;87 }88 }89 90 int GuestCtrlEvent::Init(void)91 {92 return RTSemEventCreate(&hEventSem);93 }94 95 int GuestCtrlEvent::Signal(int rc /*= VINF_SUCCESS*/)96 {97 AssertReturn(hEventSem != NIL_RTSEMEVENT, VERR_CANCELLED);98 99 mRC = rc;100 101 return RTSemEventSignal(hEventSem);102 }103 104 int GuestCtrlEvent::Wait(ULONG uTimeoutMS)105 {106 LogFlowThisFuncEnter();107 108 AssertReturn(hEventSem != NIL_RTSEMEVENT, VERR_CANCELLED);109 110 RTMSINTERVAL msInterval = uTimeoutMS;111 if (!uTimeoutMS)112 msInterval = RT_INDEFINITE_WAIT;113 int rc = RTSemEventWait(hEventSem, msInterval);114 if (RT_SUCCESS(rc))115 ASMAtomicWriteBool(&fCompleted, true);116 117 LogFlowFuncLeaveRC(rc);118 return rc;119 }120 121 ///////////////////////////////////////////////////////////////////////////////122 123 GuestCtrlCallback::GuestCtrlCallback(void)124 : pvData(NULL),125 cbData(0),126 mType(CALLBACKTYPE_UNKNOWN),127 uFlags(0),128 pvPayload(NULL),129 cbPayload(0)130 {131 }132 133 GuestCtrlCallback::GuestCtrlCallback(CALLBACKTYPE enmType)134 : pvData(NULL),135 cbData(0),136 mType(CALLBACKTYPE_UNKNOWN),137 uFlags(0),138 pvPayload(NULL),139 cbPayload(0)140 {141 int rc = Init(enmType);142 AssertRC(rc);143 }144 145 GuestCtrlCallback::~GuestCtrlCallback(void)146 {147 Destroy();148 }149 150 int GuestCtrlCallback::Init(CALLBACKTYPE enmType)151 {152 AssertReturn(enmType > CALLBACKTYPE_UNKNOWN, VERR_INVALID_PARAMETER);153 Assert((pvData == NULL) && !cbData);154 155 int rc = VINF_SUCCESS;156 157 switch (enmType)158 {159 case CALLBACKTYPE_SESSION_NOTIFY:160 {161 pvData = (PCALLBACKDATA_SESSION_NOTIFY)RTMemAllocZ(sizeof(CALLBACKDATA_SESSION_NOTIFY));162 AssertPtrReturn(pvData, VERR_NO_MEMORY);163 cbData = sizeof(CALLBACKDATA_SESSION_NOTIFY);164 break;165 }166 167 case CALLBACKTYPE_PROC_STATUS:168 {169 pvData = (PCALLBACKDATA_PROC_STATUS)RTMemAllocZ(sizeof(CALLBACKDATA_PROC_STATUS));170 AssertPtrReturn(pvData, VERR_NO_MEMORY);171 cbData = sizeof(CALLBACKDATA_PROC_STATUS);172 break;173 }174 175 case CALLBACKTYPE_PROC_OUTPUT:176 {177 pvData = (PCALLBACKDATA_PROC_OUTPUT)RTMemAllocZ(sizeof(CALLBACKDATA_PROC_OUTPUT));178 AssertPtrReturn(pvData, VERR_NO_MEMORY);179 cbData = sizeof(CALLBACKDATA_PROC_OUTPUT);180 break;181 }182 183 case CALLBACKTYPE_PROC_INPUT:184 {185 pvData = (PCALLBACKDATA_PROC_INPUT)RTMemAllocZ(sizeof(CALLBACKDATA_PROC_INPUT));186 AssertPtrReturn(pvData, VERR_NO_MEMORY);187 cbData = sizeof(CALLBACKDATA_PROC_INPUT);188 break;189 }190 191 case CALLBACKTYPE_FILE_NOTIFY:192 {193 pvData = (PCALLBACKDATA_FILE_NOTIFY)RTMemAllocZ(sizeof(CALLBACKDATA_FILE_NOTIFY));194 AssertPtrReturn(pvData, VERR_NO_MEMORY);195 cbData = sizeof(CALLBACKDATA_FILE_NOTIFY);196 break;197 }198 199 default:200 AssertMsgFailed(("Unknown callback type specified (%ld)\n", enmType));201 rc = VERR_NOT_IMPLEMENTED;202 break;203 }204 205 if (RT_SUCCESS(rc))206 {207 rc = GuestCtrlEvent::Init();208 if (RT_SUCCESS(rc))209 mType = enmType;210 }211 212 return rc;213 }214 215 void GuestCtrlCallback::Destroy(void)216 {217 GuestCtrlEvent::Destroy();218 219 switch (mType)220 {221 case CALLBACKTYPE_PROC_OUTPUT:222 {223 PCALLBACKDATA_PROC_OUTPUT pThis = (PCALLBACKDATA_PROC_OUTPUT)pvData;224 AssertPtr(pThis);225 if (pThis->pvData)226 RTMemFree(pThis->pvData);227 break;228 }229 230 case CALLBACKTYPE_FILE_NOTIFY:231 {232 PCALLBACKDATA_FILE_NOTIFY pThis = (PCALLBACKDATA_FILE_NOTIFY)pvData;233 AssertPtr(pThis);234 switch (pThis->uType)235 {236 case GUEST_FILE_NOTIFYTYPE_READ:237 {238 if (pThis->u.read.pvData)239 {240 RTMemFree(pThis->u.read.pvData);241 pThis->u.read.pvData = NULL;242 }243 244 break;245 }246 247 default:248 break;249 }250 }251 252 default:253 break;254 }255 256 mType = CALLBACKTYPE_UNKNOWN;257 if (pvData)258 {259 RTMemFree(pvData);260 pvData = NULL;261 }262 cbData = 0;263 264 if (pvPayload)265 {266 RTMemFree(pvPayload);267 pvPayload = NULL;268 }269 cbPayload = 0;270 }271 272 int GuestCtrlCallback::SetData(const void *pvCallback, size_t cbCallback)273 {274 if (!cbCallback)275 return VINF_SUCCESS;276 AssertPtr(pvCallback);277 278 int rc = VINF_SUCCESS;279 switch (mType)280 {281 case CALLBACKTYPE_SESSION_NOTIFY:282 {283 PCALLBACKDATA_SESSION_NOTIFY pThis = (PCALLBACKDATA_SESSION_NOTIFY)pvData;284 PCALLBACKDATA_SESSION_NOTIFY pCB = (PCALLBACKDATA_SESSION_NOTIFY)pvCallback;285 Assert(cbCallback == sizeof(CALLBACKDATA_SESSION_NOTIFY));286 287 memcpy(pThis, pCB, sizeof(CALLBACKDATA_SESSION_NOTIFY));288 break;289 }290 291 case CALLBACKTYPE_PROC_STATUS:292 {293 PCALLBACKDATA_PROC_STATUS pThis = (PCALLBACKDATA_PROC_STATUS)pvData;294 PCALLBACKDATA_PROC_STATUS pCB = (PCALLBACKDATA_PROC_STATUS)pvCallback;295 Assert(cbCallback == sizeof(CALLBACKDATA_PROC_STATUS));296 297 memcpy(pThis, pCB, sizeof(CALLBACKDATA_PROC_STATUS));298 break;299 }300 301 case CALLBACKTYPE_PROC_OUTPUT:302 {303 PCALLBACKDATA_PROC_OUTPUT pThis = (PCALLBACKDATA_PROC_OUTPUT)pvData;304 PCALLBACKDATA_PROC_OUTPUT pCB = (PCALLBACKDATA_PROC_OUTPUT)pvCallback;305 Assert(cbCallback == sizeof(CALLBACKDATA_PROC_OUTPUT));306 307 if (pCB->cbData)308 {309 pThis->pvData = RTMemAlloc(pCB->cbData);310 AssertPtrReturn(pThis->pvData, VERR_NO_MEMORY);311 memcpy(pThis->pvData, pCB->pvData, pCB->cbData);312 pThis->cbData = pCB->cbData;313 }314 pThis->uFlags = pCB->uFlags;315 pThis->uPID = pCB->uPID;316 break;317 }318 319 case CALLBACKTYPE_PROC_INPUT:320 {321 PCALLBACKDATA_PROC_INPUT pThis = (PCALLBACKDATA_PROC_INPUT)pvData;322 PCALLBACKDATA_PROC_INPUT pCB = (PCALLBACKDATA_PROC_INPUT)pvCallback;323 Assert(cbCallback == sizeof(CALLBACKDATA_PROC_INPUT));324 325 memcpy(pThis, pCB, sizeof(CALLBACKDATA_PROC_INPUT));326 break;327 }328 329 case CALLBACKTYPE_FILE_NOTIFY:330 {331 PCALLBACKDATA_FILE_NOTIFY pThis = (PCALLBACKDATA_FILE_NOTIFY)pvData;332 PCALLBACKDATA_FILE_NOTIFY pCB = (PCALLBACKDATA_FILE_NOTIFY)pvCallback;333 Assert(cbCallback == sizeof(CALLBACKDATA_FILE_NOTIFY));334 335 memcpy(pThis, pCB, sizeof(CALLBACKDATA_FILE_NOTIFY));336 337 switch (pThis->uType)338 {339 case GUEST_FILE_NOTIFYTYPE_READ:340 {341 pThis->u.read.pvData = RTMemAlloc(pCB->u.read.cbData);342 AssertPtrReturn(pThis->u.read.pvData, VERR_NO_MEMORY);343 memcpy(pThis->u.read.pvData, pCB->u.read.pvData, pCB->u.read.cbData);344 pThis->u.read.cbData = pCB->u.read.cbData;345 break;346 }347 348 default:349 break;350 }351 break;352 }353 354 #if 0355 case CALLBACKTYPE_FILE_OPEN:356 {357 PCALLBACKPAYLOAD_FILE_NOTIFY_OPEN pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_OPEN)pvData;358 PCALLBACKPAYLOAD_FILE_NOTIFY_OPEN pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_OPEN)pvCallback;359 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTIFY_OPEN));360 361 pThis->rc = pCB->rc;362 pThis->uHandle = pCB->uHandle;363 break;364 }365 366 case CALLBACKTYPE_FILE_CLOSE:367 {368 PCALLBACKPAYLOAD_FILE_NOTIFY_CLOSE pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_CLOSE)pvData;369 PCALLBACKPAYLOAD_FILE_NOTIFY_CLOSE pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_CLOSE)pvCallback;370 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTIFY_CLOSE));371 372 pThis->rc = pCB->rc;373 break;374 }375 376 case CALLBACKTYPE_FILE_READ:377 {378 PCALLBACKPAYLOAD_FILE_NOTIFY_READ pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_READ)pvData;379 PCALLBACKPAYLOAD_FILE_NOTIFY_READ pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_READ)pvCallback;380 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTIFY_READ));381 382 pThis->rc = pCB->rc;383 if (pCB->cbData)384 {385 pThis->pvData = RTMemAlloc(pCB->cbData);386 AssertPtrReturn(pThis->pvData, VERR_NO_MEMORY);387 memcpy(pThis->pvData, pCB->pvData, pCB->cbData);388 pThis->cbData = pCB->cbData;389 }390 break;391 }392 393 case CALLBACKTYPE_FILE_WRITE:394 {395 PCALLBACKPAYLOAD_FILE_NOTIFY_WRITE pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_WRITE)pvData;396 PCALLBACKPAYLOAD_FILE_NOTIFY_WRITE pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_WRITE)pvCallback;397 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTIFY_WRITE));398 399 pThis->rc = pCB->rc;400 pThis->cbWritten = pCB->cbWritten;401 break;402 }403 404 case CALLBACKTYPE_FILE_SEEK:405 {406 PCALLBACKPAYLOAD_FILE_NOTIFY_SEEK pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_SEEK)pvData;407 PCALLBACKPAYLOAD_FILE_NOTIFY_SEEK pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_SEEK)pvCallback;408 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTFIY_SEEK));409 410 pThis->rc = pCB->rc;411 pThis->uOffActual = pCB->uOffActual;412 break;413 }414 415 case CALLBACKTYPE_FILE_TELL:416 {417 PCALLBACKPAYLOAD_FILE_NOTIFY_TELL pThis = (PCALLBACKPAYLOAD_FILE_NOTIFY_TELL)pvData;418 PCALLBACKPAYLOAD_FILE_NOTIFY_TELL pCB = (PCALLBACKPAYLOAD_FILE_NOTIFY_TELL)pvCallback;419 Assert(cbCallback == sizeof(CALLBACKPAYLOAD_FILE_NOTFIY_TELL));420 421 pThis->rc = pCB->rc;422 pThis->uOffActual = pCB->uOffActual;423 break;424 }425 #endif426 default:427 AssertMsgFailed(("Callback type not supported (%ld)\n", mType));428 rc = VERR_NOT_SUPPORTED;429 break;430 }431 432 return rc;433 }434 435 int GuestCtrlCallback::SetPayload(const void *pvToWrite, size_t cbToWrite)436 {437 if (!cbToWrite)438 return VINF_SUCCESS;439 AssertPtr(pvToWrite);440 441 Assert(pvPayload == NULL); /* Can't reuse callbacks! */442 pvPayload = RTMemAlloc(cbToWrite);443 if (!pvPayload)444 return VERR_NO_MEMORY;445 446 memcpy(pvPayload, pvToWrite, cbToWrite);447 cbPayload = cbToWrite;448 449 return VINF_SUCCESS;450 }451 452 ///////////////////////////////////////////////////////////////////////////////453 454 GuestProcessWaitEvent::GuestProcessWaitEvent(void)455 : mFlags(0),456 mResult(ProcessWaitResult_None)457 {458 }459 460 GuestProcessWaitEvent::GuestProcessWaitEvent(uint32_t uWaitFlags)461 : mFlags(uWaitFlags)462 {463 int rc = GuestCtrlEvent::Init();464 AssertRC(rc);465 }466 467 GuestProcessWaitEvent::~GuestProcessWaitEvent(void)468 {469 Destroy();470 }471 472 void GuestProcessWaitEvent::Destroy(void)473 {474 GuestCtrlEvent::Destroy();475 476 mFlags = ProcessWaitForFlag_None;477 }478 479 int GuestProcessWaitEvent::Signal(ProcessWaitResult_T enmResult, int rc /*= VINF_SUCCESS*/)480 {481 mResult = enmResult;482 483 return GuestCtrlEvent::Signal(rc);484 }485 486 ///////////////////////////////////////////////////////////////////////////////487 488 GuestSessionWaitEvent::GuestSessionWaitEvent(void)489 : mFlags(0),490 mResult(GuestSessionWaitResult_None)491 {492 }493 494 GuestSessionWaitEvent::GuestSessionWaitEvent(uint32_t uWaitFlags)495 : mFlags(uWaitFlags)496 {497 int rc = GuestCtrlEvent::Init();498 AssertRC(rc);499 }500 501 GuestSessionWaitEvent::~GuestSessionWaitEvent(void)502 {503 Destroy();504 }505 506 void GuestSessionWaitEvent::Destroy(void)507 {508 GuestCtrlEvent::Destroy();509 510 mFlags = GuestSessionWaitForFlag_None;511 }512 513 int GuestSessionWaitEvent::Signal(GuestSessionWaitResult_T enmResult, int rc /*= VINF_SUCCESS*/)514 {515 mResult = enmResult;516 517 return GuestCtrlEvent::Signal(rc);518 }519 520 ///////////////////////////////////////////////////////////////////////////////521 41 522 42 int GuestEnvironment::BuildEnvironmentBlock(void **ppvEnv, size_t *pcbEnv, uint32_t *pcEnvVars)
Note:
See TracChangeset
for help on using the changeset viewer.