//
// The developer of the original code and/or files is Tripwire, Inc.
// Portions created by Tripwire, Inc. are copyright (C) 2000 Tripwire,
// Inc. Tripwire is a registered trademark of Tripwire, Inc.  All rights
// reserved.
// 
// This program is free software.  The contents of this file are subject
// to the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or (at your
// option) any later version.  You may redistribute it and/or modify it
// only in compliance with the GNU General Public License.
// 
// This program is distributed in the hope that it will be useful.
// However, this program is distributed AS-IS WITHOUT ANY
// WARRANTY; INCLUDING THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS
// FOR A PARTICULAR PURPOSE.  Please see the GNU General Public License
// for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
// 
// Nothing in the GNU General Public License or any other license to use
// the code or files shall permit you to use Tripwire's trademarks,
// service marks, or other intellectual property without Tripwire's
// prior written consent.
// 
// If you have any questions, please contact Tripwire, Inc. at either
// info@tripwire.org or www.tripwire.org.
//
//headerinfo.h : a base class for database and report header objects.
#ifndef __HEADERINFO_H
#define __HEADERINFO_H

#ifndef __TCHAR_H
#include "core/tchar.h"
#endif
#ifndef __TYPES_H
#include "core/types.h"
#endif
#ifndef __SERIALIZABLE_H
#include "core/serializable.h"
#endif

class iFCOPropDisplayer;

///////////////////////////////////////////////////////////////////////////////
// cHeaderInfo
///////////////////////////////////////////////////////////////////////////////
class cHeaderInfo : public iTypedSerializable
{
    DECLARE_TYPEDSERIALIZABLE()

public:
	cHeaderInfo();
	virtual ~cHeaderInfo();
	virtual void Clear();
		//Clears all data in a header to 0 or NULL equivalents.

	//Functions for getting & setting header values:
    const TSTRING&      GetPolicyFilename() const;
    const TSTRING&      GetConfigFilename() const;
    const TSTRING&      GetDBFilename() const;
    const TSTRING&      GetSystemName() const;
    const TSTRING&      GetCommandLineParams() const;
    const TSTRING&      GetIPAddress() const;
	const TSTRING&	    GetCreator() const;
    const TSTRING&      GetHostID() const;
    int64               GetCreationTime() const;
    int64               GetLastDBUpdateTime() const;
    //Set:
    void                SetPolicyFilename( const TSTRING& );
    void                SetConfigFilename( const TSTRING& );
    void                SetDBFilename( const TSTRING& );
    void                SetSystemName( const TSTRING& );
    void                SetCommandLineParams( const TSTRING& );
    void                SetIPAddress( const TSTRING& );
    void                SetCreator( const TSTRING& );
    void                SetHostID( const TSTRING& );
    void                SetCreationTime( int64 );
    void                SetLastDBUpdateTime( int64 );
		
	// iSerializable interface
	virtual void Read (iSerializer* pSerializer, int32 version = 0); // throw (eSerializer, eArchive)
	virtual void Write(iSerializer* pSerializer) const;	// throw (eSerializer, eArchive)

private:
    cHeaderInfo& operator=( cHeaderInfo& );

	//Header Data:
	TSTRING			    tstr_PolicyFilename;
	TSTRING				tstr_ConfigFilename;
	TSTRING			    tstr_DBFilename;
	TSTRING             tstr_SystemName;
	TSTRING			    tstr_CommandLineParams;
	TSTRING				tstr_IPAddress;
	TSTRING				tstr_CreatedBy;
	TSTRING             tstr_HostID;
	int64				i64_CreationTime;
	mutable int64		i64_LastDBUpdateTime;	
};

///////////////////////////////////////////////////////////////////////////////
// cGenreHeaderInfo -- for genres
///////////////////////////////////////////////////////////////////////////////
class cGenreHeaderInfo : public iTypedSerializable
{
    DECLARE_TYPEDSERIALIZABLE()

public:    
    cGenreHeaderInfo();
    cGenreHeaderInfo( const cGenreHeaderInfo& );
    virtual ~cGenreHeaderInfo();

    void Clear();

	// the prop displayer ... once this is set, this object owns the destruction of it.
	void						SetPropDisplayer(iFCOPropDisplayer* pPropDisplayer);
			iFCOPropDisplayer*	GetPropDisplayer();
	const	iFCOPropDisplayer*	GetPropDisplayer() const;

    void                SetObjectsScanned( int32 );
    int32               GetObjectsScanned() const;

	// iSerializable interface
	virtual void Read (iSerializer* pSerializer, int32 version = 0); // throw (eSerializer, eArchive)
	virtual void Write(iSerializer* pSerializer) const;	// throw (eSerializer, eArchive)
private:
    cGenreHeaderInfo& operator=( cGenreHeaderInfo& );

    iFCOPropDisplayer*	mpPropDisplayer;
	int32				i32_ObjectsScanned;
};

