//	Roast+ License

/*

	CFileBase
*/
#ifndef __SFJP_OPENMGL_roast_mxp_FileBase_H__
#define __SFJP_OPENMGL_roast_mxp_FileBase_H__

#include "roast/_common.hpp"
#include <string>

_NS_ROAST_START

///////////////////////////////////////////////////

//	CFileBase
class CFileBase
{
public:
	enum {
		DIR_SEP_LIN = '/',
		DIR_SEP_WIN = '\\'
	};

protected:
	std::string m_strFilePath;

public:
	//	コンストラクタ
	CFileBase(){};
	CFileBase(const char* szFilePath){ SetFilePath(szFilePath); }
	CFileBase(CFileBase &file){ operator = (file); }
	CFileBase(CFileBase &parent, const char* szChild){/*******/};

	//	デストラクタ
	virtual ~CFileBase(){}


	///////////////////////////////////////////////////////////
	//	ファイルパスの取得と設定

	CFileBase& operator = (const char* szFilePath){
		SetFilePath(szFilePath);
		return *this;
	}
	CFileBase& operator = (CFileBase &file){
		SetFilePath(file.GetFilePath());
		return *this;
	}

	void SetFilePath(const char* szFilePath){
		m_strFilePath = szFilePath;
	}

	const char* GetFilePath(){ return m_strFilePath.c_str(); }


	///////////////////////////////////////////////////////

	//	ファイル名だけを取得
	const char* GetFileName(){};

	//	ディレクトリ名だけを取得
	const char* GetDirName(){};
	
	//	ファイルの場合、ディレクトリを取得
	//	ディレクトリの場合、親ディレクトリを取得
	CFileBase GetParent(){}
	
	//	ディレクトリパスだけ取得
	const char* GetPath(){}
	const char* GetDirPath(){ return GetPath(); }
	const char* GetPath(){ return GetPath(); }


	///////////////////////////////////////////////////////////
	//	ユーティリティ


	//	ディレクトリか？ファイルか？
	virtual bool IsDirectory()=0;
	bool IsDir(){ return IsDirectory(); }
	bool IsFile(){ return IsDirectory() ? false : true; }
	
	//	存在しているか？
	virtual bool IsExist()=0;
	
	//	読める？書き込める？
	virtual bool IsCanRead()=0;
	bool IsReadable(){ return IsCanRead(); }
	virtual bool IsCanWrite()=0;
	bool IsWriteable(){ return IsCanWrite(); }
	
	//	権限変更
	virtual bool SetReadOnly()=0;
	bool SetReadonly(){ return SetReadOnly(); }
	bool DisableWriteable(){ return SetReadOnly(); }

	//	ファイル or ディレクトリの作成
	virtual bool CreateFile(const char* szFileName=NULL)=0;
	bool Create(const char* szFileName=NULL){ return CreateFile(szFileName); }
	virtual bool CreateDirectory(const char* szDirName=NULL)=0;
	bool CreateDir(const char* szDirName=NULL){ return CreateDirectory(szDirName); }
	
	//	ファイルサイズ取得
	virtual long GetFileSize()=0;
	long GetSize(){ return GetFileSize(); }
	long Size(){ return GetFileSize(); }
	long size(){ return GetFileSize(); }
	
	//virtual int64 GetFileSize64()=0;
	//int64 GetSize64(){ return GetFileSize(); }
	//int64 Size64(){ return GetFileSize(); }
	//int64 size64(){ return GetFileSize(); }
	
	//	名前変更
	virtual bool Rename(const char* szNewName)=0;
	bool ChName(const char* szNewName){ return Rename(szNewName); }
	bool ChangeName(const char* szNewName){ return Rename(szNewName); }
	
	//	削除
	virtual bool Delete()=0;
	bool Del(){ return Delete(); }
	bool Remove(){ return Delete(); }
	
	//	コピー
	virtual bool Copy(const char* szCopyTo)=0;
	bool Copy(CFileBase &copyTo){ return Copy(copyTo.GetFilePath()); }
	
	//	移動
	virtual bool Move(const char* szMoveTo)=0;
	bool Move(CFileBase &moveTo){ return Move(moveTo.GetFilePath()); }
	
	
	///////////////////////////////////////////////////////////
	//	読み書き
	
	//	書き込み
	virtual bool WriteFile(unsigned char* membuf, unsigned int length)=0;
	bool Write(unsigned char* membuf, unsigned int length){ return WriteFile(membuf,length); }
	bool WriteMem(unsigned char* membuf, unsigned int length){ return WriteFile(membuf,length); }
	bool WriteMemory(unsigned char* membuf, unsigned int length){ return WriteFile(membuf,length); }
	bool WriteString(char* str){ return WriteFile((unsigned char*)str, strlen(str)); }
	
	//	追記書き込み
	virtual bool AppendFile(unsigned char* membuf, unsigned int length)=0;
	bool Append(unsigned char* membuf, unsigned int length){ return AppendFile(membuf,length); }
	bool AppendMem(unsigned char* membuf, unsigned int length){ return AppendFile(membuf,length); }
	bool AppendMemory(unsigned char* membuf, unsigned int length){ return AppendFile(membuf,length); }
	bool AppendString(char* str){ return AppendFile((unsigned char*)str, strlen(str)); }
	
	//	読み込み
	virtual unsigned char* ReadFile()=0;
	virtual unsigned char* ReadFile(unsigned char* membuf, unsigned int length)=0;
	unsigned char* Read(){ return ReadFile(); }
	unsigned char* Read(unsigned char* membuf, unsigned int length){ return ReadFile(membuf,length); }
	
	
	///////////////////////////////////////////////////////////
	//	標準入出力
	
	virtual FILE* Fopen()=0;
	FILE* FOpen(){ return Fopen(); }
	FILE* fopen(){ return Fopen(); }
	
	virtual FILE* Fclose()=0;
	FILE* FClose(){ return Fclose(); }
	FILE* fclose(){ return Fclose(); }
};

_NS_ROAST_END

///////////////////////////////////////////////////

//	typedefs
typedef roast::CFileBase CRoastFileBase;

#endif//__SFJP_OPENMGL_roast_mxp_FileBase_H__




/*
 boolean isHidden() ;
 long lastModified() ;
 File[] listFiles() ;
 File[] listFiles(FileFilter filter) ;
 File[] listFiles(FilenameFilter filter) ;
 boolean setLastModified(long time) ;


************************
終わり
 boolean canRead() ;
 boolean canWrite() ;
 boolean exists() ;
 String getParent() ;
 File getParentFile() ;
 boolean isDirectory() ;
 boolean isFile() ;
 boolean createNewFile() ;
 long length() ;
 boolean mkdir() ;
 boolean mkdirs() ;
 boolean renameTo(File dest) ;
 boolean delete() ;
 boolean setReadOnly() ;



要らないと思う系
 int hashCode() ;
 boolean equals(Object obj) ;
 String toString() ;
 int compareTo(File pathname) ;
 int compareTo(Object o) ;
static File createTempFile(String prefix, String suffix) ;
static File createTempFile(String prefix, String suffix, File directory) ;
 String[] list() ;
 String[] list(FilenameFilter filter) ;
 boolean isAbsolute() ;
 File getAbsoluteFile() ;
 String getAbsolutePath() ;
 String getName() ;
 String getPath() ;
 File getCanonicalFile() ;
 String getCanonicalPath() ;
static File[] listRoots() ;

 void deleteOnExit() ;

*/