//----------------------------------------------------------------------------
//
//  Copyright (C) Red Hat, Inc., 2015.
//
//  File:       WsmanFilter.cpp
//
//  License:    BSD-3-Clause
//
//  Contents:   A C++ interface for filter_t
//
//----------------------------------------------------------------------------

#include "WsmanEPR.h"

using namespace WsmanClientNamespace;

WsmanEPR::WsmanEPR(const string &eprstring)
	: epr(epr_from_string(eprstring.c_str()))
{
}

WsmanEPR::WsmanEPR(const string &uri, const string &address)
	: epr(epr_create(uri.c_str(), NULL, address.c_str()))
{
}

WsmanEPR::WsmanEPR(WsmanEPR &epr)
	: epr(epr_copy(epr.getepr()))
{
}

WsmanEPR& WsmanEPR::operator=(const WsmanEPR &other)
{
	epr = epr_copy(other.getepr());
	return *this;
}

WsmanEPR::~WsmanEPR()
{
	if (epr) {
		epr_destroy(epr);
		epr = NULL;
	}
}

int WsmanEPR::addTextSelector(const string &name, const string &value)
{
	return epr_add_selector_text(epr, name.c_str(), value.c_str());
}

int WsmanEPR::addEprSelector(const string &name, WsmanEPR &epr)
{
	return epr_add_selector_epr(epr, name.c_str(), epr.getepr());
}

int WsmanEPR::deleteSelector(const string &name)
{
	return epr_delete_selector(epr, name.c_str());
}

bool WsmanEPR::operator==(const WsmanEPR &rhs) const
{
	return epr_cmp(epr, rhs.epr) == 0;
}

bool WsmanEPR::operator!=(const WsmanEPR &rhs) const
{
	return !(*this == rhs);
}

epr_t *WsmanEPR::getepr() const
{
	return epr;
}

WsmanEPR::operator epr_t*() const
{
	return getepr();
}
