%YAML 1.2
--- |
  /*
   *
   * Copyright 2016, Google Inc.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
   * met:
   *
   *     * Redistributions of source code must retain the above copyright
   * notice, this list of conditions and the following disclaimer.
   *     * Redistributions in binary form must reproduce the above
   * copyright notice, this list of conditions and the following disclaimer
   * in the documentation and/or other materials provided with the
   * distribution.
   *     * Neither the name of Google Inc. nor the names of its
   * contributors may be used to endorse or promote products derived from
   * this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   */

  #ifndef PYGRPC_CYTHON_WINDOWS_IMPORTS_H_
  #define PYGRPC_CYTHON_WINDOWS_IMPORTS_H_

  #include <grpc/support/port_platform.h>

  #ifdef GPR_WIN32

  #include <windows.h>

  %for header in sorted(set(api.header for api in c_apis)):
  #include <${'/'.join(header.split('/')[1:])}>
  %endfor

  %for api in c_apis:
  typedef ${api.return_type}(*${api.name}_type)(${api.arguments});
  extern ${api.name}_type ${api.name}_import;
  #define ${api.name} ${api.name}_import
  %endfor

  #ifdef __cplusplus
  extern "C" {
  #endif  /* __cpluslus */

  void pygrpc_load_imports(HMODULE library);

  #ifdef __cplusplus
  }
  #endif  /* __cpluslus */

  #else /* !GPR_WIN32 */

  #include <grpc/byte_buffer.h>
  #include <grpc/byte_buffer_reader.h>
  #include <grpc/compression.h>
  #include <grpc/grpc.h>
  #include <grpc/grpc_security.h>
  #include <grpc/support/alloc.h>
  #include <grpc/support/slice.h>
  #include <grpc/support/time.h>
  #include <grpc/status.h>

  #endif /* !GPR_WIN32 */

  #endif
