File: src\Framework\MS\Internal\Controls\ActiveXContainer.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//------------------------------------------------------------------------------
// <copyright file="ActiveXContainer.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//
//
// Description: Implements ActiveXContainer interfaces to host
//              ActiveX controls
//
//              Source copied from AxContainer.cs
//
// History
//  04/17/05    KusumaV      Created
//
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.Diagnostics;
using Microsoft.Win32;
 
using System.Windows.Interop;
using MS.Win32;
using System.Security ;
using System.Windows.Controls;
 
namespace MS.Internal.Controls
{
    #region class ActiveXContainer
 
    //This implements the basic container interfaces. Other siting related interfaces are
    //implemented on the ActiveXSite object e.g. IOleClientSite, IOleInPlaceSite, IOleControlSite etc.
 
    internal class ActiveXContainer : UnsafeNativeMethods.IOleContainer, UnsafeNativeMethods.IOleInPlaceFrame
    {
        #region Constructor
 
        ///<SecurityNote>
        ///     Critical - accesses critical _host member.
        ///</SecurityNote>
        [ SecurityCritical ]
        internal ActiveXContainer(ActiveXHost host)
        {
            this._host = host;
 
            Invariant.Assert(_host != null);
        }
 
        #endregion Constructor
 
        //------------------------------------------------------
        //
        //  Internal Methods
        //
        //------------------------------------------------------
 
        #region Internal Methods
 
        #region IOleContainer
 
