root/src/add-ons/kernel/file_systems/netfs/client/ExtendedServerInfo.cpp
// 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;
}