1// ServerQueryIterator.cpp
2
3#include "ServerQueryIterator.h"
4
5#include <new>
6
7// constructor
8ServerQueryIterator::ServerQueryIterator(Volume* volume)
9	: QueryIterator(volume),
10	  fRemoteCookie(-1),
11	  fShareVolumeIDs(NULL),
12	  fShareVolumeCount(0),
13	  fShareVolumeIndex(0)
14{
15}
16
17// destructor
18ServerQueryIterator::~ServerQueryIterator()
19{
20}
21
22// SetRemoteCookie
23void
24ServerQueryIterator::SetRemoteCookie(int32 cookie)
25{
26	fRemoteCookie = cookie;
27}
28
29// GetRemoteCookie
30int32
31ServerQueryIterator::GetRemoteCookie() const
32{
33	return fRemoteCookie;
34}
35
36// SetEntry
37status_t
38ServerQueryIterator::SetEntry(const int32* shareVolumeIDs,
39	int32 shareVolumeCount, const NodeInfo& dirInfo,
40	const EntryInfo& entryInfo)
41{
42	UnsetEntry();
43
44	if (!shareVolumeIDs || shareVolumeCount <= 0)
45		return B_BAD_VALUE;
46
47	// copy volume IDs
48	if (shareVolumeCount <= IN_OBJECT_ID_COUNT)
49		fShareVolumeIDs = fInObjectIDs;
50	else
51		fShareVolumeIDs = new(std::nothrow) int32[shareVolumeCount];
52	if (!fShareVolumeIDs)
53		return B_NO_MEMORY;
54	fShareVolumeCount = shareVolumeCount;
55	memcpy(fShareVolumeIDs, shareVolumeIDs, shareVolumeCount * 4);
56
57	// copy entry name
58	if (!fEntryName.SetTo(entryInfo.name.GetString())) {
59		UnsetEntry();
60		return B_NO_MEMORY;
61	}
62
63	fDirectoryInfo = dirInfo;
64	fEntryInfo = entryInfo;
65	fEntryInfo.name.SetTo(fEntryName.GetString());
66
67	return B_OK;
68}
69
70// UnsetEntry
71void
72ServerQueryIterator::UnsetEntry()
73{
74	if (fShareVolumeIDs && fShareVolumeIDs != fInObjectIDs)
75		delete[] fShareVolumeIDs;
76	fShareVolumeIDs = NULL;
77
78	fShareVolumeCount = 0;
79	fShareVolumeIndex = 0;
80	fEntryName.Unset();
81	fEntryInfo.name.SetTo(NULL);
82}
83
84// GetShareVolumeIDs
85const int32*
86ServerQueryIterator::GetShareVolumeIDs() const
87{
88	return fShareVolumeIDs;
89}
90
91// CountShareVolumes
92int32
93ServerQueryIterator::CountShareVolumes() const
94{
95	return fShareVolumeCount;
96}
97
98// GetDirectoryInfo
99const NodeInfo&
100ServerQueryIterator::GetDirectoryInfo() const
101{
102	return fDirectoryInfo;
103}
104
105// GetEntryInfo
106const EntryInfo&
107ServerQueryIterator::GetEntryInfo() const
108{
109	return fEntryInfo;
110}
111
112// HasNextShareVolumeID
113bool
114ServerQueryIterator::HasNextShareVolumeID() const
115{
116	return (fShareVolumeIDs && fShareVolumeIndex < fShareVolumeCount);
117}
118
119// NextShareVolumeID
120int32
121ServerQueryIterator::NextShareVolumeID()
122{
123	if (!fShareVolumeIDs || fShareVolumeIndex >= fShareVolumeCount)
124		return B_ENTRY_NOT_FOUND;
125
126	return fShareVolumeIDs[fShareVolumeIndex++];
127}
128