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); + } } } } diff --git a/libvncserver/tightvnc-filetransfer/rfbtightserver.c b/libvncserver/tightvnc-filetransfer/rfbtightserver.c index 013aa2e..9d89de1 100644 --- a/libvncserver/tightvnc-filetransfer/rfbtightserver.c +++ b/libvncserver/tightvnc-filetransfer/rfbtightserver.c @@ -485,6 +485,7 @@ rfbProtocolExtension tightVncFileTransferExtension = { NULL, rfbTightExtensionInit, NULL, + NULL, rfbTightExtensionMsgHandler, rfbTightExtensionClientClose, rfbTightUsage, diff --git a/rfb/rfb.h b/rfb/rfb.h index f7ba150..bdd895f 100644 --- a/rfb/rfb.h +++ b/rfb/rfb.h @@ -165,7 +165,11 @@ typedef struct _rfbProtocolExtension { /* returns FALSE if extension should be deactivated for client. if init == NULL, it stays activated. */ rfbBool (*init)(struct _rfbClientRec* client, void* data); - /* returns TRUE if that pseudo encoding is handled by the extension */ + /* if pseudoEncodings is not NULL, it contains a 0 terminated + list of the pseudo encodings handled by this extension. */ + int *pseudoEncodings; + /* returns TRUE if that pseudo encoding is handled by the extension. + encodingNumber==0 means "reset encodings". */ rfbBool (*enablePseudoEncoding)(struct _rfbClientRec* client, void* data, int encodingNumber); /* returns TRUE if message was handled */