⛏️ index : haiku.git

/*
 * Copyright 2016-2017, Rene Gollent, rene@gollent.com.
 * Distributed under the terms of the MIT License.
 */
#include "NetworkTargetHostInterfaceInfo.h"

#include <AutoDeleter.h>

#include "NetworkTargetHostInterface.h"
#include "SettingsDescription.h"
#include "Settings.h"
#include "Setting.h"


static const char* kHostnameSetting = "hostname";
static const char* kPortSetting = "port";


NetworkTargetHostInterfaceInfo::NetworkTargetHostInterfaceInfo()
	:
	TargetHostInterfaceInfo("Network"),
	fDescription(NULL)
{
}


NetworkTargetHostInterfaceInfo::~NetworkTargetHostInterfaceInfo()
{
	if (fDescription != NULL)
		fDescription->ReleaseReference();
}


status_t
NetworkTargetHostInterfaceInfo::Init()
{
	fDescription = new(std::nothrow) SettingsDescription;
	if (fDescription == NULL)
		return B_NO_MEMORY;

	Setting* setting = new(std::nothrow) StringSettingImpl(kHostnameSetting,
		"Hostname", "");
	BReference<Setting> settingsReference(setting, true);
	if (setting == NULL)
		return B_NO_MEMORY;
	if (!fDescription->AddSetting(setting))
		return B_NO_MEMORY;

	setting = new(std::nothrow) BoundedSettingImpl(kPortSetting, "Port",
		(uint16)1, (uint16)65535, (uint16)8305);
	if (setting == NULL)
		return B_NO_MEMORY;

	settingsReference.SetTo(setting, true);
	if (!fDescription->AddSetting(setting))
		return B_NO_MEMORY;

	return B_OK;
}


bool
NetworkTargetHostInterfaceInfo::IsLocal() const
{
	return false;
}


bool
NetworkTargetHostInterfaceInfo::IsConfigured(Settings* settings) const
{
	BVariant hostSetting = settings->Value(kHostnameSetting);
	BVariant portSetting = settings->Value(kPortSetting);

	if (hostSetting.Type() != B_STRING_TYPE || !portSetting.IsNumber())
		return false;

	if (strlen(hostSetting.ToString()) == 0)
		return false;

	return true;
}


SettingsDescription*
NetworkTargetHostInterfaceInfo::GetSettingsDescription() const
{
	return fDescription;
}


status_t
NetworkTargetHostInterfaceInfo::CreateInterface(Settings* settings,
	TargetHostInterface*& _interface) const
{
	NetworkTargetHostInterface* interface
		= new(std::nothrow) NetworkTargetHostInterface;
	if (interface == NULL)
		return B_NO_MEMORY;

	status_t error = interface->Init(settings);
	if (error != B_OK) {
		delete interface;
		return error;
	}

	_interface = interface;
	return B_OK;
}