示例#1
5
// =========================================================================
// 函数功能:处理客户端对挑战信息的响应
// 输入参数:待交流的客户端cl
// 输出参数:
// 返回值  :
// 说明    :当响应消息失败时,3.7以上的版本会发送失败的原因,而3.7及其以下会直接
//          关闭客户端
// =========================================================================
void rfbAuthProcessClientMessage(rfbClientPtr cl)
{
    char *passwd="123";
    int n;
    u8 response[CHALLENGESIZE];
    u32 authResult;

    if ((n = ReadExact(cl, (char *)response, CHALLENGESIZE)) <= 0) {
        if (n != 0)
            debug_printf("rfbAuthProcessClientMessage: read");
        rfbCloseClient(cl);
        return;
    }
     rfbEncryptBytes(cl->authChallenge, passwd);


    if (memcmp(cl->authChallenge, response, CHALLENGESIZE) != 0) {
        debug_printf("rfbAuthProcessClientMessage: authentication failed from %s\n",
               cl->host);

        authResult = Swap32IfLE(rfbVncAuthFailed);

        if (WriteExact(cl, (char *)&authResult, 4) < 0) {
            debug_printf("rfbAuthProcessClientMessage: write");
            rfbClientSendString(cl,"challengdge failed\n");
        }
        rfbCloseClient(cl);
        return;
    }
    else
    {
        debug_printf("challendge success ---cl=%s",cl->host);

    }

    authResult = Swap32IfLE(rfbVncAuthOK);

    if (WriteExact(cl, (char *)&authResult, 4) < 0) {
        debug_printf("rfbAuthProcessClientMessage: write");
        rfbCloseClient(cl);
        return;
    }

    cl->state = RFB_INITIALISATION;
}
示例#2
0
/*
 * rfbSendFence sends a fence message to a specific client
 */
