VirtualBox

source: vbox/trunk/include/VBox/com/NativeEventQueue.h

Last change on this file was 98297, checked in by vboxsync, 16 months ago

Main: rc -> hrc/vrc for all but testcases. Enabled scm rc checks accordingly. bugref:10223

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1/** @file
2 * MS COM / XPCOM Abstraction Layer - Event and EventQueue class declaration.
3 */
4
5/*
6 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef VBOX_INCLUDED_com_NativeEventQueue_h
37#define VBOX_INCLUDED_com_NativeEventQueue_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#ifndef VBOX_WITH_XPCOM
43# include <iprt/win/windows.h>
44#else
45# include <nsEventQueueUtils.h>
46#endif
47
48#include <VBox/com/defs.h>
49#include <VBox/com/assert.h>
50
51
52/** @defgroup grp_com_evt Event and EventQueue Classes
53 * @ingroup grp_com
54 * @{
55 */
56
57namespace com
58{
59
60class MainEventQueue;
61
62/**
63 * Base class for all events. Intended to be subclassed to introduce new
64 * events and handlers for them.
65 *
66 * Subclasses usually reimplement virtual #handler() (that does nothing by
67 * default) and add new data members describing the event.
68 */
69class NativeEvent
70{
71public:
72
73 NativeEvent() {}
74 virtual ~NativeEvent() {};
75
76protected:
77
78 /**
79 * Event handler. Called in the context of the event queue's thread.
80 * Always reimplemented by subclasses
81 *
82 * @return reserved, should be NULL.
83 */
84 virtual void *handler() { return NULL; }
85
86 friend class NativeEventQueue;
87};
88
89/**
90 * Simple event queue.
91 *
92 * When using XPCOM, this will map onto the default XPCOM queue for the thread.
93 * So, if a queue is created on the main thread, it automatically processes
94 * XPCOM/IPC events while waiting.
95 *
96 * When using Windows, Darwin and OS/2, this will map onto the native thread
97 * queue/runloop. So, windows messages and what not will be processed while
98 * waiting for events.
99 *
100 * @note It is intentional that there is no way to retrieve arbitrary
101 * events and controlling their processing. There is no use case which
102 * warrants introducing the complexity of platform independent events.
103 */
104class NativeEventQueue
105{
106public:
107
108 NativeEventQueue();
109 virtual ~NativeEventQueue();
110
111 BOOL postEvent(NativeEvent *event);
112 int processEventQueue(RTMSINTERVAL cMsTimeout);
113 int interruptEventQueueProcessing();
114 int getSelectFD();
115 static int init();
116 static int uninit();
117 static NativeEventQueue *getMainEventQueue();
118
119#ifdef VBOX_WITH_XPCOM
120 already_AddRefed<nsIEventQueue> getIEventQueue()
121 {
122 return mEventQ.get();
123 }
124#else
125 static int dispatchMessageOnWindows(MSG const *pMsg, int vrc);
126#endif
127
128private:
129 static NativeEventQueue *sMainQueue;
130
131#ifndef VBOX_WITH_XPCOM
132
133 /** The thread which the queue belongs to. */
134 DWORD mThreadId;
135 /** Duplicated thread handle for MsgWaitForMultipleObjects. */
136 HANDLE mhThread;
137
138#else // VBOX_WITH_XPCOM
139
140 /** Whether it was created (and thus needs destroying) or if a queue already
141 * associated with the thread was used. */
142 bool mEQCreated;
143
144 /** Whether event processing should be interrupted. */
145 bool mInterrupted;
146
147 nsCOMPtr <nsIEventQueue> mEventQ;
148 nsCOMPtr <nsIEventQueueService> mEventQService;
149
150 static void *PR_CALLBACK plEventHandler(PLEvent *self);
151 static void PR_CALLBACK plEventDestructor(PLEvent *self);
152
153#endif // VBOX_WITH_XPCOM
154};
155
156} /* namespace com */
157
158/** @} */
159
160#endif /* !VBOX_INCLUDED_com_NativeEventQueue_h */
161
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use