/* Copyright (C) 2004 TightVNC Team. All Rights Reserved. * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ // -=- RfbPlayer.h #include #include #include #include #include #include #include using namespace rfb; using namespace rfb::win32; class PlayerToolBar; class RfbPlayer : public RfbProto { public: RfbPlayer(char *fileName, PlayerOptions *options); ~RfbPlayer(); // -=- Window Message handling LRESULT processMainMessage(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam); LRESULT processFrameMessage(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam); // -=- Window interface HWND getMainHandle() const {return mainHwnd;} HWND getFrameHandle() const {return frameHwnd;} void disableTBandMenuItems(); void enableTBandMenuItems(); void setFrameSize(int width, int height); void setVisible(bool visible); void setTitle(const char *title); void calculateScrollBars(); void close(const char* reason=0); void init(); // -=- Coordinate conversions inline Point bufferToClient(const Point& p) { Point pos = p; if (client_size.width() > buffer->width()) pos.x += (client_size.width() - buffer->width()) / 2; else if (client_size.width() < buffer->width()) pos.x -= scrolloffset.x; if (client_size.height() > buffer->height()) pos.y += (client_size.height() - buffer->height()) / 2; else if (client_size.height() < buffer->height()) pos.y -= scrolloffset.y; return pos; } inline Rect bufferToClient(const Rect& r) { return Rect(bufferToClient(r.tl), bufferToClient(r.br)); } inline Point clientToBuffer(const Point& p) { Point pos = p; if (client_size.width() > buffer->width()) pos.x -= (client_size.width() - buffer->width()) / 2; else if (client_size.width() < buffer->width()) pos.x += scrolloffset.x; if (client_size.height() > buffer->height()) pos.y -= (client_size.height() - buffer->height()) / 2; else if (client_size.height() < buffer->height()) pos.y += scrolloffset.y; return pos; } inline Rect clientToBuffer(const Rect& r) { return Rect(clientToBuffer(r.tl), clientToBuffer(r.br)); } bool setViewportOffset(const Point& tl); // -=- RfbProto interface overrides virtual void processMsg(); virtual void serverInit(); virtual void frameBufferUpdateEnd(); virtual void setColourMapEntries(int first, int count, U16* rgbs); virtual void serverCutText(const char* str, int len); virtual void bell(); virtual void beginRect(const Rect& r, unsigned int encoding); virtual void endRect(const Rect& r, unsigned int encoding); virtual void fillRect(const Rect& r, Pixel pix); virtual void imageRect(const Rect& r, void* pixels); virtual void copyRect(const Rect& r, int srcX, int srcY); // -=- Player functions // calculateSessionTime() calculates the full session time in sec long calculateSessionTime(char *fileName); // closeSessionFile() closes the session file and blanks the frame buffer void closeSessionFile(); // openSessionFile() opens the new session file and starts play it void openSessionFile(char *fileName); // skipHandshaking() - is implemented to skip the initial handshaking when // perform backward seeking OR replaying. void skipHandshaking(); void blankBuffer(); void rewind(); void setPaused(bool paused); void stopPlayback(); long getTimeOffset(); bool isSeekMode(); bool isSeeking(); bool isPaused(); long getSeekOffset(); void setPos(long pos); void setSpeed(double speed); double getSpeed(); protected: bool seekMode; bool stopped; long lastPos; long sliderStepMs; char fullSessionTime[20]; int time_pos_m; int time_pos_s; char *fileName; // rfbReader is a class which used to reading the rfb data from the file rfbSessionReader *rfbReader; // Returns true if part of the supplied rect is visible, false otherwise bool invalidateBufferRect(const Rect& crect); bool waitWhilePaused(); // rewindFlag is a flag wich disable the update of the frame buffer window // while the rewind is performing. bool rewindFlag; // Local window state HWND mainHwnd; HWND frameHwnd; HMENU hMenu; Rect window_size; Rect client_size; Point scrolloffset; Point maxscrolloffset; char *cutText; win32::DIBSectionBuffer* buffer; PlayerToolBar tb; // The player's parameters PlayerOptions options; PixelFormatList supportedPF; long imageDataStartTime; long sessionTimeMs; int currentEncoding; }; // -=- sessionTerminateThread class // It is a special thread class, wich is allow the rfbSessionReader class // terminate itself. class sessionTerminateThread : public rfb::Thread { public: sessionTerminateThread(RfbPlayer *_player) : player(_player) { setDeleteAfterRun(); } virtual void run() { player->closeSessionFile(); } protected: RfbPlayer *player; };