summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVeronika Irvine <veronika>2006-01-16 15:50:33 +0000
committerVeronika Irvine <veronika>2006-01-16 15:50:33 +0000
commit4d4c8f126aa79df26892b3bdd7e8dd3fdcaa1ffb (patch)
tree5e11f8319c94b91e7082e7d1c3e6e5d62352f282
parent1fa4084ed8dc080dcdc78ba5c226b5ac6e8e6469 (diff)
downloadeclipse.platform.swt-4d4c8f126aa79df26892b3bdd7e8dd3fdcaa1ffb.tar.gz
eclipse.platform.swt-4d4c8f126aa79df26892b3bdd7e8dd3fdcaa1ffb.tar.xz
eclipse.platform.swt-4d4c8f126aa79df26892b3bdd7e8dd3fdcaa1ffb.zip
Bug 121722 Include Version, StartFragment, EndFragment information in transferred data to be consistent with CF_HTML
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java85
1 files changed, 81 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java
index 7450b1b547..0dcc94bf55 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/win32/org/eclipse/swt/dnd/HTMLTransfer.java
@@ -31,7 +31,13 @@ public class HTMLTransfer extends ByteArrayTransfer {
static HTMLTransfer _instance = new HTMLTransfer();
static final String HTML_FORMAT = "HTML Format"; //$NON-NLS-1$
static final int HTML_FORMATID = registerType(HTML_FORMAT);
-
+ static final String NUMBER = "00000000"; //$NON-NLS-1$
+ static final String HEADER = "Version:0.9\r\nStartHTML:"+NUMBER+"\r\nEndHTML:"+NUMBER+"\r\nStartFragment:"+NUMBER+"\r\nEndFragment:"+NUMBER+"\r\n";
+ static final String PREFIX = "<html><body><!--StartFragment-->"; //$NON-NLS-1$
+ static final String SUFFIX = "<!--EndFragment--></body></html>"; //$NON-NLS-1$
+ static final String StartFragment = "StartFragment:"; //$NON-NLS-1$
+ static final String EndFragment = "EndFragment:"; //$NON-NLS-1$
+
private HTMLTransfer() {}
/**
@@ -56,7 +62,6 @@ public void javaToNative (Object object, TransferData transferData){
if (!checkHTML(object) || !isSupportedType(transferData)) {
DND.error(DND.ERROR_INVALID_DATA);
}
- // HTML Format is stored as a null terminated byte array
String string = (String)object;
int count = string.length();
char[] chars = new char[count + 1];
@@ -68,6 +73,38 @@ public void javaToNative (Object object, TransferData transferData){
transferData.result = COM.DV_E_STGMEDIUM;
return;
}
+ int startHTML = HEADER.length();
+ int startFragment = startHTML + PREFIX.length();
+ int endFragment = startFragment + cchMultiByte - 1;
+ int endHTML = endFragment + SUFFIX.length();
+
+ StringBuffer buffer = new StringBuffer(HEADER);
+ int maxLength = NUMBER.length();
+ //startHTML
+ int start = buffer.indexOf(NUMBER);
+ String temp = Integer.toString(startHTML);
+ buffer.replace(start + maxLength-temp.length(), start + maxLength, temp);
+ //endHTML
+ start = buffer.indexOf(NUMBER, start);
+ temp = Integer.toString(endHTML);
+ buffer.replace(start + maxLength-temp.length(), start + maxLength, temp);
+ //startFragment
+ start = buffer.indexOf(NUMBER, start);
+ temp = Integer.toString(startFragment);
+ buffer.replace(start + maxLength-temp.length(), start + maxLength, temp);
+ //endFragment
+ start = buffer.indexOf(NUMBER, start);
+ temp = Integer.toString(endFragment);
+ buffer.replace(start + maxLength-temp.length(), start + maxLength, temp);
+
+ buffer.append(PREFIX);
+ buffer.append(string);
+ buffer.append(SUFFIX);
+
+ count = buffer.length();
+ chars = new char[count + 1];
+ buffer.getChars(0, count, chars, 0);
+ cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null);
int lpMultiByteStr = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cchMultiByte);
OS.WideCharToMultiByte(codePage, 0, chars, -1, lpMultiByteStr, cchMultiByte, null, null);
transferData.stgmedium = new STGMEDIUM();
@@ -99,6 +136,7 @@ public Object nativeToJava(TransferData transferData){
data.Release();
if (transferData.result != COM.S_OK) return null;
int hMem = stgmedium.unionField;
+
try {
int lpMultiByteStr = OS.GlobalLock(hMem);
if (lpMultiByteStr == 0) return null;
@@ -108,7 +146,46 @@ public Object nativeToJava(TransferData transferData){
if (cchWideChar == 0) return null;
char[] lpWideCharStr = new char [cchWideChar - 1];
OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr, lpWideCharStr.length);
- return new String(lpWideCharStr);
+ StringBuffer buffer = new StringBuffer(new String(lpWideCharStr));
+ int fragmentStart = 0, fragmentEnd = 0;
+ int start = buffer.indexOf(StartFragment) + StartFragment.length();
+ int end = start + 1;
+ while (end < buffer.length()) {
+ String s = buffer.substring(start, end);
+ try {
+ fragmentStart = Integer.parseInt(s);
+ end++;
+ } catch (NumberFormatException e) {
+ break;
+ }
+ }
+ start = buffer.indexOf(EndFragment) + EndFragment.length();
+ end = start + 1;
+ while (end < buffer.length()) {
+ String s = buffer.substring(start, end);
+ try {
+ fragmentEnd = Integer.parseInt(s);
+ end++;
+ } catch (NumberFormatException e) {
+ break;
+ }
+ }
+ if (fragmentEnd <= fragmentStart || fragmentEnd > lpWideCharStr.length) return null;
+ /* TO DO:
+ * FragmentStart and FragmentEnd are offsets in original byte stream, not
+ * the wide char version of the byte stream.
+ */
+ String s = buffer.substring(fragmentStart, fragmentEnd);
+ /*
+ * Firefox includes <!--StartFragment --> in the fragment, so remove it.
+ */
+ String foxStart = "<!--StartFragment -->\r\n"; //$NON-NLS-1$
+ int prefix = s.indexOf(foxStart);
+ if (prefix != -1) {
+ prefix += foxStart.length();
+ s = s.substring(prefix);
+ }
+ return s;
} finally {
OS.GlobalUnlock(hMem);
}
@@ -128,4 +205,4 @@ boolean checkHTML(Object object) {
protected boolean validate(Object object) {
return checkHTML(object);
}
-}
+} \ No newline at end of file