blob: b90d1d35802602c82d6219ec8969bea4c2750082 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
namespace UnitTests
{
using System;
using System.Runtime.InteropServices;
/// <summary>
/// Interface for IOleMessageFilter.
/// </summary>
[ComImport, Guid("00000016-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleMessageFilter
{
/// <summary>
/// Handles calls for the thread.
/// </summary>
/// <param name="dwCallType">The parameter is not used.</param>
/// <param name="hTaskCaller">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="lpInterfaceInfo">The parameter is not used.</param>
/// <returns>Code indicating message was handled.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
[PreserveSig]
int HandleInComingCall(
int dwCallType,
IntPtr hTaskCaller,
int dwTickCount,
IntPtr lpInterfaceInfo);
/// <summary>
/// Automatically retries the failed call.
/// </summary>
/// <param name="hTaskCallee">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="dwRejectType">The parameter is not used.</param>
/// <returns>Code indicating call should be retried.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
[PreserveSig]
int RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType);
/// <summary>
/// Handles an incoming message by indicating it should be dispatched always.
/// </summary>
/// <param name="hTaskCallee">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="dwPendingType">The parameter is not used.</param>
/// <returns>Code indicating message should be dispatched.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
[PreserveSig]
int MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType);
}
/// <summary>
/// This class receives messages from the COM calls to Visual Studio
/// and auto-retries them if they fail because VS is busy.
/// </summary>
public class ComMessageFilter : IOleMessageFilter
{
/// <summary>
/// Note this registers the filter only for the current thread.
/// </summary>
public static void Register()
{
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(new ComMessageFilter(), out oldFilter);
}
/// <summary>
/// Note this only closes the filter for the current thread.
/// </summary>
public static void Revoke()
{
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(null, out oldFilter);
}
/// <summary>
/// Handles calls for the thread.
/// </summary>
/// <param name="dwCallType">The parameter is not used.</param>
/// <param name="hTaskCaller">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="lpInterfaceInfo">The parameter is not used.</param>
/// <returns>Code indicating message was handled.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
int IOleMessageFilter.HandleInComingCall(
int dwCallType,
System.IntPtr hTaskCaller,
int dwTickCount,
System.IntPtr lpInterfaceInfo)
{
return 0; // SERVERCALL_ISHANDLED.
}
/// <summary>
/// Automatically retries the failed call.
/// </summary>
/// <param name="hTaskCallee">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="dwRejectType">The parameter is not used.</param>
/// <returns>Code indicating call should be retried.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
int IOleMessageFilter.RetryRejectedCall(
System.IntPtr hTaskCallee,
int dwTickCount,
int dwRejectType)
{
// If reject type is SERVERCALL_RETRYLATER.
if (dwRejectType == 2)
{
// Immediate retry.
return 99;
}
// Cancel call.
return -1;
}
/// <summary>
/// Handles an incoming message by indicating it should be dispatched always.
/// </summary>
/// <param name="hTaskCallee">The parameter is not used.</param>
/// <param name="dwTickCount">The parameter is not used.</param>
/// <param name="dwPendingType">The parameter is not used.</param>
/// <returns>Code indicating message should be dispatched.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.StyleCop.CSharp.NamingRules",
"SA1305:FieldNamesMustNotUseHungarianNotation",
Justification = "Matching variable name to COM interface")]
int IOleMessageFilter.MessagePending(
System.IntPtr hTaskCallee,
int dwTickCount,
int dwPendingType)
{
return 2; // PENDINGMSG_WAITDEFPROCESS.
}
// Implement the IOleMessageFilter interface.
[DllImport("Ole32.dll")]
private static extern int CoRegisterMessageFilter(
IOleMessageFilter newFilter, out IOleMessageFilter oldFilter);
}
}