/***************************************************************************
                Inode.h
                -----------------------------------------
    begin      : 2011/10/06
    copyright  : (C) 2005 SolutionBox Inc.
    author     : Service 1 Team
    email      : svc1@solbox.com

    CopyRight(C) 2005 SolutionBox Inc. All Rights reserved.
    Redistribution and use in source and binary forms, with or with out
    modification, are not permitted in outside of SolutionBox Inc.
***************************************************************************/

/***************************************************************************
                소스 수정 히스토리

작성자    작성일       Revision   내용
장희준    2011/10/06   ?          ADD - 최초 등록
***************************************************************************/
#ifndef	__INODE_H__
#define	__INODE_H__

#include "Logger.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string>

///@brief stat 함수로 얻는 struct stat 정보를 wrapping 하는 클래스.
class CInode
{
// Attributes
private:
	///@breif 파일명 저장
	std::string m_szFilename;

	///@brief 디바이스 id 저장
	unsigned long m_nDeviceId;

	///@brief inode 저장.
	unsigned long long m_nInum;

	///@brief protection 모드 저장
	mode_t m_nMode;

	///@brief 파일 크기(bytes)
	unsigned long long m_nSize;

	///@brief 마지막 접근 시간 - tiem of last access
	time_t m_nATime;

	///@brief 마지막 수정 시간 - time of last modification
	time_t m_nMTime;

	///@breif 마지막 변경 시간 - time of last change
	time_t m_nCTime;

	///@brief CInode을 테스트하는 클래스가 private에 접근할 수 있도록 하기 위함.
	friend class CInodeTest;
	friend class CLogFileCleanerTest;

protected:

public:

// Operations
private:

protected:
	/// 정보를 설정 함수들.
	inline void SetFilename( std::string filename ) { m_szFilename = filename; };
	inline void SetDeviceId( unsigned long deviceid ) { m_nDeviceId = deviceid; };
	inline void SetInum( unsigned long long inum ) { m_nInum = inum; };
	inline void SetFileMode( mode_t mode ) { m_nMode = mode; };
	inline void SetSize( unsigned long long size ) { m_nSize = size; };
	inline void SetATime( time_t atime ) { m_nATime = atime; };
	inline void SetMTime( time_t mtime ) { m_nATime = mtime; };
	inline void SetCTime( time_t ctime ) { m_nATime = ctime; };

public:
	CInode();
	virtual ~CInode();

	///@brief  파일의 정보를 구해서 설정하는 함수.
	///@param path [in] 파일의 절대 경로.
	///@return 파일의 정보를 구해서 설정하면 true, 그렇지 못 하면 false.
	bool LoadInfo( std::string path );

	///@brief 파일의 정보를 출력하는 함수.
	///@param logLevel [in] 로그 레벨
	///@return none.
	void Print( int logLevel = LDBG );

	/// 정보를 얻는 함수들.
	inline std::string GetFilename() { return m_szFilename; };
	inline unsigned long GetDeviceId() { return m_nDeviceId; };
	inline unsigned long long GetInum() { return m_nInum; };
	inline mode_t GetFileMode() { return m_nMode; };
	inline unsigned long long GetSize() { return m_nSize; };
	inline time_t GetATime() { return m_nATime; };
	inline time_t GetMTime() { return m_nMTime; };
	inline time_t GetCTime() { return m_nCTime; };
};

#endif //	__INODE_H__


