VirtualBox

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

Last change on this file since 55466 was 46649, checked in by vboxsync, 12 years ago

Forward ported r85941 and required build fixes (Main: Implemented new event queue to separate system's native event queue and our own. Also, XPCOM is not needed for handling our own events. On Windows this also fixes the system's queue quota limitation).

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