/*
 * A simple interface to test the RPC server.
 *
 * Copyright (C) Google 2007 (Dan Hipschman)
 *
 * 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
 */

#include "server_defines.h"

typedef struct tag_vector
{
  int x;
  int y;
  int z;
} vector_t;

[
  uuid(00000000-4114-0704-2301-000000000000),
#ifndef __midl
  implicit_handle(handle_t IServer_IfHandle)
#endif
]
interface IServer
{
cpp_quote("#if 0")
  typedef wchar_t WCHAR;
cpp_quote("#endif")

  typedef [string] char *str_t;
  typedef [string] WCHAR *wstr_t;

  typedef struct
  {
    int *pi;
    int **ppi;
    int ***pppi;
  } pints_t;

  typedef struct
  {
    char *pc;
    short *ps;
    long *pl;
    float *pf;
    double *pd;
  } ptypes_t;

  typedef struct
  {
    vector_t *pu;
    vector_t **pv;
  } pvectors_t;

  typedef struct
  {
    [switch_is(s)] union
    {
      [case(SUN_I)] int i;
      [case(SUN_F1, SUN_F2)] float f;
      [case(SUN_PI)] int *pi;
    } u;

    int s;
  } sun_t;

  int int_return(void);
  int square(int x);
  int sum(int x, int y);
  void square_out(int x, [out] int *y);
  void square_ref([in, out] int *x);
  int str_length([string] const char *s);
  int str_t_length(str_t s);
  int cstr_length([string, size_is(n)] const char *s, int n);
  int dot_self(vector_t *v);
  double square_half(double x, [out] double *y);
  float square_half_float(float x, [out] float *y);
  long square_half_long(long x, [out] long *y);
  int sum_fixed_array(int a[5]);
  int pints_sum(pints_t *pints);
  double ptypes_sum(ptypes_t *ptypes);
  int dot_pvectors(pvectors_t *pvectors);

  /* don't use this anywhere except in sp_t */
  typedef struct
  {
    int x;
  } sp_inner_t;

  typedef struct
  {
    int x;
    sp_inner_t *s;
  } sp_t;

  int sum_sp(sp_t *sp);
  double square_sun(sun_t *su);

  typedef struct test_list
  {
    int t;
    [switch_is(t)] union
    {
      [case(TL_NULL)] char x;  /* end of list */
      [case(TL_LIST)] struct test_list *tail;
    } u;
  } test_list_t;

  int test_list_length(test_list_t *ls);
  int sum_fixed_int_3d(int m[2][3][4]);
  int sum_conf_array([size_is(n)] int x[], int n);
  int sum_conf_ptr_by_conf_ptr(int n1, [size_is(n1)] int *n2_then_x1, [size_is(*n2_then_x1)] int *x2);
  int sum_unique_conf_array([size_is(n), unique] int x[], int n);
  int sum_unique_conf_ptr([size_is(n), unique] int *x, int n);
  int sum_var_array([length_is(n)] int x[20], int n);
  int dot_two_vectors(vector_t vs[2]);

  typedef struct
  {
    int n;
    [size_is(n)] int ca[];
  } cs_t;

  typedef struct
  {
    int *pn;
    [size_is(*pn)] int *ca1;
    [size_is(n * 2)] int *ca2;
    int n;
  } cps_t;

  typedef struct
  {
    [size_is(c ? a : b)] int *ca;
    int a;
    int b;
    int c;
  } cpsc_t;

  int sum_cs(cs_t *cs);
  int sum_cps(cps_t *cps);
  int sum_cpsc(cpsc_t *cpsc);

  typedef [wire_marshal(int)] void *puint_t;
  int square_puint(puint_t p);

  typedef struct
  {
    [size_is(n)] puint_t *ps;
    int n;
  } puints_t;

  /* Same thing as puints_t, but make it complex (needs padding).  */
  typedef struct
  {
    [size_is(n)] puint_t *ps;
    char n;
  } cpuints_t;

  int sum_puints(puints_t *p);
  int sum_cpuints(cpuints_t *p);
  int dot_copy_vectors(vector_t u, vector_t v);

