6bc1c8274566f065e18c252f709143511be5276cvboxsync/* $Id$ */
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync/** @file
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * VirtualBox COM IEvent implementation
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync */
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync/*
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync * Copyright (C) 2010-2014 Oracle Corporation
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync *
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * available from http://www.virtualbox.org. This file is free software;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * you can redistribute it and/or modify it under the terms of the GNU
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * General Public License (GPL) as published by the Free Software
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync */
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync#ifndef ____H_EVENTIMPL
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync#define ____H_EVENTIMPL
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync#include "EventWrap.h"
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync#include "EventSourceWrap.h"
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync#include "VetoEventWrap.h"
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncclass ATL_NO_VTABLE VBoxEvent :
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync public EventWrap
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync{
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncpublic:
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync DECLARE_EMPTY_CTOR_DTOR(VBoxEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync HRESULT FinalConstruct();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void FinalRelease();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // public initializer/uninitializer for internal purposes only
7d913420297c8662dd9523fbf927125b3ed48814vboxsync HRESULT init(IEventSource *aSource, VBoxEventType_T aType, BOOL aWaitable);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void uninit();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsyncprivate:
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IEvent properties
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getType(VBoxEventType_T *aType);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getSource(ComPtr<IEventSource> &aSource);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getWaitable(BOOL *aWaitable);
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IEvent methods
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT setProcessed();
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT waitProcessed(LONG aTimeout, BOOL *aResult);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync struct Data;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync Data* m;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync};
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsyncclass ATL_NO_VTABLE VBoxVetoEvent :
3078e717940a539966119ecd5215ec223c1ef500vboxsync public VetoEventWrap
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync{
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsyncpublic:
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync DECLARE_EMPTY_CTOR_DTOR(VBoxVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync HRESULT FinalConstruct();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync void FinalRelease();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync // public initializer/uninitializer for internal purposes only
7d913420297c8662dd9523fbf927125b3ed48814vboxsync HRESULT init(IEventSource *aSource, VBoxEventType_T aType);
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync void uninit();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsyncprivate:
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IEvent properties
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getType(VBoxEventType_T *aType);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getSource(ComPtr<IEventSource> &aSource);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getWaitable(BOOL *aWaitable);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IEvent methods
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT setProcessed();
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT waitProcessed(LONG aTimeout, BOOL *aResult);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IVetoEvent methods
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT addVeto(const com::Utf8Str &aReason);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT isVetoed(BOOL *aResult);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getVetos(std::vector<com::Utf8Str> &aResult);
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync struct Data;
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync Data* m;
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync};
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncclass ATL_NO_VTABLE EventSource :
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync public EventSourceWrap
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync{
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncpublic:
7d913420297c8662dd9523fbf927125b3ed48814vboxsync DECLARE_EMPTY_CTOR_DTOR(EventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync HRESULT FinalConstruct();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void FinalRelease();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // public initializer/uninitializer for internal purposes only
c2590a722c15520a45551ed7dc02d4831fb1a48evboxsync HRESULT init();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void uninit();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncprivate:
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync // wrapped IEventSource methods
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT createListener(ComPtr<IEventListener> &aListener);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT createAggregator(const std::vector<ComPtr<IEventSource> > &aSubordinates,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync ComPtr<IEventSource> &aResult);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT registerListener(const ComPtr<IEventListener> &aListener,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync const std::vector<VBoxEventType_T> &aInteresting,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync BOOL aActive);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT unregisterListener(const ComPtr<IEventListener> &aListener);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT fireEvent(const ComPtr<IEvent> &aEvent,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync LONG aTimeout,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync BOOL *aResult);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT getEvent(const ComPtr<IEventListener> &aListener,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync LONG aTimeout,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync ComPtr<IEvent> &aEvent);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync HRESULT eventProcessed(const ComPtr<IEventListener> &aListener,
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync const ComPtr<IEvent> &aEvent);
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync struct Data;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync Data* m;
40e7dd58e01abf2e1b9df9588ea22f58846bf886vboxsync
40e7dd58e01abf2e1b9df9588ea22f58846bf886vboxsync friend class ListenerRecord;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync};
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncclass VBoxEventDesc
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync{
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncpublic:
7d913420297c8662dd9523fbf927125b3ed48814vboxsync VBoxEventDesc() : mEvent(0), mEventSource(0)
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {}
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync ~VBoxEventDesc()
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {}
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync /**
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * This function to be used with some care, as arguments order must match
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * attribute declaration order event class and its superclasses up to
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * IEvent. If unsure, consult implementation in generated VBoxEvents.cpp.
7d913420297c8662dd9523fbf927125b3ed48814vboxsync */
7d913420297c8662dd9523fbf927125b3ed48814vboxsync HRESULT init(IEventSource* aSource, VBoxEventType_T aType, ...);
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync /**
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * Function similar to the above, but assumes that init() for this type
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * already called once, so no need to allocate memory, and only reinit
7d913420297c8662dd9523fbf927125b3ed48814vboxsync * fields. Assumes event is subtype of IReusableEvent, asserts otherwise.
7d913420297c8662dd9523fbf927125b3ed48814vboxsync */
7d913420297c8662dd9523fbf927125b3ed48814vboxsync HRESULT reinit(VBoxEventType_T aType, ...);
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync void uninit()
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {
7d913420297c8662dd9523fbf927125b3ed48814vboxsync mEvent.setNull();
7d913420297c8662dd9523fbf927125b3ed48814vboxsync mEventSource.setNull();
7d913420297c8662dd9523fbf927125b3ed48814vboxsync }
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync void getEvent(IEvent **aEvent)
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {
7d913420297c8662dd9523fbf927125b3ed48814vboxsync mEvent.queryInterfaceTo(aEvent);
7d913420297c8662dd9523fbf927125b3ed48814vboxsync }
7d913420297c8662dd9523fbf927125b3ed48814vboxsync
7d913420297c8662dd9523fbf927125b3ed48814vboxsync BOOL fire(LONG aTimeout)
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {
7d913420297c8662dd9523fbf927125b3ed48814vboxsync if (mEventSource && mEvent)
7d913420297c8662dd9523fbf927125b3ed48814vboxsync {
7d913420297c8662dd9523fbf927125b3ed48814vboxsync BOOL fDelivered = FALSE;
7d913420297c8662dd9523fbf927125b3ed48814vboxsync int rc = mEventSource->FireEvent(mEvent, aTimeout, &fDelivered);
7d913420297c8662dd9523fbf927125b3ed48814vboxsync AssertRCReturn(rc, FALSE);
7d913420297c8662dd9523fbf927125b3ed48814vboxsync return fDelivered;
7d913420297c8662dd9523fbf927125b3ed48814vboxsync }
7d913420297c8662dd9523fbf927125b3ed48814vboxsync return FALSE;
7d913420297c8662dd9523fbf927125b3ed48814vboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncprivate:
7d913420297c8662dd9523fbf927125b3ed48814vboxsync ComPtr<IEvent> mEvent;
7d913420297c8662dd9523fbf927125b3ed48814vboxsync ComPtr<IEventSource> mEventSource;
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync};
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
0d0253c4c63a28f67509d37a41df855173e94ee1vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync#endif // ____H_EVENTIMPL