        //
        // IOleContainer methods:
        //
        int UnsafeNativeMethods.IOleContainer.ParseDisplayName(Object pbc, string pszDisplayName, int[] pchEaten, Object[] ppmkOut)
        {
            if (ppmkOut != null)
                ppmkOut[0] = null;
 
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical - calls _host.ActiveXInstance
        ///</SecurityNote>
        [SecurityCritical]
        int UnsafeNativeMethods.IOleContainer.EnumObjects(int grfFlags, out UnsafeNativeMethods.IEnumUnknown ppenum)
        {
            ppenum = null;
 
            Debug.Assert(_host != null, "gotta have the avalon activex host");
 
            object ax = _host.ActiveXInstance;
 
            //We support only one control, return that here
            //How does one add multiple controls to a container?
            if (ax != null
                &&
                ( ((grfFlags & NativeMethods.OLECONTF_EMBEDDINGS) != 0)
                  ||
                  ((grfFlags & NativeMethods.OLECONTF_ONLYIFRUNNING) != 0 &&
                    _host.ActiveXState == ActiveXHelper.ActiveXState.Running )) )
            {
                Object[] temp = new Object[1];
                temp[0]= ax;
                ppenum = new EnumUnknown(temp);
                return NativeMethods.S_OK;
            }
 
            ppenum = new EnumUnknown(null);
            return NativeMethods.S_OK;
        }
 
        int UnsafeNativeMethods.IOleContainer.LockContainer(bool fLock)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        #endregion IOleContainer
 
        #region IOleInPlaceFrame
 
        //
        // IOleInPlaceFrame methods:
        //
 
        ///<SecurityNote>
        ///     Critical - accesses critical _host member.
        ///</SecurityNote>
        [SecurityCritical]
        IntPtr UnsafeNativeMethods.IOleInPlaceFrame.GetWindow()
        {
            return _host.ParentHandle.Handle;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.ContextSensitiveHelp(int fEnterMode)
        {
            return NativeMethods.S_OK;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.GetBorder(NativeMethods.COMRECT lprectBorder)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.RequestBorderSpace(NativeMethods.COMRECT pborderwidths)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.SetBorderSpace(NativeMethods.COMRECT pborderwidths)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.SetActiveObject(UnsafeNativeMethods.IOleInPlaceActiveObject pActiveObject, string pszObjName)
        {
            //Microsoft has code to remove selection handler around the active object
            //and add it around the new one
            //
            //Since we don't have anything like that in Avalon, we do nothing
            //
            //For future reference, added skeletal code on how to get to the internal hosting
            //objects incase they are needed here.
 
 
            /*
            ActiveXHost host = null;
 
            if (pActiveObject is UnsafeNativeMethods.IOleObject)
            {
                UnsafeNativeMethods.IOleObject oleObject = (UnsafeNativeMethods.IOleObject)pActiveObject;
                UnsafeNativeMethods.IOleClientSite clientSite = null;
 
                try
                {
                    clientSite = oleObject.GetClientSite();
                    if ((clientSite as ActiveXSite) != null)
                    {
                        ctl = ((ActiveXSite)(clientSite)).GetActiveXHost();
                    }
                }
                catch (COMException t)
                {
                    Debug.Fail(t.ToString());
                }
            }
            */
 
            return NativeMethods.S_OK;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.InsertMenus(IntPtr hmenuShared, NativeMethods.tagOleMenuGroupWidths lpMenuWidths)
        {
            return NativeMethods.S_OK;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.SetMenu(IntPtr hmenuShared, IntPtr holemenu, IntPtr hwndActiveObject)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.RemoveMenus(IntPtr hmenuShared)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.SetStatusText(string pszStatusText)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.EnableModeless(bool fEnable)
        {
            return NativeMethods.E_NOTIMPL;
        }
 
        ///<SecurityNote>
        ///     Critical: Implements critical interface method
        ///</SecurityNote> 
        [SecurityCritical]
        int UnsafeNativeMethods.IOleInPlaceFrame.TranslateAccelerator(ref MSG lpmsg, short wID)
        {
            return NativeMethods.S_FALSE;
        }
 
        #endregion IOleInPlaceFrame
 
        ///<SecurityNote>
        ///     Critical - calls ActiveXHost.
        ///     TreatAsSafe - transitioning to UIActive is ok.
        ///</SecurityNote>
        [ SecurityCritical, SecurityTreatAsSafe ]
        internal void OnUIActivate(ActiveXHost site)
        {
            // The ShDocVw control repeatedly calls OnUIActivate() with the same
            // site. This causes the assert below to fire.
            //
            if (_siteUIActive == site)
                return;
 
            if (_siteUIActive != null )
            {
                //Microsoft WebOC also uses ActiveXHost instead of ActiveXSite.
                //Ideally it should have been the site but since its a 1-1 relationship
                //for hosting the webOC, it will work
                ActiveXHost tempSite = _siteUIActive;
                tempSite.ActiveXInPlaceObject.UIDeactivate();
            }
            Debug.Assert(_siteUIActive == null, "Object did not call OnUIDeactivate");
            _siteUIActive = site;
 
            //
        }
 
        ///<SecurityNote>
        ///     Critical - calls ActiveXHost.
        ///     TreatAsSafe - transitioning away from UI-Active is ok.
        ///</SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe ]
        internal void OnUIDeactivate(ActiveXHost site)
        {
#if DEBUG
            if (_siteUIActive != null) {
                //
                Debug.Assert(this.ActiveXHost == site, "deactivating when not active...");
            }
#endif // DEBUG
 
            //
 
 
            _siteUIActive = null;
        }
 
        ///<SecurityNote>
        ///     Critical - accesses critical data.
        ///     TreatAsSafe - Transitioning away from in-place is ok.
        ///                   Clearing the active site is ok.
        ///</SecurityNote>
        [ SecurityCritical, SecurityTreatAsSafe ]
        internal void OnInPlaceDeactivate(ActiveXHost site)
        {
            //
            if (this.ActiveXHost == site)
            {
            }
        }
 
        #endregion Internal Methods
 
        //------------------------------------------------------
        //
        //  Internal Properties
        //
        //------------------------------------------------------
        #region Internal Properties
 
        ///<SecurityNote>
        ///     Critical - accesses critical _host member.
        ///</SecurityNote>
        internal ActiveXHost ActiveXHost
        {
            [ SecurityCritical ]
            get { return _host; }
        }
 
        #endregion Internal Properties
 
        //------------------------------------------------------
        //
        //  Private Fields
        //
        //------------------------------------------------------
        #region Private Fields
 
        ///<SecurityNote>
        ///     Critical - data - ptr. to control.
        ///</SecurityNote>
        [ SecurityCritical ]
        private ActiveXHost _host;
 
 
        ///<SecurityNote>
        ///     Critical - data - ptr. to control.
        ///</SecurityNote>
        [ SecurityCritical ]
        private ActiveXHost _siteUIActive;
 
        #endregion Private Fields
    }
 
    #endregion class ActiveXContainer
}