File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: // Archiver.h
13b7203622 2011-02-23        kinaba: //-- CArchiver -- common interface in 'Noah' for arhiving routine --
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #ifndef AFX_ARCHIVER_H__359A2ED3_2F97_480E_BC94_24834EBA6498__INCLUDED_
13b7203622 2011-02-23        kinaba: #define AFX_ARCHIVER_H__359A2ED3_2F97_480E_BC94_24834EBA6498__INCLUDED_
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: enum {
13b7203622 2011-02-23        kinaba: 	aCheck = 1, aMelt = 2, aList = 4, aMeltEach = 8, aCompress = 16, aArchive = 32, aSfx = 64,
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: enum {
13b7203622 2011-02-23        kinaba: 	aUnknown=0, aSingleFile, aSingleDir, aMulti
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: struct arcname {
13b7203622 2011-02-23        kinaba: 	arcname( const kiPath& b,const char *s,const char *l )
13b7203622 2011-02-23        kinaba: 		: basedir(b),sname(s),lname(l) {}
13b7203622 2011-02-23        kinaba: 	const kiPath& basedir;
13b7203622 2011-02-23        kinaba: 	const char*   lname;
13b7203622 2011-02-23        kinaba: 	const char*   sname;
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: struct arcfile {
13b7203622 2011-02-23        kinaba: 	INDIVIDUALINFO inf;
13b7203622 2011-02-23        kinaba: 	union {
13b7203622 2011-02-23        kinaba: 		bool selected;
13b7203622 2011-02-23        kinaba: 		bool isfile;
13b7203622 2011-02-23        kinaba: 	};
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #define aflArray kiArray<arcfile>
13b7203622 2011-02-23        kinaba: #define wfdArray kiArray<WIN32_FIND_DATA>
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: class CArchiver
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public: //--< attribute >--
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	int ability();
13b7203622 2011-02-23        kinaba: 	int cancompressby( const char* ext, const char* mhd, bool sfx );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	const char*     mlt_ext();
13b7203622 2011-02-23        kinaba: 	const kiStr&    cmp_ext();
13b7203622 2011-02-23        kinaba: 	const StrArray& cmp_mhd_list();
13b7203622 2011-02-23        kinaba: 	const int       cmp_mhd_default();
13b7203622 2011-02-23        kinaba: 	bool            ver( kiStr& str );
13b7203622 2011-02-23        kinaba: 	static bool GetVersionInfoStr( char* name, char* buf, size_t cbBuf );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: public: //--< action >--
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	bool check( const kiPath& aname );
13b7203622 2011-02-23        kinaba: 	int  contents( const kiPath& aname, kiPath& dname );
13b7203622 2011-02-23        kinaba: 	int  melt( const arcname& aname, const kiPath& ddir, const aflArray* files=NULL );
13b7203622 2011-02-23        kinaba: 	bool list( const arcname& aname, aflArray& files );
13b7203622 2011-02-23        kinaba: 	int  compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx );
13b7203622 2011-02-23        kinaba: 	kiStr arctype_name(const char* an) const { return v_name(an); }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: protected: //--< for child >--
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	CArchiver( const char* mext );
13b7203622 2011-02-23        kinaba: 	void set_cmp_ext( const char* ext );
13b7203622 2011-02-23        kinaba: 	void add_cmp_mhd( const char* mhd, bool def=false );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	virtual int  v_load(){return 0;}
13b7203622 2011-02-23        kinaba: 	virtual bool v_ver( kiStr& str ){return false;}
13b7203622 2011-02-23        kinaba: 	virtual bool v_check( const kiPath& aname ){return false;}
13b7203622 2011-02-23        kinaba: 	virtual int  v_contents( const kiPath& aname, kiPath& dname ){return aUnknown;}
13b7203622 2011-02-23        kinaba: 	virtual int  v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ){return false;}
13b7203622 2011-02-23        kinaba: 	virtual bool v_list( const arcname& aname, aflArray& files ){return false;}
13b7203622 2011-02-23        kinaba: 	virtual int  v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ){return false;}
13b7203622 2011-02-23        kinaba: 	virtual kiStr v_name(const char*) const { return ""; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: private: //--< private >--
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	friend class CNoahArchiverManager;
13b7203622 2011-02-23        kinaba: 	bool extCheck( const char* ext );
13b7203622 2011-02-23        kinaba: 	kiStr m_MyExtList, m_MyCmpExt;
13b7203622 2011-02-23        kinaba: 	StrArray m_Mhd;
13b7203622 2011-02-23        kinaba: 	int m_MhdDef,m_Able;
13b7203622 2011-02-23        kinaba: 	bool not_loaded;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: public: //--< dummy >--
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	virtual ~CArchiver(){}
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArchiver::ability()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return m_Able;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArchiver::cancompressby( const char* ext, const char* mhd, bool sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	if( (sfx && !(m_Able&aSfx)) || !(m_Able&aCompress) || !m_MyCmpExt.isSame(ext) )
13b7203622 2011-02-23        kinaba: 		return -1; // no
13b7203622 2011-02-23        kinaba: 	for( unsigned int i=0; i!=m_Mhd.len(); i++ )
13b7203622 2011-02-23        kinaba: 		if( m_Mhd[i] == mhd )
13b7203622 2011-02-23        kinaba: 			return (int)i;
13b7203622 2011-02-23        kinaba: 	return -2; // only - 'type name' matched
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArchiver::check( const kiPath& aname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return (m_Able&aCheck)?v_check(aname):false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArchiver::contents( const kiPath& aname, kiPath& dname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return (m_Able&aList)?v_contents(aname,dname):false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArchiver::melt( const arcname& aname, const kiPath& ddir, const aflArray* files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return (m_Able&aMelt)?v_melt(aname,ddir,files):0xffff;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArchiver::list( const arcname& aname, aflArray& files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return (m_Able&aList)?v_list(aname,files):false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArchiver::compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return (m_Able&aCompress)?v_compress(base,files,ddir,method,sfx):0xffff;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArchiver::ver( kiStr& str )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return v_ver(str);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline const char* CArchiver::mlt_ext()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return m_MyExtList;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline const kiStr& CArchiver::cmp_ext()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return m_MyCmpExt;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline const StrArray& CArchiver::cmp_mhd_list()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return m_Mhd;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline const int CArchiver::cmp_mhd_default()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( not_loaded )
13b7203622 2011-02-23        kinaba: 		m_Able=v_load(), not_loaded=false;
13b7203622 2011-02-23        kinaba: 	return m_MhdDef;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline CArchiver::CArchiver( const char* extlist )
13b7203622 2011-02-23        kinaba: 		: m_MyExtList( extlist ), m_Mhd(3), m_MhdDef(0), not_loaded(true)
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_MyExtList.lower();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline void CArchiver::set_cmp_ext( const char* ext )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_MyCmpExt = ext;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline void CArchiver::add_cmp_mhd( const char* method, bool Default )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_Mhd.add(method);
13b7203622 2011-02-23        kinaba: 	if( Default )
13b7203622 2011-02-23        kinaba: 		m_MhdDef = m_Mhd.len() - 1;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArchiver::extCheck( const char* ext )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	const char *x=m_MyExtList,*y;
13b7203622 2011-02-23        kinaba: 	int ln = ki_strlen(ext);
13b7203622 2011-02-23        kinaba: 	while( *x )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		for( y=x+1; *y && *y!='.'; y++ );
13b7203622 2011-02-23        kinaba: 		if( *y=='\0' ) break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( y-x == ln )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			while( x!=y )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				if( *x!=ext[ln+(x-y)] )
13b7203622 2011-02-23        kinaba: 					break;
13b7203622 2011-02-23        kinaba: 				x++;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			if( x==y )
13b7203622 2011-02-23        kinaba: 				return true;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		x=y+1;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: // 渡されたパス文字列が、絶対パスや".."を含んでいればtrue
13b7203622 2011-02-23        kinaba: static bool containsDangerPath( const char* path )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 絶対パス
13b7203622 2011-02-23        kinaba: 	if( path[0]=='\\' || path[0]=='/' || path[0]!='\0' && path[1]==':' )
13b7203622 2011-02-23        kinaba: 		return true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ".."
13b7203622 2011-02-23        kinaba: 	for( const char* p=path; *p; )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		const char* q = p;
13b7203622 2011-02-23        kinaba: 		while( *q!='\0' && *q!='\\' && *q!='/' )
13b7203622 2011-02-23        kinaba: 			q = ::CharNext(q);
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( p+2 <= q )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			const char* r;
13b7203622 2011-02-23        kinaba: 			for( r=p; r!=q; ++r )
13b7203622 2011-02-23        kinaba: 				if( *r != '.' )
13b7203622 2011-02-23        kinaba: 					break;
13b7203622 2011-02-23        kinaba: 			if( r == q ) // all dot
13b7203622 2011-02-23        kinaba: 				return true;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		p = (*q ? ::CharNext(q) : q);
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return false;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
13b7203622 2011-02-23        kinaba: // 統合アーカイバDLLレイヤ第二層 ver2。ついでにexeも適当に動く
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: class CArcModule
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public:
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 実行コマンド名を指定して作成
13b7203622 2011-02-23        kinaba: 	//  ・ファイル名として探して見つからなかった場合
13b7203622 2011-02-23        kinaba: 	//    シェルの内部コマンドと仮定して一応保持しておく
13b7203622 2011-02-23        kinaba: 	//  ・拡張子が exe か com なら実行ファイルとして扱う。
13b7203622 2011-02-23        kinaba: 	//  ・それ以外ならアーカイバDLLとして扱う。
13b7203622 2011-02-23        kinaba: 	CArcModule( const char* name, bool us=false );
13b7203622 2011-02-23        kinaba: 	virtual ~CArcModule();
13b7203622 2011-02-23        kinaba: 	bool exist();
13b7203622 2011-02-23        kinaba: 	bool isdll();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiStr name() const { return kiPath::name(m_name); }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 実行
13b7203622 2011-02-23        kinaba: 	int cmd( const char* cmd, bool mini=false );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 書庫チェック
13b7203622 2011-02-23        kinaba: 	bool chk( const char* aname );
13b7203622 2011-02-23        kinaba: 	int  arctype( const char* aname ) const;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// バージョン情報文字列を返す
13b7203622 2011-02-23        kinaba: 	void ver( kiStr& str );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 書庫の中身をリストアップ
13b7203622 2011-02-23        kinaba: 	bool lst_dll( const arcname& aname, aflArray& files, const char* wild="*" );
13b7203622 2011-02-23        kinaba: 	int  cnt( const kiPath& aname, kiPath& dname, const char* wild="*" );
13b7203622 2011-02-23        kinaba: 	bool lst_exe( const char* lstcmd, aflArray& files,
13b7203622 2011-02-23        kinaba: 		const char* BL, int BSL, const char* EL, int SL, int dx );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// DLL強制アンロード( BugTrap for UnZip32.dll )
13b7203622 2011-02-23        kinaba: 	void unload() { m_dll->unload(); }
13b7203622 2011-02-23        kinaba: 	// DLLオーナー窓設定( BugTrap for Unrar.dll )
13b7203622 2011-02-23        kinaba: 	void own( HWND wnd ) { m_dll->setOwner( wnd ); }
13b7203622 2011-02-23        kinaba: 	void fre() { m_dll->clearOwner(); }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	enum { NOTEXIST, DLL, DLLGCA, DLLBGA, EXE, EXEUS, SHLCMD=0 } m_type;
13b7203622 2011-02-23        kinaba: 	kiArcDLLRaw* m_dll;
13b7203622 2011-02-23        kinaba: 	char         m_name[MAX_PATH];
13b7203622 2011-02-23        kinaba: 	const char*  m_wild;
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArcModule::chk( const char* aname )
13b7203622 2011-02-23        kinaba: 	{ return m_dll ? FALSE!=m_dll->check( aname, m_type==DLLGCA?24:0 ) : false; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline int CArcModule::arctype( const char* aname ) const
13b7203622 2011-02-23        kinaba: 	{ return m_dll ?
13b7203622 2011-02-23        kinaba: 		m_type==DLLBGA ? m_dll->check(aname,0) : m_dll->getArcType(aname)
13b7203622 2011-02-23        kinaba: 	  : 0; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArcModule::exist()
13b7203622 2011-02-23        kinaba: 	{ return m_type!=NOTEXIST; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: inline bool CArcModule::isdll()
13b7203622 2011-02-23        kinaba: 	{ return m_type==DLL || m_type==DLLGCA; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #endif