blob: b5453e8973279ea0e55e304920da34effa5cc341 [file] [log] [blame]
/*
* Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.awt.windows;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
import sun.awt.dnd.SunDropTargetContextPeer;
import sun.awt.dnd.SunDropTargetEvent;
/**
* <p>
* The WDropTargetContextPeer class is the class responsible for handling
* the interaction between the win32 DnD system and Java.
* </p>
*
*
*/
final class WDropTargetContextPeer extends SunDropTargetContextPeer {
/**
* create the peer typically upcall from C++
*/
static WDropTargetContextPeer getWDropTargetContextPeer() {
return new WDropTargetContextPeer();
}
/**
* create the peer
*/
private WDropTargetContextPeer() {
super();
}
/**
* upcall to encapsulate file transfer
*/
private static FileInputStream getFileStream(String file, long stgmedium)
throws IOException
{
return new WDropTargetContextPeerFileStream(file, stgmedium);
}
/**
* upcall to encapsulate IStream buffer transfer
*/
private static Object getIStream(long istream) throws IOException {
return new WDropTargetContextPeerIStream(istream);
}
protected Object getNativeData(long format) {
return getData(getNativeDragContext(), format);
}
/**
* signal drop complete
*/
protected void doDropDone(boolean success, int dropAction,
boolean isLocal) {
dropDone(getNativeDragContext(), success, dropAction);
}
protected void eventPosted(final SunDropTargetEvent e) {
if (e.getID() != SunDropTargetEvent.MOUSE_DROPPED) {
Runnable runnable = new Runnable() {
public void run() {
e.getDispatcher().unregisterAllEvents();
}
};
// NOTE: this PeerEvent must be a NORM_PRIORITY event to be
// dispatched after this SunDropTargetEvent, but before the next
// one, so we should pass zero flags.
PeerEvent peerEvent = new PeerEvent(e.getSource(), runnable, 0);
SunToolkit.executeOnEventHandlerThread(peerEvent);
}
}
/**
* downcall to bind transfer data.
*/
private native Object getData(long nativeContext, long format);
/**
* downcall to notify that drop is complete
*/
private native void dropDone(long nativeContext, boolean success, int action);
}
/**
* package private class to handle file transfers
*/
class WDropTargetContextPeerFileStream extends FileInputStream {
/**
* construct file input stream
*/
WDropTargetContextPeerFileStream(String name, long stgmedium)
throws FileNotFoundException
{
super(name);
this.stgmedium = stgmedium;
}
/**
* close
*/
public void close() throws IOException {
if (stgmedium != 0) {
super.close();
freeStgMedium(stgmedium);
stgmedium = 0;
}
}
/**
* free underlying windows data structure
*/
private native void freeStgMedium(long stgmedium);
/*
* fields
*/
private long stgmedium;
}
/**
* Package private class to access IStream objects
*/
class WDropTargetContextPeerIStream extends InputStream {
/**
* construct a WDropTargetContextPeerIStream wrapper
*/
WDropTargetContextPeerIStream(long istream) throws IOException {
super();
if (istream == 0) throw new IOException("No IStream");
this.istream = istream;
}
/**
* @return bytes available
*/
public int available() throws IOException {
if (istream == 0) throw new IOException("No IStream");
return Available(istream);
}
private native int Available(long istream);
/**
* read
*/
public int read() throws IOException {
if (istream == 0) throw new IOException("No IStream");
return Read(istream);
}
private native int Read(long istream) throws IOException;
/**
* read into buffer
*/
public int read(byte[] b, int off, int len) throws IOException {
if (istream == 0) throw new IOException("No IStream");
return ReadBytes(istream, b, off, len);
}
private native int ReadBytes(long istream, byte[] b, int off, int len) throws IOException;
/**
* close
*/
public void close() throws IOException {
if (istream != 0) {
super.close();
Close(istream);
istream = 0;
}
}
private native void Close(long istream);
/*
* fields
*/
private long istream;
}