// $Id: File.h,v 1.10 2002/10/11 02:20:15 leres Exp $
//
// Copyright (c) 1996, 1997, 1998, 1999, 2002
//      The Regents of the University of California.  All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that: (1) source code distributions
// retain the above copyright notice and this paragraph in its entirety, (2)
// distributions including binary code include the above copyright notice and
// this paragraph in its entirety in the documentation or other materials
// provided with the distribution, and (3) all advertising materials mentioning
// features or use of this software display the following acknowledgement:
// ``This product includes software developed by the University of California,
// Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
// the University nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

#ifndef file_h
#define file_h

#include "util.h"
#include "Obj.h"

class BroType;

class BroFile : public BroObj {
public:
	BroFile(FILE* arg_f);
	BroFile(const char* filename, const char* access, BroType* arg_t = 0);
	virtual ~BroFile();

	// Returns nil if the file is not active, was in error, etc.
	FILE* File();
	FILE* Seek(long position);	// seek to absolute position

	void SetBuf(bool buffered);	// false=line buffered, true=fully buffered

	const char* Name()	{ return name; }

	BroType* FType() const	{ return t; }

	// Returns true if the close made sense, false if it was already
	// closed, not active, or whatever.
	int Close();

	void Describe(ODesc* d) const;

protected:
	BroFile* Prev()	{ return prev; }
	BroFile* Next()	{ return next; }
	void SetPrev(BroFile* f)	{ prev = f; }
	void SetNext(BroFile* f)	{ next = f; }

	void Suspend();
	void PurgeCache();
	void Unlink();
	void InsertAtBeginning();
	void MoveToBeginning();

	FILE* f;
	BroType* t;
	char* name;
	char* access;
	int is_open;
	int is_managed;	// whether it's in the open-file cache
	long position;	// only valid if not is_open
	BroFile* next;	// doubly-linked list of open files
	BroFile* prev;
};

#endif
