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

#pragma makedep client
#pragma makedep server

#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);

  typedef char **str_array_t;
  void get_names([out] int *n, [out, string, size_is(,*n)] str_array_t *names);
  typedef WCHAR **wstr_array_t;
  void get_namesw([out] int *n, [out, string, size_is(,*n)] wstr_array_t *names);

  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);
}
