1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync/** @file
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * MS COM / XPCOM Abstraction Layer:
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Event and EventQueue class declaration
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync/*
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Copyright (C) 2006-2013 Oracle Corporation
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * available from http://www.virtualbox.org. This file is free software;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * General Public License (GPL) as published by the Free Software
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * The contents of this file may alternatively be used under the terms
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * of the Common Development and Distribution License Version 1.0
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * VirtualBox OSE distribution, in which case the provisions of the
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * CDDL are applicable instead of those of the GPL.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * You may elect to license modified versions of this file under the
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * terms and conditions of either the GPL or the CDDL or both.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#ifndef ___VBox_com_EventQueue_h
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#define ___VBox_com_EventQueue_h
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#ifndef VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync# include <Windows.h>
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#else // VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync# include <nsEventQueueUtils.h>
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#endif // VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#include <VBox/com/defs.h>
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#include <VBox/com/assert.h>
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncnamespace com
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync{
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncclass MainEventQueue;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync/**
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Base class for all events. Intended to be subclassed to introduce new
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * events and handlers for them.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Subclasses usually reimplement virtual #handler() (that does nothing by
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * default) and add new data members describing the event.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncclass NativeEvent
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync{
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncpublic:
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync NativeEvent() {}
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync virtual ~NativeEvent() {};
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncprotected:
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync /**
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Event handler. Called in the context of the event queue's thread.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Always reimplemented by subclasses
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * @return reserved, should be NULL.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync virtual void *handler() { return NULL; }
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync friend class NativeEventQueue;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync};
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync/**
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * Simple event queue.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * When using XPCOM, this will map onto the default XPCOM queue for the thread.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * So, if a queue is created on the main thread, it automatically processes
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * XPCOM/IPC events while waiting.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * When using Windows, Darwin and OS/2, this will map onto the native thread
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * queue/runloop. So, windows messages and what not will be processed while
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * waiting for events.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync *
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * @note It is intentional that there is no way to retrieve arbitrary
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * events and controlling their processing. There is no use case which
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * warrants introducing the complexity of platform independent events.
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncclass NativeEventQueue
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync{
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncpublic:
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync NativeEventQueue();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync virtual ~NativeEventQueue();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync BOOL postEvent(NativeEvent *event);
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync int processEventQueue(RTMSINTERVAL cMsTimeout);
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync int interruptEventQueueProcessing();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync int getSelectFD();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static int init();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static int uninit();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static NativeEventQueue *getMainEventQueue();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#ifdef VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync already_AddRefed<nsIEventQueue> getIEventQueue()
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync {
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync return mEventQ.get();
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync }
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#else
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static int dispatchMessageOnWindows(MSG const *pMsg, int rc);
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#endif
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsyncprivate:
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static NativeEventQueue *sMainQueue;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#ifndef VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync /** The thread which the queue belongs to. */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync DWORD mThreadId;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync /** Duplicated thread handle for MsgWaitForMultipleObjects. */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync HANDLE mhThread;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#else // VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync /** Whether it was created (and thus needs destroying) or if a queue already
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync * associated with the thread was used. */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync bool mEQCreated;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync /** Whether event processing should be interrupted. */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync bool mInterrupted;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync nsCOMPtr <nsIEventQueue> mEventQ;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync nsCOMPtr <nsIEventQueueService> mEventQService;
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static void *PR_CALLBACK plEventHandler(PLEvent *self);
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync static void PR_CALLBACK plEventDestructor(PLEvent *self);
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#endif // VBOX_WITH_XPCOM
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync};
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync} /* namespace com */
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync
1bb6533bfb0d3d111161e0fb45b04b5e8f2c7c85vboxsync#endif