2012-06-10 16:50:54 +00:00
|
|
|
/*
|
|
|
|
* synergy -- mouse and keyboard sharing utility
|
2012-09-04 02:09:56 +00:00
|
|
|
* Copyright (C) 2012 Bolton Software Ltd.
|
|
|
|
* Copyright (C) 2004 Chris Schoeneman
|
2012-06-10 16:50:54 +00:00
|
|
|
*
|
|
|
|
* This package is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* found in the file COPYING that should have accompanied this file.
|
|
|
|
*
|
|
|
|
* This package is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2014-02-28 12:36:45 +00:00
|
|
|
#pragma once
|
2012-06-10 16:50:54 +00:00
|
|
|
|
2014-02-28 12:36:45 +00:00
|
|
|
#include "common/IInterface.h"
|
|
|
|
#include "base/Event.h"
|
|
|
|
#include "base/String.h"
|
2012-06-10 16:50:54 +00:00
|
|
|
|
|
|
|
class IEventJob;
|
|
|
|
class IEventQueueBuffer;
|
|
|
|
|
|
|
|
// Opaque type for timer info. This is defined by subclasses of
|
|
|
|
// IEventQueueBuffer.
|
|
|
|
class CEventQueueTimer;
|
|
|
|
|
2013-06-29 14:17:49 +00:00
|
|
|
// Event type registration classes.
|
|
|
|
class CClientEvents;
|
|
|
|
class IStreamEvents;
|
|
|
|
class CIpcClientEvents;
|
|
|
|
class CIpcClientProxyEvents;
|
|
|
|
class CIpcServerEvents;
|
|
|
|
class CIpcServerProxyEvents;
|
|
|
|
class IDataSocketEvents;
|
|
|
|
class IListenSocketEvents;
|
|
|
|
class ISocketEvents;
|
|
|
|
class COSXScreenEvents;
|
|
|
|
class CClientListenerEvents;
|
|
|
|
class CClientProxyEvents;
|
|
|
|
class CClientProxyUnknownEvents;
|
|
|
|
class CServerEvents;
|
|
|
|
class CServerAppEvents;
|
|
|
|
class IKeyStateEvents;
|
|
|
|
class IPrimaryScreenEvents;
|
|
|
|
class IScreenEvents;
|
|
|
|
|
2012-06-10 16:50:54 +00:00
|
|
|
//! Event queue interface
|
|
|
|
/*!
|
|
|
|
An event queue provides a queue of CEvents. Clients can block waiting
|
|
|
|
on any event becoming available at the head of the queue and can place
|
|
|
|
new events at the end of the queue. Clients can also add and remove
|
|
|
|
timers which generate events periodically.
|
|
|
|
*/
|
|
|
|
class IEventQueue : public IInterface {
|
|
|
|
public:
|
|
|
|
class CTimerEvent {
|
|
|
|
public:
|
|
|
|
CEventQueueTimer* m_timer; //!< The timer
|
|
|
|
UInt32 m_count; //!< Number of repeats
|
|
|
|
};
|
|
|
|
|
|
|
|
//! @name manipulators
|
|
|
|
//@{
|
|
|
|
|
2012-06-29 11:33:21 +00:00
|
|
|
//! Loop the event queue until quit
|
|
|
|
/*!
|
|
|
|
Dequeues and dispatches events until the kQuit event is found.
|
|
|
|
*/
|
|
|
|
virtual void loop() = 0;
|
|
|
|
|
2012-06-10 16:50:54 +00:00
|
|
|
//! Set the buffer
|
|
|
|
/*!
|
|
|
|
Replace the current event queue buffer. Any queued events are
|
|
|
|
discarded. The queue takes ownership of the buffer.
|
|
|
|
*/
|
|
|
|
virtual void adoptBuffer(IEventQueueBuffer*) = 0;
|
|
|
|
|
|
|
|
//! Remove event from queue
|
|
|
|
/*!
|
|
|
|
Returns the next event on the queue into \p event. If no event is
|
|
|
|
available then blocks for up to \p timeout seconds, or forever if
|
|
|
|
\p timeout is negative. Returns true iff an event was available.
|
|
|
|
*/
|
|
|
|
virtual bool getEvent(CEvent& event, double timeout = -1.0) = 0;
|
|
|
|
|
|
|
|
//! Dispatch an event
|
|
|
|
/*!
|
|
|
|
Looks up the dispatcher for the event's target and invokes it.
|
|
|
|
Returns true iff a dispatcher exists for the target.
|
|
|
|
*/
|
|
|
|
virtual bool dispatchEvent(const CEvent& event) = 0;
|
|
|
|
|
|
|
|
//! Add event to queue
|
|
|
|
/*!
|
|
|
|
Adds \p event to the end of the queue.
|
|
|
|
*/
|
|
|
|
virtual void addEvent(const CEvent& event) = 0;
|
|
|
|
|
|
|
|
//! Create a recurring timer
|
|
|
|
/*!
|
|
|
|
Creates and returns a timer. An event is returned after \p duration
|
|
|
|
seconds and the timer is reset to countdown again. When a timer event
|
|
|
|
is returned the data points to a \c CTimerEvent. The client must pass
|
|
|
|
the returned timer to \c deleteTimer() (whether or not the timer has
|
|
|
|
expired) to release the timer. The returned timer event uses the
|
|
|
|
given \p target. If \p target is NULL it uses the returned timer as
|
|
|
|
the target.
|
|
|
|
|
|
|
|
Events for a single timer don't accumulate in the queue, even if the
|
|
|
|
client reading events can't keep up. Instead, the \c m_count member
|
|
|
|
of the \c CTimerEvent indicates how many events for the timer would
|
|
|
|
have been put on the queue since the last event for the timer was
|
|
|
|
removed (or since the timer was added).
|
|
|
|
*/
|
|
|
|
virtual CEventQueueTimer*
|
|
|
|
newTimer(double duration, void* target) = 0;
|
|
|
|
|
|
|
|
//! Create a one-shot timer
|
|
|
|
/*!
|
|
|
|
Creates and returns a one-shot timer. An event is returned when
|
|
|
|
the timer expires and the timer is removed from further handling.
|
|
|
|
When a timer event is returned the data points to a \c CTimerEvent.
|
|
|
|
The c_count member of the \c CTimerEvent is always 1. The client
|
|
|
|
must pass the returned timer to \c deleteTimer() (whether or not the
|
|
|
|
timer has expired) to release the timer. The returned timer event
|
|
|
|
uses the given \p target. If \p target is NULL it uses the returned
|
|
|
|
timer as the target.
|
|
|
|
*/
|
|
|
|
virtual CEventQueueTimer*
|
|
|
|
newOneShotTimer(double duration,
|
|
|
|
void* target) = 0;
|
|
|
|
|
|
|
|
//! Destroy a timer
|
|
|
|
/*!
|
|
|
|
Destroys a previously created timer. The timer is removed from the
|
|
|
|
queue and will not generate event, even if the timer has expired.
|
|
|
|
*/
|
|
|
|
virtual void deleteTimer(CEventQueueTimer*) = 0;
|
|
|
|
|
|
|
|
//! Register an event handler for an event type
|
|
|
|
/*!
|
|
|
|
Registers an event handler for \p type and \p target. The \p handler
|
|
|
|
is adopted. Any existing handler for the type,target pair is deleted.
|
|
|
|
\c dispatchEvent() will invoke \p handler for any event for \p target
|
|
|
|
of type \p type. If no such handler exists it will use the handler
|
|
|
|
for \p target and type \p kUnknown if it exists.
|
|
|
|
*/
|
|
|
|
virtual void adoptHandler(CEvent::Type type,
|
|
|
|
void* target, IEventJob* handler) = 0;
|
|
|
|
|
|
|
|
//! Unregister an event handler for an event type
|
|
|
|
/*!
|
|
|
|
Unregisters an event handler for the \p type, \p target pair and
|
|
|
|
deletes it.
|
|
|
|
*/
|
|
|
|
virtual void removeHandler(CEvent::Type type, void* target) = 0;
|
|
|
|
|
|
|
|
//! Unregister all event handlers for an event target
|
|
|
|
/*!
|
|
|
|
Unregisters all event handlers for the \p target and deletes them.
|
|
|
|
*/
|
|
|
|
virtual void removeHandlers(void* target) = 0;
|
|
|
|
|
|
|
|
//! Creates a new event type
|
|
|
|
/*!
|
|
|
|
If \p type contains \c kUnknown then it is set to a unique event
|
|
|
|
type id otherwise it is left alone. The final value of \p type
|
|
|
|
is returned.
|
|
|
|
*/
|
|
|
|
virtual CEvent::Type
|
|
|
|
registerTypeOnce(CEvent::Type& type,
|
|
|
|
const char* name) = 0;
|
|
|
|
|
2014-04-17 10:56:25 +00:00
|
|
|
//! Wait for event queue to become ready
|
|
|
|
/*!
|
|
|
|
Blocks on the current thread until the event queue is ready for events to
|
|
|
|
be added.
|
|
|
|
*/
|
|
|
|
virtual void waitForReady() const = 0;
|
|
|
|
|
2012-06-10 16:50:54 +00:00
|
|
|
//@}
|
|
|
|
//! @name accessors
|
|
|
|
//@{
|
|
|
|
|
|
|
|
//! Test if queue is empty
|
|
|
|
/*!
|
|
|
|
Returns true iff the queue has no events in it, including timer
|
|
|
|
events.
|
|
|
|
*/
|
|
|
|
virtual bool isEmpty() const = 0;
|
|
|
|
|
|
|
|
//! Get an event handler
|
|
|
|
/*!
|
|
|
|
Finds and returns the event handler for the \p type, \p target pair
|
|
|
|
if it exists, otherwise it returns NULL.
|
|
|
|
*/
|
|
|
|
virtual IEventJob* getHandler(CEvent::Type type, void* target) const = 0;
|
|
|
|
|
|
|
|
//! Get name for event
|
|
|
|
/*!
|
|
|
|
Returns the name for the event \p type. This is primarily for
|
|
|
|
debugging.
|
|
|
|
*/
|
|
|
|
virtual const char* getTypeName(CEvent::Type type) = 0;
|
|
|
|
|
|
|
|
//! Get an event type by name
|
|
|
|
/*!
|
|
|
|
Returns the registered type for an event for a given name.
|
|
|
|
*/
|
|
|
|
virtual CEvent::Type getRegisteredType(const CString& name) const = 0;
|
|
|
|
|
|
|
|
//! Get the system event type target
|
|
|
|
/*!
|
|
|
|
Returns the target to use for dispatching \c CEvent::kSystem events.
|
|
|
|
*/
|
2013-06-29 14:17:49 +00:00
|
|
|
virtual void* getSystemTarget() = 0;
|
2012-06-10 16:50:54 +00:00
|
|
|
|
|
|
|
//@}
|
2013-06-29 14:17:49 +00:00
|
|
|
|
|
|
|
//
|
|
|
|
// Event type providers.
|
|
|
|
//
|
|
|
|
|
|
|
|
virtual CClientEvents& forCClient() = 0;
|
|
|
|
virtual IStreamEvents& forIStream() = 0;
|
|
|
|
virtual CIpcClientEvents& forCIpcClient() = 0;
|
|
|
|
virtual CIpcClientProxyEvents& forCIpcClientProxy() = 0;
|
|
|
|
virtual CIpcServerEvents& forCIpcServer() = 0;
|
|
|
|
virtual CIpcServerProxyEvents& forCIpcServerProxy() = 0;
|
|
|
|
virtual IDataSocketEvents& forIDataSocket() = 0;
|
|
|
|
virtual IListenSocketEvents& forIListenSocket() = 0;
|
|
|
|
virtual ISocketEvents& forISocket() = 0;
|
|
|
|
virtual COSXScreenEvents& forCOSXScreen() = 0;
|
|
|
|
virtual CClientListenerEvents& forCClientListener() = 0;
|
|
|
|
virtual CClientProxyEvents& forCClientProxy() = 0;
|
|
|
|
virtual CClientProxyUnknownEvents& forCClientProxyUnknown() = 0;
|
|
|
|
virtual CServerEvents& forCServer() = 0;
|
|
|
|
virtual CServerAppEvents& forCServerApp() = 0;
|
|
|
|
virtual IKeyStateEvents& forIKeyState() = 0;
|
|
|
|
virtual IPrimaryScreenEvents& forIPrimaryScreen() = 0;
|
|
|
|
virtual IScreenEvents& forIScreen() = 0;
|
2012-06-10 16:50:54 +00:00
|
|
|
};
|