/*
 * 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;

typedef int fnprintf(const char *format, ...);

[
  uuid(00000000-4114-0704-2301-000000000000),
  implicit_handle(handle_t IServer_IfHandle)
]
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);
  signed char sum_char(signed char x, signed char y);
  short sum_short(short x, short y);
  int sum_float(float x, float y);
  int sum_double_int(int x, double y);
  hyper sum_hyper(hyper x, hyper y);
  int sum_hyper_int(hyper x, hyper y);
  int sum_char_hyper(signed char x, hyper 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;

  typedef [ref] int *refpint_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]);
  void get_number_array([out, length_is(*n)] int x[20], [out] int *n);

  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);
  int get_cpsc(int n, [out] cpsc_t *cpsc );
  int sum_complex_array(int n, [size_is(n)] refpint_t pi[]);

  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);
  void get_a_bstr([out]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);

  enum renum
  {
    RE0,
    RE1,
    RE2,
    RE3,
  };
  const int RE_MIN = RE0;
  const int RE_MAX = RE3;
  typedef [range(RE_MIN, RE_MAX)] enum renum renum_t;
  typedef [range(0, 100)] int rint_t;
  rint_t echo_ranged_int([range(0, 10)] int i, [range(0, 20)] int j, [range(0, 100)] int k);
  rint_t echo_ranged_int2([range(0, 40)] int i);
  void get_ranged_enum([out] renum_t *re);

  void context_handle_test(void);

  void full_pointer_test([in, ptr] int *a, [in, ptr] int *b);
  void full_pointer_null_test([in, ptr] int *a, [in, ptr] int *b);

  void authinfo_test(unsigned int protseq, int secure);

  void stop(void);
}
