⛏️ index : haiku.git

/*
 * Copyright 2012 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Paweł Dziepak, pdziepak@quarnos.org
 */
#ifndef DELEGATION_H
#define DELEGATION_H


#include <lock.h>
#include <SupportDefs.h>

#include "NFS4Object.h"


class Inode;

class Delegation : public NFS4Object,
	public DoublyLinkedListLinkImpl<Delegation> {
public:
						Delegation(const OpenDelegationData& data, Inode* inode,
							uint64 clientID, bool attr = false);

	status_t			GiveUp(bool truncate = false);
			status_t	PrepareGiveUp(bool truncate);
			status_t	DoGiveUp(bool truncate, bool wait = true);

	inline	void		SetData(const OpenDelegationData& data);
	inline	Inode*		GetInode() const;
			void		GetStateIDandSeq(uint32* stateID, uint32& stateSeq) const;
	inline	OpenDelegation Type();
	inline	void		MarkRecalled();
	inline	bool		RecallInitiated() const;

	void				Dump(void (*xprintf)(const char*, ...) = dprintf) const;

protected:
	status_t			ReturnDelegation();

private:
	uint64				fClientID;
	OpenDelegationData	fData;
	Inode*				fInode;
	bool				fAttribute;
	uint32				fStateID[3];
	uint32				fStateSeq;
	uid_t				fUid;
	gid_t				fGid;
	bool				fRecalled;
};


inline void
Delegation::SetData(const OpenDelegationData& data)
{
	fData = data;
}


inline Inode*
Delegation::GetInode() const
{
	return fInode;
}


inline OpenDelegation
Delegation::Type()
{
	return fData.fType;
}


inline void
Delegation::MarkRecalled()
{
	fRecalled = true;
}


inline bool
Delegation::RecallInitiated() const
{
	return fRecalled;
}


#endif	// DELEGATION_H