DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Header

Mercurial (27a812186ff4)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "base/basictypes.h"

#include "COMMessageFilter.h"
#include "base/message_loop.h"
#include "mozilla/plugins/PluginModuleChild.h"

#include <stdio.h>

namespace mozilla {
namespace plugins {

HRESULT
COMMessageFilter::QueryInterface(REFIID riid, void** ppv)
{
  if (riid == IID_IUnknown || riid == IID_IMessageFilter) {
    *ppv = static_cast<IMessageFilter*>(this);
    AddRef();
    return S_OK;
  }
  return E_NOINTERFACE;
}

DWORD COMMessageFilter::AddRef()
{
  ++mRefCnt;
  return mRefCnt;
}

DWORD COMMessageFilter::Release()
{
  DWORD r = --mRefCnt;
  if (0 == r)
    delete this;
  return r;
}

DWORD 
COMMessageFilter::HandleInComingCall(DWORD dwCallType,
				     HTASK htaskCaller,
				     DWORD dwTickCount,
				     LPINTERFACEINFO lpInterfaceInfo)
{
  if (mPreviousFilter)
    return mPreviousFilter->HandleInComingCall(dwCallType, htaskCaller,
					       dwTickCount, lpInterfaceInfo);
  return SERVERCALL_ISHANDLED;
}

DWORD
COMMessageFilter::RetryRejectedCall(HTASK htaskCallee,
				    DWORD dwTickCount,
				    DWORD dwRejectType)
{
  if (mPreviousFilter)
    return mPreviousFilter->RetryRejectedCall(htaskCallee, dwTickCount,
					      dwRejectType);
  return -1;
}

DWORD
COMMessageFilter::MessagePending(HTASK htaskCallee,
				 DWORD dwTickCount,
				 DWORD dwPendingType)
{
  mPlugin->FlushPendingInterruptQueue();
  if (mPreviousFilter)
    return mPreviousFilter->MessagePending(htaskCallee, dwTickCount,
					   dwPendingType);
  return PENDINGMSG_WAITNOPROCESS;
}

void
COMMessageFilter::Initialize(PluginModuleChild* module)
{
  nsRefPtr<COMMessageFilter> f = new COMMessageFilter(module);
  ::CoRegisterMessageFilter(f, getter_AddRefs(f->mPreviousFilter));
}

} // namespace plugins
} // namespace mozilla