| 17 | | static rfbBool resizeImage(rfbClient* client) |
| | 17 | class VncImage : public osg::Image |
| | 18 | { |
| | 19 | public: |
| | 20 | |
| | 21 | VncImage(); |
| | 22 | |
| | 23 | bool connect(int* argc, char** argv); |
| | 24 | |
| | 25 | void close(); |
| | 26 | |
| | 27 | static rfbBool resizeImage(rfbClient* client); |
| | 28 | |
| | 29 | static void updateImage(rfbClient* client,int x,int y,int w,int h); |
| | 30 | |
| | 31 | protected: |
| | 32 | |
| | 33 | virtual ~VncImage(); |
| | 34 | |
| | 35 | class RfbThread : public osg::Referenced, public OpenThreads::Thread |
| | 36 | { |
| | 37 | public: |
| | 38 | |
| | 39 | RfbThread(rfbClient* client): |
| | 40 | _client(client), |
| | 41 | _done(false) {} |
| | 42 | |
| | 43 | virtual ~RfbThread() |
| | 44 | { |
| | 45 | _done = true; |
| | 46 | cancel(); |
| | 47 | while(isRunning()) |
| | 48 | { |
| | 49 | OpenThreads::Thread::YieldCurrentThread(); |
| | 50 | } |
| | 51 | } |
| | 52 | |
| | 53 | virtual void run() |
| | 54 | { |
| | 55 | do |
| | 56 | { |
| | 57 | int i=WaitForMessage(_client,500); |
| | 58 | if(i<0) |
| | 59 | return; |
| | 60 | if(i) |
| | 61 | if(!HandleRFBServerMessage(_client)) |
| | 62 | return; |
| | 63 | |
| | 64 | } while (!_done && !testCancel()); |
| | 65 | } |
| | 66 | |
| | 67 | rfbClient* _client; |
| | 68 | bool _done; |
| | 69 | |
| | 70 | }; |
| | 71 | |
| | 72 | public: |
| | 73 | |
| | 74 | rfbClient* _client; |
| | 75 | |
| | 76 | osg::ref_ptr<RfbThread> _rfbThread; |
| | 77 | |
| | 78 | }; |
| | 79 | |
| | 80 | VncImage::VncImage() |
| | 81 | { |
| | 82 | // setPixelBufferObject(new osg::PixelBufferObject(this); |
| | 83 | |
| | 84 | } |
| | 85 | |
| | 86 | VncImage::~VncImage() |
| | 87 | { |
| | 88 | close(); |
| | 89 | } |
| | 90 | |
| | 91 | bool VncImage::connect(int* argc, char** argv) |
| | 92 | { |
| | 93 | if (_client) close(); |
| | 94 | |
| | 95 | _client = rfbGetClient(8,3,4); |
| | 96 | _client->canHandleNewFBSize = TRUE; |
| | 97 | _client->MallocFrameBuffer = resizeImage; |
| | 98 | _client->GotFrameBufferUpdate = updateImage; |
| | 99 | _client->HandleKeyboardLedState = 0; |
| | 100 | _client->HandleTextChat = 0; |
| | 101 | |
| | 102 | rfbClientSetClientData(_client, 0, this); |
| | 103 | |
| | 104 | if (rfbInitClient(_client,argc,argv)) |
| | 105 | { |
| | 106 | _rfbThread = new RfbThread(_client); |
| | 107 | _rfbThread->startThread(); |
| | 108 | } |
| | 109 | } |
| | 110 | |
| | 111 | void VncImage::close() |
| | 112 | { |
| | 113 | if (_rfbThread.valid()) |
| | 114 | { |
| | 115 | // stop the client thread |
| | 116 | _rfbThread = 0; |
| | 117 | } |
| | 118 | |
| | 119 | if (_client) |
| | 120 | { |
| | 121 | // close the client |
| | 122 | rfbClientCleanup(_client); |
| | 123 | _client = 0; |
| | 124 | } |
| | 125 | } |
| | 126 | |
| | 127 | |
| | 128 | rfbBool VncImage::resizeImage(rfbClient* client) |
| 211 | | osg::ref_ptr<osg::Image> image = new osg::Image; |
| 212 | | // image->setPixelBufferObject(new osg::PixelBufferObject(image.get())); |
| 213 | | |
| 214 | | /* 16-bit: client=rfbGetClient(5,3,2); */ |
| 215 | | rfbClient* client=rfbGetClient(8,3,4); |
| 216 | | client->canHandleNewFBSize = TRUE; |
| 217 | | client->MallocFrameBuffer = resizeImage; |
| 218 | | client->GotFrameBufferUpdate = updateImage; |
| 219 | | client->HandleKeyboardLedState = 0; |
| 220 | | client->HandleTextChat = 0; |
| 221 | | |
| 222 | | rfbClientSetClientData(client, 0, image.get()); |
| 223 | | |
| 224 | | if(!rfbInitClient(client,&argc,argv)) |
| | 285 | osg::ref_ptr<VncImage> image = new VncImage; |
| | 286 | |
| | 287 | if (image->connect(&argc,argv)) |
| | 288 | { |