Changeset 30599 in vbox
- Timestamp:
- Jul 5, 2010 11:05:26 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63325
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp
r28931 r30599 48 48 49 49 using namespace com; 50 51 /**52 * IVirtualBoxCallback implementation for handling the GuestPropertyCallback in53 * relation to the "guestproperty wait" command.54 */55 class GuestPropertyCallback :56 VBOX_SCRIPTABLE_IMPL(IVirtualBoxCallback)57 {58 public:59 GuestPropertyCallback(const char *pszPatterns, Guid aUuid)60 : mSignalled(false), mPatterns(pszPatterns), mUuid(aUuid)61 {62 #ifndef VBOX_WITH_XPCOM63 refcnt = 0;64 #endif65 }66 67 virtual ~GuestPropertyCallback()68 {69 }70 71 #ifndef VBOX_WITH_XPCOM72 STDMETHOD_(ULONG, AddRef)()73 {74 return ::InterlockedIncrement(&refcnt);75 }76 STDMETHOD_(ULONG, Release)()77 {78 long cnt = ::InterlockedDecrement(&refcnt);79 if (cnt == 0)80 delete this;81 return cnt;82 }83 #endif /* !VBOX_WITH_XPCOM */84 VBOX_SCRIPTABLE_DISPATCH_IMPL(IVirtualBoxCallback)85 86 NS_DECL_ISUPPORTS87 88 STDMETHOD(OnMachineStateChange)(IN_BSTR machineId,89 MachineState_T state)90 {91 return VBOX_E_DONT_CALL_AGAIN;92 }93 94 STDMETHOD(OnMachineDataChange)(IN_BSTR machineId)95 {96 return VBOX_E_DONT_CALL_AGAIN;97 }98 99 STDMETHOD(OnExtraDataCanChange)(IN_BSTR machineId, IN_BSTR key,100 IN_BSTR value, BSTR *error,101 BOOL *changeAllowed)102 {103 /* we never disagree */104 if (!changeAllowed)105 return E_INVALIDARG;106 *changeAllowed = TRUE;107 return VBOX_E_DONT_CALL_AGAIN;108 }109 110 STDMETHOD(OnExtraDataChange)(IN_BSTR machineId, IN_BSTR key,111 IN_BSTR value)112 {113 return VBOX_E_DONT_CALL_AGAIN;114 }115 116 STDMETHOD(OnMediumRegistered)(IN_BSTR mediaId,117 DeviceType_T mediaType, BOOL registered)118 {119 NOREF(mediaId);120 NOREF(mediaType);121 NOREF(registered);122 return VBOX_E_DONT_CALL_AGAIN;123 }124 125 STDMETHOD(OnMachineRegistered)(IN_BSTR machineId, BOOL registered)126 {127 return VBOX_E_DONT_CALL_AGAIN;128 }129 130 STDMETHOD(OnSessionStateChange)(IN_BSTR machineId,131 SessionState_T state)132 {133 return VBOX_E_DONT_CALL_AGAIN;134 }135 136 STDMETHOD(OnSnapshotTaken)(IN_BSTR aMachineId,137 IN_BSTR aSnapshotId)138 {139 return VBOX_E_DONT_CALL_AGAIN;140 }141 142 STDMETHOD(OnSnapshotDeleted)(IN_BSTR aMachineId,143 IN_BSTR aSnapshotId)144 {145 return VBOX_E_DONT_CALL_AGAIN;146 }147 148 STDMETHOD(OnSnapshotChange)(IN_BSTR aMachineId,149 IN_BSTR aSnapshotId)150 {151 return VBOX_E_DONT_CALL_AGAIN;152 }153 154 STDMETHOD(OnGuestPropertyChange)(IN_BSTR machineId,155 IN_BSTR name, IN_BSTR value,156 IN_BSTR flags)157 {158 Utf8Str utf8Name(name);159 Guid uuid(machineId);160 if ( uuid == mUuid161 && RTStrSimplePatternMultiMatch(mPatterns, RTSTR_MAX,162 utf8Name.raw(), RTSTR_MAX, NULL))163 {164 RTPrintf("Name: %lS, value: %lS, flags: %lS\n", name, value, flags);165 ASMAtomicWriteBool(&mSignalled, true);166 com::EventQueue::getMainEventQueue()->interruptEventQueueProcessing();167 }168 return S_OK;169 }170 171 bool Signalled(void) const172 {173 return mSignalled;174 }175 176 private:177 bool volatile mSignalled;178 const char *mPatterns;179 Guid mUuid;180 #ifndef VBOX_WITH_XPCOM181 long refcnt;182 #endif183 };184 185 #ifdef VBOX_WITH_XPCOM186 NS_DECL_CLASSINFO(GuestPropertyCallback)187 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(GuestPropertyCallback, IVirtualBoxCallback)188 #endif /* VBOX_WITH_XPCOM */189 50 190 51 void usageGuestProperty(void) … … 439 300 440 301 /* 441 * Set up the callback and loop until signal or timeout. 442 * 443 * We do this in 1000 ms chunks to be on the safe side (there used to be 444 * better reasons for it). 445 */ 446 Bstr uuid; 447 machine->COMGETTER(Id)(uuid.asOutParam()); 448 GuestPropertyCallback *cbImpl = new GuestPropertyCallback(pszPatterns, uuid); 449 ComPtr<IVirtualBoxCallback> callback; 450 rc = createCallbackWrapper((IVirtualBoxCallback *)cbImpl, callback.asOutParam()); 451 if (FAILED(rc)) 452 { 453 RTPrintf("Error creating callback wrapper: %Rhrc\n", rc); 454 return 1; 455 } 456 a->virtualBox->RegisterCallback(callback); 302 * Set up the event listener and wait until found match or timeout. 303 */ 304 Bstr aMachStrGuid; 305 machine->COMGETTER(Id)(aMachStrGuid.asOutParam()); 306 Guid aMachGuid(aMachStrGuid); 307 ComPtr<IEventSource> es; 308 CHECK_ERROR(a->virtualBox, COMGETTER(EventSource)(es.asOutParam())); 309 ComPtr<IEventListener> listener; 310 CHECK_ERROR(es, CreateListener(listener.asOutParam())); 311 com::SafeArray <VBoxEventType_T> eventTypes(1); 312 eventTypes.push_back(VBoxEventType_OnGuestPropertyChange); 313 CHECK_ERROR(es, RegisterListener(listener, ComSafeArrayAsInParam(eventTypes), false)); 314 457 315 uint64_t u64Started = RTTimeMilliTS(); 316 bool fSignalled = false; 458 317 do 459 318 { … … 468 327 cMsWait = RT_MIN(1000, cMsTimeout - (uint32_t)cMsElapsed); 469 328 } 470 int vrc = com::EventQueue::getMainEventQueue()->processEventQueue(cMsWait); 471 if ( RT_FAILURE(vrc) 472 && vrc != VERR_TIMEOUT) 329 330 ComPtr<IEvent> ev; 331 int vrc = es->GetEvent(listener, cMsWait, ev.asOutParam()); 332 if (ev) 473 333 { 474 RTPrintf("Error waiting for event: %Rrc\n", vrc); 475 return 1; 334 VBoxEventType_T aType ; 335 vrc = ev->COMGETTER(Type)(&aType); 336 switch (aType) 337 { 338 case VBoxEventType_OnGuestPropertyChange: 339 { 340 ComPtr<IGuestPropertyChangeEvent> gpcev = ev; 341 Assert(ev); 342 Bstr aNextStrGuid; 343 gpcev->COMGETTER(MachineId)(aNextStrGuid.asOutParam()); 344 if (aMachGuid != Guid(aNextStrGuid)) 345 continue; 346 Bstr aNextName; 347 gpcev->COMGETTER(Name)(aNextName.asOutParam()); 348 if (RTStrSimplePatternMultiMatch(pszPatterns, RTSTR_MAX, 349 Utf8Str(aNextName).raw(), RTSTR_MAX, NULL)) 350 { 351 Bstr aNextValue, aNextFlags; 352 gpcev->COMGETTER(Value)(aNextValue.asOutParam()); 353 gpcev->COMGETTER(Flags)(aNextFlags.asOutParam()); 354 RTPrintf("Name: %lS, value: %lS, flags: %lS\n", 355 aNextName.raw(), aNextValue.raw(), aNextFlags.raw()); 356 fSignalled = true; 357 break; 358 } 359 } 360 default: 361 AssertFailed(); 362 } 476 363 } 477 } while (! cbImpl->Signalled());478 479 a->virtualBox->UnregisterCallback(callback);364 } while (!fSignalled); 365 366 es->UnregisterListener(listener); 480 367 481 368 int rcRet = 0; 482 if (! cbImpl->Signalled())369 if (!fSignalled) 483 370 { 484 371 RTPrintf("Time out or interruption while waiting for a notification.\n");
Note:
See TracChangeset
for help on using the changeset viewer.