/*
 * RPCSS shared definitions
 *
 * Copyright (C) 2002 Greg Turner
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_RPCSS_SHARED_H
#define __WINE_RPCSS_SHARED_H

#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <rpc.h>
#include <rpcdcep.h>

#define RPCSS_NP_PROTOCOL_VERSION 0x0000

#define RPCSS_STRINGIFY_MACRO(x) RPCSS_STRINGIFY_MACRO2(x)
#define RPCSS_STRINGIFY_MACRO2(x) #x

#define STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION \
  RPCSS_STRINGIFY_MACRO(RPCSS_NP_PROTOCOL_VERSION)

/* only local communications are supported so far on this pipe.
   until this changes, we can just use a constant pipe-name */
#define NAME_RPCSS_NAMED_PIPE \
  ("\\\\.\\pipe\\RpcssNP" STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION)

/* mutex is local only... perhaps this ought to be part of the pipe
   protocol for remote wine<->wine connections? */
#define RPCSS_MASTER_MUTEX_NAME \
  ("RPCSSMasterMutex" STRINGIFIED_RPCSS_NP_PROTOCOL_VERSION)

/* payloads above 1K are fragmented into multiple messages */
#define VARDATA_PAYLOAD_BYTES 1024 

/* ick -- maybe we should pass a handle to a mailslot or something? */
#define MAX_RPCSS_NP_REPLY_STRING_LEN 512

/* number of microseconds/10 to wait for master mutex before giving up */
#define MASTER_MUTEX_TIMEOUT 6000000

/* number of miliseconds to wait on the master mutex after it returns BUSY */
#define MASTER_MUTEX_WAITNAMEDPIPE_TIMEOUT 5000

/* a data payload; not a normal message */
#define RPCSS_NP_MESSAGE_TYPEID_VARDATAPAYLOADMSG 1
typedef struct _RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG {
  char payload[VARDATA_PAYLOAD_BYTES];
} RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG;

/* RANMSG: 
 *   Simply tells the server that another rpcss instance ran.
 *   The server should respond by resetting its timeout to the
 *   full lazy timeout.
 */
#define RPCSS_NP_MESSAGE_TYPEID_RANMSG 2
typedef struct _RPCSS_NP_MESSAGE_UNION_RANMSG {
  long timeout;
} RPCSS_NP_MESSAGE_UNION_RANMSG;

/* REGISTEREPMSG:
 *   Registers endpoints with the endpoint server.
 *   object_count and binding_count contain the number
 *   of object uuids and endpoints in the vardata payload,
 *   respectively.
 */
#define RPCSS_NP_MESSAGE_TYPEID_REGISTEREPMSG 3
typedef struct _RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG {
  RPC_SYNTAX_IDENTIFIER iface;
  int object_count;
  int binding_count;
  int no_replace;
} RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG;

/* UNREGISTEREPMSG:
 *   Unregisters endpoints with the endpoint server.
 *   object_count and binding_count contain the number
 *   of object uuids and endpoints in the vardata payload,
 *   respectively.
 */
#define RPCSS_NP_MESSAGE_TYPEID_UNREGISTEREPMSG 4
typedef struct _RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG {
  RPC_SYNTAX_IDENTIFIER iface;
  int object_count;
  int binding_count;
} RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG;

/* RESOLVEEPMSG:
 *   Locates an endpoint registered with the endpoint server.
 *   Vardata contains a single protseq string.  This is a bit
 *   silly: the protseq string is probably shorter than the
 *   reply (an endpoint string), which is truncated at
 *   MAX_RPCSS_NP_REPLY_STRING_LEN, at least for the moment.
 *   returns the empty string if the requested endpoint isn't
 *   registered.
 */
#define RPCSS_NP_MESSAGE_TYPEID_RESOLVEEPMSG 5
typedef struct _RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG {
  RPC_SYNTAX_IDENTIFIER iface;
  UUID object;
} RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG;

typedef union {
  RPCSS_NP_MESSAGE_UNION_RANMSG ranmsg;
  RPCSS_NP_MESSAGE_UNION_VARDATAPAYLOADMSG vardatapayloadmsg;
  RPCSS_NP_MESSAGE_UNION_REGISTEREPMSG registerepmsg;
  RPCSS_NP_MESSAGE_UNION_UNREGISTEREPMSG unregisterepmsg;
  RPCSS_NP_MESSAGE_UNION_RESOLVEEPMSG resolveepmsg;
} RPCSS_NP_MESSAGE_UNION;

/* vardata_payload_size specifies the number of bytes
 * to be transferred over the pipe in VARDATAPAYLOAD
 * messages (divide by VARDATA_PAYLOAD_BYTES to 
 * get the # of payloads) 
 */
typedef struct _RPCSS_NP_MESSAGE {
  UINT32 message_type;
  RPCSS_NP_MESSAGE_UNION message;
  UINT32 vardata_payload_size;
} RPCSS_NP_MESSAGE, *PRPCSS_NP_MESSAGE;

typedef union {
  /* some of these aren't used, but I guess we don't care */
  UINT as_uint;
  INT  as_int;
  void   *as_pvoid;
  HANDLE as_handle;
  char as_string[MAX_RPCSS_NP_REPLY_STRING_LEN]; /* FIXME: yucky */
} RPCSS_NP_REPLY, *PRPCSS_NP_REPLY;

#endif /* __WINE_RPCSS_SHARED_H */
