]> source.dussan.org Git - tigervnc.git/commitdiff
Fixes a condition where too much data on the local clipboard causes the client to...
authorBrian Hinz <bphinz@users.sourceforge.net>
Sat, 23 Nov 2013 05:05:21 +0000 (05:05 +0000)
committerBrian Hinz <bphinz@users.sourceforge.net>
Sat, 23 Nov 2013 05:05:21 +0000 (05:05 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5138 3789f03b-4d11-0410-bbf8-ca57d06f2519

java/com/tigervnc/vncviewer/ClipboardDialog.java
java/com/tigervnc/vncviewer/DesktopWindow.java
java/com/tigervnc/vncviewer/VncViewer.java

index d6e2525c4e06c3daa21dcec8a18fa8591ae7f7bb..2c9b7d0feab6dbd4bf1bac63f15cd9d0f40c2f33 100644 (file)
@@ -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");
index 3657b03a89b8469dae491a12277a3b14002a8660..e1d242a62e2f821be31088b9d4ce023d84aeada0 100644 (file)
@@ -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");
     }
   }
 
index 9a015cfbe4dc2d227bf08e643dd0761641879c19..89bc94ed5d28ffc8b8d5864d9373008282e2cea8 100644 (file)
@@ -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",