diff options
Diffstat (limited to 'libvncserver/rfbserver.c')
-rw-r--r-- | libvncserver/rfbserver.c | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c index 4b67aa1..53ec4f8 100644 --- a/libvncserver/rfbserver.c +++ b/libvncserver/rfbserver.c @@ -935,10 +935,43 @@ rfbProcessClientNormalMessage(rfbClientPtr cl) break; e = next; } - if(e == NULL) - rfbLog("rfbProcessClientNormalMessage: ignoring" - "unknown encoding type %d\n", - (int)enc); + if(e == NULL) { + rfbBool handled = FALSE; + /* if the pseudo encoding is not handled by the + enabled extensions, search through all + extensions. */ + rfbProtocolExtension* e; + + for(e = rfbGetExtensionIterator(); e;) { + int* encs = e->pseudoEncodings; + while(encs && *encs!=0) { + if(*encs==(int)enc) { + void* data = NULL; + if(e->newClient) + e->newClient(cl, &data); + if(!e->enablePseudoEncoding(cl, data, (int)enc)) { + rfbLog("Installed extension pretends to handle pseudo encoding 0x%x, but does not!\n",(int)enc); + } else { + rfbEnableExtension(cl, e, data); + handled = TRUE; + e = NULL; + break; + } + } + encs++; + } + rfbReleaseExtensionIterator(); + + + if(e) + e = e->next; + } + + if(!handled) + rfbLog("rfbProcessClientNormalMessage: ignoring" + " unknown encoding type %d\n", + (int)enc); + } } } } |