Changeset 28772 in vbox
- Timestamp:
- Apr 26, 2010 5:13:39 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/HostServices/GuestControlSvc.h
r28557 r28772 124 124 }; 125 125 126 enum eVBoxGuestCtrlCallbackType 127 { 128 VBOXGUESTCTRLCALLBACKTYPE_UNKNOWN = 0, 129 VBOXGUESTCTRLCALLBACKTYPE_EXEC_START = 1, 130 VBOXGUESTCTRLCALLBACKTYPE_EXEC_OUTPUT = 2 131 }; 132 126 133 /** 127 134 * The service functions which are callable by host. -
trunk/src/VBox/Main/GuestImpl.cpp
r28728 r28772 117 117 for (it = mCallbackList.begin(); it != mCallbackList.end(); it++) 118 118 removeCtrlCallbackContext(it); 119 120 /* Clear process list. */ 121 mGuestProcessList.clear(); 119 122 #endif 120 123 … … 518 521 } 519 522 523 /* Handle process list. */ 524 /** @todo What happens on/deal with PID reuse? */ 525 /** @todo How to deal with multiple updates at once? */ 526 GuestProcessIter it_proc = getProcessByPID(pCBData->u32PID); 527 if (it_proc == mGuestProcessList.end()) 528 { 529 /* Not found, add to list. */ 530 GuestProcess p; 531 p.mPID = pCBData->u32PID; 532 p.mStatus = pCBData->u32Status; 533 //p.mReason = pCBData->u32Reason; 534 p.mExitCode = pCBData->u32Flags; /* Contains exit code. */ 535 536 mGuestProcessList.push_back(p); 537 } 538 else /* Update list. */ 539 { 540 it_proc->mStatus = pCBData->u32Status; 541 //it_proc->mReason = pCBData->u32Reason; 542 it_proc->mExitCode = pCBData->u32Flags; /* Contains exit code. */ 543 } 544 520 545 if ( !it->pProgress.isNull() 521 546 && errMsg.length()) … … 591 616 } 592 617 593 Guest:: CallbackListIter Guest::getCtrlCallbackContextByPID(uint32_t u32PID)618 Guest::GuestProcessIter Guest::getProcessByPID(uint32_t u32PID) 594 619 { 595 620 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 596 621 597 622 /** @todo Maybe use a map instead of list for fast context lookup. */ 598 CallbackListIter it; 599 for (it = mCallbackList.begin(); it != mCallbackList.end(); it++) 600 { 601 PHOSTEXECCALLBACKDATA pCBData = (HOSTEXECCALLBACKDATA*)it->pvData; 602 if (pCBData && pCBData->u32PID == u32PID) 623 GuestProcessIter it; 624 for (it = mGuestProcessList.begin(); it != mGuestProcessList.end(); it++) 625 { 626 if (it->mPID == u32PID) 603 627 return (it); 604 628 } … … 630 654 * to the callback list. A callback is identified by a unique context ID which is used 631 655 * to identify a callback from the guest side. */ 632 uint32_t Guest::addCtrlCallbackContext( void *pvData, uint32_t cbData, Progress *pProgress)656 uint32_t Guest::addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress *pProgress) 633 657 { 634 658 LogFlowFuncEnter(); … … 640 664 CallbackContext context; 641 665 context.mContextID = uNewContext; 666 context.mType = enmType; 642 667 context.bCalled = false; 643 668 context.pvData = pvData; … … 755 780 PHOSTEXECCALLBACKDATA pData = (HOSTEXECCALLBACKDATA*)RTMemAlloc(sizeof(HOSTEXECCALLBACKDATA)); 756 781 AssertPtr(pData); 757 uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECCALLBACKDATA), progress); 782 uContextID = addCtrlCallbackContext(VBOXGUESTCTRLCALLBACKTYPE_EXEC_START, 783 pData, sizeof(HOSTEXECCALLBACKDATA), progress); 758 784 Assert(uContextID > 0); 759 785 … … 952 978 /* Search for existing PID. */ 953 979 PHOSTEXECOUTCALLBACKDATA pData = (HOSTEXECOUTCALLBACKDATA*)RTMemAlloc(sizeof(HOSTEXECOUTCALLBACKDATA)); 954 uint32_t uContextID = addCtrlCallbackContext(pData, sizeof(HOSTEXECOUTCALLBACKDATA), NULL /* pProgress */); 980 uint32_t uContextID = addCtrlCallbackContext(VBOXGUESTCTRLCALLBACKTYPE_EXEC_OUTPUT, 981 pData, sizeof(HOSTEXECOUTCALLBACKDATA), NULL /* pProgress */); 955 982 Assert(uContextID > 0); 956 983 … … 1041 1068 } 1042 1069 1070 STDMETHODIMP Guest::GetProcessStatus(ULONG aPID, ULONG *aReason, ULONG *aExitCode, ULONG *aStatus) 1071 { 1072 #ifndef VBOX_WITH_GUEST_CONTROL 1073 ReturnComNotImplemented(); 1074 #else /* VBOX_WITH_GUEST_CONTROL */ 1075 using namespace guestControl; 1076 1077 HRESULT rc = S_OK; 1078 1079 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); 1080 1081 GuestProcessIterConst it; 1082 for (it = mGuestProcessList.begin(); it != mGuestProcessList.end(); it++) 1083 { 1084 if (it->mPID == aPID) 1085 break; 1086 } 1087 1088 if (it != mGuestProcessList.end()) 1089 { 1090 *aReason = it->mReason; 1091 *aExitCode = it->mExitCode; 1092 *aStatus = it->mStatus; 1093 } 1094 else 1095 rc = setError(VBOX_E_IPRT_ERROR, 1096 tr("Process (PID %u) not found!"), aPID); 1097 return rc; 1098 #endif 1099 } 1100 1043 1101 // public methods only for internal purposes 1044 1102 ///////////////////////////////////////////////////////////////////////////// -
trunk/src/VBox/Main/idl/VirtualBox.xidl
r28764 r28772 8379 8379 <interface 8380 8380 name="IGuest" extends="$unknown" 8381 uuid=" 4b8f90ce-e8ef-4f07-af1b-b0b85bc07e37"8381 uuid="a772d41d-8f60-4247-9a0e-fea7ebec2151" 8382 8382 wsmap="managed" 8383 8383 > … … 8634 8634 </desc> 8635 8635 </param> 8636 </method> 8637 8638 <method name="getProcessStatus"> 8639 <desc> 8640 Retrieves status, exit code and the exit reason of a formerly started process. 8641 8642 <result name="VBOX_E_IPRT_ERROR"> 8643 Process with specified PID was not found. 8644 </result> 8645 8646 </desc> 8647 <param name="pid" type="unsigned long" dir="in"> 8648 <desc> 8649 Process id returned by earlier executeProcess() call. 8650 </desc> 8651 </param> 8652 <param name="reason" type="unsigned long" dir="out"> 8653 <desc> 8654 The reason of exit. 8655 </desc> 8656 </param> 8657 <param name="exitcode" type="unsigned long" dir="out"> 8658 <desc> 8659 The actual exit code. 8660 </desc> 8661 </param> 8662 <param name="status" type="unsigned long" dir="return"> 8663 <desc> 8664 The current process status. 8665 </desc> 8666 </param> 8636 8667 </method> 8637 8668 -
trunk/src/VBox/Main/include/GuestImpl.h
r28641 r28772 96 96 IN_BSTR aStdIn, IN_BSTR aStdOut, IN_BSTR aStdErr, 97 97 IN_BSTR aUserName, IN_BSTR aPassword, 98 ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress);98 ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress); 99 99 STDMETHOD(GetProcessOutput)(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, ULONG64 aSize, ComSafeArrayOut(BYTE, aData)); 100 STDMETHOD(GetProcessStatus)(ULONG aPID, ULONG *aReason, ULONG *aExitCode, ULONG *aStatus); 100 101 STDMETHOD(InternalGetStatistics)(ULONG *aCpuUser, ULONG *aCpuKernel, ULONG *aCpuIdle, 101 102 ULONG *aMemTotal, ULONG *aMemFree, ULONG *aMemBalloon, ULONG *aMemCache, … … 124 125 struct CallbackContext 125 126 { 126 uint32_t mContextID; 127 void *pvData; 128 uint32_t cbData; 127 uint32_t mContextID; 128 eVBoxGuestCtrlCallbackType mType; 129 void *pvData; 130 uint32_t cbData; 129 131 /** Atomic flag whether callback was called. */ 130 volatile bool bCalled;132 volatile bool bCalled; 131 133 /** Pointer to user-supplied IProgress. */ 132 ComObjPtr<Progress> pProgress;134 ComObjPtr<Progress> pProgress; 133 135 }; 134 136 typedef std::list< CallbackContext > CallbackList; 135 137 typedef std::list< CallbackContext >::iterator CallbackListIter; 136 138 typedef std::list< CallbackContext >::const_iterator CallbackListIterConst; 139 140 struct GuestProcess 141 { 142 uint32_t mPID; 143 uint32_t mStatus; 144 uint32_t mReason; 145 uint32_t mExitCode; 146 }; 147 typedef std::list< GuestProcess > GuestProcessList; 148 typedef std::list< GuestProcess >::iterator GuestProcessIter; 149 typedef std::list< GuestProcess >::const_iterator GuestProcessIterConst; 137 150 138 151 int prepareExecuteEnv(const char *pszEnv, void **ppvList, uint32_t *pcbList, uint32_t *pcEnv); … … 141 154 int notifyCtrlExecOut(uint32_t u32Function, PHOSTEXECOUTCALLBACKDATA pData); 142 155 CallbackListIter getCtrlCallbackContextByID(uint32_t u32ContextID); 143 CallbackListIter getCtrlCallbackContextByPID(uint32_t u32PID);156 GuestProcessIter getProcessByPID(uint32_t u32PID); 144 157 void removeCtrlCallbackContext(CallbackListIter it); 145 uint32_t addCtrlCallbackContext( void *pvData, uint32_t cbData, Progress* pProgress);158 uint32_t addCtrlCallbackContext(eVBoxGuestCtrlCallbackType enmType, void *pvData, uint32_t cbData, Progress* pProgress); 146 159 # endif 147 160 … … 171 184 volatile uint32_t mNextContextID; 172 185 CallbackList mCallbackList; 186 GuestProcessList mGuestProcessList; 173 187 # endif 174 188 };
Note:
See TracChangeset
for help on using the changeset viewer.