/***************************************************************************
                Totodisk Checksum Class (#27460, #27533)
                -----------------------------------------
    begin      : 2016/05/11
    copyright  : (C) 2005 SolutionBox Inc.
    author     : huibong
    email      : storage.sd@solbox.com
    version    : 1.0

    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.
***************************************************************************/


#ifndef __TOTO_CHECKSUM_H__
#define __TOTO_CHECKSUM_H__

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

/// @brief CTotoChecksum class
/// 토토디스크 고객사 지원을 위한 클래스로서
/// 해당 고객사에서 제공한 파일의 Checksum 추출 기능 (java 코드) 을
/// 구현하기 위한 클래스임.
///
/// 본 클래스의 코드는 
/// 토토디스크에서 제공한 Java 소스를 이용하여 최대한 유사하게 구현하였으며...
/// 비효율적인 코드가 존재하더라고.. 고객사 코드를 최대한 그대로 변환하려 한 것이므로....
/// 함부로 최적화 하면 절대 안된다....(허락 없이 수정시 옥상에서 던져버릴 것임)
///
/// 에러 상황은 GetErrorMessage() 함수를 통해 어떤이유로 에러가 발생했는지
/// 확인 할 수 있다.
///
class CTotoChecksum
{
	public :

		// 생성자
    	CTotoChecksum();

		// 소멸자
		~CTotoChecksum();


		/// @brief 토토디스크 고객사 지원용 파일 Checksum 정보 추출 함수
		/// @param szFileFullPath [in] 파일의 절대경로 값.
		/// @param nFileTotalSize [in] 파일 크기 값.
		/// @param szResult [out] Checksum 추출 결과값을 반환하기 위한 변수.
		/// @return 성공은 return true, 그 외에는 return false
		bool GetChecksum( const std::string &szFileFullPath, const unsigned long long nFileTotalSize, std::string& szResult );


        /// @brief 각 함수 호출시 마지막에 난 에러메세지를 얻을 수 있다.
        /// @return 마지막에 발생한 에러메세지.
		std::string GetErrorMessage( void ) { return m_szErrorMessage; }



	private:

		// 토토에서 제공한 CRC 연산 함수.
		int calcCRC32( unsigned char b, unsigned int iCrc32 );
		

	private :

		std::string m_szErrorMessage;


};

#endif //__TOTO_CHECKSUM_H__

