blob: 21811bf556facd2803c76c6b1cf94bdcc1d3321c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Takashi ITOH - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.util.win32;
import org.eclipse.swt.internal.win32.OS;
public class COPYDATASTRUCT {
public static final int WM_COPYDATA = 0x4a;
public static final int sizeof = 12;
public int dwData;
public int cbData;
public int lpData;
public byte[] data;
/**
* Create a COPYDATASTRUCT object using String data
*
* @param dwData
* @param strData
*/
public COPYDATASTRUCT(int dwData, String strData ) {
this(dwData,strData.getBytes());
}
/**
* Create a COPYDATASTRUCT object using binary data
*
* @param dwData
* @param data
*/
public COPYDATASTRUCT(int dwData, byte[] data ) {
this.dwData = dwData;
if( null != data ) {
this.cbData = data.length;
this.data = new byte[data.length];
System.arraycopy(data, 0, this.data, 0, data.length);
}
}
/**
* Create a COPYDATASTRUCT object using lParam
*
* @param lParam
*/
public COPYDATASTRUCT(int lParam) {
int[] pEntries = new int[3];
OS.MoveMemory(pEntries, lParam, sizeof);
dwData = pEntries[0];
cbData = pEntries[1];
lpData = pEntries[2];
if( 0 != lpData && cbData > 0 ) {
data = new byte[cbData];
OS.MoveMemory(data, lpData, cbData);
}
else {
data = new byte[0];
}
}
/**
* Copy a COPYDATASTRUCT object to memory
*
* @param pData
*/
public void setData(int pData){
int p = 0;
if( null != data ) {
p = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, cbData);
OS.MoveMemory(p, data, cbData);
}
OS.MoveMemory(pData, new int[] {dwData, cbData, p}, sizeof);
}
/**
* Send a COPYDATASTRUCT object to another window using WM_COPYDATA
*
* @param hwndTo
* @param hwndFrom
* @return
*/
public int sendMessage(int hwndTo, int hwndFrom) {
int lpData = OS.GlobalAlloc(OS.GMEM_FIXED | OS.GMEM_ZEROINIT, sizeof);
try {
setData(lpData);
return OS.SendMessage(hwndTo, WM_COPYDATA, hwndFrom, lpData);
}
finally {
OS.GlobalFree(lpData);
}
}
/**
* Retrieve a String data
* @return
*/
public String getStringData() {
try {
return new String(data);
}
catch( Exception e ) {
return null;
}
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return "dwData="+dwData+", cbData="+cbData+", lpData=0x"+Integer.toHexString(lpData)+", data=\""+new String(data)+"\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
}
}