/***************************************************************************
                Storage 상태 정보를 주기적으로 check.
                -----------------------------------------
    begin      : 2014/09/24
    copyright  : (C) 2005 Solbox Inc.
    author     : storage dev team
    email      : storage.sd@solbox.com
    version    : 3.4

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

#ifndef __STORAGE_STATUS_H__
#define __STORAGE_STATUS_H__


#include <pthread.h>
#include <string>


// CStorageStatus
// 본 클래스는 Thread 클래스로서...
// 주기적으로 지정된 경로의 mount 에 대해 유효 사용 가능 용량을 확인하여 
// 멤버 변수에 저장처리한다.
// 저장된 정보는 다른 모듈에서 사용 가능토록 interface 함수를 제공한다.
class CStorageStatus
{
	public:

		// 생성자
		CStorageStatus( std::string strRootPath );

		// 소멸자
		~CStorageStatus();

		// Thread 기동 함수
		// - storage 정보 추출 시작.
		bool Start();

		// Available size (byte) 정보를 반환한다.
		// - 실제 Free 용량에서 최소 보존 용량을 뺀 나머지 값을 반환한다.
		unsigned long long GetAvailableSize();
		

	private:

		// 생성자를 통해 전달받은 최상위 경로 정보 저장
		std::string m_strRootPath;

		// 해당 경로의 Free Size (byte)
		unsigned long long m_nFreeSize;

		// 쓰레드 핸들
        pthread_t m_threadHandle;

		// m_nFreeSize 에 대한 동시 접근을 제어하기 위한 Lock
		pthread_mutex_t m_mutexLock;


	private:

		// 스레드 함수
		static void* threadFunc( void* arg );

		// 실제 Free Size 추출 수행 함수.
		void Execute( void );

		// 멤버 변수 m_nFreeSize 의 값을 설정
		void SetFreeSize( unsigned long long value );
		
		// 전달받은 경로로부터.. 상위 Path 정보를 추출하여 전달한다.
		void GetUpperPath( const std::string & strSourcePath, std::string & strUpperPath );
		
};

#endif /* __STORAGE_STATUS_H__ */
