Обновление VNC Client Framebuffer во время прокрутки
Я работаю с открытым клиентом Android vnc ( https://sourceforge.net/projects/multivnc/) для школы и хочу сделать следующее:
Я хочу, чтобы кадровый буфер обновлялся, КАК я прокручиваю / двигаю палец (не тогда, когда я прекращаю прокручивать). Я знаю, что входные данные отправляются, когда я двигаю пальцем, но кадровый буфер ждет обновления, пока я не перестану прокручивать. Файл VNCconn.java находится ниже, и он является частью кода, который участвует в обновлении Framebuffer для VNC, является частным void processNormalProtocol
когда я опускаю палец, он замораживает весь кадровый буфер и ждет, пока я перестану прокручивать или подниму палец, чтобы обновить экран.
Когда я кладу палец вниз, чтобы начать прокрутку, код останавливается на:
rfb.readServerMessageType();
Поскольку он останавливается на readServerMessgeType, код не переходит к строкам ниже, чтобы обновить Framebuffer. Кто-нибудь из вас знает, как я могу обновить его????
Я попытался удалить эту строку (потому что я не хочу, чтобы код застрял здесь при прокрутке):
int msgType = rfb.readServerMessageType();
Но я получаю эту ошибку:
04-25 17:06:38.778 28960-29030/it.anddev.bradipao.janus E/VNCConn: java.lang.Exception: Framebuffer update rectangle too large: 0x0 at (8194,22528)
04-25 17:06:38.778 28960-29030/it.anddev.bradipao.janus W/System.err: java.lang.Exception: Framebuffer update rectangle too large: 0x0 at (8194,22528)
04-25 17:06:38.778 28960-29030/it.anddev.bradipao.janus W/System.err: at it.anddev.bradipao.janus.RfbProto.readFramebufferUpdateRectHdr(RfbProto.java:945)
04-25 17:06:38.778 28960-29030/it.anddev.bradipao.janus W/System.err: at it.anddev.bradipao.janus.VNCConn$VncInputThread.processNormalProtocol(VNCConn.java:423)
Я могу следовать логике кода, чтобы увидеть, что readServerMessageType переходит в файл rfb.java, который затем переходит в закрытый файл в студии Android под названием "DatainputStream.java", где он застревает, и, к сожалению, не может быть изменилось, потому что это заблокированный файл:
Вот часть VNCConn.java, которая участвует в обновлении Framebuffer
private void processNormalProtocol(final Context context, final ProgressDialog pd, final Runnable setModes) throws Exception {
// initialize on login
try {
// initialize on login
Log.d(TAG, "Connection initialized");
bitmapData.writeFullUpdateRequest(false);
canvas.handler.post(setModes);
while (maintainConnection) {
bitmapData.syncScroll();
int msgType = rfb.readServerMessageType();
bitmapData.doneWaiting();
switch (msgType) {
case it.anddev.bradipao.janus.RfbProto.FramebufferUpdate:
rfb.readFramebufferUpdate();
for (int i = 0; i < rfb.updateNRects; i++) {
rfb.readFramebufferUpdateRectHdr();
int rx = rfb.updateRectX, ry = rfb.updateRectY;
int rw = rfb.updateRectW, rh = rfb.updateRectH;
if (rfb.updateRectEncoding == it.anddev.bradipao.janus.RfbProto.EncodingLastRect) {
Log.v(TAG, "rfb.EncodingLastRect");
break;
}
if (rfb.updateRectEncoding == it.anddev.bradipao.janus.RfbProto.EncodingNewFBSize) {
rfb.setFramebufferSize(rw, rh);
// - updateFramebufferSize();
Log.v(TAG, "rfb.EncodingNewFBSize");
break;
}
if (rfb.updateRectEncoding == it.anddev.bradipao.janus.RfbProto.EncodingXCursor || rfb.updateRectEncoding == it.anddev.bradipao.janus.RfbProto.EncodingRichCursor) {
// - handleCursorShapeUpdate(rfb.updateRectEncoding,
// rx,
// ry, rw, rh);
Log.v(TAG, "rfb.EncodingCursor");
continue;
}
if (rfb.updateRectEncoding == it.anddev.bradipao.janus.RfbProto.EncodingPointerPos) {
canvas.mouseX = rx;
canvas.mouseY = ry;
continue;
}
rfb.startTiming();
switch (rfb.updateRectEncoding) {
case it.anddev.bradipao.janus.RfbProto.EncodingRaw:
handleRawRect(rx, ry, rw, rh);
break;
case it.anddev.bradipao.janus.RfbProto.EncodingCopyRect:
handleCopyRect(rx, ry, rw, rh);
Log.v(TAG, "CopyRect is Buggy!");
break;
case it.anddev.bradipao.janus.RfbProto.EncodingRRE:
handleRRERect(rx, ry, rw, rh);
break;
case it.anddev.bradipao.janus.RfbProto.EncodingCoRRE:
handleCoRRERect(rx, ry, rw, rh);
break;
case it.anddev.bradipao.janus.RfbProto.EncodingHextile:
handleHextileRect(rx, ry, rw, rh);
break;
case it.anddev.bradipao.janus.RfbProto.EncodingZRLE:
// This case opens RFB readFully, which is linked to the timing of data scroll
System.out.println("FRAME BUFFER UPDATE");
handleZRLERect(rx, ry, rw, rh);
break;
case it.anddev.bradipao.janus.RfbProto.EncodingZlib:
handleZlibRect(rx, ry, rw, rh);
break;
default:
Log.e(TAG, "Unknown RFB rectangle encoding " + rfb.updateRectEncoding + " (0x" + Integer.toHexString(rfb.updateRectEncoding) + ")");
}
rfb.stopTiming();
// Hide progress dialog
canvas.handler.post(new Runnable() {
public void run() {
System.out.println("Public Void RUN is Called");
if(pd.isShowing())
pd.dismiss();
}
});
}
boolean fullUpdateNeeded = false;
if (pendingColorModel != null) {
setPixelFormat();
fullUpdateNeeded = true;
}
setEncodings(true);
if(framebufferUpdatesEnabled)
bitmapData.writeFullUpdateRequest(!fullUpdateNeeded);
break;
}
}
catch (Exception e) {
throw e;
}
finally {
// unlock this lock, probably was held when IO exception occured
try {
bitmapDataPixelsLock.unlock();
}
catch(Exception e) {
}
Log.v(TAG, "Closing VNC Connection");
rfb.close();
System.gc();
}
}
Вот что такое rfb.readServerMessageType(), и он никогда не выходит из is.readUnsignedByte(); пока прокрутка не остановится
int readServerMessageType() throws IOException {
System.out.println("111111");
int msgType = is.readUnsignedByte();
System.out.println("22222");
return msgType;
}
и это вызывает Datainputstream.java (который заблокирован, и я не могу изменить его)
public final int readUnsignedByte() throws IOException {
int temp = in.read();
if (temp < 0) {
throw new EOFException();
}
return temp;
}