/*
 * wsman-transport.i
 * client transport declarations for openwsman swig bindings
 *
 */

%rename(Transport) _WsManTransport;
%nodefault _WsManTransport;
typedef struct _WsManTransport {} WsManTransport;

/*
 * Document-class: Transport
 *
 * Transport reflects details of the http(s) transport layer between
 * client and server.
 *
 */

/* rename those as <foo>_STR below */
%ignore _WS_NO_AUTH;
%ignore _WS_BASIC_AUTH;
%ignore _WS_DIGEST_AUTH;
%ignore _WS_PASS_AUTH;
%ignore _WS_NTLM_AUTH;
%ignore _WS_GSSNEGOTIATE_AUTH;

%include "u/libu.h"
%include "wsman-client-transport.h"

%extend _WsManTransport {

 /* No authentication */
 %constant int NO_AUTH           = WS_NO_AUTH;
 /* HTTP basic auth */
 %constant int BASIC_AUTH        = WS_BASIC_AUTH;
 /* HTTP digest auth */
 %constant int DIGEST_AUTH       = WS_DIGEST_AUTH;
 /* Windows Passport auth */
 %constant int PASS_AUTH         = WS_PASS_AUTH;
 /* Windows NT Lan manager auth */
 %constant int NTLM_AUTH         = WS_NTLM_AUTH;
 /* GSSAPI auth */
 %constant int GSSNEGOTIATE_AUTH = WS_GSSNEGOTIATE_AUTH;

 /* No authentication */
 %constant char *NO_AUTH_STR           = _WS_NO_AUTH;
 /* HTTP basic auth */
 %constant char *BASIC_AUTH_STR        = _WS_BASIC_AUTH;
 /* HTTP digest auth */
 %constant char *DIGEST_AUTH_STR       = _WS_DIGEST_AUTH;
 /* Windows Passport auth */
 %constant char *PASS_AUTH_STR         = _WS_PASS_AUTH;
 /* Windows NT Lan manager auth */
 %constant char *NTLM_AUTH_STR         = _WS_NTLM_AUTH;
 /* GSSAPI auth */
 %constant char *GSSNEGOTIATE_AUTH_STR = _WS_GSSNEGOTIATE_AUTH;

#if defined(SWIGRUBY)
  %rename("auth_method?") is_auth_method(int method);
  %typemap(out) int is_auth_method
    "$result = ($1 != 0) ? Qtrue : Qfalse;";
#endif
  /*
   * Check if the passed method id is valid for authentication
   * call-seq:
   *   transport.auth_method?(Integer) -> Boolean
   */
  int is_auth_method(int method) {
    return wsman_is_auth_method((WsManClient *)$self, method);
  }

  /*
   * Close the transport. No further communication possible.
   */
  void close() {
    wsman_transport_close_transport((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("agent=") set_agent(const char *agent);
#endif
  /*
   * Set the HTTP agent identifier (User-agent:) string
   *
   * This is how the client will show up in the servers http log.
   * Defaults to "Openwsman"
   * call-seq:
   *   transport.agent = "Client identifier"
   */
  void set_agent(const char *agent) {
    wsman_transport_set_agent((WsManClient *)$self, agent);
  }
  %newobject agent;
  /*
   * Get the HTTP agent identifier string
   * call-seq:
   *   transport.agent -> String
   */
  char *agent() {
    return wsman_transport_get_agent ((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("username") get_username();
#endif
  %newobject get_username;
  /*
   * Server credentials
   * Get the username part of the http transport credentials
   * call-seq:
   *   transport.username -> String
   */
  char *get_username() {
    return wsman_transport_get_userName((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("username=") set_username(char *user_name);
#endif
  /*
   * Server credentials
   * Set the username part of the http transport credentials
   * call-seq:
   *   transport.username = "Username"
   */
  void set_username(char *user_name) {
    wsman_transport_set_userName((WsManClient *)$self, user_name);
  }

#if defined(SWIGRUBY)
  %rename("password") get_password();
#endif
  %newobject get_password;
  /*
   * Server credentials
   * Get the password part of the http transport credentials
   * call-seq:
   *   transport.password -> String
   */
  char *get_password() {
    return wsman_transport_get_password((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("password=") set_password(char *password);
#endif
  /*
   * Server credentials
   * Set the password part of the http transport credentials
   * call-seq:
   *   transport.password = "Password"
   */
  void set_password(char *password) {
    wsman_transport_set_password((WsManClient *)$self, password);
  }

#if defined(SWIGRUBY)
  %rename("proxy_username") get_proxy_username();
#endif
  %newobject get_proxy_username;
  /*
   * Windows clients: HTTP proxy credentials
   *
   * Get the username part of the http proxy credentials
   * call-seq:
   *   transport.proxy_username -> String
   */
  char *get_proxy_username() {
    return wsman_transport_get_proxy_username((WsManClient *)$self );
  }

#if defined(SWIGRUBY)
  %rename("proxy_username=") set_proxy_username(char *proxy_username);
#endif
  /*
   * Windows clients: HTTP proxy credentials
   *
   * Set the username part of the http proxy credentials
   * call-seq:
   *   transport.proxy_username = "proxy_username"
   */
  void set_proxy_username(char *proxy_username) {
    wsman_transport_set_proxy_username((WsManClient *)$self, proxy_username );
  }

#if defined(SWIGRUBY)
  %rename("proxy_password") get_proxy_password();
#endif
  %newobject get_proxy_password;
  /*
   * Windows clients: HTTP proxy credentials
   *
   * Get the password part of the http proxy credentials
   * call-seq:
   *   transport.proxy_password -> String
   */
  char *get_proxy_password() {
    return wsman_transport_get_proxy_password((WsManClient *)$self );
  }

#if defined(SWIGRUBY)
  %rename("proxy_password=") set_proxy_password(char *proxy_password);
#endif
  /*
   * Windows clients: HTTP proxy credentials
   *
   * Set the password part of the http proxy credentials
   * call-seq:
   *   transport.proxy_password = "proxy_password"
   */
  void set_proxy_password(char *proxy_password) {
    wsman_transport_set_proxy_password((WsManClient *)$self, proxy_password );
  }

#if defined(SWIGRUBY)
  %rename("auth_method=") set_auth_method( const char *am);
#endif
  /*
   * Set the authentication method
   * Value must be one of:
   *   +Openwsman::NO_AUTH_STR+
   *   +Openwsman::BASIC_AUTH_STR+
   *   +Openwsman::DIGEST_AUTH_STR+
   *   +Openwsman::PASS_AUTH_STR+
   *   +Openwsman::NTLM_AUTH_STR+
   *   +Openwsman::GSSNEGOTIATE_AUTH_STR+
   */
  void set_auth_method(const char *am) {
    wsman_transport_set_auth_method((WsManClient *)$self, am);
  }
  %newobject auth_method;
  /*
   * Set the authentication method
   * call-seq:
   *   transport.auth_method -> String
   */
  char *auth_method() {
    return wsman_transport_get_auth_method ((WsManClient *)$self);
  }

  /*
   * Set the authentication method string corresponding to the given
   * auth method id
   *
   * Value must be one of:
   *   +Openwsman::NO_AUTH+
   *   +Openwsman::BASIC_AUTH+
   *   +Openwsman::DIGEST_AUTH+
   *   +Openwsman::PASS_AUTH+
   *   +Openwsman::NTLM_AUTH+
   *   +Openwsman::GSSNEGOTIATE_AUTH+   
   *
   * call-seq:
   *   transport.auth_name(Integer) -> String
   */
  static const char *auth_name(int auth) {
    return wsmc_transport_get_auth_name(auth);
  }
  /*
   * Get the authentication method integer id
   */
  int auth_value() {
    return wsmc_transport_get_auth_value((WsManClient *)$self);
  }
  /*
   * Get string corresponding to given error code
   * call-seq:
   *   transport.error_string(Integer) -> String
   */
  static char *error_string(int err) {
    return wsman_transport_get_last_error_string(err);
  }

#if defined(SWIGRUBY)
  %rename("timeout=") set_timeout(unsigned long timeout);
#endif
  /*
   * Set the transport timeout in seconds
   *
   * ==== Note
   * This is the http layer timeout. Not to be confused with the
   * WS-Management operation timeout set via Openwsman::ClientOptions.timeout
   */
  void set_timeout(unsigned long timeout) {
    wsman_transport_set_timeout((WsManClient *)$self, timeout);
  }
  /*
   * Get the transport timeout in seconds
   * call-seq:
   *   transport.timeout -> Integer
   */
  unsigned long timeout() {
    return wsman_transport_get_timeout((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("verify_peer=") set_verify_peer( VALUE rvalue );
 /*
  * verify the peer in SSL communication ?
  *
  * If passed +false+, +nil+, or 0: disable peer verification
  * else: enable peer verification
  */
  void set_verify_peer( VALUE rvalue ) {
    unsigned int value;
    if ((rvalue == Qfalse) || (rvalue == Qnil)) {
      value = 0;
    }
    else if ((TYPE(rvalue) == T_FIXNUM) && (FIX2INT(rvalue) == 0)) {
      value = 0;
    }
    else {
      value = 1;
    }
#else
 /*
  * verify the peer in SSL communication ?
  * no: == 0
  * yes: != 0
  */
  void set_verify_peer( unsigned int value ) {
#endif
    wsman_transport_set_verify_peer((WsManClient *)$self, value);
  }
#if defined(SWIGRUBY)
  %rename("verify_peer?") verify_peer();
  %typemap(out) unsigned int verify_peer
    "$result = ($1 != 0) ? Qtrue : Qfalse;";
#endif
  /*
   * Peer to be verified ?
   * call-seq:
   *   transport.verify_peer? -> Boolean
   */
  unsigned int verify_peer() {
    return wsman_transport_get_verify_peer((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("verify_host=") set_verify_host(VALUE rvalue);
  /*
  * verify the host in SSL communication ?
  *
  * If passed +false+, +nil+, or 0: disable peer verification
  * else: enable peer verification
  */
  void set_verify_host( VALUE rvalue ) {
    unsigned int value;
    if ((rvalue == Qfalse) || (rvalue == Qnil)) {
      value = 0;
    }
    else if ((TYPE(rvalue) == T_FIXNUM) && (FIX2INT(rvalue) == 0)) {
      value = 0;
    }
    else {
      value = 1;
    }
#else
  /*
  * verify the host in SSL communication ?
  * no: == 0
  * yes: != 0
  */
  void set_verify_host(unsigned int value) {
#endif
    wsman_transport_set_verify_host((WsManClient *)$self, value);
  }
#if defined(SWIGRUBY)
  %rename("verify_host?") verify_host();
  %typemap(out) unsigned int verify_host
    "$result = ($1 != 0) ? Qtrue : Qfalse;";
#endif
  /*
   * Host to be verified ?
   * call-seq:
   *   transport.verify_host? -> Boolean
   */
  unsigned int verify_host() {
    return wsman_transport_get_verify_host((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("proxy=") set_proxy(const char *proxy);
#endif
  /*
   * Set http proxy URL
   *
   * Pass nil to disable proxy communication
   * ==== Example
   *   transport.proxy = "http://your.proxy.com:80"
   */
  void set_proxy(const char *proxy) {
    wsman_transport_set_proxy((WsManClient *)$self, proxy);
  }
  %newobject proxy;
  /*
   * Get http proxy URL
   */
  char *proxy() {
    return wsman_transport_get_proxy((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("proxyauth=") set_proxyauth(const char *pauth);
#endif
  /*
   * Linux clients: HTTP proxy credentials
   *
   * Set the proxy username and password
   * ==== Example
   *   transport.proxyauth = "username:password"
   */
  void set_proxyauth(const char *pauth) {
    wsman_transport_set_proxyauth((WsManClient *)$self, pauth);
  }
  %newobject proxyauth;
  /*
   * Linux clients: HTTP proxy credentials
   *
   * Get the proxy username and password as "username:password"
   * call-seq:
   *   transport.proxyauth -> String
   */
  char *proxyauth(){
    return wsman_transport_get_proxyauth((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("cainfo=") set_cainfo(const char *cainfo);
#endif
  /*
   * Set the certification authority (CAINFO)
   */
  void set_cainfo(const char *cainfo) {
    wsman_transport_set_cainfo((WsManClient *)$self, cainfo);
  }
  %newobject cainfo;
  /*
   * Get the certification authority (CAINFO)
   * call-seq:
   *   transport.cainfo -> String
   */
  char *cainfo() {
    return wsman_transport_get_cainfo((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("certhumbprint=") set_certhumbprint(const char *arg);
#endif
  /*
   * Set the certification thumbprint
   */
  void set_certhumbprint(const char *arg) {
    wsman_transport_set_certhumbprint((WsManClient *)$self, arg);
  }
  %newobject certhumbprint;
  /*
   * Set the certification thumbprint
   * call-seq:
   *   transport.certhumbprint -> String
   */
  char *certhumbprint() {
    return wsman_transport_get_certhumbprint((WsManClient *)$self);
  }
  
#if defined(SWIGRUBY)
  %rename("capath=") set_capath(const char *capath);
#endif
  /*
   * Set the path to the certification authority (CAINFO) store
   */
  void set_capath(const char *capath) {
    wsman_transport_set_capath((WsManClient *)$self, capath);
  }
  %newobject capath;
  /*
   * Get the path to the certification authority (CAINFO) store
   */
  char *capath() {
    return wsman_transport_get_capath((WsManClient *)$self);
  }

#if defined(SWIGRUBY)
  %rename("caoid=") set_caoid(const char *oid);
#endif
  /*
   * Windows client
   *
   * Set the CA OID
   *
   * ==== Reference
   * http://support.microsoft.com/kb/287547
   */
  void set_caoid(const char *oid) {
    wsman_transport_set_caoid((WsManClient *)$self, oid);
  }
  %newobject caoid;
  /*
   * Windows client
   *
   * Get the CA OID
   */
  char *caoid() {
    return wsman_transport_get_caoid((WsManClient *)$self);
  }

#ifdef _WIN32
#if defined(SWIGRUBY)
  %rename("calocal=") set_calocal(BOOL local);
#endif
  /*
   * Windows client
   *
   * Use local CA ?
   */
  void set_calocal(BOOL local) {
    wsman_transport_set_calocal((WsManClient *)$self, local);
  }
  /*
   * Windows client
   *
   * Use local CA ?
   * call-seq:
   *   transport.calocal -> Boolean
   */
  BOOL calocal() {
    return wsman_transport_get_calocal((WsManClient *)$self);
  }
#endif

#if defined(SWIGRUBY)
  %rename("cert=") set_cert(const char *cert);
#endif
  /*
   * Set the certificate
   */
  void set_cert(const char *cert) {
    wsman_transport_set_cert((WsManClient *)$self, cert);
  }
  %newobject cert;
  /*
   * Get the certificate
   */
  char *cert() {
    return wsman_transport_get_cert((WsManClient *)$self);
  }
  
#if defined(SWIGRUBY)
  %rename("key=") set_key(const char *key);
#endif
  /*
   * Set the key
   */
  void set_key(const char *key) {
    wsman_transport_set_key((WsManClient *)$self, key);
  }
  %newobject key;
  /*
   * Get the key
   */
  char *key() {
    return wsman_transport_get_key((WsManClient *)$self);
  }


}
