EventImpl.h revision 1cee507a10df8208ebb4a36db7073b312dff343f
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync/** @file
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync *
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * VirtualBox COM IEvent implementation
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync */
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync/*
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync * Copyright (C) 2010 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
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync#include "VirtualBoxBase.h"
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncclass ATL_NO_VTABLE VBoxEvent :
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync public VirtualBoxBase,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync public VirtualBoxSupportErrorInfoImpl<VBoxEvent, IEvent>,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync public VirtualBoxSupportTranslation<VBoxEvent>,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync VBOX_SCRIPTABLE_IMPL(IEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync{
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncpublic:
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(VBoxEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync DECLARE_NOT_AGGREGATABLE(VBoxEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync BEGIN_COM_MAP(VBoxEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(IEvent)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(IDispatch)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync END_COM_MAP()
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync VBoxEvent() {}
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync virtual ~VBoxEvent() {}
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync HRESULT FinalConstruct();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void FinalRelease();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // public initializer/uninitializer for internal purposes only
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync HRESULT init (IEventSource *aSource, VBoxEventType_T aType, BOOL aWaitable);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void uninit();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // IEvent properties
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(COMGETTER(Type)) (VBoxEventType_T *aType);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(COMGETTER(Source)) (IEventSource * *aSource);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(COMGETTER(Waitable)) (BOOL *aWaitable);
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // IEvent methods
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(SetProcessed)();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // for VirtualBoxSupportErrorInfoImpl
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync static const wchar_t *getComponentName() { return L"Event"; }
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncprivate:
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync struct Data;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync Data* m;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync};
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsyncclass ATL_NO_VTABLE VBoxVetoEvent :
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync public VBoxEvent,
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync VBOX_SCRIPTABLE_IMPL(IVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync{
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsyncpublic:
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(VBoxVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync DECLARE_NOT_AGGREGATABLE(VBoxVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
f730aae71d799e740589548575e2def3203beaccvboxsync BEGIN_COM_MAP(VBoxVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
f730aae71d799e740589548575e2def3203beaccvboxsync COM_INTERFACE_ENTRY2(IEvent, IVetoEvent)
f730aae71d799e740589548575e2def3203beaccvboxsync COM_INTERFACE_ENTRY(IVetoEvent)
f730aae71d799e740589548575e2def3203beaccvboxsync COM_INTERFACE_ENTRY2(IDispatch, IVetoEvent)
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync END_COM_MAP()
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync VBoxVetoEvent() {}
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync virtual ~VBoxVetoEvent() {}
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync HRESULT FinalConstruct();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync void FinalRelease();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync // public initializer/uninitializer for internal purposes only
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync HRESULT init (IEventSource *aSource, VBoxEventType_T aType);
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync void uninit();
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync // IEvent properties
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync STDMETHOD(COMGETTER(Type)) (VBoxEventType_T *aType)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return VBoxEvent::COMGETTER(Type)(aType);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync STDMETHOD(COMGETTER(Source)) (IEventSource * *aSource)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return VBoxEvent::COMGETTER(Source)(aSource);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync STDMETHOD(COMGETTER(Waitable)) (BOOL *aWaitable)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return VBoxEvent::COMGETTER(Waitable)(aWaitable);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync // IEvent methods
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync STDMETHOD(SetProcessed)()
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return VBoxEvent::SetProcessed();
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync STDMETHOD(WaitProcessed)(LONG aTimeout, BOOL *aResult)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return VBoxEvent::WaitProcessed(aTimeout, aResult);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync // IVetoEvent methods
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync STDMETHOD(AddVeto)(IN_BSTR aVeto);
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync STDMETHOD(IsVetoed)(BOOL *aResult);
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync STDMETHOD(GetVetos)(ComSafeArrayOut(BSTR, aVetos));
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync // for VirtualBoxSupportErrorInfoImpl
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync static const wchar_t *getComponentName() { return L"VetoEvent"; }
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsyncprivate:
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync struct Data;
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync Data* m;
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync};
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncclass ATL_NO_VTABLE EventSource :
94b7446cdceebfaf85efe6c4af03a57342a8031evboxsync public VirtualBoxBase,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync public VirtualBoxSupportErrorInfoImpl<EventSource, IEventSource>,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync public VirtualBoxSupportTranslation<EventSource>,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync VBOX_SCRIPTABLE_IMPL(IEventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync{
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncpublic:
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(EventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync DECLARE_NOT_AGGREGATABLE(EventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync DECLARE_PROTECT_FINAL_CONSTRUCT()
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync BEGIN_COM_MAP(EventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(ISupportErrorInfo)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(IEventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync COM_INTERFACE_ENTRY(IDispatch)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync END_COM_MAP()
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
94b7446cdceebfaf85efe6c4af03a57342a8031evboxsync DECLARE_EMPTY_CTOR_DTOR (EventSource)
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync HRESULT FinalConstruct();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void FinalRelease();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // public initializer/uninitializer for internal purposes only
94b7446cdceebfaf85efe6c4af03a57342a8031evboxsync HRESULT init (IUnknown * aParent);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync void uninit();
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // IEventSource methods
94b7446cdceebfaf85efe6c4af03a57342a8031evboxsync STDMETHOD(CreateListener)(IEventListener ** aListener);
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync STDMETHOD(RegisterListener)(IEventListener * aListener,
40e7dd58e01abf2e1b9df9588ea22f58846bf886vboxsync ComSafeArrayIn(VBoxEventType_T, aInterested),
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync BOOL aActive);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(UnregisterListener)(IEventListener * aListener);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(FireEvent)(IEvent * aEvent,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync LONG aTimeout,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync BOOL *aProcessed);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(GetEvent)(IEventListener * aListener,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync LONG aTimeout,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync IEvent * *aEvent);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync STDMETHOD(EventProcessed)(IEventListener * aListener,
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync IEvent * aEvent);
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync // for VirtualBoxSupportErrorInfoImpl
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync static const wchar_t *getComponentName() { return L"EventSource"; }
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsyncprivate:
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync struct Data;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync Data* m;
40e7dd58e01abf2e1b9df9588ea22f58846bf886vboxsync
40e7dd58e01abf2e1b9df9588ea22f58846bf886vboxsync friend class ListenerRecord;
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync};
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncclass VBoxEventDesc
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync{
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncpublic:
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync VBoxEventDesc()
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync : mEvent(0)
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync {}
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync ~VBoxEventDesc()
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync {}
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync /**
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync * This function to be used with some care, as arguments order must match attribute declaration order
2c7402dd06f73977076fdbc86bb9f1c0c2be17f9vboxsync * event class and its superclasses up to IEvent. If unsure, consult implementation in
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync * generated VBoxEvents.cpp.
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync */
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync HRESULT init(IEventSource* aSource, VBoxEventType_T aType, ...);
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync void getEvent(IEvent ** aEvent)
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync {
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync mEvent.queryInterfaceTo(aEvent);
51e707bc5101d1a2ae988f33ebf0ef44ae6a2d90vboxsync }
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync BOOL fire(LONG aTimeout)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync if (mEventSource && mEvent)
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync {
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync BOOL fDelivered = FALSE;
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync int rc = mEventSource->FireEvent(mEvent, aTimeout, &fDelivered);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync AssertRCReturn(rc, FALSE);
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return fDelivered;
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync return FALSE;
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync }
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsyncprivate:
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync ComPtr<IEvent> mEvent;
1cee507a10df8208ebb4a36db7073b312dff343fvboxsync ComPtr<IEventSource> mEventSource;
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync};
8532fcd8b260a1648f09ab3df65e5353aa148825vboxsync
a7d389fbff436fb217a78d48fab17adcaf43dc54vboxsync#endif // ____H_EVENTIMPL