⛏️ index : haiku.git

// ExtendedServerInfo.cpp

#include "ExtendedServerInfo.h"
#include "ServerInfo.h"

// constructor
ExtendedShareInfo::ExtendedShareInfo()
	:
	BReferenceable(),
	fShareName()
{
}

// SetTo
status_t
ExtendedShareInfo::SetTo(const ShareInfo* shareInfo)
{
	if (!shareInfo)
		return B_BAD_VALUE;
	if (!fShareName.SetTo(shareInfo->GetShareName()))
		return B_NO_MEMORY;
	return B_OK;
}

// GetShareName
const char*
ExtendedShareInfo::GetShareName() const
{
	return fShareName.GetString();
}


// #pragma mark -

// constructor
ExtendedServerInfo::ExtendedServerInfo(const NetAddress& address)
	:
	BReferenceable(),
	fAddress(address),
	fState(0)
{
}

// destructor
ExtendedServerInfo::~ExtendedServerInfo()
{
	int32 count = CountShares();
	for (int32 i = 0; i < count; i++)
		ShareInfoAt(i)->ReleaseReference();
}

// GetAddress
const NetAddress&
ExtendedServerInfo::GetAddress() const
{
	return fAddress;
}

// GetServerName
const char*
ExtendedServerInfo::GetServerName() const
{
	return fServerName.GetString();
}

// GetConnectionMethod
const char*
ExtendedServerInfo::GetConnectionMethod() const
{
	return fConnectionMethod.GetString();
}

// CountShares
int32
ExtendedServerInfo::CountShares() const
{
	return fShareInfos.Count();
}

// ShareInfoAt
ExtendedShareInfo*
ExtendedServerInfo::ShareInfoAt(int32 index) const
{
	if (index < 0 || index >= fShareInfos.Count())
		return NULL;
	return fShareInfos.ElementAt(index);
}

// GetShareInfo
ExtendedShareInfo*
ExtendedServerInfo::GetShareInfo(const char* name)
{
	for (int32 i = 0; ExtendedShareInfo* shareInfo = ShareInfoAt(i); i++) {
		if (strcmp(shareInfo->GetShareName(), name) == 0)
			return shareInfo;
	}

	return NULL;
}

// SetTo
status_t
ExtendedServerInfo::SetTo(ServerInfo* serverInfo)
{
	if (!serverInfo)
		return B_BAD_VALUE;
	// set name and connection method
	const char* name = serverInfo->GetServerName();
	HashString addressString;
	if (!name || strlen(name) == 0) {
		status_t error = fAddress.GetString(&addressString, false);
		if (error != B_OK)
			return error;
		name = addressString.GetString();
	}
	if (!fServerName.SetTo(name)
		|| !fConnectionMethod.SetTo(serverInfo->GetConnectionMethod())) {
		return B_NO_MEMORY;
	}
	// add the shares
	int32 shareCount = serverInfo->CountShares();
	for (int32 i = 0; i < shareCount; i++) {
		const ShareInfo& shareInfo = serverInfo->ShareInfoAt(i);
		status_t error = _AddShare(&shareInfo);
		if (error != B_OK)
			return error;
	}
	return B_OK;
}

// SetState
void
ExtendedServerInfo::SetState(uint32 state)
{
	fState = state;
}

// GetState
uint32
ExtendedServerInfo::GetState() const
{
	return fState;
}

// _AddShare
status_t
ExtendedServerInfo::_AddShare(const ShareInfo* info)
{
	ExtendedShareInfo* extendedInfo = new(std::nothrow) ExtendedShareInfo;
	if (!extendedInfo)
		return B_NO_MEMORY;
	status_t error = extendedInfo->SetTo(info);
	if (error != B_OK) {
		delete extendedInfo;
		return error;
	}
	error = fShareInfos.PushBack(extendedInfo);
	if (error != B_OK) {
		delete extendedInfo;
		return error;
	}
	return B_OK;
}