瀏覽代碼

Fixes a condition where too much data on the local clipboard causes the client to exceed the max heap size and exit. Since the server will, by default, discard clipboard transfers greater than 256KB anyway, a parameter was added which sets the default max clipboard size that the client will hold to 256KB also.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5138 3789f03b-4d11-0410-bbf8-ca57d06f2519
tags/v1.3.90
Brian Hinz 10 年之前
父節點
當前提交
fefa48d3c4

+ 9
- 15
java/com/tigervnc/vncviewer/ClipboardDialog.java 查看文件

@@ -57,15 +57,12 @@ class ClipboardDialog extends Dialog implements ActionListener {
pack();
}

public void initDialog() {
textArea.setText(current);
textArea.selectAll();
}

public void setContents(String str) {
current = str;
textArea.setText(str);
textArea.selectAll();
}

public String getContents() {
return textArea.getText();
}

public void serverCutText(String str, int len) {
@@ -77,13 +74,13 @@ class ClipboardDialog extends Dialog implements ActionListener {
if (cb != null) {
StringSelection ss = new StringSelection(str);
try {
cb.setContents(ss, ss);
cb.setContents(ss, null);
} catch(Exception e) {
vlog.debug(e.toString());
vlog.debug(e.getMessage());
}
}
} catch(SecurityException e) {
System.err.println("Cannot access the system clipboard");
vlog.debug("Cannot access the system clipboard: "+e.getMessage());
}
}

@@ -94,11 +91,9 @@ class ClipboardDialog extends Dialog implements ActionListener {
public void actionPerformed(ActionEvent e) {
Object s = e.getSource();
if (s instanceof JButton && (JButton)s == clearButton) {
current = "";
textArea.setText(current);
serverCutText(new String(""), 0);
} else if (s instanceof JButton && (JButton)s == sendButton) {
current = textArea.getText();
cc.writeClientCutText(current, current.length());
cc.writeClientCutText(textArea.getText(), textArea.getText().length());
endDialog();
} else if (s instanceof JButton && (JButton)s == cancelButton) {
endDialog();
@@ -106,7 +101,6 @@ class ClipboardDialog extends Dialog implements ActionListener {
}

CConn cc;
String current;
JTextArea textArea;
JButton clearButton, sendButton, cancelButton;
static LogWriter vlog = new LogWriter("ClipboardDialog");

+ 17
- 14
java/com/tigervnc/vncviewer/DesktopWindow.java 查看文件

@@ -357,30 +357,33 @@ class DesktopWindow extends JPanel implements Runnable, MouseListener,
g2.dispose();
}

String oldContents = "";

public synchronized void checkClipboard() {
SecurityManager sm = System.getSecurityManager();
try {
if (sm != null) sm.checkSystemClipboardAccess();
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
if (cb != null && cc.viewer.sendClipboard.getValue()) {
Transferable t = cb.getContents(null);
if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
String newContents = (String)t.getTransferData(DataFlavor.stringFlavor);
if (newContents != null && !newContents.equals(oldContents)) {
if (cb == null) return;
Transferable t = cb.getContents(null);
if ((t != null) && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
String newContents = new String("");
if (t.getTransferData(DataFlavor.stringFlavor) != null) {
int len = Math.min(cc.viewer.maxCutText.getValue(),
((String)t.getTransferData(DataFlavor.stringFlavor)).length());
newContents =
((String)t.getTransferData(DataFlavor.stringFlavor)).substring(0, len);
}
if (!newContents.equals(cc.clipboardDialog.getContents())) {
if (cc.viewer.sendClipboard.getValue())
cc.writeClientCutText(newContents, newContents.length());
oldContents = newContents;
cc.clipboardDialog.setContents(newContents);
}
} catch(java.lang.Exception e) {
System.out.println("Exception getting clipboard data: " + e.getMessage());
cc.clipboardDialog.setContents(newContents);
}
} catch(java.lang.Exception e) {
vlog.debug("Exception getting clipboard data: " + e.getMessage());
}
}
} catch(SecurityException e) {
System.err.println("Cannot access the system clipboard");
vlog.debug("Cannot access the system clipboard");
}
}


+ 4
- 0
java/com/tigervnc/vncviewer/VncViewer.java 查看文件

@@ -460,6 +460,10 @@ public class VncViewer extends java.applet.Applet implements Runnable
= new BoolParameter("SendClipboard",
"Send clipboard changes to the server",
true);
IntParameter maxCutText
= new IntParameter("MaxCutText",
"Maximum permitted length of an outgoing clipboard update",
262144);
StringParameter menuKey
= new StringParameter("MenuKey",
"The key which brings up the popup menu",

Loading…
取消
儲存