Show
Ignore:
Timestamp:
10/31/08 17:48:19 (5 years ago)
Author:
robert
Message:

Wrapped up the various client streaming methods + thread into VncImage? classes.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/examples/osgvnc/osgvnc.cpp

    r9083 r9084  
    1515} 
    1616 
    17 static rfbBool resizeImage(rfbClient* client)  
     17class 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 
     80VncImage::VncImage() 
     81{ 
     82    // setPixelBufferObject(new osg::PixelBufferObject(this); 
     83 
     84} 
     85 
     86VncImage::~VncImage() 
     87{ 
     88    close(); 
     89} 
     90 
     91bool 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 
     111void 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 
     128rfbBool VncImage::resizeImage(rfbClient* client)  
    18129{ 
    19130    osg::Image* image = (osg::Image*)(rfbClientGetClientData(client, 0)); 
     
    32143} 
    33144 
    34 static void updateImage(rfbClient* client,int x,int y,int w,int h) 
     145void VncImage::updateImage(rfbClient* client,int x,int y,int w,int h) 
    35146{ 
    36147    osg::Image* image = (osg::Image*)(rfbClientGetClientData(client, 0)); 
     
    170281} 
    171282 
    172 class RfbThread : public OpenThreads::Thread 
    173 { 
    174 public: 
    175      
    176     RfbThread(rfbClient* client): 
    177         _client(client), 
    178         _done(false) {} 
    179      
    180     virtual ~RfbThread() 
    181     { 
    182         _done = true; 
    183         cancel(); 
    184         while(isRunning())  
    185         { 
    186             OpenThreads::Thread::YieldCurrentThread(); 
    187         } 
    188     } 
    189  
    190     virtual void run() 
    191     { 
    192         do 
    193         { 
    194             int i=WaitForMessage(_client,500); 
    195             if(i<0) 
    196                 return; 
    197             if(i) 
    198                 if(!HandleRFBServerMessage(_client)) 
    199                 return; 
    200                  
    201         } while (!_done && !testCancel()); 
    202     } 
    203      
    204     rfbClient*  _client; 
    205     bool        _done; 
    206      
    207 }; 
    208  
    209283int main(int argc,char** argv) 
    210284{ 
    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    { 
    225289        return 1; 
     290    } 
    226291 
    227292    osg::ArgumentParser arguments(&argc, argv); 
     
    255320 
    256321    viewer.addEventHandler(new osgViewer::StatsHandler); 
    257     viewer.addEventHandler(new RfbEventHandler(client)); 
    258      
    259     RfbThread rfbThread(client); 
    260     rfbThread.startThread(); 
     322    viewer.addEventHandler(new RfbEventHandler(image->_client)); 
    261323     
    262324    viewer.setKeyEventSetsDone(0); 
    263325 
    264326    return viewer.run(); 
    265  
    266     // rfbClientCleanup(cl); 
    267 } 
    268  
     327} 
     328