Bool rfbSendFence(rfbClientPtr cl, CARD32 flags, unsigned len,
                  const char *data)
{
    rfbFenceMsg f;

    if (!cl->enableFence) {
        rfbLog("ERROR in rfbSendFence: Client does not support fence extension\n");
        return FALSE;
    }
    if (len > 64) {
        rfbLog("ERROR in rfbSendFence: Fence payload is too large\n");
        return FALSE;
    }
    if ((flags & ~rfbFenceFlagsSupported) != 0) {
        rfbLog("ERROR in rfbSendFence: Unknown fence flags\n");
        return FALSE;
    }

    f.type = rfbFence;
    f.flags = Swap32IfLE(flags);
    f.length = len;

    if (WriteExact(cl, (char *)&f, sz_rfbFenceMsg) < 0) {
        rfbLogPerror("rfbSendFence: write");
        rfbCloseClient(cl);
        return FALSE;
    }

    if (WriteExact(cl, (char *)data, len) < 0) {
        rfbLogPerror("rfbSendFence: write");
        rfbCloseClient(cl);
        return FALSE;
    }
    return TRUE;
}
示例#3
0
static int
SelectSecurityType(void)
{
  CARD8 nSecTypes;
  char *secTypeNames[] = {"None", "VncAuth"};
  CARD8 knownSecTypes[] = {rfbSecTypeNone, rfbSecTypeVncAuth};
  int nKnownSecTypes = sizeof(knownSecTypes);
  CARD8 *secTypes;
  CARD8 secType = rfbSecTypeInvalid;
  int i, j;

  /* Read the list of secutiry types. */
  if (!ReadFromRFBServer((char *)&nSecTypes, sizeof(nSecTypes)))
    return rfbSecTypeInvalid;

  if (nSecTypes == 0) {
    ReadConnFailedReason();
    return rfbSecTypeInvalid;
  }

  secTypes = malloc(nSecTypes);
  if (!ReadFromRFBServer((char *)secTypes, nSecTypes))
    return rfbSecTypeInvalid;

  /* Find out if the server supports TightVNC protocol extensions */
  for (j = 0; j < (int)nSecTypes; j++) {
    if (secTypes[j] == rfbSecTypeTight) {
      free(secTypes);
      secType = rfbSecTypeTight;
      if (!WriteExact(rfbsock, (char *)&secType, sizeof(secType)))
        return rfbSecTypeInvalid;
      fprintf(stderr, "Enabling TightVNC protocol extensions\n");
      return rfbSecTypeTight;
    }
  }

  /* Find first supported security type */
  for (j = 0; j < (int)nSecTypes; j++) {
    for (i = 0; i < nKnownSecTypes; i++) {
      if (secTypes[j] == knownSecTypes[i]) {
        secType = secTypes[j];
        if (!WriteExact(rfbsock, (char *)&secType, sizeof(secType))) {
          free(secTypes);
          return rfbSecTypeInvalid;
        }
        break;
      }
    }
    if (secType != rfbSecTypeInvalid) break;
  }

  free(secTypes);

  if (secType == rfbSecTypeInvalid)
    fprintf(stderr, "Server did not offer supported security type\n");

  return (int)secType;
}
示例#4
0
Bool
SetFormatAndEncodings()
{
	printf("--- SetFormatAndEncodings\n");
	rfbSetPixelFormatMsg spf;
	char buf[sz_rfbSetEncodingsMsg + MAX_ENCODINGS * 4];
	rfbSetEncodingsMsg *se = (rfbSetEncodingsMsg *)buf;
	CARD32 *encs = (CARD32 *)(&buf[sz_rfbSetEncodingsMsg]);
	int len = 0;
	int i;

	spf.type = rfbSetPixelFormat;
	spf.format = myFormat;
	spf.format.redMax = Swap16IfLE(spf.format.redMax);
	spf.format.greenMax = Swap16IfLE(spf.format.greenMax);
	spf.format.blueMax = Swap16IfLE(spf.format.blueMax);
	spf.format.bigEndian = (*(char *)&endianTest ? 0 : 1);
	if(!WriteExact(rfbsock, (char *)&spf, sz_rfbSetPixelFormatMsg))
		return False;

	se->type = rfbSetEncodings;
	se->nEncodings = 0;

	for(i = 0; i < nExplicitEncodings; i++)
	{
		encs[se->nEncodings++] = Swap32IfLE(explicitEncodings[i]);
	}

	if(SameMachine(rfbsock))
	{
		encs[se->nEncodings++] = Swap32IfLE(rfbEncodingRaw);
	}

	if(addCopyRect)
		encs[se->nEncodings++] = Swap32IfLE(rfbEncodingCopyRect);
//	if(addHextile)
//		encs[se->nEncodings++] = Swap32IfLE(rfbEncodingHextile);
//	if(addCoRRE)
//		encs[se->nEncodings++] = Swap32IfLE(rfbEncodingCoRRE);
	if(addRRE)
		encs[se->nEncodings++] = Swap32IfLE(rfbEncodingRRE);
	if(addUseAlpha)
	{
		encs[se->nEncodings++] = Swap32IfLE(rfbEncSpecialUseAlpha);
		printf("--- Set: rfbEncSpecialUseAlpha\n");
	}
		

	len = sz_rfbSetEncodingsMsg + se->nEncodings * 4;

	se->nEncodings = Swap16IfLE(se->nEncodings);

	if(!WriteExact(rfbsock, buf, len)) return False;

	return True;
}
示例#5
0
Bool
SendClientCutText(char *str, int len)
{
	rfbClientCutTextMsg cct;

	cct.type = rfbClientCutText;
	cct.length = Swap32IfLE(len);
	return(WriteExact(rfbsock, (char *)&cct, sz_rfbClientCutTextMsg) &&
			 WriteExact(rfbsock, str, len));
}
示例#6
0
static Bool
PerformAuthenticationTight(void)
{
  rfbAuthenticationCapsMsg caps;
  CARD32 authScheme;
  int i;

  /* In the protocol version 3.7t, the server informs us about supported
     authentication schemes. Here we read this information. */

  if (!ReadFromRFBServer((char *)&caps, sz_rfbAuthenticationCapsMsg))
    return False;

  caps.nAuthTypes = Swap32IfLE(caps.nAuthTypes);

  if (!caps.nAuthTypes) {
    fprintf(stderr, "No authentication needed\n");
    return True;
  }

  if (!ReadCapabilityList(authCaps, caps.nAuthTypes))
    return False;

  /* Prefer Unix login authentication if a user name was given. */
  if (appData.userLogin && CapsIsEnabled(authCaps, rfbAuthUnixLogin)) {
    authScheme = Swap32IfLE(rfbAuthUnixLogin);
    if (!WriteExact(rfbsock, (char *)&authScheme, sizeof(authScheme)))
      return False;
    return AuthenticateUnixLogin();
  }

  /* Otherwise, try server's preferred authentication scheme. */
  for (i = 0; i < CapsNumEnabled(authCaps); i++) {
    authScheme = CapsGetByOrder(authCaps, i);
    if (authScheme != rfbAuthUnixLogin && authScheme != rfbAuthVNC)
      continue;                 /* unknown scheme - cannot use it */
    authScheme = Swap32IfLE(authScheme);
    if (!WriteExact(rfbsock, (char *)&authScheme, sizeof(authScheme)))
      return False;
    authScheme = Swap32IfLE(authScheme); /* convert it back */
    if (authScheme == rfbAuthUnixLogin) {
      return AuthenticateUnixLogin();
    } else if (authScheme == rfbAuthVNC) {
      return AuthenticateVNC();
    } else {
      /* Should never happen. */
      fprintf(stderr, "Assertion failed: unknown authentication scheme\n");
      return False;
    }
  }

  fprintf(stderr, "No suitable authentication schemes offered by server\n");
  return False;
}
示例#7
0
static Bool
SetupTunneling(void)
{
  rfbTunnelingCapsMsg caps;
  CARD32 tunnelType;

  /* In the protocol version 3.7t, the server informs us about
     supported tunneling methods. Here we read this information. */

  if (!ReadFromRFBServer((char *)&caps, sz_rfbTunnelingCapsMsg))
    return False;

  caps.nTunnelTypes = Swap32IfLE(caps.nTunnelTypes);

  if (caps.nTunnelTypes) {
    if (!ReadCapabilityList(tunnelCaps, caps.nTunnelTypes))
      return False;

    /* We cannot do tunneling anyway yet. */
    tunnelType = Swap32IfLE(rfbNoTunneling);
    if (!WriteExact(rfbsock, (char *)&tunnelType, sizeof(tunnelType)))
      return False;
  }

  return True;
}
示例#8
0
void NewClient(svcInfoPtr psvc, int sock)
{
    int one=1;


    if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) {
        Err("setsockopt failed");
        close(sock);
        return;
     }

    psvc->sock = sock;
    if (WriteExact(psvc, psvc->version, RUISVC_VERSION_LEN) < 0) {
        Err("NewClient: write");
        ExitClient(psvc);
        return;
    }

    if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) {
        Err("fcntl failed");
        close(sock);
        return;
    }

    //pthread_attr_t myattr;
    //pthread_attr_init(&myattr);
    pthread_create(&psvc->client_thread, NULL, clientInput, (void *)psvc);
    void* rtn = 0;
    pthread_join(psvc->client_thread, &rtn);
}
// adzm - 2010-07 - Extended clipboard
void ClientConnection::UpdateRemoteClipboardCaps(bool bSavePreferences)
{
	omni_mutex_lock l(m_clipMutex);
	if (!m_clipboard.settings.m_bSupportsEx) return;

	ExtendedClipboardDataMessage extendedClipboardDataMessage;
	
	if (m_opts.m_DisableClipboard || m_opts.m_ViewOnly) {
		// messages and formats that we can handle
		extendedClipboardDataMessage.m_pExtendedData->flags = Swap32IfLE(clipCaps | clipText | clipRTF | clipHTML | clipDIB);

		// now include our limits in order of enum value
		extendedClipboardDataMessage.AppendInt(0);
		extendedClipboardDataMessage.AppendInt(0);
		extendedClipboardDataMessage.AppendInt(0);
	} else {
		if (bSavePreferences) {
			SaveClipboardPreferences();
		}
		m_clipboard.settings.PrepareCapsPacket(extendedClipboardDataMessage);
	}

	int actualLen = extendedClipboardDataMessage.GetDataLength();

	rfbClientCutTextMsg message;
	memset(&message, 0, sizeof(rfbClientCutTextMsg));
	message.type = rfbClientCutText;

	message.length = Swap32IfLE(-actualLen);
	
	//adzm 2010-09
	WriteExactQueue((char*)&message, sz_rfbClientCutTextMsg, rfbClientCutText);
	WriteExact((char*)(extendedClipboardDataMessage.GetData()), extendedClipboardDataMessage.GetDataLength());
}
示例#10
0
void CFileSender::DoSend()
{
	m_bRun = true;
	int nRead = 0;

	m_bStopbyServer = false;
	int nWriteCount = 100; 
	SendMessage(m_ParentHwnd, WM_SETSENDING, 1, 0);
	SendMessage(m_ParentHwnd, WM_SETSTOPBYMYSEFLT, 0, 0);
	while (nRead < m_pFile->GetLength())
	{
		if (m_bRun == false)
		{
			QueryStatus();
			if (!PackAndSendRequest(CMD_PARAM_TRANSFILE_C2S_STOP))
			{
				SendMessage(m_ParentHwnd, WM_SETSENDING, 0, 0);
				return;
			}
			break;
		}

		if (nWriteCount ++ >= 100)
		{
			nWriteCount = 0; 
			if (!QueryStatus()) 
			{
				SendMessage(m_ParentHwnd, WM_SETSENDING, 0, 0);
				return ; 
			}
		}

		if (!PackAndSendRequest(CMD_PARAM_TRANSFILE_C2S_DATA))
		{
			SendMessage(m_ParentHwnd, WM_SETSENDING, 0, 0);
			return;
		}

		FileData fileData;

		int nCount = m_pFile->Read(fileData.Buf, 4096);
		fileData.nLength = nCount;

		if (!WriteExact(m_Socket, (char*)(&fileData), sizeof(fileData)))
		{
			MessageBox(m_ParentHwnd, "发送本地文件数据失败!", "提示", MB_OK | MB_ICONEXCLAMATION);
			return;
		}

		nRead += nCount;

		
		
		SendMessage(m_ParentHwnd, WM_FILE_SENDFILETOSERVER_PROGRESS_MESSAGE, (WPARAM)(nRead), 0);
	}
}
示例#11
0
Bool
SendKeyEvent(CARD32 key, Bool down)
{
  rfbKeyEventMsg ke;

  ke.type = rfbKeyEvent;
  ke.down = down ? 1 : 0;
  ke.key = Swap32IfLE(key);
  return WriteExact(rfbsock, (char *)&ke, sz_rfbKeyEventMsg);
}
示例#12
0
bool CFileSender::PackAndSendRequest(short nParam)
{
	FilePackHeader header;
	header.nType = FILE_REQUEST;
	header.nParam = nParam;

	if (!WriteExact(m_Socket, (char*)(&header), sizeof(header)))
	{
		return false;
	}
	return true;
}
示例#13
0
Bool
SendPointerEvent(int x, int y, int buttonMask)
{
	rfbPointerEventMsg pe;

	pe.type = rfbPointerEvent;
	pe.buttonMask = buttonMask;
	if(x < 0) x = 0;
	if(y < 0) y = 0;
	pe.x = Swap16IfLE(x);
	pe.y = Swap16IfLE(y);
	return WriteExact(rfbsock, (char *)&pe, sz_rfbPointerEventMsg);
}
示例#14
0
// =========================================================================
// 函数功能:处理客户端的安全类型信息
// 输入参数:待交流的客户端cl
// 输出参数:
// 返回值    :
// 说明         : 只有3.7及其以上版本的server才会让cl选择安全类型
// =========================================================================void
void rfbProcessClientSecurityType(rfbClientPtr cl)
{
    int n;
    u8 chosenType;
    u32 authResult;
        /* Read the security type. */
    n = ReadExact(cl, (char *)&chosenType, 1);
    if (n <= 0) {
    if (n == 0)
        debug_printf("rfbProcessClientSecurityType: client gone\n");
    else
        debug_printf("rfbProcessClientSecurityType: read");
    rfbCloseClient(cl);
    return;
    }

    /* Make sure it was present in the list sent by the server. */
    switch (chosenType)
    {
        case rfbConnFailed:
            debug_printf("The client %s connfailed!\n",cl->host);
            cl->state = RFB_INITIALISATION;
            break;

        case rfbNoAuth:
            debug_printf("The client %s need no auth!\n",cl->host);
            //对于3.8版本仍然需要把结果返还回去
            if((cl->protocolMajorVersion==3)&&(cl->protocolMinorVersion>7))
            {
                authResult = Swap32IfLE(rfbVncAuthOK);
                if (WriteExact(cl, (char *)&authResult, 4) < 0) {
                    debug_printf("rfbAuthProcessClientMessage: write");
                    rfbCloseClient(cl);
                    break;
                }
            }
            cl->state = RFB_INITIALISATION;
            break;
        case rfbVncAuth:
            debug_printf("The client %s need vncauth!\n",cl->host);
            rfbVncAuthSendChallenge(cl);//发送挑战信息
            break;

        default:
            debug_printf("No supported security method--%d\n",chosenType);
            rfbCloseClient(cl);
            break;
    }

    return;
}
示例#15
0
// =========================================================================
// 函数功能:处理连接失败的善后问题
// 输入参数:待连接的客户cl,连接失败的原因
// 输出参数:
// 返回值    :
// 说明         :当在协议版本协商或者是认证的时候失败,那么都会调用这个函数进行善后
// =========================================================================
void  rfbClientConnFailed(rfbClientPtr cl,char *reason)
{
    char *buf;
    int len = strlen(reason);

    buf = (char *)malloc(8 + len);
    ((u32 *)buf)[0] = Swap32IfLE(rfbConnFailed);
    ((u32 *)buf)[1] = Swap32IfLE(len);
    memcpy(buf + 8, reason, len);

    if (WriteExact(cl, buf, 8 + len) < 0)
        debug_printf("rfbClientConnFailed: write");
    free(buf);
    rfbCloseClient(cl);
}
示例#16
0
/*
 * rfbSendEndOfCU sends an end of Continuous Updates message to a specific
 * client
 */
