1 /*
   2  * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #ifndef AWT_DND_DS_H
  27 #define AWT_DND_DS_H
  28 
  29 #include <Ole2.h>
  30 
  31 #include <jni.h>
  32 #include <jvm.h>
  33 #include <jni_util.h>
  34 
  35 #include "awt_Object.h"
  36 #include "awt_Component.h"
  37 #include "awt_Window.h"
  38 
  39 class AwtCursor;
  40 
  41 /**
  42  * Drag Source code
  43  */
  44 
  45 class AwtDragSource : virtual public IDropSource, virtual public IDataObject {
  46     public:
  47 
  48         AwtDragSource(JNIEnv* env, jobject peer, jobject component,
  49                       jobject transferable, jobject trigger,
  50                       jint actions, jlongArray formats, jobject formatMap);
  51 
  52         virtual ~AwtDragSource();
  53 
  54         // IUnknown
  55 
  56         virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
  57 
  58         virtual ULONG   __stdcall AddRef(void);
  59         virtual ULONG   __stdcall Release(void);
  60 
  61         // IDropSource
  62 
  63         virtual HRESULT __stdcall QueryContinueDrag(BOOL fEscapeKeyPressed, DWORD grfKeyState);
  64 
  65         virtual HRESULT __stdcall GiveFeedback(DWORD dwEffect);
  66 
  67         // IDataObject
  68 
  69         virtual HRESULT __stdcall GetData(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
  70         virtual HRESULT __stdcall GetDataHere(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
  71 
  72         virtual HRESULT __stdcall QueryGetData(FORMATETC __RPC_FAR *pFormatEtc);
  73 
  74         virtual HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC __RPC_FAR *pFormatEtcIn, FORMATETC __RPC_FAR *pFormatEtcOut);
  75 
  76         virtual HRESULT __stdcall SetData(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium, BOOL fRelease);
  77 
  78         virtual HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC *__RPC_FAR *ppenumFormatEtc);
  79 
  80         virtual HRESULT __stdcall DAdvise(FORMATETC __RPC_FAR *pFormatEtc, DWORD advf, IAdviseSink __RPC_FAR *pAdvSink, DWORD __RPC_FAR *pdwConnection);
  81         virtual HRESULT __stdcall DUnadvise(DWORD dwConnection);
  82         virtual HRESULT __stdcall EnumDAdvise(IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
  83 
  84 
  85         // AwtDragSource
  86 
  87         static void StartDrag(
  88             AwtDragSource* self,
  89             jobject cursor,
  90             jintArray imageData,
  91             jint imageWidth,
  92             jint imageHeight,
  93             jint x,
  94             jint y);
  95 
  96         HRESULT ChangeCursor();
  97         void SetCursor(jobject cursor);
  98 
  99         INLINE unsigned int getNTypes() { return m_ntypes; }
 100 
 101         INLINE FORMATETC getType(unsigned int i) { return m_types[i]; }
 102 
 103         INLINE jobject GetPeer() { return m_peer; }
 104 
 105         INLINE void Signal() { ::ReleaseMutex(m_mutex); }
 106 
 107         virtual HRESULT __stdcall GetProcessId(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
 108 
 109     protected:
 110         INLINE void WaitUntilSignalled(BOOL retain) {
 111             do {
 112                 // nothing ...
 113             } while(::WaitForSingleObject(m_mutex, INFINITE) == WAIT_FAILED);
 114 
 115             if (!retain) ::ReleaseMutex(m_mutex);
 116         }
 117 
 118         static void _DoDragDrop(void* param);
 119 
 120         HRESULT __stdcall MatchFormatEtc(FORMATETC __RPC_FAR *pFormatEtcIn, FORMATETC *cacheEnt);
 121 
 122    private:
 123 
 124         void LoadCache(jlongArray formats);
 125         void UnloadCache();
 126 
 127         static int __cdecl _compar(const void *, const void *);
 128 
 129         static void call_dSCenter(JNIEnv* env, jobject self, jint targetActions,
 130                                   jint modifiers, jint x, jint y);
 131         static void call_dSCmotion(JNIEnv* env, jobject self,
 132                                    jint targetActions, jint modifiers,
 133                                    jint x, jint y);
 134         static void call_dSCchanged(JNIEnv* env, jobject self,
 135                                     jint targetActions, jint modifiers,
 136                                     jint x, jint y);
 137         static void call_dSCmouseMoved(JNIEnv* env, jobject self,
 138                                        jint targetActions, jint modifiers,
 139                                        jint x, jint y);
 140         static void call_dSCexit(JNIEnv* env, jobject self, jint x, jint y);
 141         static void call_dSCddfinished(JNIEnv* env, jobject self,
 142                                        jboolean success, jint operations,
 143                                        jint x, jint y);
 144     protected:
 145 
 146         class ADSIEnumFormatEtc : public virtual IEnumFORMATETC {
 147             public:
 148                 ADSIEnumFormatEtc(AwtDragSource* parent);
 149 
 150                 virtual ~ADSIEnumFormatEtc();
 151 
 152                 // IUnknown
 153 
 154                 virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
 155 
 156                 virtual ULONG   __stdcall AddRef(void);
 157                 virtual ULONG   __stdcall Release(void);
 158 
 159                 // IEnumFORMATETC
 160 
 161                 virtual HRESULT _stdcall Next(ULONG celt, FORMATETC __RPC_FAR *rgelt, ULONG __RPC_FAR *pceltFetched);
 162                 virtual HRESULT _stdcall Skip(ULONG celt);
 163                 virtual HRESULT _stdcall Reset();
 164                 virtual HRESULT _stdcall Clone(IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenum);
 165 
 166             private:
 167                 AwtDragSource*  m_parent;
 168                 ULONG           m_refs;
 169 
 170                 unsigned int    m_idx;
 171         };
 172 
 173         class ADSIStreamProxy : public virtual IStream {
 174             private:
 175                 ADSIStreamProxy(ADSIStreamProxy* cloneof);
 176 
 177             public:
 178                 ADSIStreamProxy(AwtDragSource* parent, jbyteArray buffer, jint len);
 179 
 180                 virtual ~ADSIStreamProxy();
 181 
 182                 // IUnknown
 183 
 184                 virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
 185 
 186                 virtual ULONG   __stdcall AddRef(void);
 187                 virtual ULONG   __stdcall Release(void);
 188 
 189                 // IStream
 190 
 191 
 192                 virtual  HRESULT __stdcall Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead);
 193 
 194                 virtual  HRESULT __stdcall Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten);
 195 
 196                 virtual  HRESULT __stdcall Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition);
 197 
 198                 virtual HRESULT __stdcall SetSize(ULARGE_INTEGER libNewSize);
 199 
 200                 virtual  HRESULT __stdcall CopyTo(IStream __RPC_FAR *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER __RPC_FAR *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten);
 201 
 202                 virtual HRESULT __stdcall Commit(DWORD grfCommitFlags);
 203 
 204                 virtual HRESULT __stdcall Revert();
 205 
 206                 virtual HRESULT __stdcall LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
 207 
 208                 virtual HRESULT __stdcall UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
 209 
 210                 virtual HRESULT __stdcall Stat(STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag);
 211 
 212                 virtual HRESULT __stdcall Clone(IStream __RPC_FAR *__RPC_FAR *ppstm);
 213             protected:
 214                 AwtDragSource*   m_parent;
 215 
 216                 signed   char*   m_buffer;
 217                 unsigned int     m_off;
 218                 unsigned int     m_blen;
 219 
 220                 STATSTG          m_statstg;
 221 
 222                 ADSIStreamProxy* m_cloneof;
 223 
 224                 ULONG            m_refs;
 225         };
 226 
 227     public:
 228         static const UINT PROCESS_ID_FORMAT;
 229 
 230     private:
 231 
 232         // instance vars ...
 233 
 234         jobject         m_peer;
 235 
 236         jint            m_initmods;
 237         jint            m_lastmods;
 238 
 239         HWND            m_droptarget;
 240         int             m_enterpending;
 241 
 242         jint            m_actions;
 243 
 244         FORMATETC*      m_types;
 245         unsigned int    m_ntypes;
 246 
 247         ULONG           m_refs;
 248 
 249         AwtCursor*      m_cursor;
 250 
 251         HANDLE          m_mutex;
 252 
 253         jobject         m_component;
 254         jobject         m_transferable;
 255         jobject         m_formatMap;
 256 
 257         POINT           m_dragPoint;
 258         POINT           m_dropPoint;
 259         BOOL            m_fNC;
 260         BOOL            m_bRestoreNodropCustomCursor;//CR 6480706 - MS Bug on hold
 261 
 262         DWORD           m_dwPerformedDropEffect;
 263 
 264         // static's ...
 265 
 266         static jclass           dSCClazz;
 267         static jclass           awtIEClazz;
 268 
 269         static jmethodID        dSCdragenter;
 270         static jmethodID        dSCdragmotion;
 271         static jmethodID        dSCopschanged;
 272         static jmethodID        dSCdragexit;
 273         static jmethodID        dSCddfinish;
 274 
 275         static jfieldID         awtIEmods;
 276 };
 277 
 278 extern const CLIPFORMAT CF_PERFORMEDDROPEFFECT;
 279 extern const CLIPFORMAT CF_FILEGROUPDESCRIPTORA;
 280 extern const CLIPFORMAT CF_FILEGROUPDESCRIPTORW;
 281 extern const CLIPFORMAT CF_FILECONTENTS;
 282 
 283 #endif /* AWT_DND_DS_H */