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