Add the decVal field to VARIANT.
[wine] / include / wine / server.h
1 /*
2  * Definitions for the client side of the Wine server communication
3  *
4  * Copyright (C) 1998 Alexandre Julliard
5  */
6
7 #ifndef __WINE_WINE_SERVER_H
8 #define __WINE_WINE_SERVER_H
9
10 #include "thread.h"
11 #include "ntddk.h"
12 #include "wine/exception.h"
13 #include "wine/server_protocol.h"
14
15 /* client communication functions */
16
17 extern unsigned int wine_server_call( union generic_request *req, size_t size );
18 extern void server_protocol_error( const char *err, ... ) WINE_NORETURN;
19 extern void server_protocol_perror( const char *err ) WINE_NORETURN;
20 extern void wine_server_alloc_req( union generic_request *req, size_t size );
21 extern void wine_server_send_fd( int fd );
22 extern int wine_server_recv_fd( handle_t handle );
23 extern const char *get_config_dir(void);
24
25 /* do a server call and set the last error code */
26 inline static unsigned int __server_call_err( union generic_request *req, size_t size )
27 {
28     unsigned int res = wine_server_call( req, size );
29     if (res) SetLastError( RtlNtStatusToDosError(res) );
30     return res;
31 }
32
33 /* get a pointer to the variable part of the request */
34 inline static void *server_data_ptr( const void *req )
35 {
36     return (char *)NtCurrentTeb()->buffer + ((struct request_header *)req)->var_offset;
37 }
38
39 /* get the size of the variable part of the request */
40 inline static size_t server_data_size( const void *req )
41 {
42     return ((struct request_header *)req)->var_size;
43 }
44
45
46 /* exception support for server calls */
47
48 extern DWORD __wine_server_exception_handler( PEXCEPTION_RECORD record, EXCEPTION_FRAME *frame,
49                                               CONTEXT *context, EXCEPTION_FRAME **pdispatcher );
50
51 struct __server_exception_frame
52 {
53     EXCEPTION_FRAME  frame;
54     unsigned int     buffer_pos;  /* saved buffer position */
55 };
56
57
58 /* macros for server requests */
59
60 #define SERVER_START_REQ(type) \
61     do { \
62         union generic_request __req; \
63         struct type##_request * const req = &__req.type; \
64         __req.header.req = REQ_##type; \
65         __req.header.var_size = 0; \
66         do
67
68 #define SERVER_END_REQ \
69         while(0); \
70     } while(0)
71
72 #define SERVER_START_VAR_REQ(type,size) \
73     do { \
74         struct __server_exception_frame __f; \
75         union generic_request __req; \
76         struct type##_request * const req = &__req.type; \
77         __f.frame.Handler = __wine_server_exception_handler; \
78         __f.buffer_pos = NtCurrentTeb()->buffer_pos; \
79         __wine_push_frame( &__f.frame ); \
80         __req.header.req = REQ_##type; \
81         wine_server_alloc_req( &__req, (size) ); \
82         do
83
84 #define SERVER_END_VAR_REQ \
85         while(0); \
86         NtCurrentTeb()->buffer_pos = __f.buffer_pos; \
87         __wine_pop_frame( &__f.frame ); \
88     } while(0)
89
90 #define SERVER_CALL()      (wine_server_call( &__req, sizeof(*req) ))
91 #define SERVER_CALL_ERR()  (__server_call_err( &__req, sizeof(*req) ))
92
93
94 extern void CLIENT_InitServer(void);
95 extern void CLIENT_InitThread(void);
96 extern void CLIENT_BootDone( int debug_level );
97 extern int CLIENT_IsBootThread(void);
98
99 #endif  /* __WINE_WINE_SERVER_H */