  typedef struct wire_us *wire_us_t;
  typedef [wire_marshal(wire_us_t)] struct us us_t;
  struct us
  {
    void *x;
  };
  struct wire_us
  {
    int x;
  };
  typedef struct
  {
    us_t us;
  } test_us_t;

  int square_test_us(test_us_t *tus);

  typedef union encu switch (int t)
  {
  case ENCU_I: int i;
  case ENCU_F: float f;
  } encu_t;

  typedef [switch_type(int)] union unencu
  {
    [case (ENCU_I)] int i;
    [case (ENCU_F)] float f;
  } unencu_t;

  typedef enum
  {
    E1 = 23,
    E2 = 4,
    E3 = 0,
    E4 = 64
  } e_t;

  typedef union encue switch (e_t t)
  {
  case E1: int i1;
  case E2: float f2;
  } encue_t;

  typedef struct
  {
    e_t f;
  } se_t;

  double square_encu(encu_t *eu);
  double square_unencu(int t, [switch_is(t)] unencu_t *eu);
  int sum_parr(int *a[3]);
  int sum_pcarr([size_is(n)] int *a[], int n);
  int enum_ord(e_t e);
  double square_encue(encue_t *eue);
  void check_se2(se_t *s);

  int sum_toplev_conf_2n([size_is(n * 2)] int *x, int n);
  int sum_toplev_conf_cond([size_is(c ? a : b)] int *x, int a, int b, int c);

  typedef struct
  {
    char c;
    int i;
    short s;
    double d;
  } aligns_t;

  double sum_aligns(aligns_t *a);

  typedef struct
  {
    int i;
    char c;
  } padded_t;

  int sum_padded(padded_t *p);
  int sum_padded2(padded_t ps[2]);
  int sum_padded_conf([size_is(n)] padded_t *ps, int n);

  typedef struct
  {
    int *p1;
  } bogus_helper_t;

  typedef struct
  {
    bogus_helper_t h;
    int *p2;
    int *p3;
    char c;
  } bogus_t;

  int sum_bogus(bogus_t *b);
  void check_null([unique] int *null);

  typedef struct
  {
    str_t s;
  } str_struct_t;

  typedef struct
  {
    wstr_t s;
  } wstr_struct_t;

  int str_struct_len(str_struct_t *s);
  int wstr_struct_len(wstr_struct_t *s);

  typedef struct
  {
    unsigned int n;
    [size_is(n)] byte a[];
  } doub_carr_1_t;

  typedef struct
  {
    int n;
    [size_is(n)] doub_carr_1_t *a[];
  } doub_carr_t;

  int sum_doub_carr(doub_carr_t *dc);
  void make_pyramid_doub_carr(unsigned char n, [out] doub_carr_t **dc);

  typedef struct
  {
    short n;
    [size_is(n)] short data[];
  } user_bstr_t;

  typedef [unique] user_bstr_t *wire_bstr_t;
  typedef [wire_marshal(wire_bstr_t)] short *bstr_t;
  unsigned hash_bstr(bstr_t s);

  typedef struct
  {
    [string, size_is(size)] char *name;
    unsigned int size;
  } name_t;
  void get_name([in,out] name_t *name);

  int sum_pcarr2(int n, [size_is(, n)] int **pa);
  int sum_L1_norms(int n, [size_is(n)] vector_t *vs);

  /* Don't use this except in the get_s123 test.  */
  typedef struct
  {
    int f1;
    int f2;
    int f3;
  } s123_t;

  /* Make sure WIDL generates a type format string for a previously unseen
     type as a return value.  */
  s123_t *get_s123(void);

  typedef struct
  {
    unsigned int length;
    unsigned int size;
    [size_is(size), length_is(length)] pints_t numbers[];
  } numbers_struct_t;

  void get_numbers([in] int length, [in] int size, [out, length_is(length), size_is(size)] pints_t pn[]);
  void get_numbers_struct([out] numbers_struct_t **ns);

  str_t get_filename(void);
  void context_handle_test(void);
  void stop(void);
}
