File: src\Framework\MS\Internal\Ink\ISFClipboardData.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//---------------------------------------------------------------------------
//
// File: ISFClipboardData.cs
//
// Description:
//      A class which can convert the clipboard data from/to StrokeCollection
//
// Features:
//
// History:
//  11/17/2004 waynezen:       Created
//
// Copyright (C) 2001 by Microsoft Corporation.  All rights reserved.
//
//---------------------------------------------------------------------------
 
using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Security;
using System.Security.Permissions;
 
namespace MS.Internal.Ink
{
    internal class ISFClipboardData : ClipboardData
    {
        //-------------------------------------------------------------------------------
        //
        // Constructors
        //
        //-------------------------------------------------------------------------------
 
        #region Constructors
 
        // The default constructor
        internal ISFClipboardData() { }
 
        // The constructor which takes StrokeCollection argument
        internal ISFClipboardData(StrokeCollection strokes)
        {
            _strokes = strokes;
        }
 
        // Checks if the data can be pasted.
        internal override bool CanPaste(IDataObject dataObject)
        {
            return dataObject.GetDataPresent(StrokeCollection.InkSerializedFormat, false);
        }
 
        #endregion Constructors
 
        //-------------------------------------------------------------------------------
        //
        // Protected Methods
        //
        //-------------------------------------------------------------------------------
 
        #region Protected Methods
 
        // Checks if there is stroke data in this instance
        protected override bool CanCopy()
        {
            return (Strokes != null && Strokes.Count != 0);
        }
 
        // Copies the internal strokes to the IDataObject
        /// <SecurityNote>
        ///    Critical: This code asserts to set data on a data object
        /// </SecurityNote>
        [SecurityCritical]
        protected override void DoCopy(IDataObject dataObject)
        {
            // samgeo - Presharp issue
            // Presharp gives a warning when local IDisposable variables are not closed
            // in this case, we can't call Dispose since it will also close the underlying stream
            // which needs to be open for consumers to read
#pragma warning disable 1634, 1691
#pragma warning disable 6518
 
            // Save the data in the data object.
            MemoryStream stream = new MemoryStream();
            Strokes.Save(stream);
            stream.Position = 0;
            (new UIPermission(UIPermissionClipboard.AllClipboard)).Assert();//BlessedAssert
            try
            {
                dataObject.SetData(StrokeCollection.InkSerializedFormat, stream);
            }
            finally
            {
                UIPermission.RevertAssert();
            }
#pragma warning restore 6518
#pragma warning restore 1634, 1691
        }
 
        // Retrieves the stroks from the IDataObject
        protected override void DoPaste(IDataObject dataObject)
        {
            // Check if we have ink data
            MemoryStream stream = dataObject.GetData(StrokeCollection.InkSerializedFormat) as MemoryStream;
 
            StrokeCollection newStrokes = null;
            bool fSucceeded = false;
            if ( stream != null && stream != Stream.Null )
            {
                try
                {
                    // Now add these ink strokes to the InkCanvas ink collection.
                    newStrokes = new StrokeCollection(stream);
                    fSucceeded = true;
                }
                catch ( ArgumentException )
                {
                    // If an invalid stream was passed in, we should get ArgumentException here.
                    // We catch this specific exception and eat it.
                    fSucceeded = false;
                }
            }
 
            // Depending on whether we are succeeded or not, we set the correct stroke collection here.
            _strokes = fSucceeded ? newStrokes : new StrokeCollection();
        }
 
        #endregion Protected Methods
 
        //-------------------------------------------------------------------------------
        //
        // Internal Properties
        //
        //-------------------------------------------------------------------------------
 
        #region Internal Properties
 
        // Gets the strokes
        internal StrokeCollection Strokes
        {
            get
            {
                return _strokes;
            }
        }
 
        #endregion Internal Properties
 
        //-------------------------------------------------------------------------------
        //
        // Private Fields
        //
        //-------------------------------------------------------------------------------
 
        #region Private Fields
 
        StrokeCollection    _strokes;
 
        #endregion Private Fields
 
    }
}