///////////////////////////////////////////////////////////////////////////////
// cFCODbGenreHeader -- for database genres
//		TODO -- once this actually has data, move it to a seperate file
///////////////////////////////////////////////////////////////////////////////
class cFCODbGenreHeader : public cGenreHeaderInfo
{
    DECLARE_TYPEDSERIALIZABLE()
public:
    cFCODbGenreHeader() {};
    cFCODbGenreHeader( const cFCODbGenreHeader& rhs ) : cGenreHeaderInfo( rhs ) {};
private:
    cFCODbGenreHeader& operator=( cFCODbGenreHeader& );
};

///////////////////////////////////////////////////////////////////////////////
// cFCOReportGenreHeader -- for report genres
//		TODO -- once this actually has data, move it to a seperate file
///////////////////////////////////////////////////////////////////////////////
class cFCOReportGenreHeader : public cGenreHeaderInfo
{
public:
    cFCOReportGenreHeader() {};
    cFCOReportGenreHeader( const cFCOReportGenreHeader& rhs ) : cGenreHeaderInfo( rhs ) {};
    DECLARE_TYPEDSERIALIZABLE()
private:
    cFCOReportGenreHeader& operator=( cFCOReportGenreHeader& );
};



///////////////////////////////////////////////////////////////////////////////
// cFCODbHeader -- specialization of header info for databases
//		TODO -- once this actually has data, move it to a seperate file
///////////////////////////////////////////////////////////////////////////////
class cFCODbHeader : public cHeaderInfo
{
    DECLARE_TYPEDSERIALIZABLE()
public:
	typedef cHeaderInfo inherited;
private:
    cFCODbHeader& operator=( cFCODbHeader& );
};

///////////////////////////////////////////////////////////////////////////////
// cFCOReportHeader -- specialization of header info for reports
//		TODO -- once this actually has data, move it to a seperate file
///////////////////////////////////////////////////////////////////////////////
class cFCOReportHeader : public cHeaderInfo
{
	typedef cHeaderInfo inherited;
    DECLARE_TYPEDSERIALIZABLE()
private:
    cFCOReportHeader& operator=( cFCOReportHeader& );
};


//-----------------------------------------------------------------------------
// inline implementation
//-----------------------------------------------------------------------------

inline const TSTRING&   cHeaderInfo::GetPolicyFilename() const              { return tstr_PolicyFilename; };
inline const TSTRING&   cHeaderInfo::GetConfigFilename() const              { return tstr_ConfigFilename; };
inline const TSTRING&   cHeaderInfo::GetDBFilename() const                  { return tstr_DBFilename; };
inline const TSTRING&   cHeaderInfo::GetSystemName() const                  { return tstr_SystemName; };
inline const TSTRING&   cHeaderInfo::GetCommandLineParams() const           { return tstr_CommandLineParams; };
inline const TSTRING&   cHeaderInfo::GetCreator() const			            { return tstr_CreatedBy; };
inline const TSTRING&   cHeaderInfo::GetIPAddress() const                   { return tstr_IPAddress; };
inline const TSTRING&   cHeaderInfo::GetHostID() const                      { return tstr_HostID; };
inline int64            cHeaderInfo::GetCreationTime() const	            { return i64_CreationTime; };
inline int64            cHeaderInfo::GetLastDBUpdateTime() const            { return i64_LastDBUpdateTime; };

inline void             cHeaderInfo::SetPolicyFilename( const TSTRING& tstr )       { tstr_PolicyFilename = tstr; };
inline void             cHeaderInfo::SetConfigFilename( const TSTRING& tstr )       { tstr_ConfigFilename = tstr; };
inline void             cHeaderInfo::SetDBFilename( const TSTRING& tstr )           { tstr_DBFilename = tstr; };
inline void             cHeaderInfo::SetSystemName( const TSTRING& name )           { tstr_SystemName = name; };
inline void             cHeaderInfo::SetCommandLineParams( const TSTRING& tstr )    { tstr_CommandLineParams = tstr; };
inline void             cHeaderInfo::SetCreator( const TSTRING& tstr )	            { tstr_CreatedBy = tstr; };
inline void             cHeaderInfo::SetHostID( const TSTRING& tstr )               { tstr_HostID = tstr; };
inline void             cHeaderInfo::SetIPAddress( const TSTRING& tstr )            { tstr_IPAddress = tstr; };
inline void             cHeaderInfo::SetCreationTime( int64 i )			            { i64_CreationTime = i; };
inline void             cHeaderInfo::SetLastDBUpdateTime( int64 i )                 { i64_LastDBUpdateTime = i; };

inline void                     cGenreHeaderInfo::SetPropDisplayer(iFCOPropDisplayer* pPropDisplayer) { mpPropDisplayer = pPropDisplayer; }
inline iFCOPropDisplayer*       cGenreHeaderInfo::GetPropDisplayer()        { return mpPropDisplayer; }
inline const iFCOPropDisplayer* cGenreHeaderInfo::GetPropDisplayer() const  { return mpPropDisplayer; }
inline void                     cGenreHeaderInfo::SetObjectsScanned( int32 i ) { i32_ObjectsScanned = i; };
inline int32                    cGenreHeaderInfo::GetObjectsScanned() const    { return i32_ObjectsScanned; };


#endif //__HEADERINFO_H

