root/src/apps/remotedesktop/RemoteView.h
/*
 * Copyright 2009, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Michael Lotz <mmlr@mlotz.ch>
 */
#ifndef REMOTE_VIEW_H
#define REMOTE_VIEW_H

#include <Cursor.h>
#include <NetEndpoint.h>
#include <ObjectList.h>
#include <View.h>

class BBitmap;
class NetReceiver;
class NetSender;
class StreamingRingBuffer;

struct engine_state;

class RemoteView : public BView {
public:
                                                                        RemoteView(BRect frame,
                                                                                const char *remoteHost,
                                                                                uint16 remotePort);
virtual                                                         ~RemoteView();

                status_t                                        InitCheck();

virtual void                                            AttachedToWindow();

virtual void                                            Draw(BRect updateRect);

virtual void                                            MouseMoved(BPoint where, uint32 code,
                                                                                const BMessage *dragMessage);
virtual void                                            MouseDown(BPoint where);
virtual void                                            MouseUp(BPoint where);

virtual void                                            KeyDown(const char *bytes, int32 numBytes);
virtual void                                            KeyUp(const char *bytes, int32 numBytes);

virtual void                                            MessageReceived(BMessage *message);

private:
                void                                            _SendMouseMessage(uint16 code,
                                                                                BPoint where);
                void                                            _SendKeyMessage(uint16 code,
                                                                                const char *bytes, int32 numBytes);

static  int                                                     _StateCompareByKey(const uint32 *key,
                                                                                const engine_state *state);
                engine_state *                          _CreateState(uint32 token);
                void                                            _DeleteState(uint32 token);
                engine_state *                          _FindState(uint32 token);

static  int32                                           _DrawEntry(void *data);
                void                                            _DrawThread();

                BRect                                           _BuildInvalidateRect(BPoint *points,
                                                                                int32 pointCount);

                status_t                                        fInitStatus;
                bool                                            fIsConnected;

                StreamingRingBuffer *           fReceiveBuffer;
                StreamingRingBuffer *           fSendBuffer;
                BNetEndpoint *                          fEndpoint;
                NetReceiver *                           fReceiver;
                NetSender *                                     fSender;

                bool                                            fStopThread;
                thread_id                                       fDrawThread;

                BBitmap *                                       fOffscreenBitmap;
                BView *                                         fOffscreen;

                BCursor                                         fViewCursor;
                BBitmap *                                       fCursorBitmap;
                BRect                                           fCursorFrame;
                bool                                            fCursorVisible;

                BObjectList<engine_state>       fStates;
};

#endif // REMOTE_VIEW_H