widl: Allow enums as union switch types.
[wine] / dlls / rpcrt4 / tests / server.idl
1 /*
2  * A simple interface to test the RPC server.
3  *
4  * Copyright (C) Google 2007 (Dan Hipschman)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "server_defines.h"
22
23 typedef struct tag_vector
24 {
25   int x;
26   int y;
27   int z;
28 } vector_t;
29
30 [
31   uuid(00000000-4114-0704-2301-000000000000),
32   implicit_handle(handle_t IServer_IfHandle)
33 ]
34 interface IServer
35 {
36   typedef struct
37   {
38     int *pi;
39     int **ppi;
40     int ***pppi;
41   } pints_t;
42
43   typedef struct
44   {
45     char *pc;
46     short *ps;
47     long *pl;
48     float *pf;
49     double *pd;
50   } ptypes_t;
51
52   typedef struct
53   {
54     vector_t *pu;
55     vector_t **pv;
56   } pvectors_t;
57
58   typedef struct
59   {
60     [switch_is(s)] union
61     {
62       [case(SUN_I)] int i;
63       [case(SUN_F1, SUN_F2)] float f;
64       [case(SUN_PI)] int *pi;
65     } u;
66
67     int s;
68   } sun_t;
69
70   int int_return(void);
71   int square(int x);
72   int sum(int x, int y);
73   void square_out(int x, [out] int *y);
74   void square_ref([in, out] int *x);
75   int str_length([string] const char *s);
76   int dot_self(vector_t *v);
77   double square_half(double x, [out] double *y);
78   float square_half_float(float x, [out] float *y);
79   long square_half_long(long x, [out] long *y);
80   int sum_fixed_array(int a[5]);
81   int pints_sum(pints_t *pints);
82   double ptypes_sum(ptypes_t *ptypes);
83   int dot_pvectors(pvectors_t *pvectors);
84
85   /* don't use this anywhere except in sp_t */
86   typedef struct
87   {
88     int x;
89   } sp_inner_t;
90
91   typedef struct
92   {
93     int x;
94     sp_inner_t *s;
95   } sp_t;
96
97   int sum_sp(sp_t *sp);
98   double square_sun(sun_t *su);
99
100   typedef struct test_list
101   {
102     int t;
103     [switch_is(t)] union
104     {
105       [case(TL_NULL)] int x;  /* end of list */
106       [case(TL_LIST)] struct test_list *tail;
107     } u;
108   } test_list_t;
109
110   int test_list_length(test_list_t *ls);
111   int sum_fixed_int_3d(int m[2][3][4]);
112   int sum_conf_array([size_is(n)] int x[], int n);
113   int sum_var_array([length_is(n)] int x[20], int n);
114   int dot_two_vectors(vector_t vs[2]);
115
116   typedef struct
117   {
118     int n;
119     [size_is(n)] int ca[];
120   } cs_t;
121
122   typedef struct
123   {
124     int *pn;
125     [size_is(*pn)] int *ca1;
126     [size_is(n * 2)] int *ca2;
127     int n;
128   } cps_t;
129
130   int sum_cs(cs_t *cs);
131   int sum_cps(cps_t *cps);
132
133   typedef [wire_marshal(int)] void *puint_t;
134   int square_puint(puint_t p);
135   int dot_copy_vectors(vector_t u, vector_t v);
136
137   typedef struct wire_us *wire_us_t;
138   typedef [wire_marshal(wire_us_t)] struct us us_t;
139   struct us
140   {
141     void *x;
142   };
143   struct wire_us
144   {
145     int x;
146   };
147   typedef struct
148   {
149     us_t us;
150   } test_us_t;
151
152   int square_test_us(test_us_t *tus);
153
154   typedef union encu switch (int t)
155   {
156   case ENCU_I: int i;
157   case ENCU_F: float f;
158   } encu_t;
159
160   typedef enum
161   {
162     E1 = 23,
163     E2 = 4,
164     E3 = 0,
165     E4 = 64
166   } e_t;
167
168   typedef union encue switch (e_t t)
169   {
170   case E1: int i1;
171   case E2: float f2;
172   } encue_t;
173
174   double square_encu(encu_t *eu);
175   int sum_parr(int *a[3]);
176   int sum_pcarr([size_is(n)] int *a[], int n);
177   int enum_ord(e_t e);
178   double square_encue(encue_t *eue);
179   void stop(void);
180 }