/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program 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 Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/
#ifndef ZABBIX_VMWARE_SHMEM_H
#define ZABBIX_VMWARE_SHMEM_H

#include "zbxvmware.h"
#include "vmware_internal.h"

#include "zbxshmem.h"
#include "zbxalgo.h"

zbx_shmem_info_t	*vmware_shmem_get_vmware_mem(void);
void	vmware_shmem_set_vmware_mem_NULL(void);
#if defined(HAVE_LIBXML2) && defined(HAVE_LIBCURL)

#define VMWARE_SHMEM_VECTOR_CREATE_DECL(ref,type) void	vmware_shmem_vector_##type##_create_ext(ref);

VMWARE_SHMEM_VECTOR_CREATE_DECL(zbx_vector_str_t*, str)
VMWARE_SHMEM_VECTOR_CREATE_DECL(zbx_vector_vmware_entity_tags_ptr_t*, vmware_entity_tags_ptr)
VMWARE_SHMEM_VECTOR_CREATE_DECL(zbx_vector_custquery_param_t*, custquery_param)
VMWARE_SHMEM_VECTOR_CREATE_DECL(zbx_vector_vmware_tag_ptr_t*, vmware_tag_ptr)
VMWARE_SHMEM_VECTOR_CREATE_DECL(zbx_vector_vmware_perf_counter_ptr_t*, vmware_perf_counter_ptr)

void	vmware_shmem_perf_counter_free(zbx_vmware_perf_counter_t *counter);
void	vmware_perf_counters_add_new(zbx_vector_vmware_perf_counter_ptr_t *counters, zbx_uint64_t counterid,
		unsigned char state);
void	vmware_perf_counters_vector_ptr_create_ext(zbx_vmware_perf_entity_t *pentity);
void	vmware_shmem_diskextent_free(zbx_vmware_diskextent_t *diskextent);
void	vmware_shmem_free_datastore(zbx_vmware_datastore_t *datastore);
void	vmware_shmem_datacenter_free(zbx_vmware_datacenter_t *datacenter);
void	vmware_shmem_resourcepool_free(zbx_vmware_resourcepool_t *resourcepool);
void	vmware_shmem_dvswitch_free(zbx_vmware_dvswitch_t *dvswitch);
void	vmware_shmem_props_free(char **props, int props_num);
void	vmware_shmem_dev_free(zbx_vmware_dev_t *dev);
void	vmware_shmem_fs_free(zbx_vmware_fs_t *fs);
void	vmware_shmem_custom_attr_free(zbx_vmware_custom_attr_t *custom_attr);
void	vmware_shmem_vm_free(zbx_vmware_vm_t *vm);
void	vmware_shmem_dsname_free(zbx_vmware_dsname_t *dsname);
void	vmware_shmem_pnic_free(zbx_vmware_pnic_t *nic);
void	vmware_shmem_alarm_free(zbx_vmware_alarm_t *alarm);
void	vmware_shmem_diskinfo_free(zbx_vmware_diskinfo_t *di);
void	vmware_shmem_cluster_free(zbx_vmware_cluster_t *cluster);
void	vmware_shmem_event_free(zbx_vmware_event_t *event);
void	vmware_shmem_data_free(zbx_vmware_data_t *data);
void	vmware_shmem_eventlog_data_free(zbx_vmware_eventlog_data_t *data_eventlog);
void	vmware_shmem_cust_query_clean(zbx_vmware_cust_query_t *cust_query);
void	vmware_shared_tag_free(zbx_vmware_tag_t *value);
void	vmware_shared_entity_tags_free(zbx_vmware_entity_tags_t *value);
void	vmware_shmem_service_free(zbx_vmware_service_t *service);
void	vmware_shmem_evtseverity_copy(zbx_hashset_t *dst, const zbx_vector_vmware_key_value_t *src);
void	zbx_shmem_vmware_key_value_free(zbx_vmware_key_value_t *value);

int		vmware_strpool_compare_func(const void *d1, const void *d2);
zbx_hash_t	vmware_strpool_hash_func(const void *data);

zbx_vmware_event_t			*vmware_shmem_event_dup(const zbx_vmware_event_t *src);
zbx_vmware_diskextent_t			*vmware_shmem_diskextent_dup(const zbx_vmware_diskextent_t *src);
zbx_vmware_resourcepool_t		*vmware_shmem_resourcepool_dup(const zbx_vmware_resourcepool_t *src);
zbx_vmware_dvswitch_t			*vmware_shmem_dvswitch_dup(const zbx_vmware_dvswitch_t *src);
zbx_vmware_fs_t				*vmware_shmem_fs_dup(const zbx_vmware_fs_t *src);
zbx_vmware_custom_attr_t		*vmware_shmem_attr_dup(const zbx_vmware_custom_attr_t *src);
zbx_vmware_dev_t			*vmware_shmem_dev_dup(const zbx_vmware_dev_t *src);
zbx_vmware_vm_t				*vmware_shmem_vm_dup(const zbx_vmware_vm_t *src);
zbx_vmware_data_t			*vmware_shmem_data_dup(zbx_vmware_data_t *src);
zbx_vmware_eventlog_data_t		*vmware_shmem_eventlog_data_dup(zbx_vmware_eventlog_data_t *src);
zbx_vmware_service_t			*vmware_shmem_vmware_service_malloc(void);
void					vmware_shmem_service_hashset_create(zbx_vmware_service_t *service);
zbx_vector_custquery_param_t		*vmware_shmem_custquery_malloc(void);
zbx_vmware_job_t			*vmware_shmem_vmware_job_malloc(void);
void					vmware_shmem_vmware_job_free(zbx_vmware_job_t *job);
zbx_vmware_entity_tags_t		*vmware_shmem_entity_tags_malloc(void);
zbx_vmware_tag_t			*vmware_shmem_tag_malloc(void);
#endif	/* defined(HAVE_LIBXML2) && defined(HAVE_LIBCURL) */
int					vmware_shmem_init(zbx_uint64_t *config_vmware_cache_size, zbx_vmware_t **vmware,
							char **error);

#endif	/* ZABBIX_VMWARE_SHMEM_H */