15a1d355fSStephan Aßmus// NodeHandle.cpp
25a1d355fSStephan Aßmus
35a1d355fSStephan Aßmus#include "NodeHandle.h"
45a1d355fSStephan Aßmus
55a1d355fSStephan Aßmus#include <errno.h>
65a1d355fSStephan Aßmus#include <fcntl.h>
75a1d355fSStephan Aßmus#include <string.h>
85a1d355fSStephan Aßmus#include <unistd.h>
95a1d355fSStephan Aßmus#include <sys/stat.h>
105a1d355fSStephan Aßmus
115a1d355fSStephan Aßmus#include <fs_attr.h>
125a1d355fSStephan Aßmus
135a1d355fSStephan Aßmus#include "Compatibility.h"
145a1d355fSStephan Aßmus#include "Directory.h"
155a1d355fSStephan Aßmus#include "FDManager.h"
165a1d355fSStephan Aßmus#include "Path.h"
175a1d355fSStephan Aßmus
185a1d355fSStephan Aßmus// TODO: Do the FD creation via the FDManager.
195a1d355fSStephan Aßmus
205a1d355fSStephan Aßmus// NodeHandle
215a1d355fSStephan Aßmus
225a1d355fSStephan Aßmus// constructor
235a1d355fSStephan AßmusNodeHandle::NodeHandle()
2488e38c17SIngo Weinhold	: BReferenceable(),
255a1d355fSStephan Aßmus	  Lockable(),
265a1d355fSStephan Aßmus	  fCookie(-1),
275a1d355fSStephan Aßmus	  fNodeRef()
285a1d355fSStephan Aßmus{
295a1d355fSStephan Aßmus}
305a1d355fSStephan Aßmus
315a1d355fSStephan Aßmus// destructor
325a1d355fSStephan AßmusNodeHandle::~NodeHandle()
335a1d355fSStephan Aßmus{
345a1d355fSStephan Aßmus}
355a1d355fSStephan Aßmus
365a1d355fSStephan Aßmus// GetStat
375a1d355fSStephan Aßmusstatus_t
385a1d355fSStephan AßmusNodeHandle::GetStat(struct stat* st)
395a1d355fSStephan Aßmus{
405a1d355fSStephan Aßmus	int fd = GetFD();
415a1d355fSStephan Aßmus	if (fd < 0)
425a1d355fSStephan Aßmus		return B_ENTRY_NOT_FOUND;
435a1d355fSStephan Aßmus
445a1d355fSStephan Aßmus	if (fstat(fd, st) < 0)
455a1d355fSStephan Aßmus		return errno;
465a1d355fSStephan Aßmus
475a1d355fSStephan Aßmus	return B_OK;
485a1d355fSStephan Aßmus}
495a1d355fSStephan Aßmus
505a1d355fSStephan Aßmus// SetCookie
515a1d355fSStephan Aßmusvoid
525a1d355fSStephan AßmusNodeHandle::SetCookie(int32 cookie)
535a1d355fSStephan Aßmus{
545a1d355fSStephan Aßmus	fCookie = cookie;
555a1d355fSStephan Aßmus}
565a1d355fSStephan Aßmus
575a1d355fSStephan Aßmus// GetCookie
585a1d355fSStephan Aßmusint32
595a1d355fSStephan AßmusNodeHandle::GetCookie() const
605a1d355fSStephan Aßmus{
615a1d355fSStephan Aßmus	return fCookie;
625a1d355fSStephan Aßmus}
635a1d355fSStephan Aßmus
645a1d355fSStephan Aßmus// GetNodeRef
655a1d355fSStephan Aßmusconst NodeRef&
665a1d355fSStephan AßmusNodeHandle::GetNodeRef() const
675a1d355fSStephan Aßmus{
685a1d355fSStephan Aßmus	return fNodeRef;
695a1d355fSStephan Aßmus}
705a1d355fSStephan Aßmus
715a1d355fSStephan Aßmus// GetFD
725a1d355fSStephan Aßmusint
735a1d355fSStephan AßmusNodeHandle::GetFD() const
745a1d355fSStephan Aßmus{
755a1d355fSStephan Aßmus	return -1;
765a1d355fSStephan Aßmus}
775a1d355fSStephan Aßmus
785a1d355fSStephan Aßmus
795a1d355fSStephan Aßmus// #pragma mark -
805a1d355fSStephan Aßmus
815a1d355fSStephan Aßmus// FileHandle
825a1d355fSStephan Aßmus
835a1d355fSStephan Aßmus// constructor
845a1d355fSStephan AßmusFileHandle::FileHandle()
855a1d355fSStephan Aßmus	: fFD(-1)
865a1d355fSStephan Aßmus{
875a1d355fSStephan Aßmus}
885a1d355fSStephan Aßmus
895a1d355fSStephan Aßmus// destructor
905a1d355fSStephan AßmusFileHandle::~FileHandle()
915a1d355fSStephan Aßmus{
925a1d355fSStephan Aßmus	Close();
935a1d355fSStephan Aßmus}
945a1d355fSStephan Aßmus
955a1d355fSStephan Aßmus// Open
965a1d355fSStephan Aßmusstatus_t
975a1d355fSStephan AßmusFileHandle::Open(Node* node, int openMode)
985a1d355fSStephan Aßmus{
995a1d355fSStephan Aßmus	if (!node)
1005a1d355fSStephan Aßmus		return B_BAD_VALUE;
1015a1d355fSStephan Aßmus
1025a1d355fSStephan Aßmus	openMode &= O_RWMASK | O_TRUNC | O_APPEND;
1035a1d355fSStephan Aßmus
1045a1d355fSStephan Aßmus	// get a path
1055a1d355fSStephan Aßmus	Path path;
1065a1d355fSStephan Aßmus	status_t error = node->GetPath(&path);
1075a1d355fSStephan Aßmus	if (error != B_OK)
1085a1d355fSStephan Aßmus		return error;
1095a1d355fSStephan Aßmus
1105a1d355fSStephan Aßmus	// open the file
1115a1d355fSStephan Aßmus	error = FDManager::Open(path.GetPath(), openMode | O_NOTRAVERSE, 0, fFD);
1125a1d355fSStephan Aßmus	if (error != B_OK)
1135a1d355fSStephan Aßmus		return error;
1145a1d355fSStephan Aßmus
1155a1d355fSStephan Aßmus	fNodeRef = node->GetNodeRef();
1165a1d355fSStephan Aßmus
1175a1d355fSStephan Aßmus	return B_OK;
1185a1d355fSStephan Aßmus}
1195a1d355fSStephan Aßmus
1205a1d355fSStephan Aßmus// Close
1215a1d355fSStephan Aßmusstatus_t
1225a1d355fSStephan AßmusFileHandle::Close()
1235a1d355fSStephan Aßmus{
1245a1d355fSStephan Aßmus	if (fFD < 0)
1255a1d355fSStephan Aßmus		return B_BAD_VALUE;
1265a1d355fSStephan Aßmus
1275a1d355fSStephan Aßmus	status_t error = B_OK;
1285a1d355fSStephan Aßmus	if (close(fFD) < 0)
1295a1d355fSStephan Aßmus		error = errno;
1305a1d355fSStephan Aßmus	fFD = -1;
1315a1d355fSStephan Aßmus
1325a1d355fSStephan Aßmus	return error;
1335a1d355fSStephan Aßmus}
1345a1d355fSStephan Aßmus
1355a1d355fSStephan Aßmus// Read
1365a1d355fSStephan Aßmusstatus_t
1375a1d355fSStephan AßmusFileHandle::Read(off_t pos, void* buffer, size_t size, size_t* _bytesRead)
1385a1d355fSStephan Aßmus{
1395a1d355fSStephan Aßmus	if (fFD < 0)
1405a1d355fSStephan Aßmus		return B_BAD_VALUE;
1415a1d355fSStephan Aßmus
1425a1d355fSStephan Aßmus	ssize_t bytesRead = read_pos(fFD, pos, buffer, size);
1435a1d355fSStephan Aßmus	if (bytesRead < 0)
1445a1d355fSStephan Aßmus		return errno;
1455a1d355fSStephan Aßmus
1465a1d355fSStephan Aßmus	*_bytesRead = bytesRead;
1475a1d355fSStephan Aßmus	return B_OK;
1485a1d355fSStephan Aßmus}
1495a1d355fSStephan Aßmus
1505a1d355fSStephan Aßmus// Write
1515a1d355fSStephan Aßmusstatus_t
1525a1d355fSStephan AßmusFileHandle::Write(off_t pos, const void* buffer, size_t size,
1535a1d355fSStephan Aßmus	size_t* _bytesWritten)
1545a1d355fSStephan Aßmus{
1555a1d355fSStephan Aßmus	if (fFD < 0)
1565a1d355fSStephan Aßmus		return B_BAD_VALUE;
1575a1d355fSStephan Aßmus
1585a1d355fSStephan Aßmus	ssize_t bytesWritten = write_pos(fFD, pos, buffer, size);
1595a1d355fSStephan Aßmus	if (bytesWritten < 0)
1605a1d355fSStephan Aßmus		return errno;
1615a1d355fSStephan Aßmus
1625a1d355fSStephan Aßmus	*_bytesWritten = bytesWritten;
1635a1d355fSStephan Aßmus	return B_OK;
1645a1d355fSStephan Aßmus}
1655a1d355fSStephan Aßmus
1665a1d355fSStephan Aßmus// ReadAttr
1675a1d355fSStephan Aßmusstatus_t
1685a1d355fSStephan AßmusFileHandle::ReadAttr(const char* name, uint32 type, off_t pos, void* buffer,
1695a1d355fSStephan Aßmus	size_t size, size_t* _bytesRead)
1705a1d355fSStephan Aßmus{
1715a1d355fSStephan Aßmus	if (fFD < 0)
1725a1d355fSStephan Aßmus		return B_BAD_VALUE;
1735a1d355fSStephan Aßmus
1745a1d355fSStephan Aßmus	ssize_t bytesRead = fs_read_attr(fFD, name, type, pos, buffer, size);
1755a1d355fSStephan Aßmus	if (bytesRead < 0)
1765a1d355fSStephan Aßmus		return errno;
1775a1d355fSStephan Aßmus
1785a1d355fSStephan Aßmus	*_bytesRead = bytesRead;
1795a1d355fSStephan Aßmus	return B_OK;
1805a1d355fSStephan Aßmus}
1815a1d355fSStephan Aßmus
1825a1d355fSStephan Aßmus// WriteAttr
1835a1d355fSStephan Aßmusstatus_t
1845a1d355fSStephan AßmusFileHandle::WriteAttr(const char* name, uint32 type, off_t pos,
1855a1d355fSStephan Aßmus	const void* buffer, size_t size, size_t* _bytesWritten)
1865a1d355fSStephan Aßmus{
1875a1d355fSStephan Aßmus	if (fFD < 0)
1885a1d355fSStephan Aßmus		return B_BAD_VALUE;
1895a1d355fSStephan Aßmus
1905a1d355fSStephan Aßmus	ssize_t bytesWritten = fs_write_attr(fFD, name, type, pos, buffer, size);
1915a1d355fSStephan Aßmus	if (bytesWritten < 0)
1925a1d355fSStephan Aßmus		return errno;
1935a1d355fSStephan Aßmus
1945a1d355fSStephan Aßmus	*_bytesWritten = bytesWritten;
1955a1d355fSStephan Aßmus	return B_OK;
1965a1d355fSStephan Aßmus}
1975a1d355fSStephan Aßmus
1985a1d355fSStephan Aßmus// RemoveAttr
1995a1d355fSStephan Aßmusstatus_t
2005a1d355fSStephan AßmusFileHandle::RemoveAttr(const char* name)
2015a1d355fSStephan Aßmus{
2025a1d355fSStephan Aßmus	if (fFD < 0)
2035a1d355fSStephan Aßmus		return B_BAD_VALUE;
2045a1d355fSStephan Aßmus
2055a1d355fSStephan Aßmus	return (fs_remove_attr(fFD, name) == 0 ? B_OK : errno);
2065a1d355fSStephan Aßmus}
2075a1d355fSStephan Aßmus
2085a1d355fSStephan Aßmus// StatAttr
2095a1d355fSStephan Aßmusstatus_t
2105a1d355fSStephan AßmusFileHandle::StatAttr(const char* name, attr_info* info)
2115a1d355fSStephan Aßmus{
2125a1d355fSStephan Aßmus	if (fFD < 0)
2135a1d355fSStephan Aßmus		return B_BAD_VALUE;
2145a1d355fSStephan Aßmus
2155a1d355fSStephan Aßmus	return (fs_stat_attr(fFD, name, info) == 0 ? B_OK : errno);
2165a1d355fSStephan Aßmus}
2175a1d355fSStephan Aßmus
2185a1d355fSStephan Aßmus// GetFD
2195a1d355fSStephan Aßmusint
2205a1d355fSStephan AßmusFileHandle::GetFD() const
2215a1d355fSStephan Aßmus{
2225a1d355fSStephan Aßmus	return fFD;
2235a1d355fSStephan Aßmus}
2245a1d355fSStephan Aßmus
2255a1d355fSStephan Aßmus
2265a1d355fSStephan Aßmus// #pragma mark -
2275a1d355fSStephan Aßmus
2285a1d355fSStephan Aßmus// DirIterator
2295a1d355fSStephan Aßmus
2305a1d355fSStephan Aßmus// constructor
2315a1d355fSStephan AßmusDirIterator::DirIterator()
2325a1d355fSStephan Aßmus	: fDirectory(NULL)
2335a1d355fSStephan Aßmus{
2345a1d355fSStephan Aßmus}
2355a1d355fSStephan Aßmus
2365a1d355fSStephan Aßmus// destructor
2375a1d355fSStephan AßmusDirIterator::~DirIterator()
2385a1d355fSStephan Aßmus{
2395a1d355fSStephan Aßmus	if (fDirectory)
2405a1d355fSStephan Aßmus		fDirectory->RemoveDirIterator(this);
2415a1d355fSStephan Aßmus}
2425a1d355fSStephan Aßmus
2435a1d355fSStephan Aßmus// IsValid
2445a1d355fSStephan Aßmusbool
2455a1d355fSStephan AßmusDirIterator::IsValid() const
2465a1d355fSStephan Aßmus{
2475a1d355fSStephan Aßmus	return fDirectory;
2485a1d355fSStephan Aßmus}
2495a1d355fSStephan Aßmus
2505a1d355fSStephan Aßmus
2515a1d355fSStephan Aßmus// #pragma mark -
2525a1d355fSStephan Aßmus
2535a1d355fSStephan Aßmus// AttrDirIterator
2545a1d355fSStephan Aßmus
2555a1d355fSStephan Aßmus// constructor
2565a1d355fSStephan AßmusAttrDirIterator::AttrDirIterator()
2575a1d355fSStephan Aßmus	: NodeHandle(),
2585a1d355fSStephan Aßmus	  fDir(NULL)
2595a1d355fSStephan Aßmus{
2605a1d355fSStephan Aßmus}
2615a1d355fSStephan Aßmus
2625a1d355fSStephan Aßmus// destructor
2635a1d355fSStephan AßmusAttrDirIterator::~AttrDirIterator()
2645a1d355fSStephan Aßmus{
2655a1d355fSStephan Aßmus	Close();
2665a1d355fSStephan Aßmus}
2675a1d355fSStephan Aßmus
2685a1d355fSStephan Aßmus// Open
2695a1d355fSStephan Aßmusstatus_t
2705a1d355fSStephan AßmusAttrDirIterator::Open(Node* node)
2715a1d355fSStephan Aßmus{
2725a1d355fSStephan Aßmus	if (!node)
2735a1d355fSStephan Aßmus		return B_BAD_VALUE;
2745a1d355fSStephan Aßmus
2755a1d355fSStephan Aßmus	// get a path
2765a1d355fSStephan Aßmus	Path path;
2775a1d355fSStephan Aßmus	status_t error = node->GetPath(&path);
2785a1d355fSStephan Aßmus	if (error != B_OK)
2795a1d355fSStephan Aßmus		return error;
2805a1d355fSStephan Aßmus
2815a1d355fSStephan Aßmus	// open the attribute directory
2825a1d355fSStephan Aßmus	error = FDManager::OpenAttrDir(path.GetPath(), fDir);
2835a1d355fSStephan Aßmus	if (error != B_OK)
2845a1d355fSStephan Aßmus		return errno;
2855a1d355fSStephan Aßmus
2865a1d355fSStephan Aßmus	fNodeRef = node->GetNodeRef();
2875a1d355fSStephan Aßmus
2885a1d355fSStephan Aßmus	return B_OK;
2895a1d355fSStephan Aßmus}
2905a1d355fSStephan Aßmus
2915a1d355fSStephan Aßmus// Close
2925a1d355fSStephan Aßmusstatus_t
2935a1d355fSStephan AßmusAttrDirIterator::Close()
2945a1d355fSStephan Aßmus{
2955a1d355fSStephan Aßmus	if (!fDir)
2965a1d355fSStephan Aßmus		return B_BAD_VALUE;
2975a1d355fSStephan Aßmus
2985a1d355fSStephan Aßmus	status_t error = B_OK;
2995a1d355fSStephan Aßmus	if (fs_close_attr_dir(fDir) < 0)
3005a1d355fSStephan Aßmus		error = errno;
3015a1d355fSStephan Aßmus
3025a1d355fSStephan Aßmus	fDir = NULL;
3035a1d355fSStephan Aßmus	return error;
3045a1d355fSStephan Aßmus}
3055a1d355fSStephan Aßmus
3065a1d355fSStephan Aßmus// ReadDir
3075a1d355fSStephan Aßmusstatus_t
3085a1d355fSStephan AßmusAttrDirIterator::ReadDir(dirent* _entry, int32 bufferSize,
3095a1d355fSStephan Aßmus	int32 count, int32* countRead, bool* done)
3105a1d355fSStephan Aßmus{
3115a1d355fSStephan Aßmus// TODO: Burst read.
3125a1d355fSStephan Aßmus	if (!fDir)
3135a1d355fSStephan Aßmus		return B_ENTRY_NOT_FOUND;
3145a1d355fSStephan Aßmus
3155a1d355fSStephan Aßmus	*countRead = 0;
3165a1d355fSStephan Aßmus	*done = false;
3175a1d355fSStephan Aßmus
3185a1d355fSStephan Aßmus	if (count == 0)
3195a1d355fSStephan Aßmus		return B_OK;
3205a1d355fSStephan Aßmus
3215a1d355fSStephan Aßmus	if (struct dirent* entry = fs_read_attr_dir(fDir)) {
3225a1d355fSStephan Aßmus		size_t entryLen = entry->d_name + strlen(entry->d_name) + 1
3235a1d355fSStephan Aßmus			- (char*)entry;
3245a1d355fSStephan Aßmus		memcpy(_entry, entry, entryLen);
3255a1d355fSStephan Aßmus		*countRead = 1;
3265a1d355fSStephan Aßmus	} else {
3275a1d355fSStephan Aßmus		*countRead = 0;
3285a1d355fSStephan Aßmus		*done = true;
3295a1d355fSStephan Aßmus	}
3305a1d355fSStephan Aßmus	return B_OK;
3315a1d355fSStephan Aßmus}
3325a1d355fSStephan Aßmus
3335a1d355fSStephan Aßmus// RewindDir
3345a1d355fSStephan Aßmusstatus_t
3355a1d355fSStephan AßmusAttrDirIterator::RewindDir()
3365a1d355fSStephan Aßmus{
3375a1d355fSStephan Aßmus	if (!fDir)
3385a1d355fSStephan Aßmus		return B_ENTRY_NOT_FOUND;
3395a1d355fSStephan Aßmus
3405a1d355fSStephan Aßmus	fs_rewind_attr_dir(fDir);
3415a1d355fSStephan Aßmus
3425a1d355fSStephan Aßmus	return B_OK;
3435a1d355fSStephan Aßmus}
3445a1d355fSStephan Aßmus
3455a1d355fSStephan Aßmus// GetFD
3465a1d355fSStephan Aßmusint
3475a1d355fSStephan AßmusAttrDirIterator::GetFD() const
3485a1d355fSStephan Aßmus{
3495a1d355fSStephan Aßmus	return dirfd(fDir);
3505a1d355fSStephan Aßmus}
3515a1d355fSStephan Aßmus
3525a1d355fSStephan Aßmus
3535a1d355fSStephan Aßmus// #pragma mark -
3545a1d355fSStephan Aßmus
3555a1d355fSStephan Aßmus// QueryListener
3565a1d355fSStephan Aßmus
3575a1d355fSStephan Aßmus// constructor
3585a1d355fSStephan AßmusQueryListener::QueryListener()
3595a1d355fSStephan Aßmus{
3605a1d355fSStephan Aßmus}
3615a1d355fSStephan Aßmus
3625a1d355fSStephan Aßmus// destructor
3635a1d355fSStephan AßmusQueryListener::~QueryListener()
3645a1d355fSStephan Aßmus{
3655a1d355fSStephan Aßmus}
3665a1d355fSStephan Aßmus
3675a1d355fSStephan Aßmus
3685a1d355fSStephan Aßmus// #pragma mark -
3695a1d355fSStephan Aßmus
3705a1d355fSStephan Aßmus// QueryHandle
3715a1d355fSStephan Aßmus
3725a1d355fSStephan Aßmus// constructor
3735a1d355fSStephan AßmusQueryHandle::QueryHandle(port_id remotePort, int32 remoteToken)
3745a1d355fSStephan Aßmus	: NodeHandle(),
3755a1d355fSStephan Aßmus	  fRemotePort(remotePort),
3765a1d355fSStephan Aßmus	  fRemoteToken(remoteToken),
3775a1d355fSStephan Aßmus	  fQueries(),
3785a1d355fSStephan Aßmus	  fCurrentQuery(NULL),
3795a1d355fSStephan Aßmus	  fListener(NULL),
3805a1d355fSStephan Aßmus	  fClosed(false)
3815a1d355fSStephan Aßmus{
3825a1d355fSStephan Aßmus}
3835a1d355fSStephan Aßmus
3845a1d355fSStephan Aßmus// destructor
3855a1d355fSStephan AßmusQueryHandle::~QueryHandle()
3865a1d355fSStephan Aßmus{
3875a1d355fSStephan Aßmus	Close();
3885a1d355fSStephan Aßmus}
3895a1d355fSStephan Aßmus
3905a1d355fSStephan Aßmus// SetQueryListener
3915a1d355fSStephan Aßmusvoid
3925a1d355fSStephan AßmusQueryHandle::SetQueryListener(QueryListener* listener)
3935a1d355fSStephan Aßmus{
3945a1d355fSStephan Aßmus	fListener = listener;
3955a1d355fSStephan Aßmus}
3965a1d355fSStephan Aßmus
3975a1d355fSStephan Aßmus// GetQueryListener
3985a1d355fSStephan AßmusQueryListener*
3995a1d355fSStephan AßmusQueryHandle::GetQueryListener() const
4005a1d355fSStephan Aßmus{
4015a1d355fSStephan Aßmus	return fListener;
4025a1d355fSStephan Aßmus}
4035a1d355fSStephan Aßmus
4045a1d355fSStephan Aßmus// AddQuery
4055a1d355fSStephan Aßmusvoid
4065a1d355fSStephan AßmusQueryHandle::AddQuery(Query* query)
4075a1d355fSStephan Aßmus{
4085a1d355fSStephan Aßmus	if (query) {
4095a1d355fSStephan Aßmus		fQueries.Insert(query);
4105a1d355fSStephan Aßmus		if (!fCurrentQuery)
4115a1d355fSStephan Aßmus			fCurrentQuery = query;
4125a1d355fSStephan Aßmus	}
4135a1d355fSStephan Aßmus}
4145a1d355fSStephan Aßmus
4155a1d355fSStephan Aßmus// RemoveQuery
4165a1d355fSStephan Aßmusvoid
4175a1d355fSStephan AßmusQueryHandle::RemoveQuery(Query* query)
4185a1d355fSStephan Aßmus{
4195a1d355fSStephan Aßmus	if (query) {
4205a1d355fSStephan Aßmus		if (query == fCurrentQuery)
4215a1d355fSStephan Aßmus			fCurrentQuery = fQueries.GetNext(query);
4225a1d355fSStephan Aßmus		fQueries.Remove(query);
4235a1d355fSStephan Aßmus	}
4245a1d355fSStephan Aßmus}
4255a1d355fSStephan Aßmus
4265a1d355fSStephan Aßmus// GetRemotePort
4275a1d355fSStephan Aßmusport_id
4285a1d355fSStephan AßmusQueryHandle::GetRemotePort() const
4295a1d355fSStephan Aßmus{
4305a1d355fSStephan Aßmus	return fRemotePort;
4315a1d355fSStephan Aßmus}
4325a1d355fSStephan Aßmus
4335a1d355fSStephan Aßmus// GetRemoteToken
4345a1d355fSStephan Aßmusint32
4355a1d355fSStephan AßmusQueryHandle::GetRemoteToken() const
4365a1d355fSStephan Aßmus{
4375a1d355fSStephan Aßmus	return fRemoteToken;
4385a1d355fSStephan Aßmus}
4395a1d355fSStephan Aßmus
4405a1d355fSStephan Aßmus// Close
4415a1d355fSStephan Aßmusstatus_t
4425a1d355fSStephan AßmusQueryHandle::Close()
4435a1d355fSStephan Aßmus{
4445a1d355fSStephan Aßmus	if (fClosed)
4455a1d355fSStephan Aßmus		return B_OK;
4465a1d355fSStephan Aßmus
4475a1d355fSStephan Aßmus	fCurrentQuery = NULL;
4485a1d355fSStephan Aßmus
4495a1d355fSStephan Aßmus	// delete all queries
4505a1d355fSStephan Aßmus	for (DoublyLinkedList<Query>::Iterator it = fQueries.GetIterator();
4515a1d355fSStephan Aßmus			it.HasNext();) {
4525a1d355fSStephan Aßmus		Query* query = it.Next();
4535a1d355fSStephan Aßmus		it.Remove();
4545a1d355fSStephan Aßmus		delete query;
4555a1d355fSStephan Aßmus	}
4565a1d355fSStephan Aßmus
4575a1d355fSStephan Aßmus	fClosed = true;
4585a1d355fSStephan Aßmus
4595a1d355fSStephan Aßmus	if (fListener)
4605a1d355fSStephan Aßmus		fListener->QueryHandleClosed(this);
4615a1d355fSStephan Aßmus
4625a1d355fSStephan Aßmus	return B_OK;
4635a1d355fSStephan Aßmus}
4645a1d355fSStephan Aßmus
4655a1d355fSStephan Aßmus// ReadDir
4665a1d355fSStephan Aßmusstatus_t
4675a1d355fSStephan AßmusQueryHandle::ReadDir(dirent* entry, int32 count, int32* countRead)
4685a1d355fSStephan Aßmus{
4695a1d355fSStephan Aßmus	if (count == 0) {
4705a1d355fSStephan Aßmus		*countRead = 0;
4715a1d355fSStephan Aßmus		return B_OK;
4725a1d355fSStephan Aßmus	}
4735a1d355fSStephan Aßmus	while (fCurrentQuery) {
4745a1d355fSStephan Aßmus		int32 readEntries = fCurrentQuery->GetNextDirents(entry,
4755a1d355fSStephan Aßmus			sizeof(struct dirent) + B_FILE_NAME_LENGTH, 1);
4765a1d355fSStephan Aßmus		if (readEntries < 0)
4775a1d355fSStephan Aßmus			return readEntries;
4785a1d355fSStephan Aßmus		if (readEntries > 0) {
4795a1d355fSStephan Aßmus			*countRead = 1;
4805a1d355fSStephan Aßmus			return B_OK;
4815a1d355fSStephan Aßmus		}
4825a1d355fSStephan Aßmus		fCurrentQuery = fQueries.GetNext(fCurrentQuery);
4835a1d355fSStephan Aßmus	}
4845a1d355fSStephan Aßmus	*countRead = 0;
4855a1d355fSStephan Aßmus	return B_OK;
4865a1d355fSStephan Aßmus}
4875a1d355fSStephan Aßmus
488