/*
 * NDR Serialization Services
 *
 * Copyright (c) 2007 Robert Shearman for CodeWeavers
 *
 * 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 __WINE_MIDLES_H__
#define __WINE_MIDLES_H__

#include <rpcndr.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum
{
    MES_ENCODE,
    MES_DECODE,
    MES_ENCODE_NDR64
} MIDL_ES_CODE;

typedef enum
{
    MES_INCREMENTAL_HANDLE,
    MES_FIXED_BUFFER_HANDLE,
    MES_DYNAMIC_BUFFER_HANDLE
} MIDL_ES_HANDLE_STYLE;

typedef void (__RPC_USER * MIDL_ES_ALLOC)(void *,char **,unsigned int *);
typedef void (__RPC_USER * MIDL_ES_WRITE)(void *,char *,unsigned int);
typedef void (__RPC_USER * MIDL_ES_READ)(void *,char **,unsigned int *);

typedef struct _MIDL_ES_MESSAGE
{
    MIDL_STUB_MESSAGE       StubMsg;
    MIDL_ES_CODE            Operation;
    void                   *UserState;
    ULONG                   MesVersion : 8;
    ULONG                   HandleStyle : 8;
    ULONG                   HandleFlags : 8;
    ULONG                   Reserve : 8;
    MIDL_ES_ALLOC           Alloc;
    MIDL_ES_WRITE           Write;
    MIDL_ES_READ            Read;
    unsigned char          *Buffer;
    ULONG                   BufferSize;
    unsigned char         **pDynBuffer;
    ULONG                  *pEncodedSize;
    RPC_SYNTAX_IDENTIFIER   InterfaceId;
    ULONG                   ProcNumber;
    ULONG                   AlienDataRep;
    ULONG                   IncrDataSize;
    ULONG                   ByteCount;
} MIDL_ES_MESSAGE, *PMIDL_ES_MESSAGE;

typedef PMIDL_ES_MESSAGE MIDL_ES_HANDLE;

typedef struct _MIDL_TYPE_PICKLING_INFO
{
    ULONG       Version;
    ULONG       Flags;
    UINT_PTR    Reserved[3];
} MIDL_TYPE_PICKLING_INFO, *PMIDL_TYPE_PICKLING_INFO;

RPC_STATUS RPC_ENTRY
 MesEncodeIncrementalHandleCreate(void *,MIDL_ES_ALLOC,MIDL_ES_WRITE,handle_t *);
RPC_STATUS RPC_ENTRY
 MesDecodeIncrementalHandleCreate(void *,MIDL_ES_READ,handle_t *);
RPC_STATUS RPC_ENTRY
 MesIncrementalHandleReset(handle_t,void *,MIDL_ES_ALLOC,MIDL_ES_WRITE,MIDL_ES_READ,MIDL_ES_CODE);

RPC_STATUS RPC_ENTRY
 MesEncodeFixedBufferHandleCreate(char *,ULONG,ULONG *,handle_t *);
RPC_STATUS RPC_ENTRY
 MesEncodeDynBufferHandleCreate(char **,ULONG *,handle_t *);
RPC_STATUS RPC_ENTRY
 MesDecodeBufferHandleCreate(char *,ULONG,handle_t *);
RPC_STATUS RPC_ENTRY
 MesBufferHandleReset(handle_t,ULONG,MIDL_ES_CODE,char **,ULONG,ULONG *);

RPC_STATUS RPC_ENTRY
 MesHandleFree(handle_t);

RPC_STATUS RPC_ENTRY
 MesInqProcEncodingId(handle_t,PRPC_SYNTAX_IDENTIFIER,ULONG *);

SIZE_T RPC_ENTRY
 NdrMesSimpleTypeAlignSize(handle_t);
void RPC_ENTRY
 NdrMesSimpleTypeDecode(handle_t,void *,short);
void RPC_ENTRY
 NdrMesSimpleTypeEncode(handle_t,const MIDL_STUB_DESC *,const void *,short);

SIZE_T RPC_ENTRY
 NdrMesTypeAlignSize(handle_t,const MIDL_STUB_DESC *,PFORMAT_STRING,const void *);
void RPC_ENTRY
 NdrMesTypeEncode(handle_t,const MIDL_STUB_DESC *,PFORMAT_STRING,const void *);
void RPC_ENTRY
 NdrMesTypeDecode(handle_t,const MIDL_STUB_DESC *,PFORMAT_STRING,void *);

SIZE_T RPC_ENTRY
 NdrMesTypeAlignSize2(handle_t,const MIDL_TYPE_PICKLING_INFO *,const MIDL_STUB_DESC *,PFORMAT_STRING,const void *);
void RPC_ENTRY
 NdrMesTypeEncode2(handle_t,const MIDL_TYPE_PICKLING_INFO *,const MIDL_STUB_DESC *,PFORMAT_STRING,const void *);
void RPC_ENTRY
 NdrMesTypeDecode2(handle_t,const MIDL_TYPE_PICKLING_INFO *,const MIDL_STUB_DESC *,PFORMAT_STRING,void *);
void RPC_ENTRY
 NdrMesTypeFree2(handle_t,const MIDL_TYPE_PICKLING_INFO *,const MIDL_STUB_DESC *,PFORMAT_STRING,void *);

void RPC_VAR_ENTRY
 NdrMesProcEncodeDecode(handle_t,const MIDL_STUB_DESC *,PFORMAT_STRING,...);
CLIENT_CALL_RETURN RPC_VAR_ENTRY
 NdrMesProcEncodeDeocde2(handle_t,const MIDL_STUB_DESC *,PFORMAT_STRING,...);

#ifdef __cplusplus
}
#endif

#endif /* __WINE_MIDLES_H__ */