| Index: obsolete/Microsoft.VisualStudio.Project/DataObject.cs
|
| diff --git a/obsolete/Microsoft.VisualStudio.Project/DataObject.cs b/obsolete/Microsoft.VisualStudio.Project/DataObject.cs
|
| deleted file mode 100644
|
| index 6704cac01040f328ba727b9c71483d96cf2c8924..0000000000000000000000000000000000000000
|
| --- a/obsolete/Microsoft.VisualStudio.Project/DataObject.cs
|
| +++ /dev/null
|
| @@ -1,579 +0,0 @@
|
| -/// Copyright (c) Microsoft Corporation. All rights reserved.
|
| -
|
| -using System;
|
| -using System.Collections;
|
| -using System.Collections.Generic;
|
| -using System.Diagnostics;
|
| -using System.Diagnostics.CodeAnalysis;
|
| -using System.Runtime.InteropServices;
|
| -using System.Security.Permissions;
|
| -using Microsoft.VisualStudio;
|
| -using Microsoft.VisualStudio.OLE.Interop;
|
| -using Microsoft.VisualStudio.Shell;
|
| -
|
| -namespace Microsoft.VisualStudio.Project
|
| -{
|
| - internal enum tagDVASPECT
|
| - {
|
| - DVASPECT_CONTENT = 1,
|
| - DVASPECT_THUMBNAIL = 2,
|
| - DVASPECT_ICON = 4,
|
| - DVASPECT_DOCPRINT = 8
|
| - }
|
| -
|
| - internal enum tagTYMED
|
| - {
|
| - TYMED_HGLOBAL = 1,
|
| - TYMED_FILE = 2,
|
| - TYMED_ISTREAM = 4,
|
| - TYMED_ISTORAGE = 8,
|
| - TYMED_GDI = 16,
|
| - TYMED_MFPICT = 32,
|
| - TYMED_ENHMF = 64,
|
| - TYMED_NULL = 0
|
| - }
|
| -
|
| - internal sealed class DataCacheEntry : IDisposable
|
| - {
|
| - #region fields
|
| - /// <summary>
|
| - /// Defines an object that will be a mutex for this object for synchronizing thread calls.
|
| - /// </summary>
|
| - private static volatile object Mutex = new object();
|
| -
|
| - private FORMATETC format;
|
| -
|
| - private long data;
|
| -
|
| - private DATADIR dataDir;
|
| -
|
| - private bool isDisposed;
|
| - #endregion
|
| -
|
| - #region properties
|
| - internal FORMATETC Format
|
| - {
|
| - get
|
| - {
|
| - return this.format;
|
| - }
|
| - }
|
| -
|
| - internal long Data
|
| - {
|
| - get
|
| - {
|
| - return this.data;
|
| - }
|
| - }
|
| -
|
| - [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
| - internal DATADIR DataDir
|
| - {
|
| - get
|
| - {
|
| - return this.dataDir;
|
| - }
|
| - }
|
| -
|
| - #endregion
|
| -
|
| - /// <summary>
|
| - /// The IntPtr is data allocated that should be removed. It is allocated by the ProcessSelectionData method.
|
| - /// </summary>
|
| - internal DataCacheEntry(FORMATETC fmt, IntPtr data, DATADIR dir)
|
| - {
|
| - this.format = fmt;
|
| - this.data = (long)data;
|
| - this.dataDir = dir;
|
| - }
|
| -
|
| - #region Dispose
|
| - ~DataCacheEntry()
|
| - {
|
| - Dispose(false);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// The IDispose interface Dispose method for disposing the object determinastically.
|
| - /// </summary>
|
| - public void Dispose()
|
| - {
|
| - Dispose(true);
|
| - GC.SuppressFinalize(this);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// The method that does the cleanup.
|
| - /// </summary>
|
| - /// <param name="disposing"></param>
|
| - private void Dispose(bool disposing)
|
| - {
|
| - // Everybody can go here.
|
| - if(!this.isDisposed)
|
| - {
|
| - // Synchronize calls to the Dispose simulteniously.
|
| - lock(Mutex)
|
| - {
|
| - if(disposing && this.data != 0)
|
| - {
|
| - Marshal.FreeHGlobal((IntPtr)this.data);
|
| - this.data = 0;
|
| - }
|
| -
|
| - this.isDisposed = true;
|
| - }
|
| - }
|
| - }
|
| - #endregion
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Unfortunately System.Windows.Forms.IDataObject and
|
| - /// Microsoft.VisualStudio.OLE.Interop.IDataObject are different...
|
| - /// </summary>
|
| - internal sealed class DataObject : IDataObject
|
| - {
|
| - #region fields
|
| - internal const int DATA_S_SAMEFORMATETC = 0x00040130;
|
| - EventSinkCollection map;
|
| - ArrayList entries;
|
| - #endregion
|
| -
|
| - internal DataObject()
|
| - {
|
| - this.map = new EventSinkCollection();
|
| - this.entries = new ArrayList();
|
| - }
|
| -
|
| - internal void SetData(FORMATETC format, IntPtr data)
|
| - {
|
| - this.entries.Add(new DataCacheEntry(format, data, DATADIR.DATADIR_SET));
|
| - }
|
| -
|
| - #region IDataObject methods
|
| - int IDataObject.DAdvise(FORMATETC[] e, uint adv, IAdviseSink sink, out uint cookie)
|
| - {
|
| - STATDATA sdata = new STATDATA();
|
| -
|
| - sdata.ADVF = adv;
|
| - sdata.FORMATETC = e[0];
|
| - sdata.pAdvSink = sink;
|
| - cookie = this.map.Add(sdata);
|
| - sdata.dwConnection = cookie;
|
| - return 0;
|
| - }
|
| -
|
| - void IDataObject.DUnadvise(uint cookie)
|
| - {
|
| - this.map.RemoveAt(cookie);
|
| - }
|
| -
|
| - int IDataObject.EnumDAdvise(out IEnumSTATDATA e)
|
| - {
|
| - e = new EnumSTATDATA((IEnumerable)this.map);
|
| - return 0; //??
|
| - }
|
| -
|
| - int IDataObject.EnumFormatEtc(uint direction, out IEnumFORMATETC penum)
|
| - {
|
| - penum = new EnumFORMATETC((DATADIR)direction, (IEnumerable)this.entries);
|
| - return 0;
|
| - }
|
| -
|
| - int IDataObject.GetCanonicalFormatEtc(FORMATETC[] format, FORMATETC[] fmt)
|
| - {
|
| - throw new System.Runtime.InteropServices.COMException("", DATA_S_SAMEFORMATETC);
|
| - }
|
| -
|
| - void IDataObject.GetData(FORMATETC[] fmt, STGMEDIUM[] m)
|
| - {
|
| - STGMEDIUM retMedium = new STGMEDIUM();
|
| -
|
| - if(fmt == null || fmt.Length < 1)
|
| - return;
|
| -
|
| - foreach(DataCacheEntry e in this.entries)
|
| - {
|
| - if(e.Format.cfFormat == fmt[0].cfFormat /*|| fmt[0].cfFormat == InternalNativeMethods.CF_HDROP*/)
|
| - {
|
| - retMedium.tymed = e.Format.tymed;
|
| -
|
| - // Caller must delete the memory.
|
| - retMedium.unionmember = DragDropHelper.CopyHGlobal(new IntPtr(e.Data));
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if(m != null && m.Length > 0)
|
| - m[0] = retMedium;
|
| - }
|
| -
|
| - void IDataObject.GetDataHere(FORMATETC[] fmt, STGMEDIUM[] m)
|
| - {
|
| - }
|
| -
|
| - int IDataObject.QueryGetData(FORMATETC[] fmt)
|
| - {
|
| - if(fmt == null || fmt.Length < 1)
|
| - return VSConstants.S_FALSE;
|
| -
|
| - foreach(DataCacheEntry e in this.entries)
|
| - {
|
| - if(e.Format.cfFormat == fmt[0].cfFormat /*|| fmt[0].cfFormat == InternalNativeMethods.CF_HDROP*/)
|
| - return VSConstants.S_OK;
|
| - }
|
| -
|
| - return VSConstants.S_FALSE;
|
| - }
|
| -
|
| - void IDataObject.SetData(FORMATETC[] fmt, STGMEDIUM[] m, int fRelease)
|
| - {
|
| - }
|
| - #endregion
|
| - }
|
| -
|
| - [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
|
| - internal static class DragDropHelper
|
| - {
|
| -#pragma warning disable 414
|
| - internal static readonly ushort CF_VSREFPROJECTITEMS;
|
| - internal static readonly ushort CF_VSSTGPROJECTITEMS;
|
| - internal static readonly ushort CF_VSPROJECTCLIPDESCRIPTOR;
|
| -#pragma warning restore 414
|
| -
|
| - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline")]
|
| - static DragDropHelper()
|
| - {
|
| - CF_VSREFPROJECTITEMS = UnsafeNativeMethods.RegisterClipboardFormat("CF_VSREFPROJECTITEMS");
|
| - CF_VSSTGPROJECTITEMS = UnsafeNativeMethods.RegisterClipboardFormat("CF_VSSTGPROJECTITEMS");
|
| - CF_VSPROJECTCLIPDESCRIPTOR = UnsafeNativeMethods.RegisterClipboardFormat("CF_PROJECTCLIPBOARDDESCRIPTOR");
|
| - }
|
| -
|
| -
|
| - public static FORMATETC CreateFormatEtc(ushort iFormat)
|
| - {
|
| - FORMATETC fmt = new FORMATETC();
|
| - fmt.cfFormat = iFormat;
|
| - fmt.ptd = IntPtr.Zero;
|
| - fmt.dwAspect = (uint)DVASPECT.DVASPECT_CONTENT;
|
| - fmt.lindex = -1;
|
| - fmt.tymed = (uint)TYMED.TYMED_HGLOBAL;
|
| - return fmt;
|
| - }
|
| -
|
| - public static int QueryGetData(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, ref FORMATETC fmtetc)
|
| - {
|
| - int returnValue = VSConstants.E_FAIL;
|
| - FORMATETC[] af = new FORMATETC[1];
|
| - af[0] = fmtetc;
|
| - try
|
| - {
|
| - int result = ErrorHandler.ThrowOnFailure(pDataObject.QueryGetData(af));
|
| - if(result == VSConstants.S_OK)
|
| - {
|
| - fmtetc = af[0];
|
| - returnValue = VSConstants.S_OK;
|
| - }
|
| - }
|
| - catch(COMException e)
|
| - {
|
| - Trace.WriteLine("COMException : " + e.Message);
|
| - returnValue = e.ErrorCode;
|
| - }
|
| -
|
| - return returnValue;
|
| - }
|
| -
|
| - public static STGMEDIUM GetData(Microsoft.VisualStudio.OLE.Interop.IDataObject pDataObject, ref FORMATETC fmtetc)
|
| - {
|
| - FORMATETC[] af = new FORMATETC[1];
|
| - af[0] = fmtetc;
|
| - STGMEDIUM[] sm = new STGMEDIUM[1];
|
| - pDataObject.GetData(af, sm);
|
| - fmtetc = af[0];
|
| - return sm[0];
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Retrives data from a VS format.
|
| - /// </summary>
|
| - public static List<string> GetDroppedFiles(ushort format, Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject, out DropDataType ddt)
|
| - {
|
| - ddt = DropDataType.None;
|
| - List<string> droppedFiles = new List<string>();
|
| -
|
| - // try HDROP
|
| - FORMATETC fmtetc = CreateFormatEtc(format);
|
| -
|
| - if(QueryGetData(dataObject, ref fmtetc) == VSConstants.S_OK)
|
| - {
|
| - STGMEDIUM stgmedium = DragDropHelper.GetData(dataObject, ref fmtetc);
|
| - if(stgmedium.tymed == (uint)TYMED.TYMED_HGLOBAL)
|
| - {
|
| - // We are releasing the cloned hglobal here.
|
| - IntPtr dropInfoHandle = stgmedium.unionmember;
|
| - if(dropInfoHandle != IntPtr.Zero)
|
| - {
|
| - ddt = DropDataType.Shell;
|
| - try
|
| - {
|
| - uint numFiles = UnsafeNativeMethods.DragQueryFile(dropInfoHandle, 0xFFFFFFFF, null, 0);
|
| -
|
| - // We are a directory based project thus a projref string is placed on the clipboard.
|
| - // We assign the maximum length of a projref string.
|
| - // The format of a projref is : <Proj Guid>|<project rel path>|<file path>
|
| - uint lenght = (uint)Guid.Empty.ToString().Length + 2 * NativeMethods.MAX_PATH + 2;
|
| - char[] moniker = new char[lenght + 1];
|
| - for(uint fileIndex = 0; fileIndex < numFiles; fileIndex++)
|
| - {
|
| - uint queryFileLength = UnsafeNativeMethods.DragQueryFile(dropInfoHandle, fileIndex, moniker, lenght);
|
| - string filename = new String(moniker, 0, (int)queryFileLength);
|
| - droppedFiles.Add(filename);
|
| - }
|
| - }
|
| - finally
|
| - {
|
| - Marshal.FreeHGlobal(dropInfoHandle);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - return droppedFiles;
|
| - }
|
| -
|
| -
|
| -
|
| - public static string GetSourceProjectPath(Microsoft.VisualStudio.OLE.Interop.IDataObject dataObject)
|
| - {
|
| - string projectPath = null;
|
| - FORMATETC fmtetc = CreateFormatEtc(CF_VSPROJECTCLIPDESCRIPTOR);
|
| -
|
| - if(QueryGetData(dataObject, ref fmtetc) == VSConstants.S_OK)
|
| - {
|
| - STGMEDIUM stgmedium = DragDropHelper.GetData(dataObject, ref fmtetc);
|
| - if(stgmedium.tymed == (uint)TYMED.TYMED_HGLOBAL)
|
| - {
|
| - // We are releasing the cloned hglobal here.
|
| - IntPtr dropInfoHandle = stgmedium.unionmember;
|
| - if(dropInfoHandle != IntPtr.Zero)
|
| - {
|
| - try
|
| - {
|
| - string path = GetData(dropInfoHandle);
|
| -
|
| - // Clone the path that we can release our memory.
|
| - if(!String.IsNullOrEmpty(path))
|
| - {
|
| - projectPath = String.Copy(path);
|
| - }
|
| - }
|
| - finally
|
| - {
|
| - Marshal.FreeHGlobal(dropInfoHandle);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - return projectPath;
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Returns the data packed after the DROPFILES structure.
|
| - /// </summary>
|
| - /// <param name="dropHandle"></param>
|
| - /// <returns></returns>
|
| - internal static string GetData(IntPtr dropHandle)
|
| - {
|
| - IntPtr data = UnsafeNativeMethods.GlobalLock(dropHandle);
|
| - try
|
| - {
|
| - _DROPFILES df = (_DROPFILES)Marshal.PtrToStructure(data, typeof(_DROPFILES));
|
| - if(df.fWide != 0)
|
| - {
|
| - IntPtr pdata = new IntPtr((long)data + df.pFiles);
|
| - return Marshal.PtrToStringUni(pdata);
|
| - }
|
| - }
|
| - finally
|
| - {
|
| - if(data != null)
|
| - {
|
| - UnsafeNativeMethods.GlobalUnLock(data);
|
| - }
|
| - }
|
| -
|
| - return null;
|
| - }
|
| -
|
| - internal static IntPtr CopyHGlobal(IntPtr data)
|
| - {
|
| - IntPtr src = UnsafeNativeMethods.GlobalLock(data);
|
| - int size = UnsafeNativeMethods.GlobalSize(data);
|
| - IntPtr ptr = Marshal.AllocHGlobal(size);
|
| - IntPtr buffer = UnsafeNativeMethods.GlobalLock(ptr);
|
| -
|
| - try
|
| - {
|
| - for(int i = 0; i < size; i++)
|
| - {
|
| - byte val = Marshal.ReadByte(new IntPtr((long)src + i));
|
| -
|
| - Marshal.WriteByte(new IntPtr((long)buffer + i), val);
|
| - }
|
| - }
|
| - finally
|
| - {
|
| - if(buffer != IntPtr.Zero)
|
| - {
|
| - UnsafeNativeMethods.GlobalUnLock(buffer);
|
| - }
|
| -
|
| - if(src != IntPtr.Zero)
|
| - {
|
| - UnsafeNativeMethods.GlobalUnLock(src);
|
| - }
|
| - }
|
| - return ptr;
|
| - }
|
| -
|
| - internal static void CopyStringToHGlobal(string s, IntPtr data, int bufferSize)
|
| - {
|
| - Int16 nullTerminator = 0;
|
| - int dwSize = Marshal.SizeOf(nullTerminator);
|
| -
|
| - if((s.Length + 1) * Marshal.SizeOf(s[0]) > bufferSize)
|
| - throw new System.IO.InternalBufferOverflowException();
|
| - // IntPtr memory already locked...
|
| - for(int i = 0, len = s.Length; i < len; i++)
|
| - {
|
| - Marshal.WriteInt16(data, i * dwSize, s[i]);
|
| - }
|
| - // NULL terminate it
|
| - Marshal.WriteInt16(new IntPtr((long)data + (s.Length * dwSize)), nullTerminator);
|
| - }
|
| -
|
| - } // end of dragdrophelper
|
| -
|
| - internal class EnumSTATDATA : IEnumSTATDATA
|
| - {
|
| - IEnumerable i;
|
| -
|
| - IEnumerator e;
|
| -
|
| - public EnumSTATDATA(IEnumerable i)
|
| - {
|
| - this.i = i;
|
| - this.e = i.GetEnumerator();
|
| - }
|
| -
|
| - void IEnumSTATDATA.Clone(out IEnumSTATDATA clone)
|
| - {
|
| - clone = new EnumSTATDATA(i);
|
| - }
|
| -
|
| - int IEnumSTATDATA.Next(uint celt, STATDATA[] d, out uint fetched)
|
| - {
|
| - uint rc = 0;
|
| - //uint size = (fetched != null) ? fetched[0] : 0;
|
| - for(uint i = 0; i < celt; i++)
|
| - {
|
| - if(e.MoveNext())
|
| - {
|
| - STATDATA sdata = (STATDATA)e.Current;
|
| -
|
| - rc++;
|
| - if(d != null && d.Length > i)
|
| - {
|
| - d[i] = sdata;
|
| - }
|
| - }
|
| - }
|
| -
|
| - fetched = rc;
|
| - return 0;
|
| - }
|
| -
|
| - int IEnumSTATDATA.Reset()
|
| - {
|
| - e.Reset();
|
| - return 0;
|
| - }
|
| -
|
| - int IEnumSTATDATA.Skip(uint celt)
|
| - {
|
| - for(uint i = 0; i < celt; i++)
|
| - {
|
| - e.MoveNext();
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| - }
|
| -
|
| - internal class EnumFORMATETC : IEnumFORMATETC
|
| - {
|
| - IEnumerable cache; // of DataCacheEntrys.
|
| -
|
| - DATADIR dir;
|
| -
|
| - IEnumerator e;
|
| -
|
| - public EnumFORMATETC(DATADIR dir, IEnumerable cache)
|
| - {
|
| - this.cache = cache;
|
| - this.dir = dir;
|
| - e = cache.GetEnumerator();
|
| - }
|
| -
|
| - void IEnumFORMATETC.Clone(out IEnumFORMATETC clone)
|
| - {
|
| - clone = new EnumFORMATETC(dir, cache);
|
| - }
|
| -
|
| - int IEnumFORMATETC.Next(uint celt, FORMATETC[] d, uint[] fetched)
|
| - {
|
| - uint rc = 0;
|
| - //uint size = (fetched != null) ? fetched[0] : 0;
|
| - for(uint i = 0; i < celt; i++)
|
| - {
|
| - if(e.MoveNext())
|
| - {
|
| - DataCacheEntry entry = (DataCacheEntry)e.Current;
|
| -
|
| - rc++;
|
| - if(d != null && d.Length > i)
|
| - {
|
| - d[i] = entry.Format;
|
| - }
|
| - }
|
| - else
|
| - {
|
| - return VSConstants.S_FALSE;
|
| - }
|
| - }
|
| -
|
| - if(fetched != null && fetched.Length > 0)
|
| - fetched[0] = rc;
|
| - return VSConstants.S_OK;
|
| - }
|
| -
|
| - int IEnumFORMATETC.Reset()
|
| - {
|
| - e.Reset();
|
| - return 0;
|
| - }
|
| -
|
| - int IEnumFORMATETC.Skip(uint celt)
|
| - {
|
| - for(uint i = 0; i < celt; i++)
|
| - {
|
| - e.MoveNext();
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| - }
|
| -}
|
|
|