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