/****************************************************************************
                Storage info class
                -----------------------------------------

    begin      : 2018/02/06
    copyright  : (C) 2005 Solbox Inc.
    author     : Dev Storage Team
    email      : huibong@solbox.com
    version    : 3.5

    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_INFO_H__
#define __STORAGE_INFO_H__

#include <unistd.h>
#include <string>
#include <vector>


// 각 Storage mount 의 정보를 저장할 구조체
struct stStorageInfo {

	std::string strName;		// mount name, statfs::f_mntonname 항목
	std::string strFsTypeName;	// zfs, ufs 형식의 Type Name, statfs::f_fstypename 항목
	uint64_t ulUsedByte;		// 사용 중인 용량 Byte
	uint64_t ulAvailableByte;	// 사용 가능한 용량 Byte
	int usage;					// Storage 사용률(%), ceil() 함수 사용으로 소수점 올림 처리되어 95.1 % -> 96 % 로 처리됨
};

// Storage 관련 정보 추출 담당 class
class CStorageInfo
{
	public:

		// 생성자
		CStorageInfo();

		// 소멸자
		~CStorageInfo();

		// 초기화 함수
		bool Init( const char * szRoot );


	public:   // Storage info 관련 interface 함수

		// 멤버 vector 에 저장된 경로의 Total Size, Total availsize, Max usage 정보를 반환.
		bool GetStorageSizeInfo( uint64_t & ulFhsTotal, uint64_t & ulFhsAvailable, int & iMaxUsage );

		// 멤버 vector 에 저장된 mount 경로명 정보를 반환
		bool GetStoragePath( std::vector< std::string > & vecPath );

		// 멤버 vector 에 저장된 storage 정보 중에 ZFS file system 정보 존재하는지 Check
		bool IsExistZFS();


	private:  // 멤버 변수

		// init() 에서 추출된 정보 저장을 위한 vector 멤버변수
		std::vector< struct stStorageInfo > m_vecStorageInfo;



	private:  // 처리 관련 내부 함수

		// 전달받은 경로로부터.. 상위 Path 정보를 추출하여 전달한다.
		void GetUpperPath( const std::string & strSourcePath, std::string & strUpperPath );

};


#endif /* __STORAGE_INFO_H__ */

