VirtualBox

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

Last change on this file since 58920 was 58110, checked in by vboxsync, 9 years ago

include,misc: Doxygen grouping adjustments, collecting all the VMM bits under one parent group, ditto for the COM library.

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette