listeners.h revision 206886290dbecc59a96634c1d4c9812f12dc21f9
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync/* $Id$ */
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync/** @file
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync *
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * Listeners helpers.
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync */
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync/*
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * Copyright (C) 2010 Oracle Corporation
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync *
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * available from http://www.virtualbox.org. This file is free software;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * General Public License (GPL) as published by the Free Software
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync *
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * The contents of this file may alternatively be used under the terms
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * of the Common Development and Distribution License Version 1.0
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * CDDL are applicable instead of those of the GPL.
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync *
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * You may elect to license modified versions of this file under the
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync * terms and conditions of either the GPL or the CDDL or both.
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync */
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifndef ___VBox_com_listeners_h
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define ___VBox_com_listeners_h
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#include <VBox/com/com.h>
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#include <VBox/com/defs.h>
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#include <iprt/asm.h>
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifdef VBOX_WITH_XPCOM
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define NS_IMPL_QUERY_HEAD_INLINE() \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsyncNS_IMETHODIMP QueryInterface(REFNSIID aIID, void** aInstancePtr) \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync{ \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_ASSERTION(aInstancePtr, \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync "QueryInterface requires a non-NULL destination!"); \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync nsISupports* foundInterface;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define NS_INTERFACE_MAP_BEGIN_INLINE() NS_IMPL_QUERY_HEAD_INLINE()
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define NS_IMPL_QUERY_INTERFACE1_INLINE(_i1) \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_INTERFACE_MAP_BEGIN_INLINE() \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_INTERFACE_MAP_ENTRY(_i1) \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _i1) \
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_INTERFACE_MAP_END
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsynctemplate <class T, class TParam = void* >
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsyncclass ListenerImpl : VBOX_SCRIPTABLE_IMPL(IEventListener)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync{
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync T mListener;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync volatile uint32_t mRefCnt;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync virtual ~ListenerImpl()
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {}
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsyncpublic:
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync ListenerImpl(TParam param)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync : mListener(param), mRefCnt(1)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync }
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync ListenerImpl()
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync : mRefCnt(1)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync }
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync /* On Windows QI implemented by VBOX_SCRIPTABLE_DISPATCH_IMPL */
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifndef RT_OS_WINDOWS
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_IMPL_QUERY_INTERFACE1_INLINE(IEventListener)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifdef RT_OS_WINDOWS
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync STDMETHOD_(ULONG, AddRef)()
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#else
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_IMETHOD_(nsrefcnt) AddRef(void)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync return ASMAtomicIncU32(&mRefCnt);
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync }
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifdef RT_OS_WINDOWS
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync STDMETHOD_(ULONG, Release)()
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#else
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync NS_IMETHOD_(nsrefcnt) Release(void)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync uint32_t cnt = ::ASMAtomicDecU32(&mRefCnt);
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync if (cnt == 0)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync delete this;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync return cnt;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync }
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync VBOX_SCRIPTABLE_DISPATCH_IMPL(IEventListener)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync STDMETHOD(HandleEvent)(IEvent * aEvent)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync {
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync VBoxEventType_T aType = VBoxEventType_Invalid;
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync aEvent->COMGETTER(Type)(&aType);
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync return mListener.HandleEvent(aType, aEvent);
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync }
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync};
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#ifdef VBOX_WITH_XPCOM
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define VBOX_LISTENER_DECLARE(klazz) NS_DECL_CLASSINFO(klazz)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#else
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#define VBOX_LISTENER_DECLARE(klazz)
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync
206886290dbecc59a96634c1d4c9812f12dc21f9vboxsync#endif