1/*
2 * Copyright 2009, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Michael Lotz <mmlr@mlotz.ch>
7 */
8#ifndef REMOTE_HW_INTERFACE_H
9#define REMOTE_HW_INTERFACE_H
10
11#include "HWInterface.h"
12
13#include <AutoDeleter.h>
14#include <Locker.h>
15#include <ObjectList.h>
16
17class BNetEndpoint;
18class StreamingRingBuffer;
19class NetSender;
20class NetReceiver;
21class RemoteEventStream;
22class RemoteMessage;
23
24struct callback_info;
25
26
27class RemoteHWInterface : public HWInterface {
28public:
29									RemoteHWInterface(const char* target);
30virtual								~RemoteHWInterface();
31
32virtual	status_t					Initialize();
33virtual	status_t					Shutdown();
34
35virtual	DrawingEngine*				CreateDrawingEngine();
36virtual	EventStream*				CreateEventStream();
37
38virtual	status_t					SetMode(const display_mode& mode);
39virtual	void						GetMode(display_mode* mode);
40virtual	status_t					GetPreferredMode(display_mode* mode);
41
42virtual status_t					GetDeviceInfo(accelerant_device_info* info);
43virtual status_t					GetFrameBufferConfig(
44										frame_buffer_config& config);
45
46virtual status_t					GetModeList(display_mode** _modeList,
47										uint32* _count);
48virtual status_t					GetPixelClockLimits(display_mode* mode,
49										uint32* _low, uint32* _high);
50virtual status_t					GetTimingConstraints(
51										display_timing_constraints* constraints);
52virtual status_t					ProposeMode(display_mode* candidate,
53										const display_mode* low,
54										const display_mode* high);
55
56virtual sem_id						RetraceSemaphore();
57virtual status_t					WaitForRetrace(
58										bigtime_t timeout = B_INFINITE_TIMEOUT);
59
60virtual status_t					SetDPMSMode(uint32 state);
61virtual uint32						DPMSMode();
62virtual uint32						DPMSCapabilities();
63
64virtual status_t			SetBrightness(float);
65virtual status_t			GetBrightness(float*);
66
67		// cursor handling
68virtual	void						SetCursor(ServerCursor* cursor);
69virtual	void						SetCursorVisible(bool visible);
70virtual	void						MoveCursorTo(float x, float y);
71virtual	void						SetDragBitmap(const ServerBitmap* bitmap,
72										const BPoint& offsetFormCursor);
73
74		// frame buffer access
75virtual	RenderingBuffer*			FrontBuffer() const;
76virtual	RenderingBuffer*			BackBuffer() const;
77virtual	bool						IsDoubleBuffered() const;
78
79virtual	status_t					InvalidateRegion(const BRegion& region);
80virtual	status_t					Invalidate(const BRect& frame);
81virtual	status_t					CopyBackToFront(const BRect& frame);
82
83		// drawing engine interface
84		StreamingRingBuffer*		ReceiveBuffer()
85										{ return fReceiveBuffer.Get(); }
86		StreamingRingBuffer*		SendBuffer() { return fSendBuffer.Get(); }
87
88typedef bool (*CallbackFunction)(void* cookie, RemoteMessage& message);
89
90		status_t					AddCallback(uint32 token,
91										CallbackFunction callback,
92										void* cookie);
93		bool						RemoveCallback(uint32 token);
94
95private:
96		callback_info*				_FindCallback(uint32 token);
97static	int							_CallbackCompare(const uint32* key,
98										const callback_info* info);
99
100static	int32						_EventThreadEntry(void* data);
101		status_t					_EventThread();
102
103static	status_t					_NewConnectionCallback(void *cookie,
104										BNetEndpoint &endpoint);
105		status_t					_NewConnection(BNetEndpoint &endpoint);
106
107		void						_Disconnect();
108
109		void						_FillDisplayModeTiming(display_mode &mode);
110
111		const char*					fTarget;
112		status_t					fInitStatus;
113		bool						fIsConnected;
114		uint32						fProtocolVersion;
115		uint32						fConnectionSpeed;
116		display_mode				fFallbackMode;
117		display_mode				fCurrentMode;
118		display_mode				fClientMode;
119		uint16						fListenPort;
120
121		ObjectDeleter<BNetEndpoint>	fListenEndpoint;
122		ObjectDeleter<StreamingRingBuffer>
123									fSendBuffer;
124		ObjectDeleter<StreamingRingBuffer>
125									fReceiveBuffer;
126
127		ObjectDeleter<NetSender>	fSender;
128		ObjectDeleter<NetReceiver>	fReceiver;
129
130		thread_id					fEventThread;
131		ObjectDeleter<RemoteEventStream>
132									fEventStream;
133
134		BLocker						fCallbackLocker;
135		BObjectList<callback_info>	fCallbacks;
136};
137
138#endif // REMOTE_HW_INTERFACE_H
139