#include "ServerQueryIterator.h"
#include <new>
ServerQueryIterator::ServerQueryIterator(Volume* volume)
: QueryIterator(volume),
fRemoteCookie(-1),
fShareVolumeIDs(NULL),
fShareVolumeCount(0),
fShareVolumeIndex(0)
{
}
ServerQueryIterator::~ServerQueryIterator()
{
}
void
ServerQueryIterator::SetRemoteCookie(int32 cookie)
{
fRemoteCookie = cookie;
}
int32
ServerQueryIterator::GetRemoteCookie() const
{
return fRemoteCookie;
}
status_t
ServerQueryIterator::SetEntry(const int32* shareVolumeIDs,
int32 shareVolumeCount, const NodeInfo& dirInfo,
const EntryInfo& entryInfo)
{
UnsetEntry();
if (!shareVolumeIDs || shareVolumeCount <= 0)
return B_BAD_VALUE;
if (shareVolumeCount <= IN_OBJECT_ID_COUNT)
fShareVolumeIDs = fInObjectIDs;
else
fShareVolumeIDs = new(std::nothrow) int32[shareVolumeCount];
if (!fShareVolumeIDs)
return B_NO_MEMORY;
fShareVolumeCount = shareVolumeCount;
memcpy(fShareVolumeIDs, shareVolumeIDs, shareVolumeCount * 4);
if (!fEntryName.SetTo(entryInfo.name.GetString())) {
UnsetEntry();
return B_NO_MEMORY;
}
fDirectoryInfo = dirInfo;
fEntryInfo = entryInfo;
fEntryInfo.name.SetTo(fEntryName.GetString());
return B_OK;
}
void
ServerQueryIterator::UnsetEntry()
{
if (fShareVolumeIDs && fShareVolumeIDs != fInObjectIDs)
delete[] fShareVolumeIDs;
fShareVolumeIDs = NULL;
fShareVolumeCount = 0;
fShareVolumeIndex = 0;
fEntryName.Unset();
fEntryInfo.name.SetTo(NULL);
}
const int32*
ServerQueryIterator::GetShareVolumeIDs() const
{
return fShareVolumeIDs;
}
int32
ServerQueryIterator::CountShareVolumes() const
{
return fShareVolumeCount;
}
const NodeInfo&
ServerQueryIterator::GetDirectoryInfo() const
{
return fDirectoryInfo;
}
const EntryInfo&
ServerQueryIterator::GetEntryInfo() const
{
return fEntryInfo;
}
bool
ServerQueryIterator::HasNextShareVolumeID() const
{
return (fShareVolumeIDs && fShareVolumeIndex < fShareVolumeCount);
}
int32
ServerQueryIterator::NextShareVolumeID()
{
if (!fShareVolumeIDs || fShareVolumeIndex >= fShareVolumeCount)
return B_ENTRY_NOT_FOUND;
return fShareVolumeIDs[fShareVolumeIndex++];
}