// Environment:
// export CLIENT_CFLAGS=`xmlrpc-c-config libwww-client --cflags`
// export CLIENT_LIBS=`xmlrpc-c-config libwww-client --libs`

// Compiling:
// gcc $CLIENT_CFLAGS -o myclient client.c $CLIENT_LIBS

#include <stdio.h>
#include <xmlrpc.h>
#include <xmlrpc_client.h>

#define NAME     "SKYRiX C Appointment Client"
#define VERSION  "0.42"
#define URL      "http://localhost:20000/RPC2"
#define USER     "root"
#define PASSWORD "yourpasshere" // password

void die_if_fault_occurred (xmlrpc_env *env)
{
  if (env->fault_occurred) {
      fprintf(stderr, "XML-RPC Fault: %s (%d)\n",
              env->fault_string, env->fault_code);
    exit(1);
  }
}

int main (int argc, char** argv) {
  xmlrpc_env env;
  xmlrpc_server_info *server;
  xmlrpc_value *appointments, *appointment;
  size_t size, i;
  char *user, *password;
  char *startDate, *endDate, *title;
  int first;
    
  /* Start up our XML-RPC client library. */
  xmlrpc_client_init(XMLRPC_CLIENT_NO_FLAGS, NAME, VERSION);
  xmlrpc_env_init(&env);

  /* Make a new object to represent our XML-RPC server. */
  server = xmlrpc_server_info_new(&env, URL);
  die_if_fault_occurred(&env);

  /* Set up our authentication information. */
  xmlrpc_server_info_set_basic_auth(&env, server, USER, PASSWORD);
  die_if_fault_occurred(&env);

  /* Ask the server to show us the appointments from August 2002 */
  appointments = xmlrpc_client_call_server(&env, server,
                                           "appointment.fetch",
                                           "({s:{s:8,s:8}})",
                                           "qualifier",
                                           "startDate","20020801T00:00:00",
                                           "endDate","20020831T23:59:59"
                                           );
  die_if_fault_occurred(&env);

  /* Dispose of our server object. */
  xmlrpc_server_info_free(server);

  /* Loop over the appointments */
  size = xmlrpc_array_size(&env, appointments);
  die_if_fault_occurred(&env);
  first = 1;
  for (i = 0; i < size; i++) {

    /* get the appointment from the result array */
    appointment = xmlrpc_array_get_item(&env, appointments, i);
    die_if_fault_occurred(&env);

    /* parse the appointment */
    xmlrpc_parse_value(&env, appointment, "{s:8,s:8,s:s,*}",
	       	       "startDate", &startDate,
		       "endDate", &endDate,
                       "title", &title);
    die_if_fault_occurred(&env);

    if (first) {
      printf("Appointment List\n");
      printf("================\n\n");
      first = 0;
    }
    else
      printf("\n");
      printf("Title: %s\nStart: %s   End: %s\n", title, startDate, endDate);
    }
    
  /* Dispose of our result value. */
  xmlrpc_DECREF(appointments);

  /* Shut down our XML-RPC client library. */
  xmlrpc_env_clean(&env);
  xmlrpc_client_cleanup();

  return 0;
}
