/*
 * Copyright 2002 Ove Kaaven
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "wtypes.idl";
#endif

cpp_quote("#ifdef __WINESRC__")
cpp_quote("#define WIDL_C_INLINE_WRAPPERS")
cpp_quote("#endif")

cpp_quote("#ifdef WIDL_C_INLINE_WRAPPERS")
cpp_quote("#define SAVE_WIDL_C_INLINE_WRAPPERS")
cpp_quote("#undef WIDL_C_INLINE_WRAPPERS")
cpp_quote("#endif")

[
  local,
  object,
  uuid(00000000-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IUnknown
{
  typedef [unique] IUnknown *LPUNKNOWN;

  HRESULT QueryInterface(
    [in] REFIID riid,
    [out, iid_is(riid)] void **ppvObject);
  ULONG AddRef();
  ULONG Release();
}

cpp_quote("HRESULT STDMETHODCALLTYPE IUnknown_QueryInterface_Proxy(IUnknown* This, REFIID riid, void **ppvObject);")
cpp_quote("void __RPC_STUB IUnknown_QueryInterface_Stub(IRpcStubBuffer* This, IRpcChannelBuffer* pRpcChannelBuffer,")
cpp_quote("     PRPC_MESSAGE pRpcMessage, DWORD* pdwStubPhase);")
cpp_quote("ULONG STDMETHODCALLTYPE IUnknown_AddRef_Proxy(IUnknown* This);")
cpp_quote("void __RPC_STUB IUnknown_AddRef_Stub(IRpcStubBuffer* This, IRpcChannelBuffer* pRpcChannelBuffer,")
cpp_quote("     PRPC_MESSAGE pRpcMessage, DWORD* pdwStubPhase);")
cpp_quote("ULONG STDMETHODCALLTYPE IUnknown_Release_Proxy(IUnknown* This);")
cpp_quote("void __RPC_STUB IUnknown_Release_Stub(IRpcStubBuffer* This, IRpcChannelBuffer* pRpcChannelBuffer,")
cpp_quote("     PRPC_MESSAGE pRpcMessage, DWORD* pdwStubPhase);")

cpp_quote("#ifdef SAVE_WIDL_C_INLINE_WRAPPERS")
cpp_quote("#define WIDL_C_INLINE_WRAPPERS")
cpp_quote("#endif")

[
  object,
  uuid(00000001-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IClassFactory : IUnknown
{
  typedef [unique] IClassFactory *LPCLASSFACTORY;

  [local]
  HRESULT CreateInstance(
    [in, unique] IUnknown *pUnkOuter,
    [in] REFIID riid,
    [out, iid_is(riid)] void **ppvObject);

  [call_as(CreateInstance)]
  HRESULT RemoteCreateInstance(
    [in] REFIID riid,
    [out, iid_is(riid)] IUnknown **ppvObject);

  [local]
  HRESULT LockServer(
    [in] BOOL fLock);

  [call_as(LockServer)]
  HRESULT RemoteLockServer(
    [in] BOOL fLock);
}
