Exemple #1
0
//! this is called before every frame, used for polling for RFB messages
void
VncServer::preFrame()
{
   const int wait_msec=1;

   if (m_delay) {
      usleep(m_delay);
   }

   if (m_numClients == 0) {
      for (size_t i=0; i<m_clientList.size(); ++i) {
         if (rfbReverseConnection(m_screen, const_cast<char *>(m_clientList[i].host.c_str()), m_clientList[i].port)) {
            break;
         }
      }
   }

   rfbCheckFds(m_screen, wait_msec*1000);
   rfbHttpCheckFds(m_screen);

   rfbClientIteratorPtr i = rfbGetClientIterator(m_screen);
   while (rfbClientPtr cl = rfbClientIteratorNext(i)) {
      if (rfbUpdateClient(cl)) {
      }
   }
   rfbReleaseClientIterator(i);
}
void PresentationServer::_initRfbServer(int screenWidth, int screenHeight, const std::string & serverPassword,
		const std::string & peerHostName /*< für Zertifikatsprüfung */, const std::string & caCertificate,
		const std::string & host, unsigned short port) {
	
	_serverPassword = serverPassword;
	//Wenn die erfolgreich war dann den Server erstellen, Gr��e = Desktopgr��e
	_server = rfbGetScreen(0, 0, screenWidth, screenHeight, 8, 3, 4);
	int buffersize = _server->width * _server->height * (_server->bitsPerPixel / 8);
	_server->frameBuffer = new char[buffersize];

	_server->alwaysShared = false;
	_server->neverShared = true;

	//Kein horchen auf neue Verbindungen
	_server->autoPort = false;
	_server->port = -1;
	_server->ipv6port = -1;
	_server->httpPort = -1;
	_server->http6Port = -1;
	
	//Die globalen Variablen werden zum Weiterreichen des Zustands an upgradeNewClientToTls verwendet.
	//dieses konstrukt funktioniert natürlich nur wenn es nur eine Instanz dieser Klasse hier gibt... vlt sollte ich die wirklich zu nem Singleton machen oder
	//natürlich besser das hier anständig implementieren.
	//... man kriegt echt das Würgen wenn man sich den Code ansieht, den man hier verbrochen hat...
	g_serverPassword = _serverPassword;
	g_peerHostName = peerHostName;
	g_caCertificate = caCertificate;
	_server->newClientCreationHook = upgradeNewClientToTls;

	/* Initialize the server */
	rfbInitServer(_server);

	if (!rfbReverseConnection(_server, const_cast<char*> (host.c_str()), port)) {
		std::cerr << "Failed to connect to " << host << ":" << port << std::endl;
		throw std::runtime_error(STR_ERR_RFBHOST_UNREACHABLE);
	}

	//Starte Timer
	_tick = std::chrono::high_resolution_clock::now();
}
int main(int argc, char **argv)
{
  //pipe signals
  signal(SIGINT, close_app);
  signal(SIGKILL, close_app);
  signal(SIGILL, close_app);
  long usec;

  if(argc > 1) {
    int i=1;
    int r;
    while(i < argc) {
      if(*argv[i] == '-') {
        switch(*(argv[i] + 1)) {
          case 'h':
          printUsage(argv);
          exit(0); 
          break;
          case 'p': 
          i++; 
          strcpy(VNC_PASSWORD,argv[i]);
          break;
          case 'f': 
          i++; 
          FB_setDevice(argv[i]);
          break;
          case 'z': 
          i++; 
          display_rotate_180=1;
          break;
          case 'P': 
          i++; 
          VNC_PORT=atoi(argv[i]);
          break;
          case 'r':
          i++; 
          r = atoi(argv[i]);
          if (r==0 || r==90 || r==180 || r==270)
          rotation = r;
          L("rotating to %d degrees\n",rotation);
          break;
          case 's':
          i++;
          r=atoi(argv[i]); 
          if (r >= 1 && r <= 150)
          scaling = r;
          else 
          scaling = 100;
          L("scaling to %d%%\n",scaling);
          break;
          case 'R':
          i++;
          extractReverseHostPort(argv[i]);
          break;
          case 'm':
          i++;
          if (!strcmp(argv[i],"adb")){
            method = ADB;
            L("ADB display grabber selected\n");
          } else if (!strcmp(argv[i],"fb")) {
            method = FRAMEBUFFER;
            L("Framebuffer display grabber selected\n");
          } else if (!strcmp(argv[i],"gralloc")) {
            method = GRALLOC;
            L("Gralloc display grabber selected\n");
          } else if (!strcmp(argv[i],"flinger")) {
            method = FLINGER;
            L("Flinger display grabber selected\n");
          } else {
            L("Grab method \"%s\" not found, sticking with auto-detection.\n",argv[i]);
          }
          break;
          }
        }
      i++;
      }
    }

    L("Initializing grabber method...\n");
    initGrabberMethod();

    L("Initializing virtual keyboard and touch device...\n");
    initInput(); 

    L("Initializing VNC server:\n");
    L("	width:  %d\n", (int)screenformat.width);
    L("	height: %d\n", (int)screenformat.height);
    L("	bpp:    %d\n", (int)screenformat.bitsPerPixel);
    L("	port:   %d\n", (int)VNC_PORT);


    L("Colourmap_rgba=%d:%d:%d:%d    lenght=%d:%d:%d:%d\n", screenformat.redShift, screenformat.greenShift, screenformat.blueShift,screenformat.alphaShift,
      screenformat.redMax,screenformat.greenMax,screenformat.blueMax,screenformat.alphaMax);  

    initVncServer(argc, argv);

    bindIPCserver();
    sendServerStarted();

    if (rhost) {
      rfbClientPtr cl;
      cl = rfbReverseConnection(vncscr, rhost, rport);
      if (cl == NULL) {
        char *str=malloc(255*sizeof(char));
        sprintf(str,"~SHOW|Couldn't connect to remote host:\n%s\n",rhost);

        L("Couldn't connect to remote host: %s\n",rhost);
        sendMsgToGui(str);
        free(str);
      } else {
        cl->onHold = FALSE;
        rfbStartOnHoldClient(cl);
      }
    }


    while (1) {
        usec=(vncscr->deferUpdateTime+standby)*1000;
        //clock_t start = clock();
        rfbProcessEvents(vncscr,usec);
      
      if (idle)
        standby+=2;
      else
        standby=2;
      
      if (vncscr->clientHead == NULL)
      {
        idle=1;
        standby=50;
        continue;
      }

      update_screen(); 
      //printf ( "%f\n", ( (double)clock() - start )*1000 / CLOCKS_PER_SEC );
    }
    close_app();
}