/***************************************************************************
                접속 요청 Client 에 대한 처리를 담당하는 Thread class
                -----------------------------------------
    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 __CLIENT_THREAD_H__
#define __CLIENT_THREAD_H__


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

#include "StorageStatus.h"
#include "ProcessStatus.h"
#include "ProcessSocket.h"


// CClientThread
// rc_syncd 에서 accept 처리한 각 client 세션을 처리하기 위한 Thread class
class CClientThread
{
	public:

		// 생성자
		CClientThread( CStorageStatus * pStorage, CProcessStatus * pProcess, int clientSocket, char * pszClientAddress );

		// 소멸자
		~CClientThread();

		// thread 를 생성하여 처리 업무 flow start
		bool Start();


		
	private:

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

		// client request 요청을 수신하여 이에 따른 job 을 수행
		void Execute();
		
		// Client 로 부터 available size 요청 수신시 이를 처리하기 위한 함수.
		void ProcessAvailableSize();
		
		// client 로 부터 파일 저장 요청 수신시 이를 처리하기 위한 함수.
		void ProcessFileSave();

		// 전달받은 Directory 정보를 확인하여 존재하지 않을 경우 생성처리.
		bool MakeDirectory( const std::string& szFullPath );

		// client 로 부터 파일 존재 여부 확인 요청 수신시 이를 처리하기 위한 함수.
		void ProcessFileCheck();


	private:

		// 쓰레드 핸들
        pthread_t m_threadHandle;

		// Storage 상태정보 추출 관련 CStorageStatus 객체에 대한 포인터
		// - 생성자를 통해 전달받음        
		CStorageStatus * m_pStorageStatus;
		
		// 프로세스 상태를 관리하는 CProcessStatus 객체에 대한 포인터
		// - 생성자를 통해 전달받음        
		CProcessStatus * m_pProcessStatus;
		
		// Client Socket discriptor
		// - 생성자를 통해 전달받음.
		int m_socketClientDesc;

		// client 와 통신 관련 처리를 수행하기 위한 socket 객체
		CProcessSocket m_client;
	
		// Client IP Address
		// - 생성자를 통해 전달받음
		std::string m_strClientIp;


};

#endif /* __CLIENT_THREAD_H__ */

