#include "idl_types.h"

import "server_id.idl";
import "security.idl";
import "file_id.idl";
import "smb2_lease_struct.idl";
import "misc.idl";

[
	pointer_default(unique)
]

interface open_files
{
	typedef [public,flag(NDR_PAHEX)] struct {
		GUID			client_guid;
		smb2_lease_key		lease_key;
		smb2_lease_state	current_state;
		/*
		 * 'breaking' indicates that we're waiting
		 * for a lease break ack from the client
		 * and breaking_to_requested and breaking_to_required
		 * have a meaning.
		 *
		 * breaking_to_requested is the value already sent to
		 * the client, the client needs to ack to this (or less).
		 *
		 * breaking_to_required is the internal value that needs to
		 * be reached before we can reset breaking = false, this
		 * may requires multiple roundtrips to the client, e.g.
		 * when the lease broken to a more reduced value, while
		 * the lease break is still in progress.
		 *
		 * The following can be assumed (if breaking == true):
		 *
		 * current_state > breaking_to_requested >= breaking_to_required
		 */
		boolean8		breaking;
		smb2_lease_state	breaking_to_requested;
		smb2_lease_state	breaking_to_required;
		uint16			lease_version;
		uint16			epoch;
	} share_mode_lease;

	typedef [public] struct {
		server_id	pid;
		hyper		op_mid;
		uint16		op_type;
		uint32		lease_idx;
		uint32		access_mask;
		uint32		share_access;
		uint32		private_options;
		timeval		time;
		file_id		id;
		udlong		share_file_id;
		uint32		uid;
		uint16		flags;
		uint32		name_hash;

		/*
		 * In-memory flag indicating a non-existing pid. We don't want
		 * to store this share_mode_entry on disk.
		 */
		[skip] boolean8	stale;
		[skip] share_mode_lease *lease;
	} share_mode_entry;

	typedef [public] struct {
		uint32		name_hash;
		security_token *delete_nt_token;
		security_unix_token *delete_token;
	} delete_token;

	typedef [public] struct {
		[string,charset(UTF8)] char *servicepath;
		[string,charset(UTF8)] char *base_name;
		[string,charset(UTF8)] char *stream_name;
		uint32 num_share_modes;
		[size_is(num_share_modes)] share_mode_entry share_modes[];
		uint32 num_leases;
		[size_is(num_leases)] share_mode_lease leases[];
		uint32 num_delete_tokens;
		[size_is(num_delete_tokens)] delete_token delete_tokens[];
		timespec old_write_time;
		timespec changed_write_time;
		[skip] boolean8 fresh;
		[skip] boolean8 modified;
		[ignore] db_record *record;
	} share_mode_data;

	/* these are 0x30 (48) characters */
	const string VFS_DEFAULT_DURABLE_COOKIE_MAGIC =
		"VFS_DEFAULT_DURABLE_COOKIE_MAGIC                ";
	const uint32 VFS_DEFAULT_DURABLE_COOKIE_VERSION = 0;

	/* this corresponds to struct stat_ex (SMB_STRUCT_STAT) */
	typedef struct {
		hyper		st_ex_dev;
		hyper		st_ex_ino;
		hyper		st_ex_mode;
		hyper		st_ex_nlink;
		hyper		st_ex_uid;
		hyper		st_ex_gid;
		hyper		st_ex_rdev;
		hyper		st_ex_size;
		timespec	st_ex_atime;
		timespec	st_ex_mtime;
		timespec	st_ex_ctime;
		timespec	st_ex_btime;
		boolean8	st_ex_calculated_birthtime;
		hyper		st_ex_blksize;
		hyper		st_ex_blocks;
		uint32		st_ex_flags;
		uint32		st_ex_mask;
	} vfs_default_durable_stat;

	typedef [public] struct {
		[value(VFS_DEFAULT_DURABLE_COOKIE_MAGIC),charset(DOS)] uint8 magic[0x30];
		[value(VFS_DEFAULT_DURABLE_COOKIE_VERSION)] uint32 version;
		boolean8 allow_reconnect;
		file_id id;
		[string,charset(UTF8)] char *servicepath;
		[string,charset(UTF8)] char *base_name;
		hyper initial_allocation_size;
		hyper position_information;
		boolean8 update_write_time_triggered;
		boolean8 update_write_time_on_close;
		boolean8 write_time_forced;
		timespec close_write_time;
		vfs_default_durable_stat stat_info;
	} vfs_default_durable_cookie;
}
