124113Skato// ShareNode.cpp
240003Skato
324113Skato#include "ShareNode.h"
424113Skato
524113Skato#include "ShareAttrDir.h"
624113Skato
724113Skato// constructor
824113SkatoShareDirEntry::ShareDirEntry(ShareDir* directory, const char* name,
924113Skato	ShareNode* node)
1024113Skato	:
1124113Skato	BReferenceable(),
1224113Skato	fDirectory(directory),
1324113Skato	fName(name),
1424113Skato	fNode(node),
1524113Skato	fRevision(-1)
1624113Skato{
1724113Skato}
1824113Skato
1924113Skato// destructor
2024113SkatoShareDirEntry::~ShareDirEntry()
2124113Skato{
2224113Skato}
2324113Skato
2424113Skato// InitCheck
2524113Skatostatus_t
2624113SkatoShareDirEntry::InitCheck() const
2724113Skato{
2824113Skato	if (fName.GetLength() == 0)
2950477Speter		return B_NO_MEMORY;
3024113Skato
3124113Skato	return B_OK;
3224113Skato}
3324113Skato
3424113Skato// GetDirectory
3524113SkatoShareDir*
3624113SkatoShareDirEntry::GetDirectory() const
3779609Speter{
3824113Skato	return fDirectory;
3924113Skato}
4024113Skato
4124113Skato// GetName
4224113Skatoconst char*
4324113SkatoShareDirEntry::GetName() const
4440003Skato{
4540003Skato	return fName.GetString();
4640003Skato}
4742112Smsmith
4840003Skato// GetNode
4940003SkatoShareNode*
5024113SkatoShareDirEntry::GetNode() const
5124113Skato{
5224113Skato	return fNode;
5324113Skato}
5425159Skato
5524113Skato// SetRevision
5624113Skatovoid
5724113SkatoShareDirEntry::SetRevision(int64 revision)
5824113Skato{
5924113Skato	fRevision = revision;
6024113Skato}
6127654Skato
6226298Skato// GetRevision
6336094Skatoint64
6461616SkatoShareDirEntry::GetRevision() const
6579623Speter{
6626298Skato	return fRevision;
6726298Skato}
6879609Speter
6979609Speter// IsActualEntry
7079609Speterbool
7179609SpeterShareDirEntry::IsActualEntry() const
7279609Speter{
7324113Skato	return (fName.GetLength() > 0 && fName != "." && fName != "..");
7424113Skato}
7524113Skato
7624113Skato
7724113Skato// #pragma mark -
7824113Skato
7924113Skato// constructor
8024113SkatoShareNode::ShareNode(Volume* volume, vnode_id id, const NodeInfo* nodeInfo)
8124113Skato	:
8224113Skato	Node(volume, id),
8324113Skato	fInfo(),
8424113Skato	fReferringEntries(),
8524113Skato	fAttrDir(NULL)
8624113Skato{
8724113Skato	if (nodeInfo) {
8824113Skato		fInfo = *nodeInfo;
8924113Skato	} else {
9024113Skato		// init the stat data at least a bit, if no node info is given
9124113Skato		fInfo.st.st_dev = -1;
9224113Skato		fInfo.st.st_ino = -1;
9324113Skato		fInfo.st.st_mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP
9424113Skato			| S_IROTH | S_IXOTH;
9524113Skato		fInfo.st.st_nlink = 1;
9624113Skato		fInfo.st.st_size = 1;
9724113Skato		fInfo.st.st_blksize = 1024;
9824113Skato		fInfo.st.st_crtime = 0;
9924113Skato		fInfo.st.st_ctime = fInfo.st.st_mtime = fInfo.st.st_atime
10024113Skato			= fInfo.st.st_crtime;
10124113Skato
10224113Skato		// negative revision, to make sure it is updated
10324113Skato		fInfo.revision = -1;
10424113Skato	}
10524113Skato}
10624113Skato
10724113Skato// destructor
10824113SkatoShareNode::~ShareNode()
10924113Skato{
11024113Skato	delete fAttrDir;
11124113Skato}
11225159Skato
11324113Skato// GetNodeInfo
11424113Skatoconst NodeInfo&
11524113SkatoShareNode::GetNodeInfo() const
11624113Skato{
11724113Skato	return fInfo;
11824113Skato}
11924113Skato
12024113Skato// GetRemoteID
12124113SkatoNodeID
12224113SkatoShareNode::GetRemoteID() const
12324113Skato{
12424113Skato	return fInfo.GetID();
12524113Skato}
12624113Skato
12724113Skato// Update
12824113Skatovoid
12924113SkatoShareNode::Update(const NodeInfo& nodeInfo)
13024113Skato{
13124113Skato	if (fInfo.revision < nodeInfo.revision)
13224113Skato		fInfo = nodeInfo;
13324113Skato}
13424113Skato
13524113Skato// AddReferringEntry
13626985Skatovoid
13726985SkatoShareNode::AddReferringEntry(ShareDirEntry* entry)
13826985Skato{
13924113Skato	if (entry)
14024113Skato		fReferringEntries.Insert(entry);
14124113Skato}
14224113Skato
14324113Skato// RemoveReferringEntry
14424113Skatovoid
14524113SkatoShareNode::RemoveReferringEntry(ShareDirEntry* entry)
14624113Skato{
14724113Skato	if (entry)
14824113Skato		fReferringEntries.Remove(entry);
14924113Skato}
15024113Skato
15124113Skato// GetFirstReferringEntry
15224113SkatoShareDirEntry*
15324113SkatoShareNode::GetFirstReferringEntry() const
15424113Skato{
15524113Skato	return fReferringEntries.GetFirst();
15624113Skato}
15724113Skato
15825159Skato// GetNextReferringEntry
15925159SkatoShareDirEntry*
16025159SkatoShareNode::GetNextReferringEntry(ShareDirEntry* entry) const
16125159Skato{
16225159Skato	return (entry ? fReferringEntries.GetNext(entry) : NULL);
16325159Skato}
16425159Skato
16525159Skato// GetActualReferringEntry
16625159SkatoShareDirEntry*
16725159SkatoShareNode::GetActualReferringEntry() const
16825159Skato{
16925159Skato	for (ShareDirEntry* entry = GetFirstReferringEntry();
17025159Skato		 entry;
17132199Skato		 entry = GetNextReferringEntry(entry)) {
17232199Skato		if (entry->IsActualEntry())
17325159Skato			return entry;
17465273Skato	}
17565273Skato
17665273Skato	return NULL;
17765273Skato}
17865273Skato
17965273Skato// SetAttrDir
18065273Skatovoid
18165273SkatoShareNode::SetAttrDir(ShareAttrDir* attrDir)
18265273Skato{
18325159Skato	delete fAttrDir;
18425159Skato	fAttrDir = attrDir;
18525159Skato}
18625159Skato
18725159Skato// GetAttrDir
18825159SkatoShareAttrDir*
18924113SkatoShareNode::GetAttrDir() const
19024113Skato{
19124113Skato	return fAttrDir;
19224113Skato}
19324113Skato
19424113Skato
19524113Skato// #pragma mark -
19624113Skato
19724113Skato// constructor
19824113SkatoShareDirIterator::ShareDirIterator()
19924113Skato{
20024113Skato}
20124113Skato
20224113Skato// destructor
20324113SkatoShareDirIterator::~ShareDirIterator()
20424113Skato{
20524113Skato}
20624113Skato
20724113Skato
20824113Skato// #pragma mark -
20924113Skato
21024113Skato// constructor
21124113SkatoLocalShareDirIterator::LocalShareDirIterator()
21224113Skato	: fDirectory(NULL),
21324113Skato	  fCurrentEntry(NULL)
21424113Skato{
21524113Skato}
21624113Skato
21724113Skato// destructor
21824113SkatoLocalShareDirIterator::~LocalShareDirIterator()
21924113Skato{
22024113Skato	SetDirectory(NULL);
22124113Skato}
22224113Skato
22324113Skato// SetDirectory
22424113Skatovoid
22524113SkatoLocalShareDirIterator::SetDirectory(ShareDir* directory)
22624113Skato{
22724113Skato	// unset the old directory
22824113Skato	if (fDirectory)
22924113Skato		fDirectory->RemoveDirIterator(this);
23024113Skato
23124113Skato	// set the new directory
23224113Skato	fDirectory = directory;
23324113Skato	if (fDirectory) {
23424113Skato		fDirectory->AddDirIterator(this);
23524113Skato		fCurrentEntry = fDirectory->GetFirstEntry();
23624113Skato	}
23724113Skato}
23824113Skato
23924113Skato// GetCurrentEntry
24024113SkatoShareDirEntry*
24124113SkatoLocalShareDirIterator::GetCurrentEntry() const
24224113Skato{
24324113Skato	return fCurrentEntry;
24424113Skato}
24524113Skato
24624113Skato// NextEntry
24724113Skatovoid
24824113SkatoLocalShareDirIterator::NextEntry()
24924113Skato{
25024113Skato	if (!fDirectory || !fCurrentEntry)
25124113Skato		return;
25224113Skato
25324113Skato	fCurrentEntry = fDirectory->GetNextEntry(fCurrentEntry);
25424113Skato}
25524113Skato
25624113Skato// Rewind
25724113Skatovoid
25824113SkatoLocalShareDirIterator::Rewind()
25924113Skato{
26024113Skato	fCurrentEntry = (fDirectory ? fDirectory->GetFirstEntry() : NULL);
26124113Skato}
26224113Skato
26324113Skato// IsDone
26424113Skatobool
26524113SkatoLocalShareDirIterator::IsDone() const
26624113Skato{
26724113Skato	return !fCurrentEntry;
26824113Skato}
26924113Skato
27024113Skato
27124113Skato// #pragma mark -
27224113Skato
27324113Skato// constructor
27424113SkatoRemoteShareDirIterator::RemoteShareDirIterator()
27524113Skato	: fCookie(-1),
27624113Skato	  fCapacity(kRemoteShareDirIteratorCapacity),
27724113Skato	  fCount(0),
27824113Skato	  fIndex(0),
27924113Skato	  fRevision(-1),
28024113Skato	  fDone(false),
28124113Skato	  fRewind(false)
28224113Skato{
28324113Skato}
28424113Skato
28524113Skato// destructor
28624113SkatoRemoteShareDirIterator::~RemoteShareDirIterator()
28724113Skato{
28824113Skato	Clear();
28924113Skato}
29024113Skato
29124113Skato// GetCurrentEntry
29224113SkatoShareDirEntry*
29324113SkatoRemoteShareDirIterator::GetCurrentEntry() const
29424113Skato{
29524113Skato	return (!fRewind && fIndex < fCount ? fEntries[fIndex] : NULL);
29624113Skato}
29724113Skato
29824113Skato// NextEntry
29924113Skatovoid
30024113SkatoRemoteShareDirIterator::NextEntry()
30124113Skato{
30224113Skato	if (fIndex < fCount)
30324113Skato		fIndex++;
30424113Skato}
30524113Skato
30624200Skato// Rewind
30724113Skatovoid
30824113SkatoRemoteShareDirIterator::Rewind()
30924113Skato{
31024113Skato	fRewind = true;
31124113Skato	fDone = false;
31224113Skato}
31324113Skato
31424113Skato// IsDone
31524113Skatobool
31624113SkatoRemoteShareDirIterator::IsDone() const
31724113Skato{
31824113Skato	return fDone;
31924113Skato}
32024113Skato
32124113Skato// GetCapacity
32224113Skatoint32
32324113SkatoRemoteShareDirIterator::GetCapacity() const
32424113Skato{
32524113Skato	return fCapacity;
32624113Skato}
32724113Skato
32824113Skato// SetCookie
32924113Skatovoid
33030162SkatoRemoteShareDirIterator::SetCookie(int32 cookie)
33130162Skato{
33231338Sjlemon	fCookie = cookie;
33330162Skato}
33431338Sjlemon
33530162Skato// GetCookie
33630162Skatoint32
33724113SkatoRemoteShareDirIterator::GetCookie() const
33824113Skato{
33924113Skato	return fCookie;
34024113Skato}
34124113Skato
34224113Skato// Clear
34324113Skatovoid
34424113SkatoRemoteShareDirIterator::Clear()
34524113Skato{
34624113Skato	for (int32 i = 0; i < fCount; i++)
34724113Skato		fEntries[i]->ReleaseReference();
34824113Skato	fCount = 0;
34924113Skato	fIndex = 0;
35024113Skato	fDone = false;
35124113Skato	fRewind = false;
35224113Skato}
35324113Skato
35424113Skato// AddEntry
35524113Skatobool
35624113SkatoRemoteShareDirIterator::AddEntry(ShareDirEntry* entry)
35730162Skato{
35830162Skato	if (!entry || fCount >= fCapacity)
35930162Skato		return false;
36030162Skato
36130162Skato	fEntries[fCount++] = entry;
36224113Skato	entry->AcquireReference();
36324113Skato	return true;
36424113Skato}
36524113Skato
36624113Skato// SetRevision
36724113Skatovoid
36824113SkatoRemoteShareDirIterator::SetRevision(int64 revision)
36924113Skato{
37024113Skato	fRevision = revision;
37124113Skato}
37224113Skato
37324113Skato// GetRevision
37424113Skatoint64
37524113SkatoRemoteShareDirIterator::GetRevision() const
37624113Skato{
37724113Skato	return fRevision;
37824113Skato}
37924113Skato
38024113Skato// SetDone
38124113Skatovoid
38224113SkatoRemoteShareDirIterator::SetDone(bool done)
38324113Skato{
38424113Skato	fDone = done;
38524113Skato}
38624113Skato
38724113Skato// GetRewind
38824113Skatobool
38924113SkatoRemoteShareDirIterator::GetRewind() const
39027654Skato{
39126298Skato	return fRewind;
39226298Skato}
39326298Skato
39426298Skato
39526298Skato// #pragma mark -
39626298Skato
39726298Skato// constructor
39826298SkatoShareDir::ShareDir(Volume* volume, vnode_id id, const NodeInfo* nodeInfo)
39926298Skato	: ShareNode(volume, id, nodeInfo),
40026298Skato	  fEntries(),
40126298Skato	  fIterators(),
40226298Skato	  fEntryCreatedEventRevision(-1),
40326298Skato	  fEntryRemovedEventRevision(-1),
40426298Skato	  fIsComplete(false)
40526298Skato{
40626298Skato}
40726298Skato
40826298Skato// destructor
40926298SkatoShareDir::~ShareDir()
41026298Skato{
41130162Skato}
41230162Skato
41331338Sjlemon// UpdateEntryCreatedEventRevision
41430162Skatovoid
41531338SjlemonShareDir::UpdateEntryCreatedEventRevision(int64 revision)
41630162Skato{
41730162Skato	if (revision > fEntryCreatedEventRevision)
41826298Skato		fEntryCreatedEventRevision = revision;
41926298Skato}
42026298Skato
42126298Skato// GetEntryCreatedEventRevision
42226298Skatoint64
42326298SkatoShareDir::GetEntryCreatedEventRevision() const
42426298Skato{
42526298Skato	return fEntryCreatedEventRevision;
42626298Skato}
42726298Skato
42826298Skato// UpdateEntryRemovedEventRevision
42926298Skatovoid
43026298SkatoShareDir::UpdateEntryRemovedEventRevision(int64 revision)
43126298Skato{
43226298Skato	if (revision > fEntryRemovedEventRevision)
43326298Skato		fEntryRemovedEventRevision = revision;
43426298Skato}
43526298Skato
43626298Skato// GetEntryRemovedEventRevision
43730162Skatoint64
43830162SkatoShareDir::GetEntryRemovedEventRevision() const
43930162Skato{
44030162Skato	return fEntryRemovedEventRevision;
44130162Skato}
44226298Skato
44326298Skato// SetComplete
44426298Skatovoid
44526298SkatoShareDir::SetComplete(bool complete)
44626298Skato{
44726298Skato	fIsComplete = complete;
44826298Skato}
44926298Skato
45026298Skato// IsComplete
45126298Skatobool
45226298SkatoShareDir::IsComplete() const
45326298Skato{
45426298Skato	return fIsComplete;
45536094Skato}
45636094Skato
45736094Skato// AddEntry
45836094Skatovoid
45936094SkatoShareDir::AddEntry(ShareDirEntry* entry)
46040003Skato{
46136094Skato	if (entry)
46236094Skato		fEntries.Insert(entry);
46336094Skato}
46436094Skato
46536094Skato// RemoveEntry
46636094Skatovoid
46736094SkatoShareDir::RemoveEntry(ShareDirEntry* entry)
46836094Skato{
46936094Skato	if (entry) {
47061616Skato		// update the directory iterators pointing to the removed entry
47161616Skato		for (LocalShareDirIterator* iterator = fIterators.First();
47261616Skato			 iterator;
47361616Skato			 iterator = fIterators.GetNext(iterator)) {
47461616Skato			if (iterator->GetCurrentEntry() == entry)
47561616Skato				iterator->NextEntry();
47661616Skato		}
47761616Skato
47861616Skato		fEntries.Remove(entry);
47961616Skato	}
48061616Skato}
48161616Skato
48261616Skato// GetFirstEntry
48361616SkatoShareDirEntry*
48461616SkatoShareDir::GetFirstEntry() const
48561616Skato{
48661616Skato	return fEntries.First();
48761616Skato}
48861616Skato
48961616Skato// GetNextEntry
49061616SkatoShareDirEntry*
49161616SkatoShareDir::GetNextEntry(ShareDirEntry* entry) const
49261616Skato{
49361616Skato	if (!entry)
49461616Skato		return NULL;
49561616Skato
49661616Skato	return fEntries.GetNext(entry);
49761616Skato}
49861616Skato
49961616Skato// AddDirIterator
50061616Skatovoid
50161616SkatoShareDir::AddDirIterator(LocalShareDirIterator* iterator)
50261616Skato{
50361616Skato	if (!iterator)
50461616Skato		return;
50561616Skato
50661616Skato	fIterators.Insert(iterator);
50761616Skato}
50861616Skato
50961616Skato// RemoveDirIterator
51061616Skatovoid
51179609SpeterShareDir::RemoveDirIterator(LocalShareDirIterator* iterator)
51279609Speter{
51379609Speter	if (!iterator)
51479609Speter		return;
51579609Speter
51679609Speter	fIterators.Remove(iterator);
51779609Speter}
51879609Speter
51979609Speter