VirtualBox

Changeset 30599 in vbox


Ignore:
Timestamp:
Jul 5, 2010 11:05:26 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63325
Message:

VBoxManage: transition to events

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp

    r28931 r30599  
    4848
    4949using namespace com;
    50 
    51 /**
    52  * IVirtualBoxCallback implementation for handling the GuestPropertyCallback in
    53  * 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_XPCOM
    63         refcnt = 0;
    64 #endif
    65     }
    66 
    67     virtual ~GuestPropertyCallback()
    68     {
    69     }
    70 
    71 #ifndef VBOX_WITH_XPCOM
    72     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_ISUPPORTS
    87 
    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 == mUuid
    161             && 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) const
    172     {
    173         return mSignalled;
    174     }
    175 
    176 private:
    177     bool volatile mSignalled;
    178     const char *mPatterns;
    179     Guid mUuid;
    180 #ifndef VBOX_WITH_XPCOM
    181     long refcnt;
    182 #endif
    183 };
    184 
    185 #ifdef VBOX_WITH_XPCOM
    186 NS_DECL_CLASSINFO(GuestPropertyCallback)
    187 NS_IMPL_THREADSAFE_ISUPPORTS1_CI(GuestPropertyCallback, IVirtualBoxCallback)
    188 #endif /* VBOX_WITH_XPCOM */
    18950
    19051void usageGuestProperty(void)
     
    439300
    440301    /*
    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
    457315    uint64_t u64Started = RTTimeMilliTS();
     316    bool fSignalled = false;
    458317    do
    459318    {
     
    468327            cMsWait = RT_MIN(1000, cMsTimeout - (uint32_t)cMsElapsed);
    469328        }
    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)
    473333        {
    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            }
    476363        }
    477     } while (!cbImpl->Signalled());
    478 
    479     a->virtualBox->UnregisterCallback(callback);
     364    } while (!fSignalled);
     365
     366    es->UnregisterListener(listener);
    480367
    481368    int rcRet = 0;
    482     if (!cbImpl->Signalled())
     369    if (!fSignalled)
    483370    {
    484371        RTPrintf("Time out or interruption while waiting for a notification.\n");
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette