/*
** Copyright 2001-2008 Ethan Galstad
** Copyright 2011-2013 Merethis
**
** This file is part of Centreon Engine.
**
** Centreon Engine is free software: you can redistribute it and/or
** modify it under the terms of the GNU General Public License version 2
** as published by the Free Software Foundation.
**
** Centreon Engine 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
** General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with Centreon Engine. If not, see
** <http://www.gnu.org/licenses/>.
*/

#ifndef CCE_XODTEMPLATE_HH
#  define CCE_XODTEMPLATE_HH

#  include "com/centreon/engine/common.hh"

// General definitions.
#  define XODTEMPLATE_NULL                  "null"
#  define MAX_XODTEMPLATE_INPUT_BUFFER      1024
#  define MAX_XODTEMPLATE_CONTACT_ADDRESSES 6
#  define XODTEMPLATE_NONE                  0
#  define XODTEMPLATE_TIMEPERIOD            1
#  define XODTEMPLATE_COMMAND               2
#  define XODTEMPLATE_CONTACT               3
#  define XODTEMPLATE_CONTACTGROUP          4
#  define XODTEMPLATE_HOST                  5
#  define XODTEMPLATE_HOSTGROUP             6
#  define XODTEMPLATE_SERVICE               7
#  define XODTEMPLATE_SERVICEDEPENDENCY     8
#  define XODTEMPLATE_HOSTGROUPESCALATION   9  // No longer implemented.
#  define XODTEMPLATE_SERVICEESCALATION     10
#  define XODTEMPLATE_HOSTESCALATION        11
#  define XODTEMPLATE_HOSTDEPENDENCY        12
#  define XODTEMPLATE_HOSTEXTINFO           13
#  define XODTEMPLATE_SERVICEEXTINFO        14
#  define XODTEMPLATE_SERVICEGROUP          15
#  define XODTEMPLATE_CONNECTOR             16

// Skip lists.
#  define X_HOST_SKIPLIST                   1
#  define X_SERVICE_SKIPLIST                2
#  define X_COMMAND_SKIPLIST                3
#  define X_TIMEPERIOD_SKIPLIST             4
#  define X_CONTACT_SKIPLIST                5
#  define X_CONTACTGROUP_SKIPLIST           6
#  define X_HOSTGROUP_SKIPLIST              7
#  define X_SERVICEGROUP_SKIPLIST           8
#  define X_HOSTDEPENDENCY_SKIPLIST         9
#  define X_SERVICEDEPENDENCY_SKIPLIST      10
#  define X_HOSTESCALATION_SKIPLIST         11
#  define X_SERVICEESCALATION_SKIPLIST      12
#  define X_HOSTEXTINFO_SKIPLIST            13
#  define X_SERVICEEXTINFO_SKIPLIST         14
#  define X_CONNECTOR_SKIPLIST              15
#  define NUM_XOBJECT_SKIPLISTS             16


/* CUSTOMVARIABLESMEMBER structure */
typedef struct xodtemplate_customvariablesmember_struct{
  char*         variable_name;
  char*         variable_value;
  struct xodtemplate_customvariablesmember_struct* next;
}              xodtemplate_customvariablesmember;


/* DATERANGE structure */
typedef struct xodtemplate_daterange_struct{
  int          type;
  int          syear;          /* start year */
  int          smon;           /* start month */
  int          smday;          /* start day of month (may 3rd, last day in feb) */
  int          swday;          /* start day of week (thursday) */
  int          swday_offset;   /* start weekday offset (3rd thursday, last monday in jan) */
  int          eyear;
  int          emon;
  int          emday;
  int          ewday;
  int          ewday_offset;
  int          skip_interval;
  char*        timeranges;
  struct xodtemplate_daterange_struct* next;
}              xodtemplate_daterange;


/* TIMEPERIOD TEMPLATE STRUCTURE */
typedef struct xodtemplate_timeperiod_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        timeperiod_name;
  char*        alias;
  char*        timeranges[7];
  xodtemplate_daterange* exceptions[DATERANGE_TYPES];
  char*        exclusions;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_timeperiod_struct* next;
}              xodtemplate_timeperiod;


/* COMMAND TEMPLATE STRUCTURE */
typedef struct xodtemplate_command_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        command_name;
  char*        command_line;

  char*        connector_name;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_command_struct* next;
}              xodtemplate_command;

/* CONNECTOR TEMPLATE STRUCTURE */
typedef struct xodtemplate_connector_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        connector_name;
  char*        connector_line;

  int          register_object;
  struct xodtemplate_connector_struct* next;
}              xodtemplate_connector;


/* CONTACT TEMPLATE STRUCTURE */
typedef struct xodtemplate_contact_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        contact_name;
  char*        alias;
  char*        contact_groups;
  char*        email;
  char*        pager;
  char*        address[MAX_XODTEMPLATE_CONTACT_ADDRESSES];
  char*        host_notification_period;
  char*        host_notification_commands;
  int          notify_on_host_down;
  int          notify_on_host_unreachable;
  int          notify_on_host_recovery;
  int          notify_on_host_flapping;
  int          notify_on_host_downtime;
  char*        service_notification_period;
  char*        service_notification_commands;
  int          notify_on_service_unknown;
  int          notify_on_service_warning;
  int          notify_on_service_critical;
  int          notify_on_service_recovery;
  int          notify_on_service_flapping;
  int          notify_on_service_downtime;
  int          host_notifications_enabled;
  int          service_notifications_enabled;
  int          can_submit_commands;
  int          retain_status_information;
  int          retain_nonstatus_information;
  xodtemplate_customvariablesmember* custom_variables;

  int          have_contact_groups;
  int          have_email;
  int          have_pager;
  int          have_address[MAX_XODTEMPLATE_CONTACT_ADDRESSES];
  int          have_host_notification_period;
  int          have_host_notification_commands;
  int          have_service_notification_period;
  int          have_service_notification_commands;

  int          have_host_notification_options;
  int          have_service_notification_options;
  int          have_host_notifications_enabled;
  int          have_service_notifications_enabled;
  int          have_can_submit_commands;
  int          have_retain_status_information;
  int          have_retain_nonstatus_information;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_contact_struct* next;
}              xodtemplate_contact;


/* CONTACTGROUP TEMPLATE STRUCTURE */
typedef struct xodtemplate_contactgroup_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        contactgroup_name;
  char*        alias;
  char*        members;
  char*        contactgroup_members;

  int          have_members;
  int          have_contactgroup_members;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_contactgroup_struct* next;
}              xodtemplate_contactgroup;


/* HOST TEMPLATE STRUCTURE */
typedef struct xodtemplate_host_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        display_name;
  char*        alias;
  char*        address;
  char*        parents;
  char*        host_groups;
  char*        check_command;
  char*        check_period;
  int          initial_state;
  double       check_interval;
  double       retry_interval;
  int          max_check_attempts;
  int          active_checks_enabled;
  int          passive_checks_enabled;
  int          obsess_over_host;
  char*        event_handler;
  int          event_handler_enabled;
  int          check_freshness;
  int          freshness_threshold;
  float        low_flap_threshold;
  float        high_flap_threshold;
  int          flap_detection_enabled;
  int          flap_detection_on_up;
  int          flap_detection_on_down;
  int          flap_detection_on_unreachable;
  char*        contact_groups;
  char*        contacts;
  int          notify_on_down;
  int          notify_on_unreachable;
  int          notify_on_recovery;
  int          notify_on_flapping;
  int          notify_on_downtime;
  int          notifications_enabled;
  char*        notification_period;
  double       notification_interval;
  double       first_notification_delay;
  int          stalk_on_up;
  int          stalk_on_down;
  int          stalk_on_unreachable;
  int          process_perf_data;
  int          failure_prediction_enabled;
  char*        notes;
  char*        notes_url;
  char*        action_url;
  char*        icon_image;
  char*        icon_image_alt;
  char*        vrml_image;
  char*        statusmap_image;
  int          x_2d;
  int          y_2d;
  double       x_3d;
  double       y_3d;
  double       z_3d;
  int          retain_status_information;
  int          retain_nonstatus_information;
  xodtemplate_customvariablesmember* custom_variables;

  int          have_display_name;
  int          have_parents;
  int          have_host_groups;
  int          have_check_command;
  int          have_check_period;
  int          have_event_handler;
  int          have_contact_groups;
  int          have_contacts;
  int          have_notification_period;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;
  int          have_icon_image;
  int          have_icon_image_alt;
  int          have_vrml_image;
  int          have_statusmap_image;

  int          have_initial_state;
  int          have_check_interval;
  int          have_retry_interval;
  int          have_max_check_attempts;
  int          have_active_checks_enabled;
  int          have_passive_checks_enabled;
  int          have_obsess_over_host;
  int          have_event_handler_enabled;
  int          have_check_freshness;
  int          have_freshness_threshold;
  int          have_low_flap_threshold;
  int          have_high_flap_threshold;
  int          have_flap_detection_enabled;
  int          have_flap_detection_options;
  int          have_notification_options;
  int          have_notifications_enabled;
  int          have_notification_interval;
  int          have_first_notification_delay;
  int          have_stalking_options;
  int          have_process_perf_data;
  int          have_failure_prediction_enabled;
  int          have_2d_coords;
  int          have_3d_coords;
  int          have_retain_status_information;
  int          have_retain_nonstatus_information;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_host_struct* next;
}              xodtemplate_host;


/* HOSTGROUP TEMPLATE STRUCTURE */
typedef struct xodtemplate_hostgroup_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        hostgroup_name;
  char*        alias;
  char*        members;
  char*        hostgroup_members;
  char*        notes;
  char*        notes_url;
  char*        action_url;

  int          have_members;
  int          have_hostgroup_members;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_hostgroup_struct* next;
}              xodtemplate_hostgroup;


/* SERVICE TEMPLATE STRUCTURE */
typedef struct xodtemplate_service_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        service_description;
  char*        display_name;
  char*        hostgroup_name;
  char*        service_groups;
  char*        check_command;
  int          initial_state;
  int          max_check_attempts;
  double       check_interval;
  double       retry_interval;
  char*        check_period;
  int          active_checks_enabled;
  int          passive_checks_enabled;
  int          parallelize_check;
  int          is_volatile;
  int          obsess_over_service;
  char*        event_handler;
  int          event_handler_enabled;
  int          check_freshness;
  int          freshness_threshold;
  double       low_flap_threshold;
  double       high_flap_threshold;
  int          flap_detection_enabled;
  int          flap_detection_on_ok;
  int          flap_detection_on_warning;
  int          flap_detection_on_unknown;
  int          flap_detection_on_critical;
  int          notify_on_unknown;
  int          notify_on_warning;
  int          notify_on_critical;
  int          notify_on_recovery;
  int          notify_on_flapping;
  int          notify_on_downtime;
  int          notifications_enabled;
  char*        notification_period;
  double       notification_interval;
  double       first_notification_delay;
  char*        contact_groups;
  char*        contacts;
  int          stalk_on_ok;
  int          stalk_on_unknown;
  int          stalk_on_warning;
  int          stalk_on_critical;
  int          process_perf_data;
  int          failure_prediction_enabled;
  char*        notes;
  char*        notes_url;
  char*        action_url;
  char*        icon_image;
  char*        icon_image_alt;
  int          retain_status_information;
  int          retain_nonstatus_information;
  xodtemplate_customvariablesmember* custom_variables;

  int          have_host_name;
  int          have_service_description;
  int          have_display_name;
  int          have_hostgroup_name;
  int          have_service_groups;
  int          have_check_command;
  int          have_important_check_command;
  int          have_check_period;
  int          have_event_handler;
  int          have_notification_period;
  int          have_contact_groups;
  int          have_contacts;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;
  int          have_icon_image;
  int          have_icon_image_alt;

  int          have_initial_state;
  int          have_max_check_attempts;
  int          have_check_interval;
  int          have_retry_interval;
  int          have_active_checks_enabled;
  int          have_passive_checks_enabled;
  int          have_parallelize_check;
  int          have_is_volatile;
  int          have_obsess_over_service;
  int          have_event_handler_enabled;
  int          have_check_freshness;
  int          have_freshness_threshold;
  int          have_low_flap_threshold;
  int          have_high_flap_threshold;
  int          have_flap_detection_enabled;
  int          have_flap_detection_options;
  int          have_notification_options;
  int          have_notifications_enabled;
  int          have_notification_dependencies;
  int          have_notification_interval;
  int          have_first_notification_delay;
  int          have_stalking_options;
  int          have_process_perf_data;
  int          have_failure_prediction_enabled;
  int          have_retain_status_information;
  int          have_retain_nonstatus_information;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_service_struct* next;
}              xodtemplate_service;


/* SERVICEGROUP TEMPLATE STRUCTURE */
typedef struct xodtemplate_servicegroup_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        servicegroup_name;
  char*        alias;
  char*        members;
  char*        servicegroup_members;
  char*        notes;
  char*        notes_url;
  char*        action_url;

  int          have_members;
  int          have_servicegroup_members;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_servicegroup_struct* next;
}              xodtemplate_servicegroup;


/* SERVICEDEPENDENCY TEMPLATE STRUCTURE */
typedef struct xodtemplate_servicedependency_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        service_description;
  char*        dependent_host_name;
  char*        dependent_service_description;
  char*        servicegroup_name;
  char*        hostgroup_name;
  char*        dependent_servicegroup_name;
  char*        dependent_hostgroup_name;
  char*        dependency_period;
  int          inherits_parent;
  int          fail_notify_on_ok;
  int          fail_notify_on_unknown;
  int          fail_notify_on_warning;
  int          fail_notify_on_critical;
  int          fail_notify_on_pending;
  int          fail_execute_on_ok;
  int          fail_execute_on_unknown;
  int          fail_execute_on_warning;
  int          fail_execute_on_critical;
  int          fail_execute_on_pending;

  int          have_host_name;
  int          have_service_description;
  int          have_dependent_host_name;
  int          have_dependent_service_description;
  int          have_servicegroup_name;
  int          have_hostgroup_name;
  int          have_dependent_servicegroup_name;
  int          have_dependent_hostgroup_name;
  int          have_dependency_period;

  int          have_inherits_parent;
  int          have_notification_dependency_options;
  int          have_execution_dependency_options;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_servicedependency_struct* next;
}              xodtemplate_servicedependency;


/* SERVICEESCALATION TEMPLATE STRUCTURE */
typedef struct xodtemplate_serviceescalation_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        service_description;
  char*        servicegroup_name;
  char*        hostgroup_name;
  int          first_notification;
  int          last_notification;
  double       notification_interval;
  char*        escalation_period;
  int          escalate_on_warning;
  int          escalate_on_unknown;
  int          escalate_on_critical;
  int          escalate_on_recovery;
  char*        contact_groups;
  char*        contacts;

  int          have_host_name;
  int          have_service_description;
  int          have_servicegroup_name;
  int          have_hostgroup_name;
  int          have_escalation_period;
  int          have_contact_groups;
  int          have_contacts;

  int          have_first_notification;
  int          have_last_notification;
  int          have_notification_interval;
  int          have_escalation_options;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_serviceescalation_struct* next;
}              xodtemplate_serviceescalation;


/* HOSTDEPENDENCY TEMPLATE STRUCTURE */
typedef struct xodtemplate_hostdependency_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        dependent_host_name;
  char*        hostgroup_name;
  char*        dependent_hostgroup_name;
  char*        dependency_period;
  int          inherits_parent;
  int          fail_notify_on_up;
  int          fail_notify_on_down;
  int          fail_notify_on_unreachable;
  int          fail_notify_on_pending;
  int          fail_execute_on_up;
  int          fail_execute_on_down;
  int          fail_execute_on_unreachable;
  int          fail_execute_on_pending;

  int          have_host_name;
  int          have_dependent_host_name;
  int          have_hostgroup_name;
  int          have_dependent_hostgroup_name;
  int          have_dependency_period;

  int          have_inherits_parent;
  int          have_notification_dependency_options;
  int          have_execution_dependency_options;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_hostdependency_struct* next;
}              xodtemplate_hostdependency;


/* HOSTESCALATION TEMPLATE STRUCTURE */
typedef struct xodtemplate_hostescalation_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        hostgroup_name;
  int          first_notification;
  int          last_notification;
  double       notification_interval;
  char*        escalation_period;
  int          escalate_on_down;
  int          escalate_on_unreachable;
  int          escalate_on_recovery;
  char*        contact_groups;
  char*        contacts;

  int          have_host_name;
  int          have_hostgroup_name;
  int          have_escalation_period;
  int          have_contact_groups;
  int          have_contacts;

  int          have_first_notification;
  int          have_last_notification;
  int          have_notification_interval;
  int          have_escalation_options;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_hostescalation_struct* next;
}              xodtemplate_hostescalation;


/* HOSTEXTINFO TEMPLATE STRUCTURE */
typedef struct xodtemplate_hostextinfo_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        hostgroup_name;
  char*        notes;
  char*        notes_url;
  char*        action_url;
  char*        icon_image;
  char*        icon_image_alt;
  char*        vrml_image;
  char*        statusmap_image;
  int          x_2d;
  int          y_2d;
  double       x_3d;
  double       y_3d;
  double       z_3d;

  int          have_host_name;
  int          have_hostgroup_name;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;
  int          have_icon_image;
  int          have_icon_image_alt;
  int          have_vrml_image;
  int          have_statusmap_image;

  int          have_2d_coords;
  int          have_3d_coords;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_hostextinfo_struct* next;
}              xodtemplate_hostextinfo;


/* SERVICEEXTINFO TEMPLATE STRUCTURE */
typedef struct xodtemplate_serviceextinfo_struct{
  char*        tmpl;
  char*        name;
  int          _config_file;
  int          _start_line;

  char*        host_name;
  char*        hostgroup_name;
  char*        service_description;
  char*        notes;
  char*        notes_url;
  char*        action_url;
  char*        icon_image;
  char*        icon_image_alt;

  int          have_host_name;
  int          have_hostgroup_name;
  int          have_service_description;
  int          have_notes;
  int          have_notes_url;
  int          have_action_url;
  int          have_icon_image;
  int          have_icon_image_alt;

  int          has_been_resolved;
  int          register_object;
  struct xodtemplate_serviceextinfo_struct* next;
}              xodtemplate_serviceextinfo;

/* CONTACT LIST STRUCTURE */
typedef struct xodtemplate_contactlist_struct{
  char*        contact_name;
  struct xodtemplate_contactlist_struct* next;
}              xodtemplate_contactlist;


/* HOST LIST STRUCTURE */
typedef struct xodtemplate_hostlist_struct{
  char*        host_name;
  struct xodtemplate_hostlist_struct* next;
}              xodtemplate_hostlist;


/* SERVICE LIST STRUCTURE */
typedef struct xodtemplate_servicelist_struct{
  char*        host_name;
  char*        service_description;
  struct xodtemplate_servicelist_struct* next;
}              xodtemplate_servicelist;


/* MEMBER LIST STRUCTURE */
typedef struct xodtemplate_memberlist_struct{
  char*        name1;
  char*        name2;
  struct xodtemplate_memberlist_struct* next;
}              xodtemplate_memberlist;


/***** CHAINED HASH DATA STRUCTURES ******/

typedef struct         xodtemplate_service_cursor_struct{
  int                  xodtemplate_service_iterator;
  xodtemplate_service* current_xodtemplate_service;
}                      xodtemplate_service_cursor;


#  ifdef __cplusplus
extern "C" {
#  endif

int read_main_config_file(char const* main_config_file);

/* top-level routine processes all config files */
int xodtemplate_read_config_data(char const*, int, int, int);
/* grabs variables from main config file */
int xodtemplate_grab_config_info(char const*);
/* process data in a specific config file */
int xodtemplate_process_config_file(char*, int);
/* process all files in a specific config directory */
int xodtemplate_process_config_dir(char*, int);

xodtemplate_memberlist* xodtemplate_expand_contactgroups_and_contacts(
                          char*,
                          char*,
                          int,
                          int);
int xodtemplate_expand_contactgroups(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);
int xodtemplate_expand_contacts(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);
int xodtemplate_add_contactgroup_members_to_memberlist(
      xodtemplate_memberlist**,
      xodtemplate_contactgroup*,
      int,
      int);

xodtemplate_memberlist* xodtemplate_expand_hostgroups_and_hosts(
                          char*,
                          char*,
                          int,
                          int);
int xodtemplate_expand_hostgroups(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);
int xodtemplate_expand_hosts(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);
int xodtemplate_add_hostgroup_members_to_memberlist(
      xodtemplate_memberlist**,
      xodtemplate_hostgroup*,
      int,
      int);

xodtemplate_memberlist* xodtemplate_expand_servicegroups_and_services(
                          char*,
                          char*,
                          char*,
                          int,
                          int);
int xodtemplate_expand_servicegroups(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);
int xodtemplate_expand_services(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      char*,
      int,
      int);
int xodtemplate_add_servicegroup_members_to_memberlist(
      xodtemplate_memberlist**,
      xodtemplate_servicegroup*,
      int,
      int);

char* xodtemplate_process_contactgroup_names(char*, int, int);
int xodtemplate_get_contactgroup_names(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);

char* xodtemplate_process_hostgroup_names(char*, int, int);
int xodtemplate_get_hostgroup_names(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);

char* xodtemplate_process_servicegroup_names(char*, int, int);
int xodtemplate_get_servicegroup_names(
      xodtemplate_memberlist**,
      xodtemplate_memberlist**,
      char*,
      int,
      int);

int xodtemplate_add_member_to_memberlist(
      xodtemplate_memberlist**,
      char*,
      char*);
int xodtemplate_free_memberlist(xodtemplate_memberlist **);
void xodtemplate_remove_memberlist_item(
       xodtemplate_memberlist*,
       xodtemplate_memberlist **);

void xodtemplate_free_timeperiod(xodtemplate_timeperiod const* tperiod);

int xodtemplate_begin_object_definition(char*, int, int, int);
int xodtemplate_add_object_property(char*, int);
int xodtemplate_end_object_definition(int);

int xodtemplate_parse_timeperiod_directive(
      xodtemplate_timeperiod*,
      char const*,
      char const*);
xodtemplate_daterange* xodtemplate_add_exception_to_timeperiod(
                         xodtemplate_timeperiod*,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         int,
                         char*);
int xodtemplate_get_month_from_string(char*, int*);
int xodtemplate_get_weekday_from_string(char*, int*);

xodtemplate_customvariablesmember* xodtemplate_add_custom_variable_to_host(
                                     xodtemplate_host*,
                                     char*,
                                     char*);
xodtemplate_customvariablesmember* xodtemplate_add_custom_variable_to_service(
                                     xodtemplate_service*,
                                     char*,
                                     char*);
xodtemplate_customvariablesmember* xodtemplate_add_custom_variable_to_contact(
                                     xodtemplate_contact*,
                                     char*,
                                     char*);
xodtemplate_customvariablesmember* xodtemplate_add_custom_variable_to_object(
                                     xodtemplate_customvariablesmember**,
                                     char*,
                                     char*);


int xodtemplate_register_objects();
int xodtemplate_free_memory();

int xodtemplate_duplicate_objects();
int xodtemplate_duplicate_services();

int xodtemplate_inherit_object_properties();

int xodtemplate_resolve_objects();

int xodtemplate_sort_objects();
int xodtemplate_compare_strings1(char*, char*);
int xodtemplate_compare_strings2(char*, char*, char*, char*);

int xodtemplate_cache_objects(char*);

int xodtemplate_duplicate_service(xodtemplate_service*,char*);
int xodtemplate_duplicate_hostescalation(
      xodtemplate_hostescalation*,
      char*);
int xodtemplate_duplicate_serviceescalation(
      xodtemplate_serviceescalation*,
      char*,
      char*);
int xodtemplate_duplicate_hostdependency(
      xodtemplate_hostdependency*,
      char*,
      char*);
int xodtemplate_duplicate_servicedependency(
      xodtemplate_servicedependency*,
      char*,
      char*,
      char*,
      char*,
      char*,
      char*,
      char*,
      char*);
int xodtemplate_duplicate_hostextinfo(xodtemplate_hostextinfo*, char*);
int xodtemplate_duplicate_serviceextinfo(
      xodtemplate_serviceextinfo*,
      char*);

int xodtemplate_recombobulate_contactgroups();
int xodtemplate_recombobulate_contactgroup_subgroups(
      xodtemplate_contactgroup*,
      char **);
int xodtemplate_recombobulate_object_contacts();
int xodtemplate_recombobulate_hostgroups();
int xodtemplate_recombobulate_hostgroup_subgroups(
      xodtemplate_hostgroup*,
      char **);
int xodtemplate_recombobulate_servicegroups();
int xodtemplate_recombobulate_servicegroup_subgroups(
      xodtemplate_servicegroup*,
      char **);

int xodtemplate_resolve_timeperiod(xodtemplate_timeperiod*);
int xodtemplate_resolve_command(xodtemplate_command*);
int xodtemplate_resolve_contactgroup(xodtemplate_contactgroup*);
int xodtemplate_resolve_hostgroup(xodtemplate_hostgroup*);
int xodtemplate_resolve_servicegroup(xodtemplate_servicegroup*);
int xodtemplate_resolve_servicedependency(xodtemplate_servicedependency*);
int xodtemplate_resolve_serviceescalation(xodtemplate_serviceescalation*);
int xodtemplate_resolve_contact(xodtemplate_contact*);
int xodtemplate_resolve_host(xodtemplate_host*);
int xodtemplate_resolve_service(xodtemplate_service*);
int xodtemplate_resolve_hostdependency(xodtemplate_hostdependency*);
int xodtemplate_resolve_hostescalation(xodtemplate_hostescalation*);
int xodtemplate_resolve_hostextinfo(xodtemplate_hostextinfo*);
int xodtemplate_resolve_serviceextinfo(xodtemplate_serviceextinfo*);

int xodtemplate_sort_timeperiods();
int xodtemplate_sort_commands();
int xodtemplate_sort_connectors();
int xodtemplate_sort_contactgroups();
int xodtemplate_sort_hostgroups();
int xodtemplate_sort_servicegroups();
int xodtemplate_sort_contacts();
int xodtemplate_sort_hosts();
int xodtemplate_sort_services();
int xodtemplate_sort_servicedependencies();
int xodtemplate_sort_serviceescalations();
int xodtemplate_sort_hostdependencies();
int xodtemplate_sort_hostescalations();

int xodtemplate_merge_extinfo_ojects();
int xodtemplate_merge_host_extinfo_object(
      xodtemplate_host*,
      xodtemplate_hostextinfo*);
int xodtemplate_merge_service_extinfo_object(
      xodtemplate_service*,
      xodtemplate_serviceextinfo*);

xodtemplate_timeperiod* xodtemplate_find_timeperiod(char*);
xodtemplate_command* xodtemplate_find_command(char*);
xodtemplate_connector* xodtemplate_find_connector(char*);
xodtemplate_contactgroup* xodtemplate_find_contactgroup(char*);
xodtemplate_contactgroup* xodtemplate_find_real_contactgroup(char*);
xodtemplate_hostgroup* xodtemplate_find_hostgroup(char*);
xodtemplate_hostgroup* xodtemplate_find_real_hostgroup(char*);
xodtemplate_servicegroup* xodtemplate_find_servicegroup(char*);
xodtemplate_servicegroup* xodtemplate_find_real_servicegroup(char*);
xodtemplate_servicedependency* xodtemplate_find_servicedependency(char*);
xodtemplate_serviceescalation* xodtemplate_find_serviceescalation(char*);
xodtemplate_contact* xodtemplate_find_contact(char*);
xodtemplate_contact* xodtemplate_find_real_contact(char*);
xodtemplate_host* xodtemplate_find_host(char*);
xodtemplate_host* xodtemplate_find_real_host(char*);
xodtemplate_service* xodtemplate_find_service(char*);
xodtemplate_service* xodtemplate_find_real_service(char*,char*);
xodtemplate_hostdependency* xodtemplate_find_hostdependency(char*);
xodtemplate_hostescalation* xodtemplate_find_hostescalation(char*);
xodtemplate_hostextinfo* xodtemplate_find_hostextinfo(char*);
xodtemplate_serviceextinfo* xodtemplate_find_serviceextinfo(char*);

int xodtemplate_get_inherited_string(int*, char**, int*, char **);
int xodtemplate_clean_additive_string(char **);

int xodtemplate_clean_additive_strings();

int xodtemplate_fill_timeperiod(xodtemplate_timeperiod*, timeperiod*);
int xodtemplate_register_timeperiod(xodtemplate_timeperiod*);
int xodtemplate_get_time_ranges(char*, unsigned long*, unsigned long*);

int xodtemplate_register_command(xodtemplate_command*);
int xodtemplate_register_connector(xodtemplate_connector *);
int xodtemplate_register_contactgroup(xodtemplate_contactgroup*);
int xodtemplate_register_hostgroup(xodtemplate_hostgroup*);
int xodtemplate_register_servicegroup(xodtemplate_servicegroup*);
int xodtemplate_register_servicedependency(xodtemplate_servicedependency*);
int xodtemplate_register_serviceescalation(xodtemplate_serviceescalation*);
int xodtemplate_register_contact(xodtemplate_contact*);
int xodtemplate_register_host(xodtemplate_host*);
int xodtemplate_register_service(xodtemplate_service*);
int xodtemplate_register_hostdependency(xodtemplate_hostdependency*);
int xodtemplate_register_hostescalation(xodtemplate_hostescalation*);


int xodtemplate_init_xobject_skiplists();
int xodtemplate_free_xobject_skiplists();

int xodtemplate_skiplist_compare_text(
      char const* val1a,
      char const* val1b,
      char const* val2a,
      char const* val2b);
int xodtemplate_skiplist_compare_host_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_service_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_connector_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_command_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_timeperiod_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_contact_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_contactgroup_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostgroup_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_servicegroup_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostdependency_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_servicedependency_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostescalation_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_serviceescalation_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostextinfo_template(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_serviceextinfo_template(
      void const* a,
      void const* b);

int xodtemplate_skiplist_compare_host(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_service(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_contact(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_contactgroup(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostgroup(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_servicegroup(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_command(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_connector(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_timeperiod(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostdependency(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_servicedependency(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_hostescalation(
      void const* a,
      void const* b);
int xodtemplate_skiplist_compare_serviceescalation(
      void const* a,
      void const* b);

#  ifdef __cplusplus
}
#  endif

#endif // !CCE_XODTEMPLATE_HH


