/*
 * Copyright 2003 Ove Kåven, TransGaming Technologies
 *
 * 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
 */

/* see the official DCOM specification
 * (there's a copy at http://www.grimes.demon.co.uk/DCOM/DCOMSpec.htm) */

#pragma makedep proxy
#pragma makedep register

#include "hstring.idl"
#include "wine/orpc.idl"

[
    threading(both),
    uuid(00000320-0000-0000-c000-000000000046)
]
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }

[
  object,
  uuid(00000131-0000-0000-C000-000000000046)
]
interface IRemUnknown : IUnknown
{
  typedef [unique] IRemUnknown *LPREMUNKNOWN;

  typedef struct tagREMQIRESULT {
    HRESULT hResult;
    STDOBJREF std;
  } REMQIRESULT;

  typedef struct tagREMINTERFACEREF {
    IPID ipid;
    unsigned long cPublicRefs;
    unsigned long cPrivateRefs;
  } REMINTERFACEREF; 

  HRESULT RemQueryInterface(
    [in] REFIPID ripid,
    [in] ULONG cRefs,
    [in] unsigned short cIids,
    [in, size_is(cIids)] IID *iids,
    [out, size_is(,cIids)] REMQIRESULT **ppQIResults);

  HRESULT RemAddRef(
    [in] unsigned short cInterfaceRefs,
    [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs,
    [out, size_is(cInterfaceRefs)] HRESULT *pResults);

  HRESULT RemRelease(
    [in] unsigned short cInterfaceRefs,
    [in, size_is(cInterfaceRefs)] REMINTERFACEREF* InterfaceRefs);
}

[
  object,
  uuid(00000142-0000-0000-C000-000000000046)
]
interface IRemUnknown2 : IRemUnknown
{
  typedef [unique] IRemUnknown2 *LPREMUNKNOWN2;

  HRESULT RemQueryInterface2(
    [in] REFIPID ripid,
    [in] unsigned short cIids,
    [in, size_is(cIids)] IID *iids,
    [out, size_is(cIids)] HRESULT *phr,
    [out, size_is(cIids)] MInterfacePointer **ppMIF);
}

[
  object,
  uuid(0000013C-0000-0000-C000-000000000046)
]
interface IRemUnknownN : IRemUnknown2
{
  const DWORD IRUF_CONVERTTOWEAK = 0x01;
  const DWORD IRUF_CONVERTTOSTRONG = 0x02;
  const DWORD IRUF_DISCONNECTIFLASTSTRONG = 0x04;

  typedef struct tagXAptCallback
  {
    DWORD64 pfnCallback;
    DWORD64 pParam;
    DWORD64 pServerCtx;
    DWORD64 pUnk;
    GUID iid;
    INT iMethod;
    GUID guidProcessSecret;
  } XAptCallback;

  HRESULT AcknowledgeMarshalingSets(
    [in] WORD cMarshalingSets,
    [in, size_is(cMarshalingSets)] DWORD64 *pMarshalingSets);

  HRESULT RemChangeRef(
    [in] DWORD flags,
    [in] WORD cInterfaceRefs,
    [in, size_is(cInterfaceRefs)] REMINTERFACEREF InterfaceRefs[]);

  HRESULT DoCallback(
    [in] XAptCallback *pCallbackData);

  HRESULT DoNonreentrantCallback(
    [in] XAptCallback *pCallbackData);

  HRESULT GetInterfaceNameFromIPID(
    [in] REFIPID ripid,
    [out] HSTRING *interfaceName);
}

[
  object,
  uuid(00000134-0000-0000-C000-000000000046),
]
interface IRundown : IRemUnknownN
{
  const DWORD MAX_OID_RUNDOWNS_PER_CALL = 100;

  HRESULT RundownOid(
    [in, range(1, MAX_OID_RUNDOWNS_PER_CALL)] DWORD cOid,
    [in, size_is(cOid)] OID aOid[],
    [out, size_is(cOid)] BYTE aRundownStatus[]);
}

[
  uuid(99fcfec4-5260-101b-bbcb-00aa0021347a),
  pointer_default(unique)
]
interface IOXIDResolver
{
  [idempotent] error_status_t ResolveOxid(
    [in] handle_t hRpc,
    [in] OXID *pOxid,
    [in] unsigned short cRequestedProtseqs,
    [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
    [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
    [out, ref] IPID *pipidRemUnknown,
    [out, ref] DWORD *pAuthnHint);

  [idempotent] error_status_t SimplePing(
    [in] handle_t hRpc,
    [in] SETID *pSetId);

  [idempotent] error_status_t ComplexPing(
    [in] handle_t hRpc,
    [in, out] SETID *pSetId,
    [in] unsigned short SequenceNum,
    [in] unsigned short cAddToSet,
    [in] unsigned short cDelFromSet,
    [in, unique, size_is(cAddToSet)] OID AddToSet[],
    [in, unique, size_is(cDelFromSet)] OID DelFromSet[],
    [out] unsigned short *pPingBackoffFactor);

  [idempotent] error_status_t ServerAlive(
    [in] handle_t hRpc);

  [idempotent] error_status_t ResolveOxid2(
    [in] handle_t hRpc,
    [in] OXID *pOxid,
    [in] unsigned short cRequestedProtseqs,
    [in, ref, size_is(cRequestedProtseqs)] unsigned short arRequestedProtseqs[],
    [out, ref] DUALSTRINGARRAY **ppdsaOxidBindings,
    [out, ref] IPID *pipidRemUnknown,
    [out, ref] DWORD *pAuthnHint,
    [out, ref] COMVERSION *pComVersion); 
}

[
  uuid(4d9f4ab8-7d1c-11cf-861e-0020af6e7c57),
  pointer_default(unique)
]
interface IRemoteActivation
{
  const unsigned long MODE_GET_CLASS_OBJECT = 0xffffffff;

  HRESULT RemoteActivation(
    [in] handle_t hRpc,
    [in] ORPCTHIS *ORPCthis,
    [out] ORPCTHAT *ORPCthat,
    [in] GUID *Clsid,
    [in, string, unique] WCHAR *pwszObjectName,
    [in, unique] MInterfacePointer *pObjectStorage,
    [in] DWORD ClientImpLevel,
    [in] DWORD Mode,
    [in] DWORD Interfaces,
    [in, unique, size_is(Interfaces)] IID *pIIDs,
    [in] unsigned short cRequestedProtseqs,
    [in, size_is(cRequestedProtseqs)] unsigned short RequestedProtseqs[],
    [out] OXID *pOxid,
    [out] DUALSTRINGARRAY **ppdsaOxidBindings,
    [out] IPID *pipidRemUnknown,
    [out] DWORD *pAuthnHint,
    [out] COMVERSION *pServerVersion,
    [out] HRESULT *phr,
    [out,size_is(Interfaces)] MInterfacePointer **ppInterfaceData,
    [out,size_is(Interfaces)] HRESULT *pResults);
}