void rfbSendEndOfCU(rfbClientPtr cl)
{
    char type = rfbEndOfContinuousUpdates;

    if (!cl->enableCU) {
        rfbLog("ERROR in rfbSendEndOfCU: Client does not support Continuous Updates\n");
        return;
    }

    if (WriteExact(cl, &type, 1) < 0) {
        rfbLogPerror("rfbSendEndOfCU: write");
        rfbCloseClient(cl);
        return;
    }
}
示例#17
0
static void rfbProcessClientInitMessage(rfbClientPtr cl)
{
    rfbClientInitMsg ci;
    char buf[256];
    rfbServerInitMsg *si = (rfbServerInitMsg *)buf;
    int len, n;
    if ((n = ReadExact(cl, (char *)&ci,sz_rfbClientInitMsg)) <= 0) {
        if (n == 0)
            debug_printf("rfbProcessClientInitMessage: client gone\n");
        else
            debug_printf("rfbProcessClientInitMessage: read");
        rfbCloseClient(cl);
        return;
    }

    si->framebufferWidth = Swap16IfLE(cl->screen->width);
    si->framebufferHeight = Swap16IfLE(cl->screen->height);
    debug_printf("width=%d  hieght=%d\n",cl->screen->width,cl->screen->height);
    si->format = cl->screen->rfbServerFormat;
    si->format.redMax = Swap16IfLE(si->format.redMax);
    si->format.greenMax = Swap16IfLE(si->format.greenMax);
    si->format.blueMax = Swap16IfLE(si->format.blueMax);

    if (strlen(cl->screen->desktopName) > 128)      /* sanity check on desktop name len */
        cl->screen->desktopName[128] = 0;

    strcpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName);
    len = strlen(buf + sz_rfbServerInitMsg);
    si->nameLength = Swap32IfLE(len);

    if (WriteExact(cl, buf, sz_rfbServerInitMsg + len) < 0) {
        debug_printf("rfbProcessClientInitMessage: write");
        rfbCloseClient(cl);
        return;
    }

    cl->state = RFB_NORMAL;
    if(ci.shared)
    {
        debug_printf("The client permit share!\n");
    }
    else
    {
        debug_printf("The client refused share!\n");
    }
    //关于是否共享的问题,以后再谈
}
示例#18
0
int
rfbSendSetColourMapEntries(rfbClientPtr cl,
                           int firstColour,
                           int nColours)
{
    char buf[sz_rfbSetColourMapEntriesMsg + 256 * 3 * 2];
    char *wbuf = buf;
    rfbSetColourMapEntriesMsg *scme;
    unsigned short *rgb;

    int i, len;

    if (nColours > 256) {
    /* some rare hardware has, e.g., 4096 colors cells: PseudoColor:12 */
        wbuf = (char *) malloc(sz_rfbSetColourMapEntriesMsg + nColours * 3 * 2);
    }

    scme = (rfbSetColourMapEntriesMsg *)wbuf;
    rgb = (u16 *)(&wbuf[sz_rfbSetColourMapEntriesMsg]);

    scme->type = rfbSetColourMapEntries;

    scme->firstColour = Swap16IfLE(firstColour);
    scme->nColours = Swap16IfLE(nColours);

    len = sz_rfbSetColourMapEntriesMsg;

    for (i = 0; i < nColours; i++) {
      rgb[i*3] = Swap16IfLE(i);
      rgb[i*3+1] = Swap16IfLE(i);
      rgb[i*3+2] = Swap16IfLE(i);

    }

    len += nColours * 3 * 2;

    if (WriteExact(cl, wbuf, len) < 0) {
    debug_printf("rfbSendSetColourMapEntries: write");
    rfbCloseClient(cl);
    if (wbuf != buf)
        free(wbuf);

    return FALSE;
    }
    if (wbuf != buf) free(wbuf);
    return TRUE;
}
示例#19
0
static Bool
PerformAuthenticationTight(void)
{
  rfbAuthenticationCapsMsg caps;
  CARD32 authScheme;
  int i;

  /* In protocols 3.7t/3.8t, the server informs us about supported
     authentication schemes. Here we read this information. */

  if (!ReadFromRFBServer((char *)&caps, sz_rfbAuthenticationCapsMsg))
    return False;

  caps.nAuthTypes = Swap32IfLE(caps.nAuthTypes);

  /* Special case - empty capability list stands for no authentication. */
  if (!caps.nAuthTypes)
    return AuthenticateNone();

  if (!ReadCapabilityList(authCaps, caps.nAuthTypes))
    return False;

  /* Try server's preferred authentication scheme. */
  for (i = 0; i < CapsNumEnabled(authCaps); i++) {
    authScheme = CapsGetByOrder(authCaps, i);
    if (authScheme != rfbAuthVNC && authScheme != rfbAuthNone)
      continue;                 /* unknown scheme - cannot use it */
    authScheme = Swap32IfLE(authScheme);
    if (!WriteExact(rfbsock, (char *)&authScheme, sizeof(authScheme)))
      return False;
    authScheme = Swap32IfLE(authScheme); /* convert it back */

    switch (authScheme) {
    case rfbAuthNone:
      return AuthenticateNone();
    case rfbAuthVNC:
      return AuthenticateVNC();
    default:                      /* should never happen */
      fprintf(stderr, "Internal error: Invalid authentication type\n");
      return False;
    }
  }

  fprintf(stderr, "No suitable authentication schemes offered by server\n");
  return False;
}
示例#20
0
Bool
SendFramebufferUpdateRequest(int x, int y, int w, int h, Bool incremental)
{
  rfbFramebufferUpdateRequestMsg fur;

  fur.type = rfbFramebufferUpdateRequest;
  fur.incremental = incremental ? 1 : 0;
  fur.x = Swap16IfLE(x);
  fur.y = Swap16IfLE(y);
  fur.w = Swap16IfLE(w);
  fur.h = Swap16IfLE(h);

  if (!WriteExact(rfbsock, (char *)&fur, sz_rfbFramebufferUpdateRequestMsg))
    return False;

  return True;
}
示例#21
0
void RA::key_event(int key, int mode)
{
	char buf[1024];
	
	if( m_monkeysock == INVALID_SOCKET )
		return;

	if( mode == 0 )
		sprintf_s(buf, "key up %d\n", key);
	else if ( mode == 1 )
		sprintf_s(buf, "key down %d\n", key);
	else
		sprintf_s(buf, "key down %d\nkey up %d\n", key, key);

	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
void ClientConnection::RequestRemoteClipboard()
{
	if (!m_clipboard.settings.m_bSupportsEx) return;

	ExtendedClipboardDataMessage extendedClipboardDataMessage;

	int actualLen = extendedClipboardDataMessage.GetDataLength();
	extendedClipboardDataMessage.AddFlag(clipRequest | clipText | clipRTF | clipHTML | clipDIB);

	rfbClientCutTextMsg message;
	memset(&message, 0, sizeof(rfbClientCutTextMsg));
	message.type = rfbClientCutText;

	message.length = Swap32IfLE(-actualLen);
	
	//adzm 2010-09
	WriteExactQueue((char*)&message, sz_rfbClientCutTextMsg, rfbClientCutText);
	WriteExact((char*)(extendedClipboardDataMessage.GetData()), extendedClipboardDataMessage.GetDataLength());
}
示例#23
0
void RA::key_search(bool bDown)
{
#ifdef USE_UINPUT
	raw_key(bDown, 217);
	return;
#endif
	//ta_log("TDC KEYCODE_SEARCH");
	if( m_monkeysock == INVALID_SOCKET )
		return;
	char buf[1024];

	//sprintf_s(buf, "press %d\n", AKEYCODE_SEARCH);
	if( bDown )
		sprintf_s(buf, "key down %d\n", AKEYCODE_SEARCH);
	else
		sprintf_s(buf, "key up %d\n", AKEYCODE_SEARCH);
	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
示例#24
0
void RA::key_power(bool bDown)
{
#ifdef USE_UINPUT
	raw_key(bDown, 116);
	return;
#endif
	//ta_log("TDC sleep device");
	if( m_monkeysock == INVALID_SOCKET )
		return;
	char buf[1024];
	
	//sprintf_s(buf, "press %d\n", AKEYCODE_POWER);
	if( bDown )
		sprintf_s(buf, "key down %d\n", AKEYCODE_POWER);
	else
		sprintf_s(buf, "key up %d\n", AKEYCODE_POWER);
	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
示例#25
0
void RA::key_camera(bool bDown)
{
#ifdef USE_UINPUT
	raw_key(bDown, 212);
	return;
#endif
	//ta_log("TDC KEYCODE_CAMERA");
	if( m_monkeysock == INVALID_SOCKET )
		return;
	char buf[1024];
	
	//sprintf_s(buf, "type abcdefg\n");
	//sprintf_s(buf, "press %d\n", AKEYCODE_CAMERA);
	if( bDown )
		sprintf_s(buf, "key down %d\n", AKEYCODE_CAMERA);
	else
		sprintf_s(buf, "key up %d\n", AKEYCODE_CAMERA);
	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
示例#26
0
void RA::key_menu(bool bDown)
{
#ifdef USE_UINPUT
	raw_key(bDown, 139);
	return;
#endif
	//tdc_getinstalledpkgname();

	//ta_log("TDC KEYCODE_MENU");
	if( m_monkeysock == INVALID_SOCKET )
		return;
	char buf[1024];

	//sprintf_s(buf, "press %d\n", AKEYCODE_MENU);
	if( bDown )
		sprintf_s(buf, "key down %d\n", AKEYCODE_MENU);
	else
		sprintf_s(buf, "key up %d\n", AKEYCODE_MENU);
	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
示例#27
0
void RA::key_wake()
{
#ifdef USE_UINPUT
	raw_key(1, 116); // power
	raw_key(0, 116);
	raw_key(1, 102); // home
	raw_key(0, 102);
	raw_key(1, 158); // back
	raw_key(0, 158);
	return;
#endif

	//ta_log("TDC wake device");
	if( m_monkeysock == INVALID_SOCKET )
		return;
	char buf[1024];

	sprintf_s(buf, "wake\n");
	//sprintf_s(buf, "press 187\n");
	WriteExact(m_monkeysock, buf, strlen(buf));
	key_checkok();
}
示例#28
0
Bool
SetScaleFactor()
{
	rfbSetScaleFactorMsg sf;

	sf.type = rfbSetScaleFactor;
	sf.scale = serverScaleFactor;
	printf("Sending scale %d request to rfb server\n",serverScaleFactor);
	if(!WriteExact(rfbsock, (char *)&sf, sz_rfbSetScaleFactorMsg))
		return False;
	else
	{
/*		printf("Waiting for answer\n");
		rfbReSizeFrameBufferMsg sfb;
		if(!ReadExact(rfbsock, (char *)&sfb, sz_rfbReSizeFrameBufferMsg)) return False;
//		if(sfb.type!=rfbReSizeFrameBuffer)
		printf("rfbReSizeFrameBuffer: %d/%d | %d/%d\n",sfb.buffer_w,sfb.buffer_h,sfb.desktop_w,sfb.desktop_h);
		si.framebufferWidth = Swap16IfLE(sfb.buffer_w);
		si.framebufferHeight = Swap16IfLE(sfb.buffer_h);*/
	}
	return True;
}
示例#29
0
Bool
SendFramebufferUpdateRequest(int x, int y, int w, int h, Bool incremental)
{
	dprintf("SendFramebufferUpdateRequest\n");
	rfbFramebufferUpdateRequestMsg fur;

	fur.type = rfbFramebufferUpdateRequest;
	fur.incremental = incremental ? 1 : 0;
	fur.x = Swap16IfLE(x);
	fur.y = Swap16IfLE(y);
	fur.w = Swap16IfLE(w);
	fur.h = Swap16IfLE(h);

	if(!WriteExact(rfbsock, (char *)&fur, sz_rfbFramebufferUpdateRequestMsg))
	{
		return False;
	}

	gettimeofday(&updateRequestTime, NULL);

	sendUpdateRequest = False;

	return True;
}
示例#30
0
/*
 * 	abcdefghijklmnopqrstuvwxyz
 *      e  hi klmno q  t u
 *      |  || ||||| |  | |
 *      |  || ||||| |  | +get screen (full res)
 *      |  || ||||| |  + touch(down,x,y)
 *      |  || ||||| +quit client
 *      |  || ||||+ftp_err
 *      |  || |||+ftp_data
 *      |  || ||+ftp_upload_req
 *      |  || |+ftp_download_req
 *      |  || +ftp_filelist_req
 *      |  |+get screen info
 *      |  +get screen (half req)
 *      +stop service
 */
static int ProcessClientMessage(svcInfoPtr psvc, FBCCMD* pmsg)
{
	//FBCCMD msg;
    //char msg;
    int n = 0;
    int nSize;

    //if( (n = ReadExact(psvc, (char*)&msg, FBCCMD_HEADER)) <= 0 ) {
    //    Err("ProcessClientMessage : read(%d)\n", n);
    //    return false;
    //}
    pmsg->size = ntohl(pmsg->size);
    pmsg->size -= FBCCMD_HEADER;
    //Log("msg received(%c: size - %d)\n", pmsg->cmd, pmsg->size);
    if( pmsg->size > 0) {
    	pmsg->data = (char*)malloc(pmsg->size);
        if( (n = ReadExact(psvc, (char*)pmsg->data, pmsg->size)) <= 0 ) {
            Err("ProcessClientMessage : read(%d)\n", n);
            return false;
        }
    }
    //Log("after alloc %02x %02x %02x %02x\n", msg.data[0],msg.data[1],msg.data[2],msg.data[3]);


    unsigned int data;
#ifdef PERFORMANCE_REPORT
	struct timeval tS, tE;

	gettimeofday(&tS,NULL);
	psvc->frame_client += ELAPSED(tLast, tS);
#endif
    switch(pmsg->cmd) {

        case 'i':
        {
        	FBCCMD_SCRINFO res;
        	res.cmd = 'i';
        	res.size = htonl(sizeof(FBCCMD_SCRINFO));

        	res.width = htonl(g_fbinfo.width);
        	res.height = htonl(g_fbinfo.height);
        	res.bpp = htonl(g_fbinfo.bpp);
        	res.touchfd = htonl( (touchfd != -1 ) ? 1 : 0);
        	LOCK(psvc->output_mutex);
            int rtn = WriteExact(psvc, (const char*)&res, sizeof(FBCCMD_SCRINFO));
            UNLOCK(psvc->output_mutex);
            //Log("response i %d to :%d\n", res.size, rtn);
        }
            break;
        case 'u':
        	//Log("signal-u\n");
        	g_halfmode = 0;
        	//TSIGNAL(psvc->updateCond);
        	read_rgb_framebuffer_to_jpeg(psvc);
#ifdef PERFORMANCE_REPORT
	gettimeofday(&tE,NULL);

	psvc->frame_total += ELAPSED(tS, tE);
	tS = tE;
#endif
            break;
        case 'h':
        	g_halfmode = 1;
        	//Log("signal-h\n");
        	//TSIGNAL(psvc->updateCond);
            //g_halfmode = 0;
            read_rgb_framebuffer_to_jpeg(psvc);
#ifdef PERFORMANCE_REPORT
	gettimeofday(&tE,NULL);

	psvc->frame_total += ELAPSED(tS, tE);
	tS = tE;
#endif
            break;
        case 'e':
            return false;
            break;
        case 'q':
        	ExitClient(psvc);
        	ShutdownSockets(psvc);
        	break;
        // ftp
        case 'k':	// ftp filestlist req
        	onFilelistReq(psvc, pmsg);
        	break;
        case 'l':	// ftp filedownload req
        	onFileDownloadReq(psvc, pmsg);
        	break;
        case 'm':	// ftp fileupload req
        	onFileUploadReq(psvc, pmsg);
        	break;
        case 'n':	// ftp fileupload data
            //Log("case n\n");

        	onFileMsg(psvc, pmsg);
        	break;
        case 'o':	// ftp fileerr
        	onFileErr(psvc, pmsg);
        	break;
        case 't':
        	onTouch(psvc, pmsg);
        	break;
    }

    if( pmsg->size > 0) {
    	free(pmsg->data);
    }

    //if(( psvc->frame_sent++ % 5) == 0) {
    //	g_fbinfo.orientation = get_dev_rotation();
    //	//int isScreenOn = get_screen_on();
    //	//Log("isScreenOn(%d)\n",isScreenOn);
    //}

#ifdef PERFORMANCE_REPORT

            if( (psvc->frame_sent % 10) == 0)
            {
            	double frame_total;
            	double frame_capture;
            	double frame_compress;
            	double frame_colorspace;
            	double frame_tx;
            	double frame_client;
            	double fps, fps_svr;



            	fps = (double)10 * 1000000 / (psvc->frame_total + psvc->frame_client);
            	fps_svr = (double)10 * 1000000 / psvc->frame_total;
            	frame_total = psvc->frame_total / 10000;
            	frame_capture = psvc->frame_capture / 10000;
            	frame_compress = psvc->frame_compress / 10000;
            	frame_colorspace = psvc->frame_colorspace / 10000;
            	frame_tx = psvc->frame_tx / 10000;
            	frame_client = psvc->frame_client / 10000;

                if( psvc->frame_sent > 10 )
                {
                	Log("FPS(%5.2f),SVR(%4.1f) TOT(%3.0f),CAP(%3.0f),ZIP(%3.0f),CNV(%2.0f),TX(%2.0f),CLI(%2.0f)\n",
                			//psvc->frame_sent-1,
                			fps, fps_svr,
                			frame_total, frame_capture, frame_compress, frame_colorspace, frame_tx,frame_client);
                }
            	psvc->frame_total		=	0;
            	psvc->frame_capture		=	0;
            	psvc->frame_compress	=	0;
            	psvc->frame_colorspace	=	0;
            	psvc->frame_tx			=	0;
            	psvc->frame_client		= 	0;

            }
            gettimeofday(&tLast,NULL);
#endif /* PERFORMANCE_REPORT */
           // Log("end loop");
    return true;

}