VirtualBox

source: vbox/trunk/src/VBox/Main/VBoxEvents.cpp@ 30432

Last change on this file since 30432 was 30393, checked in by vboxsync, 15 years ago

Main, glue: webservice events

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.3 KB
Line 
1/* $Id: VBoxEvents.cpp 30393 2010-06-23 14:07:46Z vboxsync $ */
2/** @file
3 * VirtualBox-specific event classes implementation
4 */
5
6/*
7 * Copyright (C) 2010 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17#include "EventImpl.h"
18
19/**
20 * @todo: Technically, this file better be autogenerated,
21 * as contains almost no semantic meat. We use aggregation
22 * of VBoxEvent to simplify multiple inheritance ambiguity.
23 */
24
25// @todo: add more elements to COM map too
26#define EVENT_CLASS_TRIVIA(klazz, iface) \
27 public: \
28 DECLARE_NOT_AGGREGATABLE(klazz) \
29 \
30 DECLARE_PROTECT_FINAL_CONSTRUCT() \
31 \
32 BEGIN_COM_MAP(klazz) \
33 COM_INTERFACE_ENTRY(iface) \
34 COM_INTERFACE_ENTRY(IEvent) \
35 COM_INTERFACE_ENTRY(IDispatch) \
36 END_COM_MAP() \
37 \
38 klazz () {} \
39 virtual ~klazz () {} \
40 \
41 HRESULT FinalConstruct() \
42 { \
43 return mEvent.createObject(); \
44 } \
45 void FinalRelease() { \
46 mEvent->FinalRelease(); \
47 } \
48 STDMETHOD(COMGETTER(Type)) (VBoxEventType_T *aType) \
49 { \
50 return mEvent->COMGETTER(Type) (aType); \
51 } \
52 STDMETHOD(COMGETTER(Source)) (IEventSource * *aSource) \
53 { \
54 return mEvent->COMGETTER(Source) (aSource); \
55 } \
56 STDMETHOD(COMGETTER(Waitable)) (BOOL *aWaitable) \
57 { \
58 return mEvent->COMGETTER(Waitable) (aWaitable); \
59 } \
60 STDMETHOD(SetProcessed)() \
61 { \
62 return mEvent->SetProcessed(); \
63 } \
64 STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult) \
65 { \
66 return mEvent->WaitProcessed(aTimeout, aResult); \
67 } \
68private: \
69 ComObjPtr<VBoxEvent> mEvent;
70
71// operator VBoxEvent&() { return mEvent; }
72// operator IEvent&() { return mEvent; }
73
74
75class ATL_NO_VTABLE MachineStateChangeEvent :
76 public VirtualBoxBase,
77 VBOX_SCRIPTABLE_IMPL(IMachineStateChangeEvent)
78{
79 EVENT_CLASS_TRIVIA(MachineStateChangeEvent, IMachineStateChangeEvent)
80
81public:
82 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aId, MachineState_T aState)
83 {
84 HRESULT rc;
85
86 rc = mEvent->init(aSource, aType, FALSE);
87 if (SUCCEEDED(rc))
88 {
89 mMachineId = aId;
90 mState = aState;
91 }
92 return rc;
93 }
94
95 void uninit()
96 {
97 mEvent->uninit();
98 }
99
100 // IMachineEvent properties
101 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
102 {
103 mMachineId.cloneTo(aMachineId);
104 return S_OK;
105 }
106 // IMachineStateChangeEvent methods
107 STDMETHOD(COMGETTER(State))(MachineState_T * aState)
108 {
109 *aState = mState;
110 return S_OK;
111 }
112
113 private:
114 Bstr mMachineId;
115 MachineState_T mState;
116};
117
118class ATL_NO_VTABLE MachineDataChangeEvent :
119 public VirtualBoxBase,
120 VBOX_SCRIPTABLE_IMPL(IMachineDataChangeEvent)
121{
122 EVENT_CLASS_TRIVIA(MachineDataChangeEvent, IMachineDataChangeEvent)
123
124public:
125 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aId)
126 {
127 HRESULT rc;
128
129 rc = mEvent->init(aSource, aType, FALSE);
130 if (SUCCEEDED(rc))
131 mMachineId = aId;
132
133 return rc;
134 }
135
136 void uninit()
137 {
138 mEvent->uninit();
139 }
140
141 // IMachineEvent properties
142 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
143 {
144 mMachineId.cloneTo(aMachineId);
145 return S_OK;
146 }
147
148 private:
149 Bstr mMachineId;
150};
151
152class ATL_NO_VTABLE MachineRegisteredEvent :
153 public VirtualBoxBase,
154 VBOX_SCRIPTABLE_IMPL(IMachineRegisteredEvent)
155{
156 EVENT_CLASS_TRIVIA(MachineRegisteredEvent, IMachineRegisteredEvent)
157
158public:
159 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aId, BOOL aRegistered)
160 {
161 HRESULT rc;
162
163 rc = mEvent->init(aSource, aType, FALSE);
164 if (SUCCEEDED(rc))
165 {
166 mMachineId = aId;
167 mRegistered = aRegistered;
168 }
169
170 return rc;
171 }
172
173 void uninit()
174 {
175 mEvent->uninit();
176 }
177
178 // IMachineEvent properties
179 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
180 {
181 mMachineId.cloneTo(aMachineId);
182 return S_OK;
183 }
184
185 // IMachineRegisteredEvent properties
186 STDMETHOD(COMGETTER(Registered))(BOOL * aRegistered)
187 {
188 *aRegistered = mRegistered;
189 return S_OK;
190 }
191
192 private:
193 Bstr mMachineId;
194 BOOL mRegistered;
195};
196
197class ATL_NO_VTABLE MachineSessionStateEvent :
198 public VirtualBoxBase,
199 VBOX_SCRIPTABLE_IMPL(IMachineSessionStateEvent)
200{
201 EVENT_CLASS_TRIVIA(MachineSessionStateEvent, IMachineSessionStateEvent)
202
203public:
204 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aId, SessionState_T aState)
205 {
206 HRESULT rc;
207
208 rc = mEvent->init(aSource, aType, FALSE);
209 if (SUCCEEDED(rc))
210 {
211 mMachineId = aId;
212 mState = aState;
213 }
214
215 return rc;
216 }
217
218 void uninit()
219 {
220 mEvent->uninit();
221 }
222
223 // IMachineEvent properties
224 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
225 {
226 mMachineId.cloneTo(aMachineId);
227 return S_OK;
228 }
229
230 // IMachineSessionStateEvent properties
231 STDMETHOD(COMGETTER(State))(SessionState_T * aState)
232 {
233 *aState = mState;
234 return S_OK;
235 }
236
237 private:
238 Bstr mMachineId;
239 SessionState_T mState;
240};
241
242class ATL_NO_VTABLE GuestPropertyChangeEvent :
243 public VirtualBoxBase,
244 VBOX_SCRIPTABLE_IMPL(IGuestPropertyChangeEvent)
245{
246 EVENT_CLASS_TRIVIA(GuestPropertyChangeEvent, IGuestPropertyChangeEvent)
247
248public:
249 HRESULT init (IEventSource* aSource, VBoxEventType_T aType,
250 IN_BSTR aMachineId, IN_BSTR aName, IN_BSTR aValue, IN_BSTR aFlags)
251 {
252 HRESULT rc;
253
254 rc = mEvent->init(aSource, aType, FALSE);
255 if (SUCCEEDED(rc))
256 {
257 mMachineId = aMachineId;
258 mName = aName;
259 mValue = aValue;
260 mFlags = aFlags;
261 }
262
263 return rc;
264 }
265
266 void uninit()
267 {
268 mEvent->uninit();
269 }
270
271 // IMachineEvent properties
272 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
273 {
274 mMachineId.cloneTo(aMachineId);
275 return S_OK;
276 }
277
278 // IGuestPropertyChangeEvent properties
279 STDMETHOD(COMGETTER(Name))(BSTR * aName)
280 {
281 mName.cloneTo(aName);
282 return S_OK;
283 }
284 STDMETHOD(COMGETTER(Value))(BSTR * aValue)
285 {
286 mValue.cloneTo(aValue);
287 return S_OK;
288 }
289 STDMETHOD(COMGETTER(Flags))(BSTR * aFlags)
290 {
291 mFlags.cloneTo(aFlags);
292 return S_OK;
293 }
294 private:
295 Bstr mMachineId, mName, mValue, mFlags;
296};
297
298class ATL_NO_VTABLE SnapshotTakenEvent :
299 public VirtualBoxBase,
300 VBOX_SCRIPTABLE_IMPL(ISnapshotTakenEvent)
301{
302 EVENT_CLASS_TRIVIA(SnapshotTakenEvent, ISnapshotTakenEvent)
303
304public:
305 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aMachineId, IN_BSTR aSnapshotId)
306 {
307 HRESULT rc;
308
309 rc = mEvent->init(aSource, aType, FALSE);
310 if (SUCCEEDED(rc))
311 {
312 mMachineId = aMachineId;
313 mSnapshotId = aSnapshotId;
314 }
315
316 return rc;
317 }
318
319 void uninit()
320 {
321 mEvent->uninit();
322 }
323
324 // IMachineEvent properties
325 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
326 {
327 mMachineId.cloneTo(aMachineId);
328 return S_OK;
329 }
330
331 // ISnapshotEvent properties
332 STDMETHOD(COMGETTER(SnapshotId)) (BSTR *aSnapshotId)
333 {
334 mSnapshotId.cloneTo(aSnapshotId);
335 return S_OK;
336 }
337
338 private:
339 Bstr mMachineId, mSnapshotId;
340};
341
342class ATL_NO_VTABLE SnapshotChangeEvent :
343 public VirtualBoxBase,
344 VBOX_SCRIPTABLE_IMPL(ISnapshotChangeEvent)
345{
346 EVENT_CLASS_TRIVIA(SnapshotChangeEvent, ISnapshotChangeEvent)
347
348public:
349 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aMachineId, IN_BSTR aSnapshotId)
350 {
351 HRESULT rc;
352
353 rc = mEvent->init(aSource, aType, FALSE);
354 if (SUCCEEDED(rc))
355 {
356 mMachineId = aMachineId;
357 mSnapshotId = aSnapshotId;
358 }
359
360 return rc;
361 }
362
363 void uninit()
364 {
365 mEvent->uninit();
366 }
367
368 // IMachineEvent properties
369 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
370 {
371 mMachineId.cloneTo(aMachineId);
372 return S_OK;
373 }
374
375 // ISnapshotEvent properties
376 STDMETHOD(COMGETTER(SnapshotId)) (BSTR *aSnapshotId)
377 {
378 mSnapshotId.cloneTo(aSnapshotId);
379 return S_OK;
380 }
381
382 private:
383 Bstr mMachineId, mSnapshotId;
384};
385
386class ATL_NO_VTABLE SnapshotDeletedEvent :
387 public VirtualBoxBase,
388 VBOX_SCRIPTABLE_IMPL(ISnapshotDeletedEvent)
389{
390 EVENT_CLASS_TRIVIA(SnapshotDeletedEvent, ISnapshotDeletedEvent)
391
392public:
393 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aMachineId, IN_BSTR aSnapshotId)
394 {
395 HRESULT rc;
396
397 rc = mEvent->init(aSource, aType, FALSE);
398 if (SUCCEEDED(rc))
399 {
400 mMachineId = aMachineId;
401 mSnapshotId = aSnapshotId;
402 }
403
404 return rc;
405 }
406
407 void uninit()
408 {
409 mEvent->uninit();
410 }
411
412 // IMachineEvent properties
413 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
414 {
415 mMachineId.cloneTo(aMachineId);
416 return S_OK;
417 }
418
419 // ISnapshotEvent properties
420 STDMETHOD(COMGETTER(SnapshotId)) (BSTR *aSnapshotId)
421 {
422 mSnapshotId.cloneTo(aSnapshotId);
423 return S_OK;
424 }
425
426 private:
427 Bstr mMachineId, mSnapshotId;
428};
429
430class ATL_NO_VTABLE ExtraDataChangeEvent :
431 public VirtualBoxBase,
432 VBOX_SCRIPTABLE_IMPL(IExtraDataChangeEvent)
433{
434 EVENT_CLASS_TRIVIA(ExtraDataChangeEvent, IExtraDataChangeEvent)
435
436public:
437 HRESULT init (IEventSource* aSource, VBoxEventType_T aType, IN_BSTR aMachineId, IN_BSTR aKey, IN_BSTR aValue)
438 {
439 HRESULT rc;
440
441 rc = mEvent->init(aSource, aType, FALSE);
442 if (SUCCEEDED(rc))
443 {
444 mMachineId = aMachineId;
445 mKey = aKey;
446 mValue = aValue;
447 }
448
449 return rc;
450 }
451
452 void uninit()
453 {
454 mEvent->uninit();
455 }
456
457 // IExtraDataChangeEvent properties
458 STDMETHOD(COMGETTER(MachineId)) (BSTR *aMachineId)
459 {
460 mMachineId.cloneTo(aMachineId);
461 return S_OK;
462 }
463
464 STDMETHOD(COMGETTER(Key)) (BSTR *aKey)
465 {
466 mKey.cloneTo(aKey);
467 return S_OK;
468 }
469
470 STDMETHOD(COMGETTER(Value)) (BSTR *aValue)
471 {
472 mValue.cloneTo(aValue);
473 return S_OK;
474 }
475
476 private:
477 Bstr mMachineId, mKey, mValue;
478};
479
480
481#ifdef VBOX_WITH_XPCOM
482NS_DECL_CLASSINFO(VBoxEvent)
483NS_IMPL_THREADSAFE_ISUPPORTS1_CI(VBoxEvent, IEvent)
484NS_DECL_CLASSINFO(MachineStateChangeEvent)
485NS_IMPL_THREADSAFE_ISUPPORTS3_CI(MachineStateChangeEvent, IMachineStateChangeEvent, IMachineEvent, IEvent)
486NS_DECL_CLASSINFO(MachineDataChangeEvent)
487NS_IMPL_THREADSAFE_ISUPPORTS3_CI(MachineDataChangeEvent, IMachineDataChangeEvent, IMachineEvent, IEvent)
488NS_DECL_CLASSINFO(MachineRegisteredEvent)
489NS_IMPL_THREADSAFE_ISUPPORTS3_CI(MachineRegisteredEvent, IMachineRegisteredEvent, IMachineEvent, IEvent)
490NS_DECL_CLASSINFO(MachineSessionStateEvent)
491NS_IMPL_THREADSAFE_ISUPPORTS3_CI(MachineSessionStateEvent, IMachineSessionStateEvent, IMachineEvent, IEvent)
492NS_DECL_CLASSINFO(GuestPropertyChangeEvent)
493NS_IMPL_THREADSAFE_ISUPPORTS3_CI(GuestPropertyChangeEvent, IGuestPropertyChangeEvent, IMachineEvent, IEvent)
494NS_DECL_CLASSINFO(SnapshotTakenEvent)
495NS_IMPL_THREADSAFE_ISUPPORTS4_CI(SnapshotTakenEvent, ISnapshotTakenEvent, ISnapshotEvent, IMachineEvent, IEvent)
496NS_DECL_CLASSINFO(SnapshotDeletedEvent)
497NS_IMPL_THREADSAFE_ISUPPORTS4_CI(SnapshotDeletedEvent, ISnapshotDeletedEvent, ISnapshotEvent, IMachineEvent, IEvent)
498NS_DECL_CLASSINFO(SnapshotChangeEvent)
499NS_IMPL_THREADSAFE_ISUPPORTS4_CI(SnapshotChangeEvent, ISnapshotChangeEvent, ISnapshotEvent, IMachineEvent, IEvent)
500NS_DECL_CLASSINFO(ExtraDataChangeEvent)
501NS_IMPL_THREADSAFE_ISUPPORTS2_CI(ExtraDataChangeEvent, IExtraDataChangeEvent, IEvent)
502#endif
503
504HRESULT VBoxEventDesc::init(IEventSource* source, VBoxEventType_T aType, ...)
505{
506 va_list args;
507 va_start(args, aType);
508 switch (aType)
509 {
510 case VBoxEventType_OnMachineStateChange:
511 {
512 ComObjPtr<MachineStateChangeEvent> obj; obj.createObject();
513 BSTR aId = va_arg(args, BSTR);
514 MachineState_T aState = va_arg(args, MachineState_T);
515 obj->init(source, aType, aId, aState);
516 obj.queryInterfaceTo(mEvent.asOutParam());
517 break;
518 }
519 case VBoxEventType_OnMachineDataChange:
520 {
521 ComObjPtr<MachineDataChangeEvent> obj; obj.createObject();
522 BSTR aId = va_arg(args, BSTR);
523 obj->init(source, aType, aId);
524 obj.queryInterfaceTo(mEvent.asOutParam());
525 break;
526 }
527 case VBoxEventType_OnMachineRegistered:
528 {
529 ComObjPtr<MachineRegisteredEvent> obj; obj.createObject();
530 BSTR aId = va_arg(args, BSTR);
531 BOOL aRegistered = va_arg(args, BOOL);
532 obj->init(source, aType, aId, aRegistered);
533 obj.queryInterfaceTo(mEvent.asOutParam());
534 break;
535 }
536 case VBoxEventType_OnSessionStateChange:
537 {
538 ComObjPtr<MachineSessionStateEvent> obj; obj.createObject();
539 BSTR aId = va_arg(args, BSTR);
540 SessionState_T aState = va_arg(args, SessionState_T);
541 obj->init(source, aType, aId, aState);
542 obj.queryInterfaceTo(mEvent.asOutParam());
543 break;
544 }
545 case VBoxEventType_OnGuestPropertyChange:
546 {
547 ComObjPtr<GuestPropertyChangeEvent> obj; obj.createObject();
548 BSTR aMachineId = va_arg(args, BSTR);
549 BSTR aName = va_arg(args, BSTR);
550 BSTR aValue = va_arg(args, BSTR);
551 BSTR aFlags = va_arg(args, BSTR);
552 obj->init(source, aType, aMachineId, aName, aValue, aFlags);
553 obj.queryInterfaceTo(mEvent.asOutParam());
554 break;
555 }
556
557 case VBoxEventType_OnSnapshotTaken:
558 {
559 ComObjPtr<SnapshotTakenEvent> obj; obj.createObject();
560 BSTR aMachineId = va_arg(args, BSTR);
561 BSTR aSnapshotId = va_arg(args, BSTR);
562 obj->init(source, aType, aMachineId, aSnapshotId);
563 obj.queryInterfaceTo(mEvent.asOutParam());
564 break;
565 }
566 case VBoxEventType_OnSnapshotDeleted:
567 {
568 ComObjPtr<SnapshotDeletedEvent> obj; obj.createObject();
569 BSTR aMachineId = va_arg(args, BSTR);
570 BSTR aSnapshotId = va_arg(args, BSTR);
571 obj->init(source, aType, aMachineId, aSnapshotId);
572 obj.queryInterfaceTo(mEvent.asOutParam());
573 break;
574 }
575 case VBoxEventType_OnSnapshotChange:
576 {
577 ComObjPtr<SnapshotChangeEvent> obj; obj.createObject();
578 BSTR aMachineId = va_arg(args, BSTR);
579 BSTR aSnapshotId = va_arg(args, BSTR);
580 obj->init(source, aType, aMachineId, aSnapshotId);
581 obj.queryInterfaceTo(mEvent.asOutParam());
582 break;
583 }
584 case VBoxEventType_OnExtraDataChange:
585 {
586 ComObjPtr<ExtraDataChangeEvent> obj; obj.createObject();
587 BSTR aMachineId = va_arg(args, BSTR);
588 BSTR aKey = va_arg(args, BSTR);
589 BSTR aValue = va_arg(args, BSTR);
590 obj->init(source, aType, aMachineId, aKey, aValue);
591 obj.queryInterfaceTo(mEvent.asOutParam());
592 break;
593 }
594
595 default:
596 if (0) AssertFailed();
597 }
598 va_end(args);
599
600 return S_OK;
601}
602
603void VBoxEventDesc::getEvent(IEvent ** aEvent)
604{
605 mEvent.queryInterfaceTo(aEvent);
606}
Note: See TracBrowser for help on using the repository browser.

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