blob: c2c1989413884d486e440a5176ce309d1d8d1d24 [file] [log] [blame]
The Android Open Source Project7c1b96a2008-10-21 07:00:00 -07001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "RFBServer"
18
19#include <stdlib.h>
20#include <stdio.h>
21#include <stdint.h>
22#include <errno.h>
23#include <fcntl.h>
24
25#include <sys/types.h>
26#include <sys/socket.h>
27#include <sys/ioctl.h>
28
29#include <netinet/in.h>
30
31#include <cutils/sockets.h>
32
33#include <utils/Log.h>
34#include <ui/Rect.h>
35
36#ifdef HAVE_ANDROID_OS
37#include <linux/input.h>
38#endif
39
40#include "RFBServer.h"
41#include "SurfaceFlinger.h"
42
43/* BUG=773511: this is a temporary hack required while developing the new
44 set of "clean kernel headers" for the Bionic C library. */
45#ifndef KEY_STAR
46#define KEY_STAR 227
47#endif
48#ifndef KEY_SHARP
49#define KEY_SHARP 228
50#endif
51#ifndef KEY_SOFT1
52#define KEY_SOFT1 229
53#endif
54#ifndef KEY_SOFT2
55#define KEY_SOFT2 230
56#endif
57#ifndef KEY_CENTER
58#define KEY_CENTER 232
59#endif
60
61// ----------------------------------------------------------------------------
62
63#define DEBUG_MSG 0
64
65// ----------------------------------------------------------------------------
66
67namespace android {
68
69const int VNC_PORT = 5900;
70
71RFBServer::RFBServer(uint32_t w, uint32_t h, android::PixelFormat format)
72 : Thread(false), mFD(-1), mStatus(NO_INIT), mIoVec(0)
73{
74 mFrameBuffer.version = sizeof(mFrameBuffer);
75 mFrameBuffer.width = w;
76 mFrameBuffer.height = h;
77 mFrameBuffer.stride = w;
78 mFrameBuffer.format = format;
79 mFrameBuffer.data = 0;
80}
81
82RFBServer::~RFBServer()
83{
84 if (mRobinThread != 0) {
85 // ask the thread to exit first
86 mRobinThread->exitAndWait();
87 }
88
89 free(mFrameBuffer.data);
90
91 delete [] mIoVec;
92}
93
94void RFBServer::onFirstRef()
95{
96 run("Batman");
97}
98
99status_t RFBServer::readyToRun()
100{
101 LOGI("RFB server ready to run");
102 return NO_ERROR;
103}
104
105bool RFBServer::threadLoop()
106{
107 struct sockaddr addr;
108 socklen_t alen;
109 int serverfd = -1;
110 int port = VNC_PORT;
111
112 do {
113 retry:
114 if (serverfd < 0) {
115 serverfd = socket_loopback_server(port, SOCK_STREAM);
116 if (serverfd < 0) {
117 if ((errno == EADDRINUSE) && (port < (VNC_PORT+10))) {
118 LOGW("port %d already in use, trying %d", port, port+1);
119 port++;
120 goto retry;
121 }
122 LOGE("couldn't create socket, port=%d, error %d (%s)",
123 port, errno, strerror(errno));
124 sleep(1);
125 break;
126 }
127 fcntl(serverfd, F_SETFD, FD_CLOEXEC);
128 }
129
130 alen = sizeof(addr);
131 mFD = accept(serverfd, &addr, &alen);
132
133 if (mFD < 0) {
134 LOGE("couldn't accept(), error %d (%s)", errno, strerror(errno));
135 // we could have run out of file descriptors, wait a bit and
136 // try again.
137 sleep(1);
138 goto retry;
139 }
140 fcntl(mFD, F_SETFD, FD_CLOEXEC);
141
142 // send protocol version and Authentication method
143 mStatus = NO_ERROR;
144 handshake(3, 3, Authentication::None);
145
146 if (alive()) {
147 // create the thread we use to send data to the client
148 mRobinThread = new ServerThread(this);
149 }
150
151 while( alive() ) {
152 // client message must be destroyed at each iteration
153 // (most of the time this is a no-op)
154 ClientMessage msg;
155 waitForClientMessage(msg);
156 if (alive()) {
157 handleClientMessage(msg);
158 }
159 }
160
161 } while( alive() );
162
163 // free-up some resources
164 if (mRobinThread != 0) {
165 mRobinThread->exitAndWait();
166 mRobinThread.clear();
167 }
168
169 free(mFrameBuffer.data);
170 mFrameBuffer.data = 0;
171
172 close(mFD);
173 close(serverfd);
174 mFD = -1;
175
176 // we'll try again
177 return true;
178}
179
180// ----------------------------------------------------------------------------
181
182RFBServer::ServerThread::ServerThread(const sp<RFBServer>& receiver)
183 : Thread(false), mReceiver(receiver)
184{
185 LOGD("RFB Server Thread created");
186}
187
188RFBServer::ServerThread::~ServerThread()
189{
190 LOGD("RFB Server Thread destroyed");
191}
192
193void RFBServer::ServerThread::onFirstRef()
194{
195 mUpdateBarrier.close();
196 run("Robin");
197}
198
199status_t RFBServer::ServerThread::readyToRun()
200{
201 return NO_ERROR;
202}
203
204void RFBServer::ServerThread::wake()
205{
206 mUpdateBarrier.open();
207}
208
209void RFBServer::ServerThread::exitAndWait()
210{
211 requestExit();
212 mUpdateBarrier.open();
213 requestExitAndWait();
214}
215
216bool RFBServer::ServerThread::threadLoop()
217{
218 sp<RFBServer> receiver(mReceiver.promote());
219 if (receiver == 0)
220 return false;
221
222 // wait for something to do
223 mUpdateBarrier.wait();
224
225 // we're asked to quit, abort everything
226 if (exitPending())
227 return false;
228
229 mUpdateBarrier.close();
230
231 // process updates
232 receiver->sendFrameBufferUpdates();
233 return !exitPending();
234}
235
236// ----------------------------------------------------------------------------
237
238void RFBServer::handshake(uint8_t major, uint8_t minor, uint32_t auth)
239{
240 ProtocolVersion protocolVersion(major, minor);
241 if( !write(protocolVersion) )
242 return;
243
244 if ( !read(protocolVersion) )
245 return;
246
247 int maj, min;
248 if ( protocolVersion.decode(maj, min) != NO_ERROR ) {
249 mStatus = -1;
250 return;
251 }
252
253#if DEBUG_MSG
254 LOGD("client protocol string: <%s>", (char*)protocolVersion.payload());
255 LOGD("client wants protocol version %d.%d\n", maj, min);
256#endif
257
258 Authentication authentication(auth);
259 if( !write(authentication) )
260 return;
261
262 ClientInitialization clientInit;
263 if ( !read(clientInit) )
264 return;
265
266#if DEBUG_MSG
267 LOGD("client initialization: sharedFlags = %d\n", clientInit.sharedFlags());
268#endif
269
270 ServerInitialization serverInit("Android RFB");
271 ServerInitialization::Payload& message(serverInit.message());
272 message.framebufferWidth = htons(mFrameBuffer.width);
273 message.framebufferHeight = htons(mFrameBuffer.height);
274 message.serverPixelFormat.bitsPerPixel = 16;
275 message.serverPixelFormat.depth = 16;
276 message.serverPixelFormat.bigEndianFlag = 0;
277 message.serverPixelFormat.trueColorFlag = 1;
278 message.serverPixelFormat.redMax = htons((1<<5)-1);
279 message.serverPixelFormat.greenMax = htons((1<<6)-1);
280 message.serverPixelFormat.blueMax = htons((1<<5)-1);
281 message.serverPixelFormat.redShift = 11;
282 message.serverPixelFormat.greenShift = 5;
283 message.serverPixelFormat.blueShift = 0;
284
285 mIoVec = new iovec[mFrameBuffer.height];
286
287 write(serverInit);
288}
289
290void RFBServer::handleClientMessage(const ClientMessage& msg)
291{
292 switch(msg.type()) {
293 case SET_PIXEL_FORMAT:
294 handleSetPixelFormat(msg.messages().setPixelFormat);
295 break;
296 case SET_ENCODINGS:
297 handleSetEncodings(msg.messages().setEncodings);
298 break;
299 case FRAME_BUFFER_UPDATE_REQ:
300 handleFrameBufferUpdateReq(msg.messages().frameBufferUpdateRequest);
301 break;
302 case KEY_EVENT:
303 handleKeyEvent(msg.messages().keyEvent);
304 break;
305 }
306}
307
308void RFBServer::handleSetPixelFormat(const SetPixelFormat& msg)
309{
310 if (!validatePixelFormat(msg.pixelFormat)) {
311 LOGE("The builtin VNC server only supports the RGB 565 pixel format");
312 LOGD("requested pixel format:");
313 LOGD("bitsPerPixel: %d", msg.pixelFormat.bitsPerPixel);
314 LOGD("depth: %d", msg.pixelFormat.depth);
315 LOGD("bigEndianFlag: %d", msg.pixelFormat.bigEndianFlag);
316 LOGD("trueColorFlag: %d", msg.pixelFormat.trueColorFlag);
317 LOGD("redmax: %d", ntohs(msg.pixelFormat.redMax));
318 LOGD("bluemax: %d", ntohs(msg.pixelFormat.greenMax));
319 LOGD("greenmax: %d", ntohs(msg.pixelFormat.blueMax));
320 LOGD("redshift: %d", msg.pixelFormat.redShift);
321 LOGD("greenshift: %d", msg.pixelFormat.greenShift);
322 LOGD("blueshift: %d", msg.pixelFormat.blueShift);
323 mStatus = -1;
324 }
325}
326
327bool RFBServer::validatePixelFormat(const PixelFormat& pf)
328{
329 if ((pf.bitsPerPixel != 16) || (pf.depth != 16))
330 return false;
331
332 if (pf.bigEndianFlag || !pf.trueColorFlag)
333 return false;
334
335 if (ntohs(pf.redMax)!=0x1F ||
336 ntohs(pf.greenMax)!=0x3F ||
337 ntohs(pf.blueMax)!=0x1F) {
338 return false;
339 }
340
341 if (pf.redShift!=11 || pf.greenShift!=5 || pf.blueShift!=0)
342 return false;
343
344 return true;
345}
346
347void RFBServer::handleSetEncodings(const SetEncodings& msg)
348{
349 /* From the RFB specification:
350 Sets the encoding types in which pixel data can be sent by the server.
351 The order of the encoding types given in this message is a hint by the
352 client as to its preference (the first encoding specified being most
353 preferred). The server may or may not choose to make use of this hint.
354 Pixel data may always be sent in raw encoding even if not specified
355 explicitly here.
356 */
357
358 LOGW("SetEncodings received. Only RAW is supported.");
359}
360
361void RFBServer::handleFrameBufferUpdateReq(const FrameBufferUpdateRequest& msg)
362{
363#if DEBUG_MSG
364 LOGD("handle FrameBufferUpdateRequest");
365#endif
366
367 Rect r;
368 r.left = ntohs(msg.x);
369 r.top = ntohs(msg.y);
370 r.right = r.left + ntohs(msg.width);
371 r.bottom = r.top + ntohs(msg.height);
372
373 Mutex::Autolock _l(mRegionLock);
374 mClientRegionRequest.set(r);
375 if (!msg.incremental)
376 mDirtyRegion.orSelf(r);
377
378 mRobinThread->wake();
379}
380
381void RFBServer::handleKeyEvent(const KeyEvent& msg)
382{
383#ifdef HAVE_ANDROID_OS
384
385 int scancode = 0;
386 int code = ntohl(msg.key);
387
388 if (code>='0' && code<='9') {
389 scancode = (code & 0xF) - 1;
390 if (scancode<0) scancode += 10;
391 scancode += KEY_1;
392 } else if (code>=0xFF50 && code<=0xFF58) {
393 static const uint16_t map[] =
394 { KEY_HOME, KEY_LEFT, KEY_UP, KEY_RIGHT, KEY_DOWN,
395 KEY_SOFT1, KEY_SOFT2, KEY_END, 0 };
396 scancode = map[code & 0xF];
397 } else if (code>=0xFFE1 && code<=0xFFEE) {
398 static const uint16_t map[] =
399 { KEY_LEFTSHIFT, KEY_LEFTSHIFT,
400 KEY_COMPOSE, KEY_COMPOSE,
401 KEY_LEFTSHIFT, KEY_LEFTSHIFT,
402 0,0,
403 KEY_LEFTALT, KEY_RIGHTALT,
404 0, 0, 0, 0 };
405 scancode = map[code & 0xF];
406 } else if ((code>='A' && code<='Z') || (code>='a' && code<='z')) {
407 static const uint16_t map[] = {
408 KEY_A, KEY_B, KEY_C, KEY_D, KEY_E,
409 KEY_F, KEY_G, KEY_H, KEY_I, KEY_J,
410 KEY_K, KEY_L, KEY_M, KEY_N, KEY_O,
411 KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T,
412 KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z };
413 scancode = map[(code & 0x5F) - 'A'];
414 } else {
415 switch (code) {
416 case 0x0003: scancode = KEY_CENTER; break;
417 case 0x0020: scancode = KEY_SPACE; break;
418 case 0x0023: scancode = KEY_SHARP; break;
419 case 0x0033: scancode = KEY_SHARP; break;
420 case 0x002C: scancode = KEY_COMMA; break;
421 case 0x003C: scancode = KEY_COMMA; break;
422 case 0x002E: scancode = KEY_DOT; break;
423 case 0x003E: scancode = KEY_DOT; break;
424 case 0x002F: scancode = KEY_SLASH; break;
425 case 0x003F: scancode = KEY_SLASH; break;
426 case 0x0032: scancode = KEY_EMAIL; break;
427 case 0x0040: scancode = KEY_EMAIL; break;
428 case 0xFF08: scancode = KEY_BACKSPACE; break;
429 case 0xFF1B: scancode = KEY_BACK; break;
430 case 0xFF09: scancode = KEY_TAB; break;
431 case 0xFF0D: scancode = KEY_ENTER; break;
432 case 0x002A: scancode = KEY_STAR; break;
433 case 0xFFBE: scancode = KEY_SEND; break; // F1
434 case 0xFFBF: scancode = KEY_END; break; // F2
435 case 0xFFC0: scancode = KEY_HOME; break; // F3
436 case 0xFFC5: scancode = KEY_POWER; break; // F8
437 }
438 }
439
440#if DEBUG_MSG
441 LOGD("handle KeyEvent 0x%08x, %d, scancode=%d\n", code, msg.downFlag, scancode);
442#endif
443
444 if (scancode) {
445 mEventInjector.injectKey(uint16_t(scancode),
446 msg.downFlag ? EventInjector::DOWN : EventInjector::UP);
447 }
448#endif
449}
450
451void RFBServer::waitForClientMessage(ClientMessage& msg)
452{
453 if ( !read(msg.payload(), 1) )
454 return;
455
456 switch(msg.type()) {
457
458 case SET_PIXEL_FORMAT:
459 read(msg.payload(1), sizeof(SetPixelFormat)-1);
460 break;
461
462 case FIX_COLOUR_MAP_ENTRIES:
463 mStatus = UNKNOWN_ERROR;
464 return;
465
466 case SET_ENCODINGS:
467 {
468 if ( !read(msg.payload(1), sizeof(SetEncodings)-1) )
469 return;
470
471 size_t size = ntohs( msg.messages().setEncodings.numberOfEncodings ) * 4;
472 if (msg.resize(sizeof(SetEncodings) + size) != NO_ERROR) {
473 mStatus = NO_MEMORY;
474 return;
475 }
476
477 if ( !read(msg.payload(sizeof(SetEncodings)), size) )
478 return;
479
480 break;
481 }
482
483 case FRAME_BUFFER_UPDATE_REQ:
484 read(msg.payload(1), sizeof(FrameBufferUpdateRequest)-1);
485 break;
486
487 case KEY_EVENT:
488 read(msg.payload(1), sizeof(KeyEvent)-1);
489 break;
490
491 case POINTER_EVENT:
492 read(msg.payload(1), sizeof(PointerEvent)-1);
493 break;
494
495 case CLIENT_CUT_TEXT:
496 {
497 if ( !read(msg.payload(1), sizeof(ClientCutText)-1) )
498 return;
499
500 size_t size = ntohl( msg.messages().clientCutText.length );
501 if (msg.resize(sizeof(ClientCutText) + size) != NO_ERROR) {
502 mStatus = NO_MEMORY;
503 return;
504 }
505
506 if ( !read(msg.payload(sizeof(SetEncodings)), size) )
507 return;
508
509 break;
510 }
511
512 default:
513 LOGE("Unknown Message %d", msg.type());
514 mStatus = UNKNOWN_ERROR;
515 return;
516 }
517}
518
519// ----------------------------------------------------------------------------
520
521bool RFBServer::write(const Message& msg)
522{
523 write(msg.payload(), msg.size());
524 return alive();
525}
526
527bool RFBServer::read(Message& msg)
528{
529 read(msg.payload(), msg.size());
530 return alive();
531}
532
533bool RFBServer::write(const void* buffer, int size)
534{
535 int wr = ::write(mFD, buffer, size);
536 if (wr != size) {
537 //LOGE("write(%d) error %d (%s)", size, wr, strerror(errno));
538 mStatus = (wr == -1) ? errno : -1;
539 }
540 return alive();
541}
542
543bool RFBServer::read(void* buffer, int size)
544{
545 int rd = ::read(mFD, buffer, size);
546 if (rd != size) {
547 //LOGE("read(%d) error %d (%s)", size, rd, strerror(errno));
548 mStatus = (rd == -1) ? errno : -1;
549 }
550 return alive();
551}
552
553bool RFBServer::alive() const
554{
555 return mStatus == 0;
556}
557
558bool RFBServer::isConnected() const
559{
560 return alive();
561}
562
563// ----------------------------------------------------------------------------
564
565void RFBServer::frameBufferUpdated(const GGLSurface& front, const Region& reg)
566{
567 Mutex::Autolock _l(mRegionLock);
568
569 // update dirty region
570 mDirtyRegion.orSelf(reg);
571
572 // remember the front-buffer
573 mFrontBuffer = front;
574
575 // The client has not requested anything, don't do anything more
576 if (mClientRegionRequest.isEmpty())
577 return;
578
579 // wake the sending thread up
580 mRobinThread->wake();
581}
582
583void RFBServer::sendFrameBufferUpdates()
584{
585 Vector<Rect> rects;
586 size_t countRects;
587 GGLSurface fb;
588
589 { // Scope for the lock
590 Mutex::Autolock _l(mRegionLock);
591 if (mFrontBuffer.data == 0)
592 return;
593
594 const Region reg( mDirtyRegion.intersect(mClientRegionRequest) );
595 if (reg.isEmpty())
596 return;
597
598 mDirtyRegion.subtractSelf(reg);
599 countRects = reg.rects(rects);
600
601 // copy the frame-buffer so we can stay responsive
602 size_t bytesPerPix = bytesPerPixel(mFrameBuffer.format);
603 size_t bpr = mFrameBuffer.stride * bytesPerPix;
604 if (mFrameBuffer.data == 0) {
605 mFrameBuffer.data = (GGLubyte*)malloc(bpr * mFrameBuffer.height);
606 if (mFrameBuffer.data == 0)
607 return;
608 }
609
610 memcpy(mFrameBuffer.data, mFrontBuffer.data, bpr*mFrameBuffer.height);
611 fb = mFrameBuffer;
612 }
613
614 FrameBufferUpdate msgHeader;
615 msgHeader.type = 0;
616 msgHeader.numberOfRectangles = htons(countRects);
617 write(&msgHeader, sizeof(msgHeader));
618
619 Rectangle rectangle;
620 for (size_t i=0 ; i<countRects ; i++) {
621 const Rect& r = rects[i];
622 rectangle.x = htons( r.left );
623 rectangle.y = htons( r.top );
624 rectangle.w = htons( r.width() );
625 rectangle.h = htons( r.height() );
626 rectangle.encoding = htons( SetEncodings::Raw );
627 write(&rectangle, sizeof(rectangle));
628 size_t h = r.height();
629 size_t w = r.width();
630 size_t bytesPerPix = bytesPerPixel(fb.format);
631 size_t bpr = fb.stride * bytesPerPix;
632 size_t bytes = w * bytesPerPix;
633 size_t offset = (r.top * bpr) + (r.left * bytesPerPix);
634 uint8_t* src = static_cast<uint8_t*>(fb.data) + offset;
635 iovec* iov = mIoVec;
636 while (h--) {
637 iov->iov_base = src;
638 iov->iov_len = bytes;
639 src += bpr;
640 iov++;
641 }
642 size_t iovcnt = iov - mIoVec;
643 int wr = ::writev(mFD, mIoVec, iovcnt);
644 if (wr < 0) {
645 //LOGE("write(%d) error %d (%s)", size, wr, strerror(errno));
646 mStatus = errno;
647 }
648 }
649}
650
651// ----------------------------------------------------------------------------
652
653RFBServer::Message::Message(size_t size)
654 : mSize(size), mAllocatedSize(size)
655{
656 mPayload = malloc(size);
657}
658
659RFBServer::Message::Message(void* payload, size_t size)
660 : mPayload(payload), mSize(size), mAllocatedSize(0)
661{
662}
663
664RFBServer::Message::~Message()
665{
666 if (mAllocatedSize)
667 free(mPayload);
668}
669
670status_t RFBServer::Message::resize(size_t size)
671{
672 if (size > mAllocatedSize) {
673 void* newp;
674 if (mAllocatedSize) {
675 newp = realloc(mPayload, size);
676 if (!newp) return NO_MEMORY;
677 } else {
678 newp = malloc(size);
679 if (!newp) return NO_MEMORY;
680 memcpy(newp, mPayload, mSize);
681 mAllocatedSize = size;
682 }
683 mPayload = newp;
684 }
685 mSize = size;
686 return NO_ERROR;
687}
688
689// ----------------------------------------------------------------------------
690
691RFBServer::EventInjector::EventInjector()
692 : mFD(-1)
693{
694}
695
696RFBServer::EventInjector::~EventInjector()
697{
698}
699
700void RFBServer::EventInjector::injectKey(uint16_t code, uint16_t value)
701{
702#ifdef HAVE_ANDROID_OS
703 // XXX: we need to open the right event device
704 int version;
705 mFD = open("/dev/input/event0", O_RDWR);
706 ioctl(mFD, EVIOCGVERSION, &version);
707
708 input_event ev;
709 memset(&ev, 0, sizeof(ev));
710 ev.type = EV_KEY;
711 ev.code = code;
712 ev.value = value;
713 ::write(mFD, &ev, sizeof(ev));
714
715 close(mFD);
716 mFD = -1;
717#endif
718}
719
720
721}; // namespace android
722