/* * 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; }