/***************************************************************************
                ftsd ( File TranSfer Daemon ) Header ( Worker.h )
                -----------------------------------------
	begin      : 2010/03/04
	copyright  : (C) 2005 SolutionBox Inc.
	author     : Service 1 Team
	email      : svc1@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 __WORKER_H__
#define __WORKER_H__

#include "../define_ftsd.h"

#include "LocalIPCache.h"
#include "IPCache.h"
#include "ProcessStatus.h"
#include "ProperStorage.h"
#include "SocketControl.h"
#include "FileSender.h"


#ifdef __cplusplus
extern "C" {
#endif


	// 이거는 malloc 을 사용해야 하므로 C++ 스타일의 구조체를 만들지 않는다.
	struct WorkerThreadArg {

		int clientSocketDesc;				// Client Socket Descriptor

		CLocalIPCache	* pLocalIpCache;	// Local NIC IP Cache Calss pointer
		CIPCache		* pIpCache;			// 내부망 IP 정보 Cache Class pointer
		CProcessStatus	* pProcessStatus;	// Process 상태 정보 Class pointer
		CProperStorage	* pProperStorage;	// 내부 저장 stroage 정보 Class pointer
	};

	/// @brief Worker Process 의 main 함수
	/// @param listenSocket [in] Listen Socket Descriptor
	/// @return
	int WorkerMain( const int listenSocket );

	/// @brief 각 요청을 처리하기 위함 Thread 함수.
	/// @param arg [in] struct WorkerThreadArg 에 대한 포인터.
	/// @return
	void * WorkerThreadProc( void * arg );

	/// @brief Local NIC IP 요청에 대한 처리를 수행한다.
	/// @param pSocketControl [in] 요청 Client socket 에 대한 CSocketControl object pointer
	/// @param pLocalIpCache [in] Local NIC IP 정보 처리를 위한 CLocalIPCache object pointer
	/// @return Local NIC 처리결과 전송 성공시 true, 실패시 false 반환.
	bool ProcessLocalIpRequest( CSocketControl * pSocketControl, CLocalIPCache * pLocalIpCache );

	/// @brief Replication 대상 파일의 수신 요청에 대한 처리를 수행한다.
	/// @param pSocketControl [in] 요청 Client socket 에 대한 CSocketControl object pointer
	/// @param pProperStorage [in] CProperStorage Object Pointer. 해당값이 NULL 인 경우 Cache, NULL 인 아닌 경우 Replication 처리
	/// @return 파일 수신 및 처리 성공시 true, 오류 발생시 false 반환.
	bool ProcessFileReceive( CSocketControl * pSocketControl, CProperStorage * pProperStorage, char commandCode );


	bool ProcessFileHashCheck( CSocketControl * pSocketControl );


	/// @brief 파일 전송 관련 작업을 수행한다.
	bool ProcessFileSend( CFileSender& fileSender, CProcessStatus * pProcessStatus
			, CSocketControl * pSocketControl, char command );


	/// @brief Control 로 부터 Content 에 대한 Check ( Size, Hash ) 요청을 받은 경우 이를 처리하기 위한 함수
	bool ProcessFileCheck( CSocketControl * pSocketControl, char command );

	/// @brief Control 로 부터 Content 에 대한 Unlink 요청을 받은 경우 이를 처리하기 위한 함수
	bool ProcessFileUnlink( CSocketControl * pSocketControl, char command );



	// NEW 2016-05-04 huibong 토토디스크 지원용 기능 추가 (#27460, #27533)
	/// @brief 고객사 토토디스크 지원을 위한 기능
	///        Control 로 부터 전달받은 Content 에 대해 Size 정보 및 MD5 Hash, Checksum 정보 등을 추출하여 전달한다.
	/// @param
	/// @retrun
	bool ProcessFileCheckTOTO( CSocketControl * pSocketControl, char command );


	// NEW 2021-04-01 huibong content stat(size, atime, mtime, ctime) 정보 추출 기능 추가 (#33516)
	/// @brief Control 로 부터 Content 에 대한 stat ( size, atime, mtime, ctime ) 요청을 받은 경우 이를 처리하기 위한 함수
	bool ProcessFileStat( CSocketControl * pSocketControl, char command );
	

	/// @brief Worker 프로세스 signal 처리 설정을 위한 함수	
	/// @return void	
	void SetSignalWorker( void );

	/* Signal 처리를 위한 각 Signal Handler 함수는 
	 * 다른 Code 에서 Include 처리시 Static 관련 문제로 인해 
	 * 본 Header 에서 선언처리 하지 않음. cpp 에만 존재 
	 */



#ifdef __cplusplus
}
#endif


#endif /* __WORKER_H__ */
